롬복 @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor 어노테이션 알아보기

2024. 1. 15. 13:00백엔드/Spring Boot

스프링으로 개발을 하다 보면 생성자를 자동으로 생성해 주는 @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor 어노테이션을 자주 쓰게 되는데 이번 게시글에서는 이것들이 어떤 기능을 가지고 있는지 알아보려고 합니다. 

 

 

👀 간단하게 표로 확인해 보자

어노테이션 기능
@AllArgsConstructor 내부에 선언된 모든 필드 값을 파라미터로 받는 생성자를 생성
@NoArgsConstructor 파라미터가 없는 생성자를 생성한다
@RequiredArgsConstructor final이나 @NotNull로 선언된 필드만을 파라미터로 받는 생성자를 생성한다

 

 


 

 

# @AllArgsConstructor

  • 클래스의 모든 필드 값을 파라미터로 받는 생성자를 자동으로 생성하여 클래스의 모든 필드를 한 번에 초기화 
  • 선언된 필드의 순서대로 생성자를 생성

장점

  • 어노테이션 하나로 코드가 간결해져 가독성이 좋다. 
  • 생성자를 직접 생성하는 경우 파라미터가 추가되는 경우 수정이 필요하지만 해당 어노테이션을 쓰면 파라미터가 추가되어도 변경을 할 부분이 없어 유지보수측면에서 좋다. 

단점 

  • 필드 순서가 변경되는 경우 객체를 생성하는 코드를 수정해줘야 한다.
  • 필드 순서가 변경되는 경우 오류가 발생할 수 있다. 

 

🧑‍💻 적용 전/후를 코드로 비교해 보자

적용 전

public class Dog {
    private String name;
    private String age;
    private String breed;

    public Dog(String name, String age, String breed) {
        this.name = name;
        this.age = age;
        this.breed = breed;
    }
}

적용 후

@AllArgsConstructor
public class Dog {
    private String name;
    private String age;
    private String breed;
}

 

 

 

 

 

# @NoArgsConstructor

  • 파라미터가 없는 디폴트 생성자를 자동으로 생성
  • 필드에 final이 붙는 경우 에러 발생
    • @NoArgsConstructor(force = true|false) 설정으로 초기화 (true인 경우 0, false, null로 초기화)
    • @NonNull의 경우 개발자가 직접 초기화하는 코드를 추가해야 한다. 

장점

  • 기본 생성자를 자동으로 생성해 줘 코드가 간결해진다. 
  • access = AccessLevel.PROTECTED 속성을 이용하여 무분별한 객체 생성을 막아준다.

단점

  • 필드 중 기본값을 가져야 하는 경우 초기화 로직이 빠질 수 있다. 

 

🧑‍💻 적용 전/후를 코드로 비교해 보자

적용 전

public class Dog {
    private String name;
    private String age;
    private String breed;

    public Dog() {

    }
}

적용 후

@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Dog {
    private String name;
    private String age;
    private String breed;
}

 

 

 

 

 

# @RequiredArgsConstructor

  • final이나 @NonNull으로 선언된 필드만을 파라미터로 받는 생성자를 자동으로 생성
  • 주로 의존성 주입 편의를 위해 사용 

장점

  • @Autowired 어노테이션 없이도 의존성 주입이 가능하다.
  • 생성자 어노테이션을 사용 시 순환 참조 발생 시 Exception 발생하여 테스트 단계에서 순환 참조 이슈를 파악할 수 있다. 

단점 

  • @Value 값을 final로 선언한 경우 Bean으로 주입받게 되어 오류가 발생할 수 있다. 

 

🧑‍💻 적용 전/후를 코드로 비교해 보자

적용 전

public class Dog {
    private final String name;
    private final String age;
    private String breed;

    public Dog(String name, String age) {
        this.name = name;
        this.age = age;
    }
}

적용 후

@RequiredArgsConstructor
public class Dog {
    private final String name;
    private final String age;
    private String breed;
}

 

 

 

 

 

 

'백엔드 > Spring Boot' 카테고리의 다른 글

Spring boot Exception Handling  (1) 2024.01.17
Spring Validation(유효성 검사)에 대하여 알아보기  (0) 2024.01.15
SOLID 원칙  (2) 2024.01.10
디자인 패턴과 SOLID 원칙  (3) 2024.01.09
[Spring Security] 세션 제어하기  (0) 2024.01.04