#8. Spring_ IoC 와 DI

박주현·2023년 11월 17일
0

Spring

목록 보기
10/12
post-thumbnail

스프링의 IoC와 DI.. 이름만 들어도 다가가기 싫다
그치만, 스프링을 똑바로하려면 알아야한다! 기본이니까! ( 오글거리는 텍스트 )

무튼, 스프링을 공부하다보면 항상 나오는말이
1. 스프링은 IoC 컨테이너로 Bean 관리
2. 스프링은 DI 사용

이처럼 우리가 두가지를 꼭 알아야 스프링을 공부했다고 할 수 있다.

1. Spring의 IoC

IoC는 Inversion of Control의 약자이다.
영어를 해석해보면, 제어의 역전 이라고 할 수 있는데... 해석만 해봐도 뭔소리인지 스프링에서 어디에서 사용하는지 알 수 없다.

학습한대로 말하자면
IoC는 제어의 반전으로서, 객체의 생성, 생명주기의 관리까지 모든 객체의 제어권이 바뀌었다는 것을 의미한다.

해당 작업은 애플리케이션 코드가 담당하는 것이 아닌, 스프링 컨테이너가 담당하며
스프링 컨테이너를 IoC 컨테이너라고 부른다.

2. IoC 컨테이너

스프링에서 IoC를 담당하는 컨테이너를 빈 팩토리, DI 컨테이너, 애플리케이션 컨텍스트라고 부른다.
컨테이너의 역할은 앞서말한대로 객체의 생명주기를 관리, 생성된 인스턴스에게 추가적인 기능을 제공하는 역할과 하며,
스프링 프레임워크도 객체를 생성하고 관리하며 의존성을 관리해주는 IoC 컨테이너가 있다.

특징)
1. 객체 생성코드가 없기에 TDD가 용이
2. 개발자가 직접 Getter/Setter 와 같은 Bean 객체를 생성할 수 있지만 컨테이너가 대신해서 담당한다.
3. 2번과 같은 특징으로 개발자는 비즈니스 로직에 더욱 집중할 수 있다.

3. IoC 분류

  1. Dependency Lookup (DL)
    : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 사용

  2. Dependenct Injection (DI)
    : 각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 직접 자동으로 연결하고 수정자 , 생성자, 필드 주입이 대표적이다.

4. DI

앞서 말한 IoC 분류 중 우리가 흔히 사용하는 것이 DI로서 DI가 바로 의존성주입 이다.

장점)
1. 클래스들 간 의존관계를 최소화
2. 프로젝트 유지보수 용이
3. 개발자가 직접 객체 생성 및 소멸한 부분을 대체

주의!
DI는 객체의 생성, 소멸, 의존관계를 개발자가 직접 설정하는 것이 아닌, Annotation과 XML을 활용하여 스프링 프레임워크가 제어함.

의존성 주입 3가지 방법 :

  1. 생성자 주입
  • 현재 가장 권장되는 의존성 주입 방식으로 하나의 생성자가 존재할 때 생성자 주입을 권장한다.
    Spring 4.3 후로 @Autowired가 생략 가능하여여 생성자를 하나만 둬도 되는 장점이 있으며 Lombok과 함께 사용하여 클린코드 작성이 용이.
  • 생성자 주입만 final 키워드 사용하기에 인스턴스가 생성될 때 1번만 할당.
  • final로 인해 값이 변경되지 않기에 객체의 불변성 보장.
  • 초기 할당으로 인해 Null Pointer Exception이 발생하지 않는다.
@RequiredArgsConstructor
public class Post {

    private PostService postService;
   
}
  1. 필드 주입
  • @Autowired 어노테이션을 사용하여 객체 내 필드에 선언
  • 참조관계를 파악할 수 없고, 순환참조를 막을 수 없다.
  • 생성자 주입을 뺀 나머지는 모두 생성자 이후 호출되므로, final 사용 불가.
public class Post {

	@Autowired
    private PostService postService;
   
}
  1. Setter 주입
  • @Autowired 어노테이션을 사용하여 Setter 메서드를 사용하여 선언
  • Null Pointer Exception 발생 가능.
  • 생성자 주입을 뺀 나머지는 모두 생성자 이후 호출되므로, final 사용 불가.
public class Post {
	
    private PostService postService;
  
    @Autowired
    public void setPostService( PostService postService) {
    	this.postService = postService;
    }
}
profile
빌드업 막 시작하는 개발자

0개의 댓글