1. 제어 역전 (IoC)
- 일반적인 자바 개발의 경우 객체를 사용하기 위해 아래 코드처럼 작성하게됨.
@RestController
public class NoDIController {
private MyService service = new MyServiceImpl();
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
- 하지만 IoC을 특징으로 하는 스프링은 기존 자바 개발 방식과 다르게 동작함
- IoC를 적용한 환경에서는 사용할 객체를 직접생성하지 않음
- 객체의 생명주기 관리를 외부에 위임 (외부 = 스프링컨테이너, IoC컨테이너)
- 객체 관리를 컨테이너에 맡김 = 제어권이 넘어감 = 제어 역전
- 제어 역전을 통해 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 가 가능하게 됨.
그렇다면 DI 와 AOP가 무엇인가?
2. 의존성 주입 (DI)
- 제어 역전의 방법 중 하나
- 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식
- 스프링에서 의존성을 주입받는 방법은 크게 3가지가 있음
2-1. 생성자
@RestController
public class DIController {
MyService myService;
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
@GetMapping("/di/hello")
public String getHello() {
return myService.getHello();
}
}
2-2. 필드 객체 선언
@RestController
public class FieldInjectionController {
@Autowired
private MyService myService;
}
2-3. setter 메서드
@RestController
public class SetterInjectionController {
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
- @Autowired라는 어노테이션을 통해 의존성을 주입할 수 있음.
- 스프링 공식문서에서 권장하는 방법은 생성자 주입을 권장함
- 래퍼런스 객체 없이 초기화 할 수 없게 설계할 수 있기 때문
3. 관점 지향 프로그래밍 (AOP)
- 스프링의 아주 중요한 특징이다.
- AOP는 관점을 기준으로 묶어 개발하는 방식을 의미한다.
관점이란?
어떤 기능을 구현 시 그 기능을 '핵심기능' 과 '부가기능'으로 구분해 각각 하나의 관점으로 보는 것을 의미
핵심기능?
비즈니스 로직 구현 과정에서 비즈니스로직이 처리하려는 목적 기능
부가 기능?
핵심기능이 어떤 기능인지에 무관하게 로직이 수행전 또는 후에 수행하면 됨.
즉, 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화에 삽입하는 방식을 AOP라고 한다.
AOP를 구현하는 방법은 크게 3가지가 있다.
- 컴파일 과정에서 삽입
- 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식
- 프록시 패턴을 이용한 방식
3-2. AOP의 목적?
- OOP와 마찬가지로 모듈화 해서 재사용 가능한 구성을 만드는 것
- 즉, 모듈화 객체를 편하게 적용할 수 있게 하고 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와줌.
'BackEnd > Spring' 카테고리의 다른 글
AOP에 관하여 (0) | 2024.02.03 |
---|---|
스프링 프레임워크와 스프링 부트 차이 간단 정리 (0) | 2023.09.12 |