📝 JPA의 기본 Annotation 대하여
Spring Data JPA를 사용하여 프로젝트를 진행하면서 사용하였던 JPA Annotation에 대하여 정리해보려고 한다. JPA를 완벽하게 다루진 못했지만 자주 사용하고 반드시 기억해야되는 Annotation 위주로 글을 구성하였다.
🚩 @Entity
📝 설명
- Datadbase Table과 매핑시켜주는 역할
- JPA가 Class를 직접 관리할 수 있도록 명시
- 기본 생성자는 필수
- 객체의 불편성을 최대한 유지하기 위한 @Setter 사용은 지양, @Builder 패턴 사용
🔨 설정 옵션
■ Name
- JPA에서 사용할 Entity의 이름을 지정한다. 지정하지 않을 경우 Class 이름을 사용
🚩 @Id
📝 설명
- JPA가 Entity를 구별하기 위한 식별자 Field를 지정해주는 역할
🚩 @GeneratedValue
📝 설명
🔨 생성 전략 ( Strategy )
■ GenerationType.IDENTITY
- 기본 키 생성을 데이터베이스에 위임
- 데이터베이스에 위임을 하였으므로 데이터베이스에 Sequence 또는 Auto_Increment 설정이 따로 필요
■ GenerationType.SEQUENCE
- 데이터베이스 Sequence를 사용해서 기본 키를 할당
- 데이터베이스 Sequence로 식별자 값을 획득 후 영속성 컨택스트에 할당
■ GenerationType.TABLE
- 키 생성 테이블을 사용 ex) hibernate_sequnce
- 키 생성 테이블을 이용하므로 모든 데이터베이스에 사용이 가능
■ GenerationType.AUTO ( Default )
- 선택한 데이터베이스에 따라서 방식을 자동으로 선택
🚩 @Column
📝 설명
- JPA가 Class의 Field를 Table의 Column으로 인식할 수 있도록 지정하는 역할
🔨 설정 옵션
■ Name
- Database에 표시될 Table Column의 이름을 지정, 미지정 시 Field Name을 사용
■ ColumnDefinition ( DDL )
- Table Column의 자료형을 명시하는 설정
- 해당 옵션 미사용 시 Field의 자료형에 따라 Column의 자료형이 자동 설정
- DDL이므로 JPA Option이 Create거나, 처음 실행시에만 적용
■ Nullable ( DDL )
- Table Column의 Null 허용 여부를 설정
- DDL이므로 JPA Option이 Create거나, 처음 실행시에만 적용
■ Length ( DDL )
- Table Column의 Length 를 지정 ( Default : 255 )
- DDL이므로 JPA Option이 Create거나, 처음 실행시에만 적용
🚩 @ColumnDefault
📝 설명
- Column의 내용이 설정되지 않으면 자동으로 입력되는 값을 설정
- ❗ ) 항상 쌍따옴표 안에 홑따옴표를 넣어줘야 한다. 아니면 DDL 오류로 인해 Table이 제대로 생성되지 않는다.
→ @ColumnDefault(" ' ' ")
🚩 @Enumerated
📝 설명
🔨 설정 옵션 ( Value )
■ EnumType.ORDINAL ( Default )
- Enum의 순서를 Database에 저장, 자료형은 Integer
- Enum의 순서에 따르므로 Enum을 수정할때 주의
■ EnumType.STRING
- Enum의 이름를 Database에 저장, 자료형은 String
- Enum의 이름을 따르므로 Enum 수정시에도 문제 없음
🚩 @CreatedDate & @LastModifiedDate
두 개의 Annotation은 JPA에서 기본적으로 시간을 자동으로 기록해주는 Annotation이다.
위 두개의 Annotation을 사용하기 위해서는 사전작업이 필요하다.
🔨 사전 작업
■ Spring Boot Main 함수에 @EnableJpaAuditing Annotation 추가
SpringBootApplication
@ImportResource({"classpath:/egovframework/springmvc/dispatcher-servlet.xml", "classpath*:/egovframework/spring/context-*.xml"})
@Import(EgovBootInitialization.class)
@ComponentScan(basePackages = {"com.*.boot"})
@EntityScan(basePackages = {"com.*.boot.domain"})
@EnableJpaRepositories(basePackages = {"com.*.boot.repository"})
@EnableJpaAuditing
public class EgovBootApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(EgovBootApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF);
springApplication.setLogStartupInfo(false);
springApplication.run(args);
}
}
■ BaseTime Class 추가
Entity가 존재하는 Package에 BaseTime Class를 추가한다.
이름은 다른것으로 지어도 무방하다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTime {
@CreatedDate
private LocalDateTime createdTime;
@LastModifiedDate
private LocalDateTime updatedTime;
}
- @MappedSuperclass Annotation이 Class에 붙게되면 Entity로 인식하지 않고 추상 클래스로 인식된다.
■ 기존 Entity Class에서 BaseTime Class 상속
@Entity(name = "user_info")
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
public class UserInfo extends BaseTime {
...
}
- 사전 작업이 끝나면 @CreatedDate & @LastModifiedDate Annotation에 따라서 자동으로 시간이 기록된다.
📝 @CreatedDate
- Entity를 이용한 Data가 생성( Insert )될때 해당 Field에 현재시간을 자동으로 기록
📝 @LastModifiedDate
- Entity를 이용한 Data가 수정( Update )될때 해당 Field에 현재시간을 자동으로 기록
📌 마무리
Spring Data JPA를 사용하여 프로젝트를 진행하면서 주요하게 사용하였던 Annotation에 대해서 정리하였다. 더 많은 Annotation이 있지만 현재로서 가장 많이, 가장 주요하게 사용하였던 것들만 적었다. 연관 관계에 필요한 Annotation들은 생각외로 양이 좀 있어서 따로 정리가 필요할 것 같아서 적지 않았다. 이글에 적힌 것들 및 옵션만 제대로 숙지해도 개발할 때 큰 문제가 생기진 않을 것 같다.