의존성 주입 애노테이션 종류 알아보기
Spring Boot에서 의존성 주입을 위해 Lombok 라이브러리에서 제공하는 어노테이션인 @RequiredArgsConstructor, @AllArgsConstructor, @NoArgsConstructor를 활용하면 코드가 간결해지고 다양한 생성자 주입 방식을 선택할 수 있습니다. 각 어노테이션의 역할과 생성자 주입 방식은 다음과 같습니다.
@RequiredArgsConstructor
-
@RequiredArgsConstructor
는final
또는@NonNull
로 선언된 필드에 대한 생성자를 자동으로 생성합니다. -
의존성 주입이 필요한 필드를
final
로 지정하면 해당 필드만 초기화하는 생성자를 Lombok 이 만들어줍니다. -
서비스나 리포지토리 클래스에서 필드 의존성 주입 시, 필요하지 않은 필드까지 초기화하는 오버헤드를 줄이고 싶을 때 사용합니다.
@Service @RequiredArgsConstructor public class MyService { private final MyRepository repository; private final MyOtherService otherService; @NonNull private String nonNullString; private String justString; // repository와 otherService, nonNullString 필드에 대한 생성자가 자동으로 생성됩니다. // justString 에 대해서는 생성되지 않습니다. }
@AllArgsConstructor
@AllArgsConstructor
는 모든 필드를 파라미터로 받는 생성자를 생성합니다.- 클래스의 모든 필드에 대해 초기화할 수 있는 생성자를 자동으로 만들어주기 때문에, 초기화가 필요한 모든 필드 값을 외부에서 전달할 수 있습니다.
- 테스트 코드나 특정 객체의 모든 필드를 초기화해야 하는 경우에 유용합니다. 다만, 스프링에서 생성자 주입으로 사용할 경우 주입할 필요 없는 필드까지 포함될 수 있어 자주 사용되지는 않습니다.
@Service
@AllArgsConstructor
public class MyService {
private MyRepository repository;
private MyOtherService otherService;
private String serviceName;
// repository, otherService, serviceName 모두를 파라미터로 받는 생성자가 생성됩니다.
}
@NoArgsConstructor
@NoArgsConstructor
는 기본 생성자를 자동으로 생성합니다. 파라미터가 없는 생성자를 만들어주기 때문에 기본 초기화가 필요할 때 유용합니다.- 기본적으로 인스턴스를 만들기 위해 필요한 매개변수가 없을 때 사용됩니다. 스프링에서 빈을 생성할 때 매개변수가 없는 기본 생성자가 필요할 경우에 사용됩니다.
- JPA 엔티티 클래스에서 기본 생성자가 반드시 필요하기 때문에 JPA 엔티티 클래스에 자주 사용됩니다. JPA의 프록시를 통해 엔티티를 초기화할 때 필요합니다.
@Entity
@NoArgsConstructor
public class MyEntity {
@Id
private Long id;
private String name;
// 기본 생성자가 자동으로 생성됩니다.
}
비교 요약
어노테이션 | 생성자 역할 | 사용 용도 |
---|---|---|
@RequiredArgsConstructor |
final 및 @NonNull 필드만 초기화 생성자 생성 | 주로 서비스, 리포지토리 등의 생성자 주입 시 사용 |
@AllArgsConstructor |
모든 필드를 초기화하는 생성자 생성 | 모든 필드를 초기화해야 할 때 (테스트 등에서 사용) |
@NoArgsConstructor |
기본 생성자 생성 | JPA 엔티티에서 필수, 기본 초기화가 필요할 때 사용 |
반응형
'WEB > Spring' 카테고리의 다른 글
TDD(테스트 주도 개발, Test-Driven Development), Junit (0) | 2024.11.05 |
---|---|
[Spring] 의존관계 주입(Dependency Injection) 개념과 Bean 중복방지 (0) | 2023.12.14 |
[Spring] @ComponentScan, Bean 객체 관리하기 (0) | 2023.12.14 |
[Spring] @Configuration과 싱글톤 패턴의 관계 (0) | 2023.12.13 |
[Spring] 싱글톤 패턴과 싱글톤 컨테이너 개념 (1) | 2023.12.13 |
댓글