이 글은 김영한의 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발]을 수강하며 정리한 글입니다.
🟦 기본 환경: IDE: IntelliJ, Language: Java
@NoArgsConstructor
: 파라미터가 없는 기본 생성자 생성
OPTION
- AccessLevel.PROTECTED
: 기본 생성자의 접근 제어 = PROTECTED
: 같은 pkg 또는 자식 class를 제외한 외부 클래스에서는 해당 객체의 인스턴스를 생성할 수 없음
- (default) AccessLevel.PUBLIC
: 기본 생성자의 접근 제어 = PUBLIC
: 모든 위치에서 접근 가능
@Entity를 통해서 기본생성자를 만들 수 있지만 @NoArgsConstructor를 통한 접근 제한을 지정함으로써 무분별한 기본 생성자의 생성을 막을 수 있음
= 모든 필드에 대한 값이 반드시 제공되어야만 클래스의 인스턴스를 생성할 수 있도록 제어
1
2
3
4
5
6
7
8
9
10
11
|
public class ExampleClass {
private String field1;
private int field2;
@NoArgsConstructor(AccessLevel.PROTECTED)
public ExampleClass(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
}
|
cs |
ExampleClass에 대한 @NoArgsConstructor를 선언함으로써 불완전한 객체 생성을 방지
1
2
3
|
ExampleClass example = new ExampleClass();
// 기본 생성자가 없으므로 Error 발생
|
cs |
⭐ 요약
* Class + @NoArgsConstructor: 기본 생성자 생성
* Constructor + @NoArgsConstructot: 해당 생성자 이외의 생성자는 생성되지 않음
cf. @Entity 선언 시, 생성자가 필요한 이유
: JPA에서 Entity Proxy를 만들기 위해서는 반드시 기본 생성자 하나를 생성해야 함
: Entity Proxy는 JPA의 지연 로딩(lazy loading) 기능을 구현하는 데 사용
1. 엔티티 클래스를 상속받아 프록시 클래스 생성
2. JPA는 리플렉션을 사용하여 프록시 객체를 생성
3. 프록시 객체는 엔티티의 실제 데이터를 지연해서 로딩
* JPA Reflection: 엔티티 클래스의 메타데이터를 조사하여 객체와 데이터베이스 간의 매핑을 구성
참고 자료
'Java > JPA' 카테고리의 다른 글
[SpringBoot_JPA_1] @PathVariable (0) | 2023.06.03 |
---|---|
[SpringBoot_JPA_1] TypedQuery (0) | 2023.06.02 |
[SpringBoot_JPA_1] @Transactional (0) | 2023.05.29 |
[SpringBoot_JPA_1] Dirty Checking & Merge (0) | 2023.05.28 |
[SpringBoot_JPA_1] StringUtils.hasText() (0) | 2023.05.27 |