2023. 2. 3. 01:38ㆍSpring 강의/section4
자바 코드로 직접 스프링 빈 등록하기
- 직접 설정파일에 등록하기
먼저 MemberService와 MemoryMemberRepository에 있던 @Service, @Repository, @Autowired 어노테이션을 지워준다.
그리고 SpringConfig 클래스 추가

SpringConfig.class
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
 | 
 package hello.hellospring2; 
import hello.hellospring2.repository.MemberRepository; 
import hello.hellospring2.repository.MemoryMemberRepository; 
import hello.hellospring2.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(); 
    } 
} 
 | 
cs | 
1. 스프링이 뜰 때 @Configuration 읽음.
2. @Bean을 보고 인식해서 memberService()와 memberRepository()를 스프링 빈에 등록
3. 스프링 빈으로 등록되어 있는 memberRepository를 MemberService에 넣어준다.
MemberController.class

컨트롤러 코드는 어쩔 수 없음. 그냥 둔다.
실행시켜보면 잘 돌아간다.

현재 이 그림까지 완성

DI의 3가지 방법
1. 생성자 주입

생성자를 통해 memberService가 MemberController에 주입된다.
2. 필드 주입

이렇게 필드 주입으로 등록되면 수정이 어려워서 별로 권장 안 한다.
3. Setter 주입

누군가가 MemberController를 호출했을 때 setMemberService가 public으로 되어 있어야한다.
한 번 세팅하면 거의 바꿀 일이 없는데 누군가 바꿔치기하기 쉽게 public으로 열려 있고
아무나 호출할 수 있다는 단점이 있다.
그래서 요즘 권장하는 스타일은 생성자 주입이라는 것!
참고 : 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다.
그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.