들어가며
5편에서는 IoC컨테이너(스프링 컨테이너)를 통해 Config창을 따로 두어 역할 분리를 했습니다.
또한, @Configuration과 @Bean을 통해 빈 저장소를 만들고 빈을 생성했습니다.
그러나 Bean을 각각 지정해야하는 불편함이 있음을 알았고 이를 해결하기 위한 방법을 공부하려고 합니다.
컴포넌트 스캔
@ComponentScan(스캐너), @Component(바코드)
업무를 하다보면 비즈니스 로직을 구성한 뒤에 따로 설정 정보를 입력하기가 매우 귀찮다. 그래서 비즈니스 로직 창에 @Component을 달면 설정창의 ComponentScan이 알아서 찾아 등록해준다.
그렇지만 장점에는 단점도 항상 존재한다.
편리하고 유연한 대신에 설정창에서 명시적으로 빈의 역할을 확인할 수 있던 것과 달리 직접 확인이 어렵다. 또한, 대규모 프로젝트에서 오버헤드가 발생하기도 한다.
컴포넌트 스캔(Component Scanning)은 스프링이 자동으로 빈(Bean)을 찾아 등록하는 메커니즘 중 하나입니다. 스프링은 어플리케이션을 실행할 때, 특정 패키지 이하에서 @Component 및 관련 어노테이션들이 붙은 클래스를 찾아서 자동으로 빈으로 등록합니다.
@ComponentScan 어노테이션을 사용하면 @Component 외에도 @Controller, @Service, @Repository, @Configuration 등과 같은 특정 어노테이션이 붙은 클래스들도 스캔 대상에 포함된다.
package hello.core;
import ...
@Configuration
@ComponentScan
public class AutoAppConfig {
}
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
@ComponentScan, @Component를 통해 설정 정보 작성, 그리고 @Autowired를 통해 의존관계 주입.
탐색 위치 지정과 필터
위에서 말했듯, @ComponentScan을 사용시, 자동으로 등록해 대규모 프로젝트의 경우 오버헤드의 위험이 있다. 이 단점을 해결하기 위한 방법이 탐색 위치 지정 그리고 필터다.
탐색 위치 지정
basePackages를 통해 시작 위치를 설정하는 방법이 있다.
그러나 추천하는 방식은 프로젝트의 상단을 활용해 시작점을 두는 것이다.
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// configuration content here
}
필터
@Component, @Service, @Repository, @Controller 등 컴포넌트 등록할 대상과 제외할 대상을 구별할 수 있다.
롬복 lombok
컴포넌트 스캔을 통해 설정창을 간단하게 정리하고 비즈니스 로직을 구성하는 창에는 @Component와 @Autowired를 통해 자동으로 등록할 수 있게 하고 의존관계를 정리했다.
그리고 lombok을 이용하면 비즈니스 로직을 보다 간단하게 정리할 수 있다.
아래 코드를 보면,
OrderServiceImpl가 주문서비스를 의존해 생성자를 생성하기 위해 초기화하고 있다.
private final을 통해 불변하게 멤버저장소와 할인정책을 의존 가능하게 주입받고 있다.
이외에 생성과 관련된 코드는 @RequiredArgsConstructor을 통해 자동으로 진행된다.
롬복은 주로 클래스의 Getter, Setter, Equals 및 HashCode 메서드, ToString 메서드 등을 애노테이션을 사용하여 생성할 수 있게 해줍니다. 이로써 개발자는 이러한 반복적인 코드를 일일이 작성하지 않아도 됩니다. 여러 롬복 애노테이션 중에서 @Getter, @Setter, @ToString, @EqualsAndHashCode 등은 주로 빈 클래스에서 사용되며, 이는 주로 스프링의 컴포넌트 스캔과 함께 사용됩니다.
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
'Java Spring > Spring Framework' 카테고리의 다른 글
스프링 컨테이너와 싱글톤 컨테이너 Jav Spring 프레임워크의 기본 (5) (1) | 2023.11.29 |
---|---|
좋은 객체 지향 SOLID를 위한 config 구성창 Jav Spring 프레임워크의 기본 (4) (0) | 2023.11.28 |
회원 도메인 설계! Jav Spring 프레임워크의 기본 (3) (1) | 2023.11.27 |
JAVA는 객체 지향 프로그래밍? Jav Spring 프레임워크의 기본 (2) (0) | 2023.11.27 |
처음 자바 스프링을 공부한다면?Java Spring 프레임워크의 기본 (2) | 2023.11.26 |