Home 스프링 빈과 의존관계
Post
Cancel

스프링 빈과 의존관계

스프링 빈 등록, 의존관계 설정

@Controller 어노테이션을 사용하면 스프링 컨테이너에 Controller객체를 생성해서 넣는다. = 스프링 컨테이너에서 스프링 빈이 관리된다.

생성자에 @Autowired 어노테이션을 사용하면 스프링 빈에 등록되어있는 객체를 가져다 넣어준다.

@Autowired를 이용하기 위해서는 서비스클래스에는 @Service, 리포지토리클래스에는 @Repository 어노테이션을 사용해 @Controller와 같이 스프링 빈으로 등록해주어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Controller
public class MemberController{
	private final MemberService memberService;
	
	/*= new MemberService()로 하는 대신 스프링 빈에서 관리를 해주면 무엇이 좋냐.
	MemberService는 MemberController뿐 아니라 주문컨트롤러 등에서도 쓰일수 있다.
	매번 호출하는 것 보다 스프링 빈에 한번 등록하고 가져다쓰면 장점이 많다. 장점은 추후.
	*/
	
	@Autowired
	public MemberController(MemberService memberService){
		this.memberService = memberService;
	}
	
	//@Service로 스프링 빈에 등록해놓지 않으면 가져와지지 않는다.
}

** 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다. 따라서 스프링 빈이면 모두 같은 인스턴스이다.

  • 스프링 빈을 등록하는 2가지 방법
    • 위의 방법이 Component 스캔과 자동 의존관계 설정 -> 어노테이션을 이용
    • 자바코드로 직접 스프링 빈 등록하기
  • Service.SpringConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration  
public class SpringConfig {  
  
    @Bean  
	public MemberService memberService(){  
        return new MemberService(memberRepository());  
	}  
  
    @Bean  
	public MemberRepository memberRepository(){  
        return new MemoryMemberRepository();  
	}  
}

@Configuration 어노테이션과 @Bean 어노테이션을 이용해 Bean을 등록하고 스프링 빈에 있는 객체를 가져오는 의존관계를 주입할 수도 있다.

** @Autowired를 통한 DI(Dependency Injection - 의존관계 주입)는 Controller나 Service같이 스프링이 관리하는 객체에서만 동작한다.

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드에는 컴포넌트 스캔을 활용하지만

정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

This post is licensed under CC BY 4.0 by the author.