[스프링부트 핵심가이드] - 01. 스프링 부트란?
01. 스프링 부트란?
1. 1 스프링 프레임워크
1. 1. 1 제어 역전 (loC)
1. 1. 2 의존성 주입 (DI)
1. 1. 3 관점 지향 프로그래밍 (AOP)
1. 1. 4 스프링 프레임워크의 다양한 모듈
1.2 스프링 프레임 워크 vs 스프링 부트
1. 2. 1 의존성 관리
1. 2. 2 자동 설정
1. 2. 3 내장 WAS
1. 2. 4 모니터링
1. 1 스프링 프레임워크
스프링 프레임 워크는 자바에서 가장 많이 사용하는 프레임워크이다. 현재 우리나리의 '전자정부 표준 프레임워크'의 기반 기술로 채택되어 공공기관 웹 서비스를 개발할 때도 사용된다.
1. 1. 1 제어 역전 (loC)
일반적인 자바 개발의 경우 객체를 사용하기 위해 밑과 같은 코드를 사용한다.
즉, 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용한다.
객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조다.
하지만 제어 역전을 특징으로 하는 스프링은 기존 자바 개발 방식과 다르게 동작한다. loC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부(스프링 컨테이너 ; Spring Container)에 위임한다.
즉, 제어 역전이란? 객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것
우리는 제어 역전을 통해 의존성 주입, 관점 지향 프로그래밍이 가능해지는 것을 알 수 있다.
1. 1. 2 의존성 주입 (DI ; Dependency Injection)
사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식이다.
스프링에서 의존성을 주입 받는 방법은 세 가지가 있다.
- 생성자를 통한 의존성 주입
- 필드 객체 선언을 통한 의존성 주입
- setter 메서드를 통한 의존성 주입
스프링에서는 @Autowired라는 어노테이션을 통해 의존성을 주입할 수 있다.
스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자를 통해 의존성을 주입받는 방식이다. 다른 방식과는 다르게 생성자를 통해 의존성을 주입받는 방식은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있기 때문이다.
1. 1. 3 관점 지향 프로그래밍 (AOP ; Aspect-Oriented Programming)
AOP는 스프링의 아주 중요한 특징이다. 간혹 AOP를 OOP의 대체 개념으로 오해하는 경우가 종종있지만 AOP는 OOP를 더욱 잘 사용하도록 돕는 개념으로 보는 것이 좋다.
<OOP의 핵심키워드 4가지> 추상화, 캡슐화, 상속, 다형성 |
AOP는 관점을 기준으로 묶어 개발하는 방식을 의미한다. 여기서 관점(aspect)이란 어떤 기능을 구현할 때 그 기능을 '핵심기능'과 '부가기능'으로 구분해 각각 하나의 관점으로 보는 것을 의미한다.
핵심 기능은 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다.
클라이언트로부터 상품 등록 요청을 받아 DB에 저장한 후 그 상품을 정보를 조회하는 비즈니스 로직을 구현한다면, 첫번째로는 상품 정보를 데이터베이스에 저장하고, 두번째로는 저장된 상품 정보 데이터를 보여주는 코드가 핵심 기능이다.
그런데 실제로 애플리케이션을 개발할 때는 핵심 기능에 부가 가능을 추가할 상황이 생긴다.
핵심 기능인 비즈니스 로직 사이에 로깅 처리를 하거나 트랜잭션을 처리하는 코드를 예로 들 수 있다.
OOP 방식의 애플리케이션 로직에서는 위 그림과 같이 객체마다 핵심기능을 수행하기 위한 로직과 함꼐 부가 기능인 로깅, 트랜잭션 등의 코드를 작성한다. 하지만 유지보수 목적이나 데이터 베이스 접근을 위해 작성된 로깅과 트랜잭션 영역은 상품정보를 등록할 때나 상품 정보를 조회할 때 동일한 기능을 수행할 확률이 높다. 즉, 핵심 기능을 구현한 두 로직에 동일한 코드가 포함되는 것을 의미한다.
AOP의 관점에서는 부가 기능은 핵심 기능이 어떤 기능인지 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 됩니다.
<AOP를 구현하는 방법 세 가지> 1. 컴파일 과정에 삽입하는 방식 2. 바이트코드를 메모리에 로드하는 과정에 삽입하는 방식 3. 프락시 패턴을 이용한 방식 |
스프링 AOP의 목적은 OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와주는 것이다.
1. 1. 4 스프링 프레임워크의 다양한 모듈
스프링 프레임워크는 기능별로 구분된 약 20여 개의 모듈로 구성돼 있다.
스프링 프레임워크를 사용한다고 해서 모든 모듈을 사용할 필요는 없습니다. 애플리케이션 개발에 필요한 모듈만 선택해서 사용하게끔 설계돼 있으며, 이를 경량 컨테이너 설계라고 부른다.
1.2 스프링 프레임 워크 vs 스프링 부트
앞에서 살펴본 것처럼 스프링 프레임워크는 기존 개발 방식의 문제와 한계를 극복하기 위해 다양한 기능을 제공한다.
지만 기능이 많은 만큼 성장이 복잡한 편이다. 필요한 모듈을 추가하다 보면 설정이 복잡해지는 문제를 해결하기 위해 등장한 것이 스프링 부트이다. 스프링 부트 공식 사이트는 다음과 같은 문구가 쓰여있다.
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
:스트링 부트를 이용하면 단독으로 실행 가능한 상용 수준의 스프링 기반 애플리케이션을 손쉽게 만들 수 있습니다.
1. 2. 1 의존성 관리
스프링 프레임워크에서는 개발에 필요한 각 모듈의 의존성을 직접 설정해야 했다. 또 호환되는 버전을 명시해야 정상 동작한다. 심지어 사용되는 프로그램의 버전까지도 고려해야한다.
하지만 스프링 부트에서는 이 같은 불편함을 해소하기 위해 'spring-boot-starter'라는 의존성을 제공한다.
이것의 의존성은 여러가지 종류가 있고, 각 라이브러리의 기능과 관련해서 자주 사용되고 서로 호환되는 버전의 모듈 조합을 제공한다.
'sping-boot-starter'의 여러 라이브러리를 함께 사용할 때는 의존성이 겹칠 수 있다. 이로 인해 버전 충돌이 발생할 수 있는데, 의존성 조합 충돌 문제가 없도록 'spring-boot-starter-parent'가 검중된 조합을 제공한다.
1. 2. 2 자동 설정
스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정 (Auto Configuration)을 지원한다.
자동 설정은 애플리케이션에 추가된 라이브러리를 실행하는 데 필요한 환경 설정을 알아서 찾아준다.
즉, 필요한 의존성을 추가하면 프레임워크가 이를 자동으로 관리해준다.
@SpringBootApplication 은 여러 어노테이션을 합쳐 놓은 인터페이스지만 기능 위주로 보면 크게 세 개의 어노테이션을 합쳐놓은 구성이다.
=> @SpringBootConfiguration, @EnableAutoConfiauration, @ComponentScan
1. 2. 3 내장 WAS (web Application Server)
스프링 부트의 각 웹 애플리케이션에는 내장 WAS가 존재한다. 웹 애플리케이션을 개발할 때 가장 기본이 되는 의존성인 'spring-boot-starter-web'의 경우 톰캣을 내장한다.
스프링 부트의 자동 설정 기능은 톰켓에도 적용되므로 특별한 설정 없이도 톰캣을 실행할 수 있다.
1. 2. 4 모니터링
개발이 끝나고 서비스를 운영하는 시기에는 해당 시스템이 사용하는 스레드, 메모리, 세션 등의 주요 요소들을 모니터링 해야 한다. 스프링 부트에는 부트 액추에이터라는 자체 모니터링 도구가 있다.