본문 바로가기
Web/spring study

[Spring] 스프링 빈 자바 코드로 수동 등록(@Configuration, ApplicationContext)

by 장인이 2023. 1. 9.

0. 개요

 이번 게시물에서는 스프링 컨테이너에 스프링 빈을 자바 코드(직접 만든 DI 컨테이너)로 추가하는 방법에 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다.

(스프링 빈과 스프링 컨테이너)

 

1. AppConfig 스프링 기반 변경

모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고
https://imgzon.tistory.com/114

우선 예시 프로젝트에서 사용할 DI 컨테이너를 작성해보자.

 

public class AppConfig {
    public MemberService memberService() {
    	return new MemberServiceImpl(memberRepository());
    }
    
    public OrderService orderService() {
    	return new OrderServiceImpl(memberRepository(),discountPolicy());
    }
    
    public MemberRepository memberRepository() {
    	return new MemoryMemberRepository();
    }
    
    public DiscountPolicy discountPolicy() {
    	return new FixDiscountPolicy();
    }
}

위 코드는 예시 프로젝트의 클래스들에 의존관계 주입을 해주는 DI 컨테이너이다.

(IOC, DI 컨테이너)

 

이제 이 코드에 어노테이션을 붙여서, 스프링 컨테이너에 빈으로 등록시켜보자.

 

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
    	return new MemberServiceImpl(memberRepository());
    }
    
    @Bean
    public OrderService orderService() {
    	return new OrderServiceImpl(memberRepository(),discountPolicy());
    }
    
    @Bean
    public MemberRepository memberRepository() {
    	return new MemoryMemberRepository();
    }
    
    @Bean
    public DiscountPolicy discountPolicy() {
    	return new FixDiscountPolicy();
    }
}

 클래스 위에 @Configuration 어노테이션을 붙이면, 이제 스프링에서 이 클래스를 스프링 설정 정보로 인식한다. 참고로 스프링 빈이 싱글톤을 유지하도록 추가 처리를 해주기도 한다.

 

 그리고 인스턴스를 생성하는 메서드 위에 @Bean 을 붙여주면 된다.

(참고로 @Bean은 메서드나 어노테이션 위에만 붙일 수 있다.)

 

 

2. 스프링 컨테이너 생성

//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

 여기서 ApplicationContext를 스프링 컨테이너라고 하며, 이는 인터페이스이다. 스프링 컨테이너는 자바 코드, xml 등 다양한 형식의 설정 정보를 받아드릴 수 있게 설계되어 있다.

 

<다양한 설정 형식 지원>

 여기서는 우리가 방금 만든 AppConfig 클래스를 이용할 것이므로 new AnnotationConfigApplicationContext(AppConfig.class); 구현체를 사용해보자.

 

3. 스프링 컨테이너의 생성 과정

1) 스프링 컨테이너 생성

스프링 컨테이너 생성 시 구성 정보를 지정해 주어야 하는데, 여기서는 AppConfig.class를 구성 정보로 지정했다.

 

2) 스프링 빈 등록

파라미터로 넘어온 AppConfig.class의 정보를 사용해서 스프링 빈을 등록한다.

이때, 빈 이름은 메서드 이름을 사용한다.

 

3. 스프링 빈 의존관계 설정

설정 정보를 참고하여 의존관계를 주입한다.

 

 스프링 빈과 스프링 컨테이너 게시글에서도 언급한 내용이지만, 빈 생성의존관계 주입하는 단계가 나누어져 있기는 하다. 하지만, 이렇게 자바 코드로 빈을 등록하면 생성자를 호출하면서 의존관계 주입(DI)도 한번에 처리된다.(인스턴스를 생성해야 하므로)

 

 

4. 스프링 빈 수동 등록

public class MemberApp {
	
    public static void main(String[] args) {
    	ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
    }
}

실제로 잘 사용하는 방식은 아니지만, ApplicationContext를 직접 호출한 후 수동으로 빈을 등록해줄 수 있다.

 

 

5. @ComponentScan

 @ComponentScan 활용시 자동 스캔을 통해 빈 등록을 할 수 있다. 이와 관련해서는 아래 게시물을 참고 바란다.

https://imgzon.tistory.com/117

 

 


위 내용은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

댓글