롬복 @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 |