[jpa] JPA annotation By starseat 2022-10-19 13:19:10 java/spring Post Tags # JPA 기본 annotation ## @Entity - 엔티티 클래스 설정, 필수 지정 - @Id 적용 필요 - 인자 없는 기본 생성자 필요 - 최상위 클래스여야 함. - `final` 안됨. - 테이블과 연결될 클래스임을 나타냄 - 기본 설정으로 카멜케이스를 언더스코어 네이밍으로 매칭함. (ex. SalesManager -> sales_manager) ## @Table - 매핑할 테이블 지정 ### 속성 - name: 테이블 명 (생략 시 클래스명과 동일하게 생성됨) - catalog: 카탈로그 명(에: MySQL DB 명) - schema: 스키마 명(예: Oracle 스키마 명) ### 사용 예 - @Table - @Table(name = "tb_member") - @Table(name = "tb_member", catalog = "point") - @Table(name = "tb_member", schema = "crm") ## @Id - 식별사 속성 설정, 필수 지정 - 해당 테이블의 PK 필드 ## @GeneratedValue - PK 의 생성 규칙 - Spring Boot v2.0 에서는 `GenerationType.IDENTITY` 옵션을 추가해야만 `auto_increment` 가 됨. - Spring Boot v2.0 과 v1.5 차이 => [Spring Boot Data JPA 2.0 에서 id Auto_increment 문제 해결](https://jojoldu.tistory.com/295) ### 사용 예 ```java @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ``` ## @Column - 매핑할 컬럼명 지정. 지정하지 않으면 필드명 사용 ### 사용 예 ```java @Column(length = 500, nullable = false) private String title; @Column(columnDefinition = "TEST", nullable = false) private String content; ``` ## @Enumerated - enum 타입 매핑시 설정 ### 설정 값 - EnumType.STRING: enum 타입 값 이름 저장 - 문자열 타입 컬럼에 매핑 - EnumType.ORDINAL: enum 타입 값의 순서 저장 (default) - 숫자 타입 컬럼에 매핑 - 소스가 수정되면 값도 바뀔 수 있기때문에 신중히 사용해야 함(잘 안씀) ```java public enum Grade { S1, S2, S3, S4, S5, S6 } ``` ```java EnumType.STRING // "S1" Gradle.S1.name() EnumType.ORDINAL // 0 Gradle.S1.ordinal() ``` ### 사용 예 ```java @Gatter @Setter @Entity @Table(name ="hotel_info") public class Hotel { @Id @Column(name = "hotel_id") private String id; private String name; private int year; @Enumerated(EnumType.STRING) private Grade grade; private LocalDateTime created; @Column(name ="modified") private LocalDateTime lastModified; ... } ``` ## @Temporal - java.util.Date, java.util.Calendar 매핑 - java8 시간/날짜 타입 등장 이후로 거의 안씀(LocalDate, LocalDateTime 등) ## @Basic - 기본 지원 타입 매핑 (거의 안씀) ## 시간 관련 - `JPA Auditing` 으로 생성시간/수정시간 자동화 가능 ### @MappedSuperclass - JPA Entity 클래스들이 지정한 Entity 클래스를 상속할 경우 플드들(createdDate, modifiedDate 등)도 컬럼으로 인식하도록 함 ### @EntityListeners = 지정할 상위 Entity 클래스에 `Auditing` 기능 포함 ### @CreatedDate - Entity 가 생성되어 저장될 때 생성 시간 자동 설정 ### @LastModifiedDate - 조회한 Entity 의 값을 변경할 때 변경 시간 자동 저장 ### 사용 예 ```java import lombok.Getter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.EntityListeners; import javax.persistence.MappedSupperclass; import java.time.LocalDateTime; @Getter @MappedSuperclass @EntityListeners(AuditingEntityListerner.class) public abstract class BaseTimeEntity { @CreatedDate private LocalDateTime createdDate; @LastModiiedDate private LocalDateTime modifiedDate; } ``` ```java import lombok.*; @ToString @Builder @Getter @NoArgsConstructor @AllArgsConstructor public class Posts extends BaseTimeEntity { private String title; private String content; private String author; ... } ``` ```java @EnableJpaAuditing // JPA Auditing 활성화 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- # 접근 타입 - 필드 접근: 필드 값을 사용해서 매핑 - 프로퍼티 접근: getter/setter 메서드를 사용하여 매핑 ## 설정 방법 - @id 를 필드에 붙이면 필드 접근 - @id 를 getter 메서드에 붙이면 프로퍼티 접근 - @Access 을 사용해서 명시적 지정 가능 - class/개별 필드에 적용 가능 - @Access(AccessType.PROPERTY) / @Access(AccessType.FIELD) # 참조 - [최범균님의 JPA 기초 04 엔티티 매핑 설정](https://www.youtube.com/watch?v=SbMJVuv8Iyo) - [스프링 부트와 AWS로 혼자 구현하는 웹 서비스](https://jojoldu.tistory.com/463) Previous Post [java] Optional 사용 Next Post [java] JPA 식별자 생성 방식