✅ @Autowired ✅ @Component ✅ @Controller ✅ @Service ✅ @Repository ✅ @Configuration
생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.
이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.
👉 의존관계가 실행중에 동적으로 변하는 경우는 거의 없을 뿐더러
setter 주입의 경우 불필요하게 다른 개발자가 객체를 수정할 수 있는 가능성이 있기 때문에
최초에 한번 생성할 때 주입하고 이후에 수정할 수 없는 생성자 주입을 권장
필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입한다.
즉, memberController 와 memberService 사이의 연관관계를 연결(화살표)해주어 상대를 쓸 수 있게 해준다고 보면된다.
IoC 컨테이너에 빈으로 등록이 되어야 의존성 주입을 할 수 있다.
스프링 빈을 등록하는 2가지 방법 👇
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록한다.
@Controller, @Service, @Repository 는 @Component 을 포함한다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
ex : memberRepository를 db에 직접 연결하는 레포로 변경해야 하는 경우
다른 코드는 건들 필요 없이 @Bean만 변경하면 되므로 편함
@Configuration : 컨테이너임을 알려줌
@Bean : 빈 등록
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Configuration 으로 직접 스프링 빈 등록을 하기 위해서는
자동 등록 어노테이션인 @Component (@Controller, @Service, @Repository) 을 사용하면 안된다. (지워줘야 함)
https://www.inflearn.com/questions/360713