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

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 {}

참고

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

profile
개발하는 DBA 입니다 !!

0개의 댓글

관련 채용 정보