728x90

들어가며


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;
}

 

+ Recent posts