@Configuration
public class SpringConfig {
@Bean // Spring bean을 등록할 거라는 의미로 이해하면 됨
public MemberService memberService() // 이 memberService를 아래의 로직 호출하여 spring bean에 등록해줌{
return new MemberService(memberRepository()); // spring bean에 등록된 memberRepository를 넣어준다.
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository(); // 인터페이스에서는 new가 안되어, 구현체(MemoryMemberRepository()) 사용
}
컨트롤러는 어차피 스프링이 관리하는 것이기 때문에 위와 같은 코드 대신 컴포넌트 스캔 방식 이용
(고정적) (Annotation으로 @Controller와 @Autowired 사용)
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
참고: DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다.
필드 주입 (수정등에 대해 유연하지 않아 선호 x )
@Autowired final MemberService memberService;
생성자 주입 : (우리가 한 것)