[Spring] 스프링 입문 (코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술) - 스프링 빈과 의존관계

밀크야살빼자·2023년 4월 18일
0

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

controller/MemberController

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

new로 객체를 생성하게 되면 MemberController뿐만 아니라 다른 여러 controller도 가져다가 쓸 수 있다. -> 해결 방법 : 스프링 컨테이너에 등록하고 사용하면 된다.

  • 생성자로 @Autowired가 있으면 스프링이 멤버서비스와 연관된 객체들을 스프링 컨테이너에서 찾아서 연결시켜준다.
    @Autowired가 정상적으로 동작하려면 두 인스턴스가 빈으로써 스프링 컨테이너에 들어가 있어야한다.
  • 의존성 주입(Dependency Indection) : 의존관계를 직접 주입하는 것이 아니라, 외부에서 주입하는 것이다.
  • @Service, @Controller, @Repository 어노테이션들이 @Component를 포함하고 있기 때문에 스프링 빈으로 자동 등록이 된다.

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

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

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

SpringConfig

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();
   }
}
  • 의존성 주입 방법에는 필드 주입, setter 주입, 생성자 주입 3가지가 있는데, 실행 중에 의존관계가 동적으로 변할 경우는 거의 없기 때문에 생성자 주입을 권장한다.
  • 주로 정형화된 컴포넌트 스캔을 사용한다. 정형화 되지않거나 구현 클래스를 변경해야 할 경우는 설정을 통해 스프링 빈으로 등록한다.
profile
기록기록기록기록기록

0개의 댓글