[JPA] JPA로 데이터베이스 다루기
Updated:
스프링 부트에서 JPA로 데이터베이스 다루기
JPA란?
- 자바 표준 ORM
- 쿼리를 매핑하는 SQL Mapper(Mybatis, iBatis)와 달리 객체를 매핑하는 것이 ORM(JPA)
- 지향하는 바가 다른 2개 영역(객체지향 프로그래밍 언어와 관계형데이터베이스) 간의 패러다임 일치를 시켜줌.
- 개발자는 객체지향적 프로그래밍을 하고, JPA는 이를 관계형데이터베이스에 맞게 SQL 대신 생성하여 실행함.
Spring Data JPA
- 인터페이스인 JPA를 사용하기 위해선 구현체가 필요함.
- 구현체들을 더 쉽게 사용하고자 추상화시킨 Spring Data JPA 모듈을 이용하여 JPA 기술을 다룸.
장점
- 구현체 교체의 용이성
- 저장소 교체의 용이성
- Hibernate 외 다른 구현체로 쉽게 교체하기 위함
- 관계형 데이터베이스 외에 다른 저장소(대용량 데이터 처리 시 MongoDB)로 쉽게 교체하기 위함. Spring Data 하위 프로젝트들은 기본적인 CRUD 인터페이스가 동일하기 때문.
Entity 클래스
- JPA 사용시 테이블과 링크될 클래스
- 주요 어노테이션
@Entity //테이블과 링크될 클래스임을 나타냄. @Id //해당 테이블의 PK. 이때, PK는 Long 타입의 Auto_increment를 추천. 주민등록번호, 복합키는 유니크 키를 별도로 추가. @GeneratedValue(strategy = GenerationType.IDENTITY) //PK 생성 규칙. @Column(length = 500, nullable = false) //테이블의 칼럼을 나타냄. 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 됨. 기본값 외에 추가로 변경이 필요한 옵션이 있을 때 사용
Entity 클래스에는 절대 Setter 메소드를 생성하지 않음.
- 해당 클래스의 인스턴스 값들이 언제 어디서 변해야하는지 코드상 명확히 구분할 수 없으므로, 차후 변경 시 복잡해짐.
- 대신, 값 변경이 필요한 경우 해당 이벤트에 맞는 public 메소드를 호출하여 변경.
- 생성자 대신 @Builer를 통해 제공하는 빌더 클래스 사용
JpaRepository 생성
- ibatis나 Mybatis에서 Dao라고 불리는 DB layer 접근자.
- JPA에선 Repository라 부르며 인터페이스로 생성.
- JpaRepository<Entity 클래스, PK타입>
- Entity 클래스와 기본 Entity Repository는 함께 위치해야 함. 도메인 패키지에서 함께 관리하는 것이 기본.