IOC(Inversion Of Control : 제어의 역전)
내가 직접 인스턴스를 생성하지 않고,
외부에서 의존성을 주입(Dependency Injection) 해주는 것.
1. 내가 직접 인스턴스를 생성하는 경우,
public class MemberService {
// 의존성을 내가 직접 결합
private final MemberRepository memberRepository = new MysqlMemberRepository();
.
.
.
}
2. 외부에서 의존성을 주입 해주는 경우,
- 주입 받는 부분
public class MemberService {
private final MemberRepository memberRepository;
// 생성자 주입 패턴
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
- 주입 하는 부분 (수동 주입)
public class MemberController {
Member Service memberService;
MysqlMemberRepository memberRepository;
public void injectTest() {
// mysql 레포지토리 인스턴스를 생성 후
memberRepository = new MysqlMemberRepository();
// MemberService에 레포지토리를 주입
memberService = new MemberService(memberRepository);
}
}
- 주입 하는 부분 (자동 주입)
위 처럼 직접 주입해가면서 사용하는 방법도 있지만,
스프링 프레임워크에서는 IOC 컨테이너를 통해 자동으로 주입해주는 기능을 제공 하고 있다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
// 생성자 주입 패턴
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
클래스에 @Service 또는 @Component 어노테이션을 붙여주면, 스프링이 IOC 컨테이너에 올라가 있는 Bean을 자동으로 주입 해준다.
* @Service 도 @Component로 구현되어 있지만, 직관적으로 사용할 수 있도록 @Controller / @Service / @Repository 로 구분해서 별칭처럼 사용할 수 있다.
컨테이너에 Bean으로 등록 방법
주입할 클래스에 어노테이션을 붙인다.
@Repository
public class MysqlMemberRepository implements MemberRepository {
.
.
.
}
구현체를 Service에 주입 할 것이기 때문에, 구현체에 @Repository 또는 @Component 어노테이션을 붙여주게 되면,
스프링이 MemberService 클래스 생성할때 아래 코드 부분(생성자)에 알아서 주입 해준다.
// 생성자 주입 패턴
public MemberService(MemberRepository memberRepository) { // MemberRepository를 주입 받는 부분
this.memberRepository = memberRepository;
}
스프링 컨테이너의 중요한 특징 :
- 스프링 빈을 등록할 때 기본적으로 싱글톤으로 인스턴스를 생성하여 등록한다. (유일하게 하나만 등록해서 공유한다)
반응형
'Spring Boot' 카테고리의 다른 글
[Spring Boot] Gradle 로 빌드 하는 법 (0) | 2021.10.17 |
---|---|
[Java] 8 에서 11로 변경 잘 안될 때 (0) | 2021.10.17 |
[Spring] AOP 관점 지향 프로그래밍 (0) | 2021.10.17 |
[Spring Boot] 스프링부트 간단 세팅 3분컷!! (0) | 2021.10.16 |
[Spring Boot] 로그레벨 Debug 설정 (0) | 2021.10.16 |