어노테이션으로 설정하기
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
참고적으로 위에 어노테이션
@Service은 자동으로 스프링 빈으로 등록된다.
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다. @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다. @Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
@Controller
@Service
@Repository
스프링 빈을 등록하는 2가지 방법
1. 컴포넌트 스캔과 자동 의존관계설정
2. 자바 코드로 직접 스프링 빈 등록하기
자바코드로 설정하기

@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
1.과거 XML 문서로 설정 지금은 사용하지 않음, 코드로 설정함
2. DI에서 필두
생성자주입
@Controller
public class MemberController {
private final MemberService memberService;
// 맴버 서비스를 스프링 컨테이너에 가져다가 연결시켜준다
// 스프링 컨테이너에서 맴버서비스를 가져온다 ,
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
필드 주입 (별루 안좋다)
- field injection 를 사용하면 작성된 클래스라면 단위테스트시 의존관계를 가지는 객체를 생성해서 주입할수 없다. 즉 다시 말해 스프링 빈에 등록이 되어 있어여 가져올수 있다.
@Controller
public class MemberController {
@Autowired private MemberService memberService;
// 맴버 서비스를 스프링 컨테이너에 가져다가 연결시켜준다
// 스프링 컨테이너에서 맴버서비스를 가져온다 ,
// @Autowired
// public MemberController(MemberService memberService) {
// this.memberService = memberService;
// }
}
set 주입
@Controller
public class MemberController {
private MemberService memberService;
// 맴버 서비스를 스프링 컨테이너에 가져다가 연결시켜준다
// 스프링 컨테이너에서 맴버서비스를 가져온다 ,
@Autowired
public void setMemberController(MemberService memberService) {
this.memberService = memberService;
}
}
set 주입은 아무개발자나 호출할수 있어서 권장하지 않음
생성자 주입방식은 아래와 같은 장점을 가진다
- 의존관계 설정이 되지 않으면 객체생성 불가 -> 컴파일 타임에 인지 가능, NPE 방지
- 의존성 주입이 필요한 필드를 final 로 선언가능 -> Immutable
- (스프링에서) 순환참조 감지가능 -> 순환참조시 앱구동 실패
- 테스트 코드 작성 용이
필드 인젝션은 아래와 같은 장점을 가진다
- 편하다는 것 말고는 없다
직접 bin에 구현하는 이유
- 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.
'Java > Spring Boot' 카테고리의 다른 글
| [docker] Could not find tools.jar (0) | 2021.08.14 |
|---|---|
| spring boot global exception 처리 (0) | 2021.08.14 |
| [Spring boot] AOP 란 (0) | 2021.01.27 |
| [Spring Boot] AWS EC2 서버 환경 구축하기 (0) | 2021.01.19 |
| 배민 팀장 김영한님 vs 백기선님 스프링 입문 강의 (0) | 2020.12.07 |