-
스프링 부트란? - IoC, DI와 AOP개발/Spring Boot 2023. 7. 15. 00:10
Spring Boot는 Spring Framework의 다양한 프로젝트 중 하나이다.
스프링 프레임워크는 자바에서 가장 많이 사용되는 프레임워크이다.
스프링은 자바 언어를 이용해 엔터프라이즈급 개발을 편리하게 만들어주는 프레임워크이다.제어 역전 (IoC; Inversion of Control)
일반적인 자바 개발에서는 사용하려는 객체를 먼저 선언하고, 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용한다.
객체를 생성한 뒤 객체를 이용하는 작업을 개발자가 직접 제어하는 형태이다.
제어 역전은 기존 자바 개발 방식과 다르게 동작한다. 제어 역전 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임하는 형태이다. (스프링에서 '외부'는 스프링 컨테이너 또는 IoC 컨테이너를 의미)
객체의 관리를 컨테이너에게 맡겨져 제어권이 넘어간 것을 제어 역전이라고 부른다.
제어 역전을 통해 DI, AOP가 가능해진다.
의존성 주입 (DI; Dependency Injection)
제어 역전의 방법 중 하나. 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미한다.
스프링에서 의존성을 주입 받는 방법에는 세가지가 있다.
- 생성자를 통한 의존성 주입
- 필드 객체 선언을 통한 의존성 주입
- setter 메서드를 통한 의존성 주입
스프링에서는 @Autowired 어노테이션을 통해 의존성을 주입할 수 있다.
@RestController public class Contorller { // 생성자를 통해 의존성 주입 Service service; // 생성자로 의존성 주입할 땐 @Autowired 어노테이션 생략가능 (SpringFramework 4.3) @Autowired public Controller(Service service) { this.service = service; } // 필드 객체 선언을 통해 의존성을 주입 @Autowired private Service2 service2; // setter 메서드를 통해 의존성 주입 Service3 service3 @Autowired public void setService(Service3 serivce3) { this.myService = mySerivce; } }
스프링 공식 문서에서는 생성자를 통해 의존성을 주입 받는 방법을 이용하는 것을 권장한다고 한다.
다른 방법과는 다르게 생성자 방법은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문이다.
Setter 메서드를 이용한 방법과 필드 객체 선언을 통해 의존성을 주입하는 방법은 권장되지 않는다.
관점 지향 프로그래밍 (AOP; Aspect-Oriented Programming)
여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 한다.
AOP를 구현하는 방법은 크게 세가지가 있다.
- 컴파일 과정에 삽입
- 바이트 코드를 메모리에 로드하는 과정에서 삽입하는 방식
- 프록시 패턴을 이용한 방식
⚠️ 참고: [스프링부트 핵심가이드]
'개발 > Spring Boot' 카테고리의 다른 글
유지보수가 용이하도록 아키텍처 구성하기 (0) 2024.05.24 아키텍처 개선에 대한 고민 (1) 2024.05.23 Spring Boot 3.X 에 Swagger3를 추가하기 (0) 2023.07.16 Swagger에 대해 (0) 2023.07.16 스프링 프레임워크와 스프링 부트 (0) 2023.07.15