IOC, DI

YH·2023년 3월 26일
0

IoC(Inversion of Control), DI(Dependency Injection)

  • IoC나 DI는 레고와 같은 것이다
    • 스프링이 바닥판처럼 깔려있고, 우리는 그 위에서 멋진 조립(나의 어플리케이션)을 만들면 된다

✅ IOC(Inversion of Control)

IOC란?

  • Spring에서는 일반적인 자바 객체를 new로 생성하여 개발자가 관리하지 않고 Spring Container에 모두 맡김
  • 즉, 개발자에서 -> 프레임워크로 제어의 객체 관리의 권한이 넘어 갔음으로 제어의 역전이라고 함

✅ DI(Dependency Injection)

DI란?

  • 의존관계란 예를 들어 A가 B를 의존한다고 했을때, 의존 대상 B가 변하면 A에 영향을 미친다는 뜻
  • DI는 의존성 주입 또는 의존관계 주입이라고 하는데, 위에서 말한 의존 대상을 외부에서 결정하여 주입하는 것임
  • DI 컨테이너에 의해 런타임시 의존 객체를 사용할 수 있도록 그 레퍼런스를 전달받는 과정이 마치 생성자를 통해 DI 컨테이너가 주입해주는 것과 같다고 해서 이를 의존관계 주입이라고 부름

DI의 장점

  • 의존성으로부터 격리시켜 코드 테스트에 용이함
  • DI를 통하여, Mock과 같은 기술을 통해 외부와의 통신이 필요한 부분 등에 대한 테스트를 안정적으로 가능케 함
  • 코드를 확장하거나 변경할 때 영향을 최소화 해줌
  • 순환 참조를 방지할 수 있음

Bean이란?

자바에서의 javaBean

  • 데이터를 저장하기 위한 구조체로 자바 빈 규약이라는 것을 따르는 구조체
  • private 프로퍼티와 getter/setter로만 데이터를 접근한다.
  • 인수(argument)가 없는 기본 생성자가 있다.
public class JavaBean {
	private String id;
	private Integer count;

	public JavaBean(){}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Integer getCount() {
		return count;
	}

	public void setCount(Integer count) {
		this.count = count;
	}
}

스프링에서의 Bean

  • 스프링 IoC 컨테이너에 의해 생성되고 관리되는 객체
  • 자바에서처럼 new Object(); 로 생성하지 않는다
  • 각각의 Bean들 끼리는 서로를 편리하게 의존(사용)할 수 있음

스프링 컨테이너 개요

ApplicationContext 인터페이스를 통해 제공되는 스프링 컨테이너는 Bean 객체의 생성 및 Bean들의 조립(상호 의존성 관리)을 담당한다.

Bean의 등록

  • 과거에는 xml로 설정을 따로 관리하여 등록(불편)
  • 현재는 annotation 기반으로 Bean 등록
    • @Bean, @Controller, @Service

Bean 등록 시 정보

  • Class 경로
  • Bean의 이름
    • 기본적으로는 원 Class 이름에서 첫 문자만 소문자로 변경 → accountService, userDao
    • 원하는 경우 변경 가능
  • Scope : Bean을 생성하는 규칙
    • singleton : 컨테이너에 단일로 생성
    • prototype: 작업 시마다 Bean을 새로 생성하고 싶을 경우
    • request: http 요청마다 새롭게 Bean을 생성하고 싶은 경우

Bean LifeCycle callback(빈 생명주기 콜백함수)

  • callback : 어떤 이벤트가 발생하는 경우 호출되는 메서드
  • lifecycle callback
    • Bean을 생성하고 초기화하고 파괴하는 등 특정 시점에 호출되도록 정의된 함수
  • 주로 많이 사용되는 콜백
    • @PostConstruct : 빈 생성 시점에 필요한 작업을 수행
    • @PreDestroy : 빈 파괴(주로 어플리케이션 종료) 시점에 필요한 작업을 수행

Reference

profile
하루하루 꾸준히 포기하지 말고

0개의 댓글