Computer Engineering/Java & Spring

[spring] 스프링 빈과 의존관계1 - 컴포넌트 스캔으로 자동 의존관계 설정

soohey 2022. 5. 18. 22:19

김영한님의 인프런 스프링 강의 리뷰입니다. XD

 

 

스프링 빈을 등록하고 의존관계 설정하기

회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있도록 의존관계를 준비하자.
"회원 컨트롤러에 의존관계 추가"

package hello.hellospring.controller;

import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

    //스프링 컨테이너에 등록하여 1개만 생성
    private final MemberService memberService;


    //의존관계 주입
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

}

 

 

스프링 빈을 등록하는 두가지 방법이 있습니다.

  • 컴포넌트 스캔과 자동 의존관계 설정 (애노테이션을 사용합니다.)
  • 자바 코드로 직접 스프링 빈 등록하기

 

이번에는 컴포넌트 스캔으로 의존관계를 자동으로 설정하는 방법을 다룹니다.

어노테이션을 사용하면 컨테이너에 객체로 자동으로 등록이 됩니다.

아래는 어노테이션 종류입니다.

  • @Component : 스프링빈이 자동 등록된다.
  • @Controller : 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.

 

@Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록됩니다.

  • @Controller : 컨트롤러라는 객체를 만들어서 컨테이너에 등록하도록 한다. ( 이를 스프링 빈이 관리된다고 함 )
  • @Service
  • @Repository
  • @Autowired : 연관관계를 만들어서 연결을 시켜주는 역할을 한다. 
    • ex) Controller가 memberService를 사용할 수 있게 해줌
    • ex) memberService가 memberRepository를 사용할 수 있게 해줌

 

컨트롤러에서 외부의 요청을 받고, 서비스에서 비즈니스 로직을 짜고, 리포지토리에서 데이터를 저장하는 것이 스프링의 정형화된 패턴입니다.

 

만약 다른 패키지에서 어노테이션으로 스프링 빈을 등록할 수 있을까?

일반적으로 불가능합니다. 메인 어플리케이션에서 package 하위에 있는 어노테이션만 컨테이너가 찾아 돌립니다.

그러므로 다른 패키지에 어노테이션을 등록해도 컴포넌트 스캔이 불가능합니다. ( 하지만 따로 설정할 수는 있음 )

 


참고 : 스프링은 스프링 컨테이너에 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록합니다.

(유일하게 하나만 등록해서 공유한다)
따라서 같은 스프링 빈이면 모두 같은 인스턴스입니다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용합니다.