스프링 부트를 사용만 했지 자세한 개념이나 실무에서는 어떻게 사용 되는지 잘 모르는 것 같았다. 그래서 이 책을 1회독 했고 현재 2회독 중에 책의 내용 중 중요한 내용을 정리 해보고자 한다.
일반적인 자바 개별의 경우 객체를 사용하기 위해 개발자가 직접 객체를 생성하고 사용한다.
@RestController
public class NoDIController {
private MyService service = new MyServiceImpl(); //개발자가 직접 생성한다.
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
하지만 제어 역전을 특징으로 하는 스프링은 사용할 객체를 직접 생성하지 않고 객체의 생명 주기 관리를 외부에 위임한다. 여기서 외부란 스프링 컨테이너(IoC 컨테이너라고도 한다)를 의미한다.
이렇게 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어의 역전 이라고 부른다.
또한 제어의 역전으로 의존성 주입(DI), 관점 지향 프로그래밍(AOP)가 가능해진다.
의존성 주입은 제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입 받아 사용하는 방식을 의미한다.
스프링에서 의존성을 주입 받는 방법은 3가지가 있다.
생성자를 통한 의존성 주입
필드 객체 선언을 통한 의존성 주입
setter 메서드를 통한 의존성 주입
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
@Autowired
private MyService myService;
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
스프링 공식 문서에서 권장하는 의존성 주입 방식은 생성자 주입이다.
AOP는 관점을 기준으로 묶어 개발하는 방식을 의미한다. 여기서 관점(Aspect)란 어떤 기능을 구현할 때 그 기능을 핵심 기능, 부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.
핵심 기능이란, 비즈니스 로직을 처리하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다.
부가 기능이란, 핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션 처리를 하는 부가적인 기능들이다. 부가 기능들은 비즈니스 로직마다 동일한 기능을 수행할 확률이 높다.
컴파일 과정에 삽입
바이트코드를 메모리에 로드하는 과정에 삽입
프록시 패턴 이용
스프링에서는 프록시 패턴을 이용해 AOP 기능을 제공한다.
스프링 AOP의 목적은 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와주는 것이다.
사실 나는 두개가 동일한 줄 알았다. 하지만 책을 읽으며 다른 것임을 알게 되었다..
스프링 프레임워크와 비교했을 때 스프링 부트가 가진 특징은 다음과 같다.
스프링 프레임워크에서는 개발에 필요한 모듈의 의존성을 직접 설정해야 했다.
호환 되는 버전을 명시해야 정상 동작하고, 하나의 버전을 올리면 연관된 다른 라이브러리의 버전까지도 고려해야 했다.
하지만 스프링 부트는 spring-boot-starter라는 의존성을 제공하여 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공한다.
스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정을 지원한다. 이는 에플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다. 즉, 애플리케이션을 개발하는 데 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해준다.
스프링 부트의 각 웹 어플리케이션에는 내장 WAS(Web Application Server)가 존재한다. 기본은 톰캣을 사용하지만 톰캣이 아닌 다른 웹 서버(Jetty, Undertow 등)으로 대체 가능하다.
개발 이후 서비스 운영 시기에는 해당 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링 해야된다. 스프링 부트에는 스프링 부트 엑추에이터(Spring Boot Actuator)라는 자체 모니터링 도구가 있다.