스프링 빈 등록 (Spring Bean)
https://yong-codinglog.tistory.com/62
Spring Bean 생성
🔸 DI: Dependency Injection, 의존성 주입 ◼ new 키워드로 객체 생성을 직접하지 않고, 객체 생성을 외부에서 대신 수행 ◼ 클래스/인터페이스 타입의 멤버 변수만 선언하고, 생성자 구현 ✔ 객체를 생
yong-codinglog.tistory.com
이전에도 한 번 적은 거 있음
✔ Spring Bean 생성
① 컴포넌트 스캔 방식 (Component Scan)
@Component
- @Controller
- @Service
- @Repository
◼ @Controller, @Service, @Repository 어노테이션이 있으면, 스프링 빈으로 자동 등록된다.
ex) @Controller 어노테이션 있으니, MemberController를 스프링 빈으로 등록
그 때, MemberController의 생성자를 호출
그런데 생성자에 @Autowired 어노테이션 있으면,
Spring이 스프링 컨테이너에 있는 MemberService를 가져다가 연결시켜 준다.
이 때, MemberService는 스프링 컨테이너에 Bean으로 등록되어 있어야 한다.
(MemberService에 @Service 어노테이션 붙어있거나, 직접 Bean 생성해주거나)
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Service
public class MemberService { ... }
② 자바 코드로 직접 등록
Controller는 위와 동일하게 놔두고, Service와 Repository Class에서 어노테이션 제거
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
◼ 스프링 빈으로 등록할 때, 기본으로 싱글톤으로 등록한다. 유일하게 하나만 등록해서 공유한다.
MemberController 하나, MemberSerivce 하나, MemberRepository 하나 등록
그 이후로 또 MemberController에서 MemberService 쓴다고 하면,
이미 만들어놓은 MemberService 공유해서 사용한다.