Entity 클래스에서 자주 사용하는 어노테이션

2024. 9. 8. 21:30Spring

@NoArgsConstructor(access = AccessLevel.PROTECTED)

JPA는 리플렉션을 통해 엔티티를 생성할 때 기본 생성자가 필요하지만, 일반적으로 직접 사용하지 않도록 접근제한자를 protected 또는 private 으로 설정한다.

리플렉션이란 ?

구체적인 Class Type을 알지 못하더라도 해당 Class의 method, type, variable들에 접근할 수 있도록 해주는 자바 API이며, 컴파일된 바이트 코드를 통해 Runtime에 동적으로 특정 Class의 정보를 추출할 수 있는 프로그래밍 기법이다.

리플렉션을 이용하여 객체의 필드값을 동적으로 읽어와서 JSON으로 직렬화 할 수 있다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

JPA 에서 기본 키 생성 전략을 정의

JPA는 기본 키를 자동으로 생성하는 여러 전략을 제공하는데 그 중GenerationType.IDENTITY 는 데이터베이스의 기능을 사용 하여 자동으로 값을 증가시킨다.

  • MySQL :AUTO_INCREMENT
  • PostgreSQL : SERIAL

@ManyToOne(fetch = FetchType.LAZY)

fetch란, 연관된 엔티티를 언제 로드할지 정한다.

JPA는 지연로딩즉시로딩 이렇게 두가지를 제공하는데, 그중

FetchType.LAZY 는 실제로 해당 필드에 접근할 때 로드하도록 지연 로딩을 설정한다.

  • 지연로딩 (Lazy Loading)
    • 연관된 엔티티가 실제로 필요할 때 로드된다.
    • 성능최적화를 위해서 사용한다.
    • 연관된 모든 데이터를 한 번에 로드하지 않아 쿼리성능을 개선할 수 있다.
  • 즉시로딩(Eager Loading)
    • 엔티티가 조회될때 연관된 엔티티도 함께 로드된다.
    • 불필요한 데이터 로드로 성능 저하

@OnDelete(action = OnDeleteAction.CASCADE)

데이터베이스 수준에서 외래 키 삭제 규칙을 정의한다.

CASCADE는 부모 엔티티가 삭제될 때 연관된 자식 엔티티도 자동으로 삭제한다.

cascade = CascadeType.REMOVE도 연관된 엔티티를 삭제하는 규칙을 정의할 수 있는데, @OnDelete와는 어떻게 다른걸까 ?

  • cascade = CascadeType.REMOVE
    • JPA 에 의해 처리된다.
    • 참조하고 있는 레코드 수 만큼 delete 쿼리가 발생한다.
    • 양방향 매핑이 아닌 이상 적용하기 어렵다.
  • OnDelete(action = OnDeleteAction.CASCADE)
    • 데이터베이스에 의해 처리된다.
    • DDL 생성시 cascade 제약 조건이 생성된다.
    • delete쿼리가 발생하지 않는다.
    • 단방향 매핑에서도 적용이 가능하다. 자식테이블의 부모 컬럼에 적용하면 된다.

@JsonFormat(pattern = "HH:mm")

JSON 직렬화 및 역직렬화 시 필드의 형식을 지정한다.

Pattern을 사용하여 원하는 형식으로 지정할 수 있다.

  • yyyy-MM-dd
  • MM/dd/yyyy
  • dd-MM-yyyy 등등.. 필요할땐 그때그때 gpt한테 물어보는게 편할 것 같다