Lombok이란 ?
Lombok은 자바에서 반복적으로 작성해야 하는 코드를 자동으로 생성해주는 라이브러리이다. 생성자, getter/setter, equals/hashCode, builder 등을 어노테이션 한 줄로 자동 생성할 수 있어 코드 양을 크게 줄이고 가독성을 높인다.
특히, Spring에서는 DI (의존성 주입)과 엔티티 생성에 필요한 생성자를 깔끔하게 만들어주기 때문에 거의 필수적으로 사용된다.
생성자 관련 어노테이션
Lombok은 총 3가지 생성자 어노테이션을 제공하며, 각 각 생성하는 생성자의 형태가 다르다.
1) @NoArgsConstructor
파라미터가 없는 기본 생성자를 만들어준다.
@NoArgsConstructor
public class User {
private String name;
private String email;
}
위 코드에서 `User()` 기본 생성자가 자동으로 생성된다.
2) @AllArgsConstructor
모든 필드를 매개변수로 받는 생성자를 만들어준다. 자동으로 `User(String name, String email)` 생성자가 생성된다.
@AllArgsConstructor
public class User {
private String name;
private String email;
}
언제 @NoArgsConstructor를 사용하고, 언제 @AllArgsConstructor를 사용할까 ?
`@NoArgsConstructor` 는 파라미터 없는 기본 생성자가 필요할 때 사용하며, JPA 엔티티처럼 프레임워크가 객체를 만들어야 하는 경우에 필수적이다. `@AllArgsConstructor` 는 모든 필드를 한 번에 넣어 객체를 만들 때 쓰며, 주로 DTO나 테스트 코드에서 편하게 사용된다. 엔티티에서는 `@AllArgsConstructor`를 거의 사용하지 않는다.
3) @RequiredArgsConstructor
`final` 필드 또는 `@NotNull` 이 붙은 필드만을 매개변수로 가지는 생성자를 만들어 준다.
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
위 경우 자동으로 아래 생성자가 만들어진다.
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
왜 final 필드만 포함되나 ?
final 필드는 한 번 초기화 되면 바꿀 수 없는 불변 필드이다. 반드시 생성자를 통해 값이 들어와야 객체가 완전하게 만들어진다. 그리고 @RequiredArgsConstructor는 이런 필드만 자동으로 생성자 매개변수에 넣어준다.
Repository를 생성자에 넣는 이유
서비스는 Repository 없이는 동작할 수 없다. 생성자를 통해 Repository를 전달하면 객체가 생성되는 시점에 반드시 값이 들어간다.
위의 코드의 경우 UserService가 사용자 정보 조회나 저장을 하려면 반드시 UserRepository가 필요하다. 생성자에 넣으면 객체 생성 시점에 반드시 주입되기 때문에 null이 될 일이 없다. final로 선언하면 한 번 초기화 후에 변경이 불가하다. 생성자를 통해 초기화하면, 이후 다른 코드에서 실수로 repository를 바꾸는 것을 방지할 수 있다.
'Spring' 카테고리의 다른 글
| [Spring] Spring AI와 LangChain4j 비교 (0) | 2025.11.24 |
|---|---|
| [Spring] 임베디드 타입 (@Embeddable, @Embedded) (0) | 2025.11.10 |
| [Spring] 데이터 유효성 검증 (Validation) 이해하기 (0) | 2025.11.04 |
| [Spring] DTO 활용 패턴 - toEntity(), from() 정적 팩토리 메서드 (0) | 2025.10.13 |
| [Spring] 외부 API 연동하기 (RestTemplate vs. WebClient vs. OpenFeign) (0) | 2025.10.05 |
