on
스프링 IoC
예제로 배우는 스프링 입문 (개정판)의 내용을 정리하는 포스트
스프링 IoC
Inversion of Control
Inversion of Control은 해석하면 제어권이 뒤바뀌었다는 말인데 이게 무슨 말일까?
일반적인 (의존성에 대한) 제어권: “내가 사용할 의존성은 내가 만든다.”
class OwnerController {
private OwnerRepository repository = new OwnerRepository();
}
일반적으로 의존성에 대한 제어권은 자기 자신이 가지고 필요한 의존성을 직접 만들어서 사용한다.
즉, OwnerController
가 직접 만들어 관리하는 것이다.
IoC : “내가 사용할 의존성을 누군가가 알아서 주겠지.”
class OwnerController {
private OwnerRepository repo;
public OwnerController(OwnerRepository repo) {
this.repo = repo;
}
// repo를 사용
}
class OwnerControllerTest {
@Test
public void create() {
OwnerRepository repo = new OwnerRepository();
OwnerController controller = new OwnerController(repo);
}
}
IoC에서는 직접 관리하지 않는다. 위 코드를 보면 OwnerController
는 OwnerRepository
를 사용은 하지만 만들지 않는다.
OwnerController
코드 밖에서 누군가가 줄 수 있도록 생성자를 통해 받아 온다.
의존성을 관리하는 일을 밖에서 누군가가 하는 것이다. 따라서 제어권이 역전되었다, Inversion of Controller인 것이다.
외부에서 의존성을 ‘주입’해주는 것을 dependency injection
이라고 하는데 이것 또한 일종의 IoC로 볼 수 있다.
예시
본문 코드
package org.springframework.samples.petclinic.sample;
public class SampleController {
SampleRepository sampleRepository;
public SampleController(SampleRepository sampleRepository) {
thils.sampleRepository = sampleRepository;
}
public void doSomething() {
sampleRepository.save();
}
}
테스트 코드
package org.springframework.samples.petclinic.sample;
import org.junit.Test;
public class SampleControllerTest {
@Test
public void testDoSomething() {
SampleRepository sampleRepository = new SampleRepository();
SampleController samplecontroller = new SampleController(sampleRepository);
}
}
doSomething()
을 호출하면 sampleRepository
에 객체가 설정되어 있지 않아 nullPointException
이 된다. 하지만 실제론 발생할 수 없다.
SampleController
라는 타입의 인스턴스를 생성하려면 생성자가 하나뿐이기 때문에 반드시 SampleRepository
를 만들어 줄 수 밖에 없다. 따라서 SampleController
는 무조건 SampleRepository
있는 상태가 된다.
sampleRepository
는 SampleControllerTest
에서 생성자에 넣어주었다.
Reference
Comments
SPRING 의 다른 글
-
스프링 타입 컨터버 24 Jun 2022
-
API 예외 처리 17 Jun 2022
-
예외 처리와 오류 페이지 12 Jun 2022
-
로그인 처리 - 인터셉터 08 Jun 2022
-
로그인 처리 - 필터 06 Jun 2022
-
로그인 처리 - 쿠키, 세션 31 May 2022
-
Bean Validation 22 May 2022
-
검증 22 May 2022
-
메시지, 국제화 21 May 2022
-
타임리프 - 스프링 통합과 폼 19 May 2022
-
타임리프 - 기본 기능 10 May 2022
-
스프링 MVC 기본 기능 - 웹 페이지 만들기 02 May 2022
-
스프링 MVC 기본 기능 - HTTP 응답 30 Apr 2022
-
스프링 MVC 기본 기능 - HTTP 요청 24 Apr 2022
-
스프링 MVC 기본 기능 - 요청 매핑 19 Apr 2022
-
스프링 MVC 기본 기능 19 Apr 2022
-
스프링 MVC 구조 이해 14 Apr 2022
-
MVC 프레임워크 만들기 - V4, V5 12 Apr 2022
-
MVC 프레임워크 만들기 - V1, V2, V3 09 Apr 2022
-
서블릿, JSP, MVC 패턴 05 Apr 2022
-
서블릿 29 Mar 2022
-
웹 애플리케이션 이해 24 Mar 2022
-
스프링 웹 계층이란? 05 Nov 2021
-
스프링 시큐리티 공식문서 번역 27 Sep 2021
-
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP 27 Apr 2021
-
SpEL (스프링 Expression Language) 25 Apr 2021
-
데이터 바인딩 추상화 : Converter와 Formatter 21 Apr 2021
-
데이터 바인딩 추상화 : PropertyEditor 12 Apr 2021
-
Validation 추상화 10 Apr 2021
-
Resource 추상화 08 Apr 2021
-
IoC 컨테이너 9부 07 Apr 2021
-
IoC 컨테이너 8부 06 Apr 2021
-
IoC 컨테이너 7부 02 Apr 2021
-
IoC 컨테이너 6부 29 Mar 2021
-
IoC 컨테이너 5부 27 Mar 2021
-
IoC 컨테이너 4부 23 Mar 2021
-
IoC 컨테이너 3부 20 Mar 2021
-
IoC 컨테이너 2부 18 Mar 2021
-
IoC 컨테이너 1부 12 Mar 2021
-
스프링 PSA 07 Jan 2021
-
스프링 @AOP 실습 07 Jan 2021
-
프록시 패턴 06 Jan 2021
-
스프링 AOP 04 Jan 2021
-
의존성 주입(Dependency Injection) 04 Jan 2021
-
스프링 빈(Bean) 02 Jan 2021
-
스프링 IoC 컨테이너 01 Jan 2021
-
스프링 IoC 01 Jan 2021