회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고 진행
하나하나 직접 스프링한테 등록하기 !
@Bean 어노테이션과 @Configuration 어노테이션 ]
만약 다음과 같은 클래스를 스프링 컨테이너에 등록하고자 한다면,
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
설정 클래스에서 @Bean 어노테이션을 사용하여 수동으로 스프링 컨테이너에 빈을 등록한다.
이때 설정 클래스에서는 @Configuration 어노테이션을 클래스에 붙여준다.
@Bean을 사용해 수동으로 빈을 등록해줄 때에는 메소드 이름으로 빈 이름이 결정된다. 그러므로 중복된 빈 이름이 존재하지 않도록 주의해야 한다.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
이제 MemberService와 MemberRepository 모두 Spring Bean에 올라간다 !!
What about Controller ?
컨트롤러는 어떻게 할 수가 없다. 그냥 @Autowired를 사용하면 된다.
어차피 @Controller를 사용하면 컴포넌트 스캔이기 때문에 상관 없음 ! !
DI (Dependency Injection)의 3가지 종류
- 필드 주입 (비추천)
- setter 주입 (비추천)
- 생성자 주입 (추천)
필드 주입
아예 필드에서 주입을 하는 방법 (not recommended)
@Controller
public class MemberController {
@Autowired private MemberService memberService;
}
Setter 주입
setter을 통해서 주입되는 방법 (not recommended)
단점 : 누군가가 MemberController를 호출했을 때 public으로 되어있어야함→ 아무 개발자가 수정 가능 → 중간에 잘 못 바꾸면 문제 발생 !
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService){
this.memberService = memberService;
}
}
생성자 주입
ex ) 생성자를 통해서 MemberService가 MemberController로 들어온다. (RECOMMENDED)
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
정형화된 컨트롤러, 서비스, 리포지토리 → 컴포넌트 스캔 사용
정형화 되지 않거나, 상황에 따라 구현 클래스를 변경 필요 → 설정을 통해 스프링 빈으로 등록
`@Autowired` 를 통한 DI는 `helloController` , `memberService` 등과 같이 스프링이 관리하는 객체에서만 동작
스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.
@참고자료
[인프런] 김영한 - 스프링 입문 강의 (무료)
'개발 > Spring' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] JPA란? (0) | 2025.01.11 |
---|---|
[Spring] 스프링 입문 - (회원 관리 예제)웹 MVC 개발 (0) | 2024.11.10 |
[Spring] 스프링 입문 - 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2024.11.07 |
[Spring] 스프링 입문 - 회원 서비스 테스트 (0) | 2024.11.07 |
[Spring] 스프링 입문 - 회원 서비스 개발 (0) | 2024.11.07 |