본문 바로가기

공부 기록/Spring

[Spring] IoC(Inversion of Control, 제어의 역전), DI

IoC(Inversion of Control, 제어의 역전)

- 스프링에서는 일반적인 자바 객체를 new로 생성하여 개발자가 관리하지 않고 스프링 컨테이너에게 맡긴다. (싱글톤의 형태로 관리된다.)

- 즉, 객체나 메서드에 대한 제어의 관리 권한을 제3자인 프레임워크로 넘긴다. 이를 "제어의 역전"이라고 한다.

- 스프링 프레임워크의 가장 큰 특징이다.

- IoC의 주된 목적: 의존 관계를 제거 => 느슨한 결합을 제공 => 클래스의 재사용성을 높임( => 중복 코드 제거)

  


DI(Dependency Injection)

외부(스프링 컨테이너)로부터 사용할 객체를 주입 받는다.


DI의 장점

  • 의존성으로부터 격리시켜(의존하고 있는 객체와 분리하여), 코드 테스트에 용이하다.
  • 불가능한 상황을 Mock와 같은 기술을 통하여 안정적으로 테스트할 수 있다.
  • 코드를 확장하거나 변경할 때 영향을 최소화한다. (추상화)
  • 순환 참조를 막을 수 있다.
    • 순환 참조 : 참조하는 대상이 서로 물려 있어서 참조할 수 없게 되는 현상. (ex. 내가 나를 참조하거나, 내가 참조하는 객체가 다시 나를 참조하거나 ...)

의존성 주입 방법

1. 생성자 주입(*권장)

@Controller
public class UserController {

    private final UserService userService;
    
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
}

 

1-2. 스프링 4.3 버전 이상에서는 @Autowired 생략이 가능하다.

@Controller
@RequiredArgumentConstructor
public class UserController {

    private final UserService userService;

}

  

2. 필드 주입

@Controller
public class UserController {

    @Autowired
    private final UserService userService;
 
}

 

3. Setter 주입

@Controller
public class UserController {

    private final UserService userService;
    
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

'공부 기록 > Spring' 카테고리의 다른 글

[Spring] Exception Handling  (0) 2023.05.04
[Spring] Validation(2) - Custom Validation  (0) 2023.05.01
[Spring] Validation(1) - Annotation  (0) 2023.05.01
[Spring] AOP의 활용  (0) 2023.04.27
[Spring] AOP  (0) 2023.03.28