자주 사용하는 어노테이션
- @NoArgsConstructor
- @AllArgsConstructor
- @RequiredArgsConstructor
에 대해 정리했습니다.
3개 모두 Lombok에서 제공하는 어노테이션이다.
Lombok 생성자 관련 어노테이션의 주요 특징
- 코드 간결성 + 가독성
- 유지보수 용이성
- 새 필드를 추가했을 때, 생성자 코드를 일일이 수정할 필요 없이 자동으로 반영된다.
- Lombok이 컴파일 시점에 자동으로 생성자 코드를 생성해주기 때문에 실수 가능성을 줄여준다.
3. 불변 객체 설계에 용이
- @RequiredArgsConstructor는 final 필드 기반으로 생성자를 만들어주기 때문에, 불변 객체 설계에 적합하다.
- 불변성을 유지하면서도 의존성 주입(DI) 시 깔끔하게 사용 가능하다.
1️⃣ @NoArgsConstructor : 기본 생성자(아무 인자 없는 생성자)를 만듦
📌 JPA 엔티티에서는 기본 생성자가 꼭 필요하기에 @NoArgsConstructor 가 꼭 필요하다.
Hibernate가 객체를 DB에서 조회할 때 리플렉션(Reflection) 으로 인스턴스를 만들기 때문에 기본 생성자가 필수!
@NoArgsConstructor
public class User {
private String name;
private int age;
}
public User() {}
2️⃣ @AllArgsConstructor : 모든 필드를 매개변수로 받는 생성자를 만듦
@AllArgsConstructor
public class User {
private String name;
private int age;
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
3️⃣ @RequiredArgsConstructor : 필수(final or @NonNull) 필드만 가지고 생성자를 만듦
@Autowired를 붙일 필요 없이 @RequiredArgsConstructor + final 필드 조합으로 스프링이 알아서 생성자를 통해 주입한다.
@RequiredArgsConstructor
public class CartServiceImpl implements CartService {
private final CartRepository cartRepository;
private final CartItemRepository cartItemRepository;
private final MenuItemRepository menuItemRepository;
private final UserRepository userRepository;
}
→ Lombok이 다음과 같은 생성자를 자동으로 생성해준다.
public CartServiceImpl(CartRepository cartRepository,
CartItemRepository cartItemRepository,
MenuItemRepository menuItemRepository,
UserRepository userRepository) {
this.cartRepository = cartRepository;
this.cartItemRepository = cartItemRepository;
this.menuItemRepository = menuItemRepository;
this.userRepository = userRepository;
}
📌 주로 Spring의 @Service, @Controller 등과 함께 사용된다.
→ @Autowired 없이 생성자 주입 방식을 자동으로 만들어주는 것.
(즉, DI(Dependency Injection) 편리하게 하는 용도)
정리
| @NoArgsConstructor | 기본 생성자 | 없음 | JPA Entity 등 |
| @AllArgsConstructor | 전체 필드 포함 | 모든 필드 | DTO, VO 등 |
| @RequiredArgsConstructor | 필수 필드 포함 | final 또는 @NonNull | Spring Bean, Service 등 |
'Spring' 카테고리의 다른 글
| DB 동시성 문제 어떤 경우에 발생할까요? DB Lock의 종류 (0) | 2025.11.21 |
|---|---|
| @Transactional(readOnly =true) 하는 이유 (0) | 2025.10.18 |
| Dto와 @Builder에 대하여 (0) | 2025.10.06 |
| @ModelAttribute 언제 사용할까? (0) | 2025.03.24 |
| HTTP 상태코드에 대해 설명해주세요. (0) | 2024.08.29 |