Spring Data JPA - 기본 Annotation

몽루문·2023년 2월 15일
1

Spring Data JPA

목록 보기
2/7
post-thumbnail

📝 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


📝 설명

  • @Id인 식별자의 생성 전략

🔨 생성 전략 ( 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


📝 설명

  • Field의 자료형이 Enum일때 사용

🔨 설정 옵션 ( 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들은 생각외로 양이 좀 있어서 따로 정리가 필요할 것 같아서 적지 않았다. 이글에 적힌 것들 및 옵션만 제대로 숙지해도 개발할 때 큰 문제가 생기진 않을 것 같다.

profile
알고 있는 것을 정리하고, 새로운 것을 알기위해 끄적이는곳..

0개의 댓글