본문 바로가기
JPA

JPA와 ORM 기본 개념

by moca7 2025. 2. 25.

 

 

ㅁ ORM이란?

- ORM(Object-Relational Mapping)이란 자바의 객체와 관계형 데이터베이스를 맵핑하는 기술으로,

DB의 특정 테이블이 자바의 객체로 맵핑되어 SQL문을 일일이 작성하지 않고 객체로 구현할 수 있도록 하는 프레임워크입니다.

 

 

 

ㅁ JPA란?
- Java Persistence API로, 자바에서 사용하는 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스 모음이다.

- JPA는 자바의 ORM기술을 쉽게 구현하도록 도와주는 API이다.

- JPA는 자바 애플리케이션과 JDBC 사이에서 동작한다.

 

- JPA(Java Persistence API)는 자바 애플리케이션에서 관계형 데이터베이스를 객체 지향적으로 다룰 수 있도록 도와주는 ORM(Object-Relational Mapping) 기술이다.

- SQL을 직접 작성하지 않고 엔터티(Entity) 객체를 통해 데이터베이스와 상호 작용할 수 있다.

 


- SQL 작성 없이 객체를 DB에 직접 저장할 수 있게 도와주고, 객체와 관계형 DB의 차이도 중간에서 해결한다.
- 객체와 관계형 DB간의 매핑을 손쉽게 처리할 수 있다.

 

- JPA 자체는 데이터베이스와 직접 소통하는 기능을 제공하지 않으며, 이를 구현하는 구현체(Implementation)가 필요하다.

- 대표적인 JPA 구현체로는 Hibernate, EclipseLink, Apache OpenJPA 등이 있다. 

이 중에서 Hibernate가 가장 널리 사용되며, Spring Boot의 spring-boot-starter-data-jpa를 사용하면 기본적으로 Hibernate가 적용된다.

 

 




 

ㅁ JPA를 사용하는 이유
- 개발 생산성 향상과 유지보수의 편의성.

- SQL 중심의 개발에서 객체 중심으로 개발
- 패러다임의 불일치 해결
- 성능 향상
- 데이터 접근 추상화와 벤더 독립성
- 자바 ORM 표준 기술






JPA의 장점으로, SQL 위주의 Mybatis 프로젝트와 비교하여 쿼리를 하나하나 작성할 필요도 없어 코드량이 엄청나게 줄어듭니다. 또한 객체 위주로 코드가 작성되다 보니 가독성도 좋고, 여러 가지 요구사항으로 기능 수정이 발생해도 DB부터 더 간편하게 수정이 가능합니다. 또한 Oracle, MySQL 등 DB 벤더에 따라 조금씩 다른 SQL 문법 때문에 애플리케이션이 DB에 종속될 수밖에 없었는데, JPA는 직접 쿼리를 작성하는 것이 아니라서 DB 벤더에 독립적으로 개발이 가능합니다.


  • JPA 자체는 SQL을 직접 작성할 필요 없이 데이터를 조작할 수 있도록 돕지만, 내부적으로는 각 데이터베이스에 맞는 SQL을 생성하여 실행한다. 예를 들어, MySQL, PostgreSQL, Oracle, MariaDB 등의 RDBMS를 사용할 수 있으며, JPA가 직접 데이터베이스를 처리하는 것이 아니라 JDBC 드라이버와 JPA 구현체(Hibernate 등)를 통해 해당 DB에 맞는 SQL이 실행된다.
  • JPA를 사용해도 특정 RDBMS를 완전히 안 쓰는 것은 아닙니다.

 

  • JPA 쓰면 특정 RDBMS를 안써?
  • JPA는 데이터베이스에 종속되지 않는 객체 지향적인 데이터 접근 방식을 제공하지만, 결국에는 기본적으로 특정 RDBMS에 매핑되어 동작한다.결국 데이터베이스는 필요하며, 설정(application.properties 또는 application.yml)에서 spring.datasource.url 등을 통해 사용할 RDBMS를 지정해야 한다.

 

 

 

