본문 바로가기
Java/JPA

[SpringBoot_JPA_1] @NoArgsConstructor

by HJ0216 2023. 5. 30.

이 글은 김영한의 [실전! 스프링 부트와 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: 엔티티 클래스의 메타데이터를 조사하여 객체와 데이터베이스 간의 매핑을 구성

 

 

 

참고 자료

 

자주 사용되는 lombok, 주의 사항 | devk0ng's blog

@Getter, @Setter : 말그대로 getter, setter method를 생성해주는 놈이야! AccessLevel을 명시해줌으로써 접근제한자를 지정 해 줄 수 있어. 123456789public Class Sample { @Getter private String attr1; @Getter(AccessLevel.PRIVATE)

devk0ng.github.io

 

@NoargsConstructor(AccessLevel.PROTECTED) 와 @Builder

@NoargsConstructor(AccessLevel.PROTECTED) 와 @Builder를 함께 사용할때 주의할 점에 대해서 서술합니다. "왜" 안되는지와 "왜" 이렇게 해결 할 수 있는지에 대해 집중하여 서술합니다. 1. 왜 NoargsConstructor(Access

cobbybb.tistory.com

 

'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