스프링 빈과 의존관계 - 컴포넌트 스캔과 자동 의존관계 설정

myeonji·2022년 1월 25일
1

Spring

목록 보기
3/22


스프링 컨테이너 내의 스프링 빈으로 등록하기 위한 방법에는 두 가지가 있습니다.

  1. 컴포넌트 스캔과 자동 의존관계 설정
  2. 자바 코드로 직접 스프링 빈 등록하기

오늘은 컴포넌트 스캔과 자동 의존관계 설정에 대해 알아보겠습니다.

컴포넌트 스캔은 @Component 어노테이션이 있으면 스프링 빈으로 자동 등록됨을 말합니다.

@Controller, @Service, @Repository 어노테이션 모두 @Component를 포함하고 있기 때문에 이 세 개의 어노테이션도 스프링 빈으로 자동 등록 되게 됩니다.

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

회원 컨트롤러와 회원 서비스, 회원 리포지토리를 사용하여 구현해보겠습니다.

< MemberController >

@Controller
public class MemberController {
  private final MemberService memberService;
  
  @Autowired
  public MemberController(MemberService memberService) {
    this.memberService = memberService;
 }
}

컨트롤러에는 @Controller 어노테이션을 등록해줘야 합니다.

그래야 스프링 빈으로 자동 등록이 되어 스프링이 관리하게 됩니다. 즉, 스프링 컨테이너에 MemberController가 생성되는 것입니다.

이때 MemberService와 MemberRepository를 사용하기 위해서는 의존 관계가 필요합니다.

MemberController -> MemberService -> MemberRepository 순으로 의존 관계를 맺습니다.

위의 MemberController 코드를 보면 생성자에 @Autowired 어노테이션이 있는 것을 확인할 수 있는데 이는 스프링이 스프링 컨테이너에 있는 MemberService를 가져와서 MemberController에 연결시킨다는 것을 의미합니다. 이렇게 객체 의존관계를 외부에서 찾아 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라고 합니다.

@Autowired 어노테이션에 의해 스프링이 주입해주게 되는 것이죠.

하지만 위처럼 의존관계를 맺기 위해서는 MemberService 또한 스프링 컨테이너 안의 스프링 빈으로 등록되어 있어야 합니다.

그래야지 스프링이 스프링 컨테이너에서 MemberService를 찾아 MemberController에게 주입시킬 수 있기 때문입니다.

< MemberService >

@Service
public class MemberService {
 private final MemberRepository memberRepository;
  
 @Autowired
 public MemberService(MemberRepository memberRepository) {
 this.memberRepository = memberRepository;
 }
}

이처럼 @Service로 MemberService 또한 스프링 빈으로 등록하였습니다. 이제 MemberService는 MemberRepository와 의존관계를 맺어야 합니다. 따라서 생성자에 @Autowired를 사용하여 객체 생성 시점에 스프링 컨테이너에서 MemberRepository 를 찾아 주입하도록 하였습니다.

< MemberRepository >

@Repository
public implement MemberRepository implements MemberRepository {}

참고

스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 싱글톤이 기본입니다. (스프링 컨테이너에 하나만 등록하고 공유함을 말합니다.) 따라서 같은 스프링 빈이면 모두 같은 인스턴스 입니다.

0개의 댓글