ㅁ JPA의 장점

 

  • JPA를 사용하면 SQL을 줄이고 객체 중심으로 데이터 관리를 할 수 있으며, 트랜잭션과 변경 감지 기능을 통해 유지보수가 쉬워지고, 데이터베이스 변경에도 유연하게 대응할 수 있다.

JPA의 장점

JPA를 사용하면 데이터베이스 연동 시 SQL을 직접 작성할 필요 없이 엔터티 객체를 통해 데이터를 조작할 수 있다.

save(), findById() 같은 메서드를 호출하면 자동으로 SQL이 생성되므로, 반복적인 SQL 작성에서 벗어나 비즈니스 로직에 집중할 수 있다.

 

2. 객체와 관계형 데이터베이스 간의 불일치 해결(ORM)

java
복사편집
@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private String email;
}

위와 같은 엔터티를 정의하면, JPA가 알아서 적절한 테이블을 생성하고 데이터를 매핑해준다.JPA는 특정 데이터베이스에 의존하지 않도록 추상화되어 있어, MySQL, PostgreSQL, Oracle, MariaDB 등 다양한 RDBMS에서 사용할 수 있다.

properties
복사편집
# MySQL에서 PostgreSQL로 변경할 경우 설정만 수정
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
# ➝ 변경
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb

4. 트랜잭션 및 일관성 관리객체의 상태를 자동으로 감지하여 변경이 발생하면 별도의 update SQL을 작성하지 않아도 데이터베이스에 반영된다.5. 지연 로딩(Lazy Loading)과 성능 최적화필요한 경우 fetch join, @BatchSize 등을 활용해 최적화할 수도 있다.6. JPQL 및 QueryDSL을 활용한 쿼리 최적화또한, QueryDSL을 활용하면 타입 안전한 쿼리 작성이 가능하여 런타임 오류를 방지하고 가독성을 높일 수 있다.📌 결론하지만, 복잡한 쿼리가 필요할 경우 QueryDSL 또는 네이티브 SQL을 활용하는 것이 필요하며, 성능 최적화를 위한 추가적인 설정도 고려해야 한다.

 

  • JPA는 영속성 컨텍스트(Persistence Context)를 통해 자동으로 트랜잭션을 관리하고, 변경 감지를 수행한다.
  • 데이터베이스 변경이 필요할 경우 JPA 설정만 변경하면 되므로 유지보수가 쉬워진다.
  • 3. 데이터베이스 벤더 종속성 제거
  • 객체 지향 프로그래밍에서는 객체 간의 관계를 다루고, 관계형 데이터베이스(RDBMS)에서는 테이블 간의 관계를 다룬다. JPA는 ORM을 통해 이러한 불일치를 해결하여, 객체 모델을 그대로 유지하면서 DB와 연동할 수 있게 해준다.
  • java 복사편집 // SQL 없이 객체 저장 User user = new User("John", "john@example.com"); userRepository.save(user);
  • 1. SQL 작성 감소 및 생산성 향상

 



ㅁ 실제 사용법
- JpaRepository를 상속하는 인터페이스에 메서드 이름만 적어놓으면
알아서 다 처리(구현체 생성, 쿼리문 구현 등)해주는 좋은 ORM이다.
- 메소드 이름은 findby(필드명), deleteby(필드명)처럼 메소드 명칭만 적어주면
개발자는 SQL을 작성하지 않아도 쿼리문을 만들어준다.

 

- @Entity 어노테이션을 사용하면 데이터베이스 테이블과 매핑되는 클래스를 정의할 수 있으며, @Id를 이용해 기본 키를 설정할 수 있다. 


- Maven 프로젝트 pom.xml에 spring-boot-starter-data-jpa Dependency를 수동으로 작성한다.
- application.properties나 application.yml에 데이터베이스 정보를 설정한다.

 

- @Entity 어노테이션을 사용하여 엔터티 클래스를 정의하고, @Id, @GeneratedValue 등을 활용해 기본 키를 설정한다.

- JpaRepository를 상속하는 인터페이스를 만들어 기본적인 CRUD 기능을 자동으로 제공받는다.

- @Transactional을 활용하여 데이터 저장, 수정, 삭제 등의 작업을 수행한다.