2024. 9. 8. 21:30ㆍSpring
@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한테 물어보는게 편할 것 같다
'Spring' 카테고리의 다른 글
스프링 3 이상 Multipart Config 설정 (0) | 2024.07.30 |
---|---|
Spring Security JWTFilter에서 Exception 처리하기 (4) | 2024.07.28 |
@EnableWebMvc와 WebMvcConfigurer (0) | 2024.06.25 |