TIL 6 | IoC, Bean, DI

Seon Kang choi·2021년 9월 26일
0

IoC

제어의 역전 IoC 기존 프로그램은 클라이언트가 스스로 필요한 구현 객체를 생성하고, 연결하고, 실행했다. 하지만 IoC컨테이너가 제어 흐름을 가져가고 구현 객체는 자신의 로직 실행만 담당한다. 이렇듯 제어 흐름을 직접하는 것이 아니라 외부에서 하는 것을 제어의 역전(IoC)라 한다.
컨테이너 내부에서는 Bean의 생성 및 보관, 의존성 주입 등 Bean을 관리 합니다.

Bean

컨테이너가 관리하는 객체들을 Bean이라 부른다. Bean은 기본적으로 싱글톤 방식이다.
Bean 등록 방식 중 먼저 xml 방식이다.
Application context.xml에서 Bean id와 클래스명, 변수명, 의존관게 등을 작성하여 등록한다.

두번째 방법은 Java Config class를 만들어 등록하는 방식이다.
Application context.xml에 등록할 내용을 자바 설정 클래스로 작성하여 등록하는 방법이다.
@Configuration 어노테이션으로 설정 파일임을 명시해야 한다.
Bean으로 등록할 클래스를 @Bean 어노테이션이 붙은 함수를 만들고 new로 반환하면 된다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }
}

마지막으로 가장 많이 사용하는 방법으로 어노테이션을 사용하여 등록하는 방법이다.
Bean으로 등록할 클래스에 어노테이션을 명시해준다. 어노테이션을 붙은 클래스를 스캔하여 자동으로 컨테이너에 등록해준다.
@Component : 기본
@Repository : 데이터 접근 객체
@Service : 서비스 객체
@Controller : 컨트롤러 객체

DI

각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 자동으로 연결해 준다.
의존성 주입의 장점으로는 컴파일시에 이루어지는 것이 아닌 실행시에 이루어져 모듈간의 결합도를 낮출 수 있고, 코드 재사용 높여준다.

  1. 생성자 주입
    생성자에서 받는 방식이다. 컨테이너가 알아서 생성자에 객체를 넣어주면서 생성하는 방식이다. 이 때 final로 설정하는 것이 좋다.
public class MemberController {
	private final MemberRepository memberRepository;
    
    public MemberController(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}
  1. setter 주입
    setter 메소드를 통해 주입받는 방식이다.
public class MemberController {
	private MemberRepository memberRepository;
    
    public void setMemberRepository(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}
  1. 필드 주입
    주입 받을 필드에 @Autowired 어노테이션을 붙여주면 컨테이너가 알아서 resolve 해준다.
public class MemberController {
	@Autowired
	private MemberRepository memberRepository;
}

@Inject라는 어노테이션도 있다.

@Autowired - 객체 타입을 우선으로 DI 연결, 스프링에서 지원하는 어노테이션으로 프레임워크에 종속적

@Inject - 객체 타입을 우선으로 DI 연결, 자바에서 지원, 프레임워크에 종속적이지 않는다.

예전에는 많이 사용 했지만 요즘은 생성자 주입을 많이 사용한다.

profile
유쾌한 개발 생활~

0개의 댓글