Spring Boot

[Spring] IOC Container

먹세 2021. 10. 20. 08:46

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;
}

 

 

스프링 컨테이너의 중요한 특징 :

- 스프링 빈을 등록할 때 기본적으로 싱글톤으로 인스턴스를 생성하여 등록한다. (유일하게 하나만 등록해서 공유한다)

 

반응형