본문 바로가기
공부/Spring

[스프링 입문](3) 스프링 빈과 의존관계

by 다음에바꿔야지 2024. 1. 6.

컨트롤러가 서비스와 리포지토리를 사용할 수 있도록 해야한다.

이를 위해 컨트롤러에 서비스와 리포지토리의 의존관계를 추가한다.

 

package hello.hellospring.controller;
 import hello.hellospring.service.MemberService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 @Controller
 public class MemberController {
     private final MemberService memberService;
     
     @Autowired
     public MemberController(MemberService memberService) {
         this.memberService = memberService;
     }
}

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.

이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection), 의존성 주입이라고 한다.

 

하지만 아직 memberService가 스프링 빈으로 등록되어 있지 않아, 스프링 빈으로 등록이 필요하다.

 

<스프링 빈을 등록하는 2가지 방법>

* 컴포넌트 스캔과 자동 의존관계 설정

* 자바 코드로 직접 스프링 빈 등록

 

* 컴포넌트 스캔 원리

@Component 가 있으면 스프링 빈으로 자동 등록된다.

-> @Controller, @Service, @Repository 는 모두 내부에 @Component를 포함하고 있어 스프링 빈으로 자동 등록된다.

 

회원 서비스와 회원 리포지토리에 각각 @Service, @Repository를 넣어 스프링 빈으로 등록했다.

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

 

* 자바 코드로 직접 스프링 빈 등록하기

애노테이션을 제거하고 직접 등록하는 방법이다.

package hello.hellospring;
 import hello.hellospring.repository.MemberRepository;
 import hello.hellospring.repository.MemoryMemberRepository;
 import hello.hellospring.service.MemberService;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 @Configuration
 public class SpringConfig {
     @Bean
     public MemberService memberService() {
         return new MemberService(memberRepository());
     }
     @Bean
     public MemberRepository memberRepository() {
         return new MemoryMemberRepository();
     }
}