
new 키워드로 생성하는 반면,Application Context)가 대신 객체 생성 및 관리@Component, @Service, @Repository, @Controller, @Configuration + @BeanController가 Service와 Repository를 사용할 수 있도록 의존 관계를 준비
스프링이 처음에 뜰 때 스프링 컨테이너가 생성되는데,
MemberController.java 파일에 @Controller 를 붙여두면
컨트롤러 객체를 생성해서 스프링 컨테이너에 넣어두고 관리한다.
즉, 스프링 컨테이너에서 스프링 빈이 관리된다.
@Controller
public class MemberController {
private final MemberService memberService = new MemberService();
...
}
@Controller
public class MemberController {
private final MemberService memberService;
@AutoWired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
...
}
Controller와 Service 의존관계를 맺는 과정에서new를 사용하는건 스프링답지 않다.@Autowired를 사용해 의존관계를 주입한다.@Component는 해당 클래스를 스프링 컨테이너가 관리할 수 있도록 등록하는 어노테이션@Controller, @Servcie, @Repository 등의 어노테이션은@Component를 포함하고 있어,@ComponentScan이 설정된 패키지 안에 있어야 감지됨!@Autowired는 스프링 컨테이너 안에 있는 필요한 객체(빈)을 자동으로 주입하는 어노테이션
Controller가 Service를 사용하고, Service가 Repository를 사용할 수 있도록
@Autowired는 연관관계(의존관계)를 자동으로 맵핑(주입)해줌
생성자, 필드, setter() 등에 사용 가능
@Autowired를 사용하면 객체 생성 시점에⚠️ 단, @Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작
(스프링 빈으로 등록하지 않거나, 개발자가 직접 생성한 객체에서는 동작❌)
@Component를 통해 스프링 빈으로 등록하고,@Autowired를 통해 빈들 간의 의존관계를 자동으로 맺는다.@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
Controller에서 사용하는 Service가 스프링 빈으로 등록되지 않는 경우,Service를 Controller에 DI해줌@Bean 어노테이션을 사용해 메서드에서 정의한 빈들을 스프링 컨테이너에 등록📂SpringConfig.java
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepsoitory();
}
}
Controller, Service, Repsotitory 는 컴포넌트 스캔을 사용