new
키워드로 생성하는 반면,Application Context
)가 대신 객체 생성 및 관리@Component
, @Service
, @Repository
, @Controller
, @Configuration + @Bean
Controller
가 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
는 컴포넌트 스캔을 사용