도메인 모델과 테이블 설계
김영한 저자의 '자바 ORM 표준 JPA 프로그래밍' 11 챕터의 기능들을 구현했다.
도메인 모델
테이블 설계
Domain 엔터티 생성
Member를 등록, 조회, 수정 하는 기능을 만들기 위해, Member Entity를 만든다.
@Entity
@Entity
- @Entity를 선언하면 DB에 있는 테이블과 매핑된다.
- @Table(name="테이블명")으로 지정해주지 않으면 클래스 이름의 테이블과 매핑한다.
- Entity 클래스에는 Setter 메서드를 만들지 않고, 만들더라도 updateAddress처럼 명확한 목적을 나타내야 한다.
- Entity는 기본 생성자가 필수다. 따라서 @NoArgsConstructor로 기본 생성자를 만들어주었다.
@ID
@GeneratedValue
- PK키인 ID의 Auto Increment 생성 전략이다.
- Id는 Long 타입으로 사용해서 숫자가 부족하지 않는다.
@Embedded
@ Embedded 는 Entity가 아닌 값 타입이다.
@Embdded로 Entity 내에서 사용하려면 Embedded 타입을 @Embeddable을 붙여 클래스로 생성해야 한다.
DB에보면 Member 테이블의 Address에 해당되는 city, street, zipcode 컬럼이 생성되었다.
@MappedSuperclass
객체들마다 생성일자와 수정일자를 기록할 수 있도록, BaseTimeEntity를 만들었다
@MappedSuperclass
- 부모 클래스는 테이블과 매핑하지 않고, 부모 클래스를 상속 받는 자식 클래스에게 매핑 정보만 제공하고 싶을 때 사용한다.
- 객체들이 주로 사용하는 공통 매핑 정보를 정의한다.
@CreateDate
- Entity가 생성되어 저장될 때 시간이 자동 저장
@LastModifiedDate
- Entity가 생성되어 저장될 때 시간이 자동 저장
자식 클래스가 @MappedSuperclass를 적용한 클래스를 상속받으면 된다.
Member 테이블에 CREATED_DATE, LAST_MODIFIED_DATE 컬럼이 생성된 것을 확인할 수 있다.
@EntityListeners({AuditingEntityListener.class})
- JPA Auditing(감시) 기능을 포함시킨다.
- JPA Auditing 기능을 사용하려면 SpringBoot 실행클래스나, @Configuration 클래스에 @EnableJPAAuditing를 적용해야한다.
혹은
활성화하지 않으면 LastModifiedDate가 저장되지 않는다.
- @EnableJpaAuditing 적용 전
Entity의 값을 변경해도 LAST_MODIFIED_DATE의 값이 null로 들어간다.
- @EnableJpaAuditing 적용 후
Entity를 생성하기만 해도 LAST_MODIFIED_DATE 값이 들어간다.
LocaDate, LocalDateTime
Java 8부터 LocalDate와 LocalDateTIme이 등장했다.
JAVA의 기본 날짜 타입인 Date의 문제점을 제대로 고친 타입으로, Java 8일 경우 무조건 써야한다.