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

stephanie·2022년 10월 9일
0

스프링 입문

목록 보기
12/13

스프링 빈을 등록하는 방법 (2)

  1. 자바 코드로 직접 스프링 빈 등록하기
    직접 설정 파일에 등록하는 방법!

hello.hellospring 하위에 SpringConfig class를 생성한다.
@Configuration annotation을 달아주고, MemberService와 MemberRepository에는 @Bean annotation을 달아준다.
=> 스프링이 올라올 때 MemberService와 MemberRepository 모두를 컨테이너에 가지고 오다.

** 컨트롤러는 컴포넌트 스캔을 활용해 스프링 빈에 등록한다.

  • 과거에는 자바 코드로 설정하지 않고, XML이라는 문서로 설정했다.
  • 지금은 거의 자바 코드로 많이 설정하고 있다.

  • DI

    • 필드 주입
      => 필드의 객체를 바꿀 수 있는 방법이 없고, 외부에서 접근할 수 없기 때문에 권장하지 않음
      e.g. 생성자를 빼고 필드에 @Autowired 붙여주기
    @Autowired private MemberService memberService;
    • setter 주입
      => setter를 만들어서 @Autowired를 붙이고 주입해줌.
      단점: 누군가가 MemberController를 호출했을 때 setter가 public으로 열려 있어야 한다.
      -> public으로 열려있어 누군가가 잘못 바꾸면 문제가 된다.
    • 생성자 주입
      => 생성 시점에 injection하고 그 이후로는 막아놓기 때문에 권장된다.
      e.g. MemberController에서 생성자를 통해 MemberService를 MemberController에 주입
  • 실무

    • 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드: 컴포넌트 스캔 사용
    • 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 할 때: 설정을 통해 스프링 빈으로 등록
      => 지금 같이 어떤 DB를 사용할지 정하지 않은 상태에서는 설정을 통해 스프링 빈으로 등록하는 것이 낫다!
      -> 다른 코드를 건드릴 필요 없이 반환하는 객체의 이름만 바꾸면 되기 때문이다.
      컴포넌트 스캔의 경우 여러 파일을 바꾸어야 한다.

** 스프링이 관리하는 객체, 즉 스프링 빈에 등록되어 있는 객체에 한해서 @Autowired가 동작한다. 스프링 컨테이너에 올라가 있어야 동작한다!

0개의 댓글