[spring] 스프링 빈 등록하기 - @Configuration, @ComponentScan

괭이밥·2022년 11월 5일

spring

목록 보기
2/10

목차

  1. 애노테이션 기반 스프링 빈 등록
  2. 예제 파일
  3. 스프링 빈 등록 - @Configuration
  4. 스프링 빈 등록 - @ComponentScan

📌 애노테이션 기반 스프링 빈 등록

스프링 빈을 등록하는 방법은 여러가지가 있다. 가장 대표적으로 사용하는 애노테이션 기반 스프링 빈 등록에 대해 알아보자.

스프링 빈 등록한 빈은 AnnotationConfigApplicationContext를 통해 조회하고 사용할 수 있다.
스프링 빈 조회하기

자바 클래스로 설정 정보 파일 만들기

설정 정보 파일은 두 가지 방법이 있다.

1. 수동 등록 - @Configuration

  • 스프링에게 설정 정보 파일 알리기: 설정 정보 클래스에 @Configuration을 추가한다.
  • 스프링 빈 추가: 설정 정보 클래스에 객체를 생성하는 메서드를 만들고 그 위에 @Bean을 추가한다.
  • 의존 관계 주입: 객체의 생성자를 통해 주입한다.

2. 자동 등록 - @ComponentScan

  • 스프링에게 설정 정보 파일 알리기: 설정 정보 클래스에 @ComponentScan을 추가한다.
  • 스프링 빈 추가: 객체 클래스에 @Component를 추가한다.
  • 의존 관계 주입: @Autowired를 통한 자동 의존관계 주입을 주로 사용한다.

@Configuration@Component
@Configuration파일을 보면 @Component가 붙어있는 것을 볼 수 있다. 즉, @Configuration도 컴포넌트 스캔 대상이라는 것이다. 그렇다면 차이점은 무엇일까? @Configuration의 경우 클래스 파일을 스프링 컨테이너에 빈을 등록하는데 이때 클래스 파일을 프록시로 만들어 등록한다.



예제 코드

간단하게 두 개의 클래스를 스프링 빈에 등록하겠다.

  • MyBean은 인터페이스이다.
    • MyBean의 구현체로 RedMyBean, GreenMyBean이 있다.
    • 스프링 빈으로 GreenMyBean으로 등록할 것이다.
  • MyRepository는 인터페이스이다.
    • 구현체로 MemoryMyRepository가 있다.
    • MemoryMyRepository는 MyBean을 호출한다. -> 의존관계 주입 일어남

예제 클래스 다이어그램



🍃 스프링 빈 등록 - @Configuration

스프링에게 설정 정보 파일 알리기

  • 내가 만든 설정 정보 클래스 : AppConfig
  • 스프링 컨테이너에게 설정 정보 알리기 : @Configuration 추가
    • 스프링 컨테이너는 @Configuration 붙은 클래스를 설정 정보로 사용한다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //추가
public class AppConfig {

}

스프링 빈 추가

  • 빈 등록하기 : @Bean 붙은 메서드 추가한다.
    • @Configuration 붙은 클래스에 @Bean 붙은 메서드를 통해 스프링 빈이 등록된다.
  • 빈 이름
    • 기본 빈 이름은 메서드 이름이다.
    • 변경하고 싶다면 @Bean(name = "이름")을 통해 지정한다.
  • DIP를 위해 반환형은 주로 인터페이스로 한다.
@Configuration
public class AppConfig {

	//추가 - RedMyBean 스프링 빈으로 등록
    @Bean
    public MyBean myBean(){
      return new RedMyBean();  
    }

	//추가 - MyRepository 스프링 빈으로 등록
    @Bean
    public MyRepository myRepository(){
        return new MemoryMyRepository();
    }
}

의존관계 주입

  • 생성자 주입을 사용한다.
  • new를 통해 객체를 생성할 때 필요한 객체를 메서드를 통해 파라미터로 넘겨준다.
    @Bean
    public MyRepository myRepository(){
        return new MemoryMyRepository(myBean()); //파라미터로 넘겨줌
    }


🍃 스프링 빈 등록 - @ComponentScan

스프링에게 설정 정보 파일 알리기

  • 내가 만든 설정 정보 클래스 : AppConfig
  • 스프링 컨테이너에게 설정 정보 알리기 : @ComponentScan 추가

스프링 빈 추가

  • @Componentscan@Component가 붙은 클래스를 찾아 스프링 빈으로 등록한다.
  • 빈 이름은 기본적으로 클래스의 이름을 소문자로 바꾸어 사용한다.
    • 빈 이름을 지정하고 싶다면 @Component("이름")으로 바꿀 수 있다.
  • 경로는 기본적으로 @Componentscan가 붙은 파일이 위치한 곳부터 하위 폴더까지 탐색한다.
    • 경로를 따로 지정할 수 있다.
    • 탐색 시작할 패키지 지정
      • @ComponentScan(basePackages={"패키지 경로1","패키지 경로2"})
    • 탐색 시작할 클래스 지정
      • @ComponentScan(basePackageClasses= {클래스명1.class, 클래스명2.class})

컴포넌트 스캔 대상
아래는 @Component가 붙은 애노테이션이다. 즉, 컴포넌트 스캔 대상이라는 뜻이다. 기능에 따라 여러 애노테이션이 있다.

  • @Component
    • 컴포넌트 스캔대상
  • @Service
    • 코드에 @Component 붙어있음
    • 스프링 비즈니스 로직을 나타냄
  • @Controller
    • 코드에 @Component 붙어있음
    • 스프링 MVC 컨트롤러에서 사용
  • @Repository
    • 코드에 @Component 붙어있음
    • 스프링 데이터 접근 계층에서 사용
  • @Configuration
    • 코드에 @Component 붙어있음
    • 추가 스프링 설정 정보

예제

  • 여기서는 간단한 예제를 보일 것이므로 @Component만 사용한다.
//@Component 추가
@Component
public class RedMyBean implements MyBean {
}

//@Component 추가
@Component
public class MemoryMyRepository implements MyRepository {
	...
}

의존관계 자동 주입

@Component
public class MemoryMyRepository implements MyRepository {

    private final MyBean myBean;

	//생성자 자동 의존관계 주입
    @Autowired
    public MemoryMyRepository(MyBean myBean){
        this.myBean = myBean;
    }
}


출처
인프런 '스프링 핵심 원리 - 기본편' 강의

profile
개발도 하고 싶은 클라우드 엔지니어

0개의 댓글