PROGRAMMING/Spring

[Inflearn] 스프링 입문 | 4 스프링과 빈의 의존관계

yuujoeng 2022. 12. 28. 01:52

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

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

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

 

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

(0) 컴포넌트 스캔 원리

  - @Component 애노테이션이 있으면 스프링 빈으로 자동 등록 됨

  - @Component를 포함하는 @Controller, @Service, @Repository > 스프링 빈으로 자동 등록

  - 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록

 

(1) Controller

  - Controller 선언 시 객체를 생성해서 Spring이 들고 있음 (?)

  - Spring Container에서 Bin을 관리함

  - MemberController

@Controller
public class MemberController {

    /* Spring Container에 등록 */
    private final MemberService memberService;

    /* 생성자 호출 */
    /* @Autowired를 사용하여 MemberService를 가져와 memberService 연결 */
    @Autowired
    public MemberController(MemberService memberService) {
    this.memberService = memberService;
    }
}

 

- Service와 Repository도 각각 애노테이션 추가

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    /* memberRepository를 직접 생성하는 것이 아니라 외부에서 넣어주도록 설정 */
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
@Repository
/* MemberRepository를 implements하여 기존의 메소드를 모두 불러옴 */
public class MemoryMemberRepository implements MemberRepository{

 

  - 스프링 컨테이너의 연결 구조  형성

 

 

(2) main의 SpringApplication을 실행하면 정상적으로 실행

 

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

(1) 이전 상태로 돌리기

  - @Service, @Repository 애노테이션을 지우고 다시 실행하면 오류 출력

 

(2) SpringConfig

  - @Controller는 그대로 두기

@Configuration
public class SpringConfig {
    
    /* MemberService를 SpringBin에 등록 */
    @Bean
    public MemberService memberService() {
        /* SpringBin에 등록된 memberRepository를 요기 넣어줌 */
        return new MemberService(memberRepository());
    }

    /* MemberRepository를 SpringBin에 등록 */
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

(3) main의 SpringApplication을 실행하면 정상적으로 실행

 

 

* 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용

* 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록

* @Autowired 를 통한 DI는 helloController , memberService 등과 같이 스프링이 관리하는 객체에서만 동작 !!