- JPA / Hibernate / Spring Data JPA의 관계
- JPA <- Hibernate <- Spring Data JPA
- Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없다.
- 그러나 이렇게 한 단계 더 감싸놓은 Spirng Data JPA가 등장한 이유는 크게 두 가지
- 구현체 교체의 용이성 -> Hibernate 외에 다른 구현체로 쉽게 교체하기 위함
- 저장소 교체의 용이성 -> 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함
- Spring Data JPA를 이용하여 관계형 데이터베이스를 객체지향적으로 관리하는 방법
- JPA의 더티 체킹을 이용하면 Update 쿼리 없이 테이블 수정이 가능하다는 것
- JPA Auditing을 이용하여 등록/수정 시간을 자동화하는 방법
어노테이션 정보
@Entity
- 테이블과 링크될 클래스임을 나타낸다.
- 기본값으로 클래스의 Camel Case 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭한다.
- Ex) SalesManager.java -> sales_manager table
@id
- 해당 테이블의 PK 필드를 나타낸다
@GeneratedValue
- PK의 생성 규칙을 나타낸다.
- Spring Boot 2.0에서는 GenerationType.IDENTITY 옵션을 추가해야만 auto_increment 된다.
@Column
- 테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 된다.
- 사용하는 이유 -> 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용한다.
- 문자열의 경우 VARCHAR(255)가 기본값, 사이즈를 500으로 늘리고 싶거나 타입을 TEXT로 변경하고 싶거나 등의 경우에 사용
@NoArgsConstructor
- 기본 생성자 자동 추가
- public Posts() {}와 같은 효과
@Getter
- 클래스 내 모든 빌드의 Getter 메서드를 자동 생성
@Builder
- 해당 클래스의 빌더 패턴 클래스를 생성
- 생성자 상단에 선언 시 생성자에 포함된 필드만 빌더에 포함
@RequiredArgsConstructor
- 스프링에선 Bean을 주입받는 방식들이 다음과 같다.
- @Autowired, Setter, 생성자
- 이 중 가장 권장하는 방식이 생성자로 주입받는 방식 (@Autowired는 권장하지 않는다)
- final이 선언된 모든 필드를 인자값으로 하는 생성자를 롬복의 @RequiredArgsConstructor가 대신 생성 해준다.
@MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 칼럼으로 인식되도록 한다.
@EntityListeners(AuditingEntityLisener.class)
- BaseTimeEntity 클래스에 Auditing 기능을 포함시킨다.
주의할 점
- Entity 클래스에서는 절대 Setter 메서드를 만들지 않는다.
- Entity 클래스와 기본 Entity Repository는 함께 위치해야 한다.
- Java8 이전에 사용되었던 Date와 Calendar 클래스의 문제점
- 불변 객체가 아니다. -> 멀티스레드 환경에서 언제든 문제가 발생할 가능성 존재
- Calendar는 월(Month) 값 설계가 잘못되었다. -> 10월을 나타내는 Calendar.OCTOBER의 숫자 값이 '9'이다.