ㅁ 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을 활용하여 데이터 저장, 수정, 삭제 등의 작업을 수행한다.