본문 바로가기

프로그래밍(TA, AA)/JVM 언어

[스프링] 스프링 프레임워크 5.0 (2) - 스프링부트

스프링 부트의 목표는 새로운 컴포넌트로 문제를 빠르게 해결하는 것이다. 


 - 왜 스프링 부트인가?

 - 스프링 부트가 제공하는 기능은 무엇인가?

 - 자동 설정이란 무엇인가?

 - 스프링 부트란 무엇인가?

 - 스프링 부트를 사용할때 백그라운드에서는 어떤 일이 발생할까?

 - 스프링 Initializer를 사용해 새로운 스프링 부트를 어떻게 만들까?

 - 스프링 부트로 기본적인 RESTful 서비스를 어떻게 만들까?




스프링 부트는 무엇인가?


스프링 부트는 코드 생성 프레임워크가 아니기 때문에 코드를 생성하지 않는다. 스프링 부트는 애플리케이션 섭도, 웹서버도 아니다. 다양한 애플리케이션, 웹서버와의 통합을 제공한다. 스프링 부트는 특정 프레임워크나 스펙을 구현하지 않는다.


스프링부트란 무엇이며, 지난 2년동안 왜 인기가 많았을까?



[마이크로서비스로 빠르게 프로토타입 구축]

스프링 MVC로 마이크로서비스를 만들고 JPA를 사용해 데이터베이스에 연결한다고 가정한다면 애플리케이션을 설정하는 단계는 다음과 같다.


1. 사용할 스프링 MVC, JPA, 하이버네이트의 버전을 결정한다.

2. 모든 다른 레이어를 연결하는 스프링 Context를 설정한다.

3. 스프링 MVC로 웹레이어를 설정한다. (DispatcherServlet, Handler, Resolver, View Resolver 등에 대한 빈구성)

4. 데이터 레이어에서 하이버네이트를 설정하한다. (SessionFactory, DataSource 등에 대한 빈 구성)

5. 서로 다른 환경에 따라 애플리케이션 구성을 저장하는 방법을 결정하고 구현한다.

6. 단위 테스트를 어떻게 할 것인지 결정한다.

7. 트랜잭션 전략을 결정하고 구현한다.

8. 보안을 구현한는 방법을 결정하고 구현한다.

9. 로깅 프레임워크를 설정한다.

10. 프로덕션 환경에서 애플리케이션을 모니터링할 방법을 결정하고 구현한다.

11. 애플리케이션에 대한 통계를 제공하기 위해 메트릭스 관리 시스템을 결정하고 구현한다.

12. 애플리케이션을 웹 또는 애플리케이션 서버에 배포하는 방법을 결정하고 구현한다.


위에 언급단 단계 중 최소한 몇가지를 완료해야 비즈니스 로직을 구축할 수 있다. 이는 최소한 몇주일이 걸릴 수도 있다. 마이크로서비스를 구축할 때는 빠른 시작을 원한다. 앞의 12단계를 모두 거치면 마이크로서비스를 쉽게 개발할 수 없다. 


스프링부트를 사용하면 "바로 실행"할 수 있는 Standalone, 프로덕션급 스프링기반 애플리케이션을 쉽게 만들 수 있다. 스프링 플랫폼 및 서드파티 라이브러리에 대한 의견을 개진해 최소한의 관심으로 시작할 수 있다. 대부분의 스프링 부트 애플리케이션은 스프링 구성이 거의 필요하지 않다.


스프링 부트는 개발자가 마이크로서비스 뒤에 있는 비즈니스 로직에 집중할 수 있게 해준다. 스프링 부트의 목표는 마이크로서비스를 개발하는 것과 관련된 모든 핵심적인 기술 세부 사항을 관리하는 것이다.


[기본목표]

1. 스프링-기반 프로젝트를 신속하게 구축할 수 있다.

2. 일반적인 사용법에 따라 기본적인 가정을 만든다. 기본값과의 차이를 처리하는 구성 옵션을 제공한다.

3. 다양한 비기능적인 특징을 제공한다.

4. 코드 생성을 사용하지 말고, 많은 XML 구성을 피할 수 있다.


[비기능적인 특징]

1. 다양한 프레임워크, 서버 및 스펙의 버전 관리 및 설정에 대한 기본 처리

2. 애플리케이션 보안을 위한 기본 옵션

3. 확장 가능성이 있는 기본 애플리케이션 메트릭스

4. 상태 확인을 사용한 기본 애클리케이션 모니터링

5. 외부화된 설정을 위한 여러 옵션



스프링 부트 Hello World


스프링 부트 애플리케이션으로 시작하는 과정은 다음과 같다.


1. pom.xml 파일에서 spring-boot-starter-parent를 설정한다.

2. 필요한 스타터 프로젝트로 pom.xml 파일을 구성한다.

3. 애플리케이션을 실행하려면 spring-boot-maven-plugin을 설정한다.

4. 첫번째 스프링 부트 실행 클래스를 만든다.



1. spring-boot-starter-parent 구성

spring-boot-starter-parent 의존성은 사용할 자바 기본 버전, 스프링 부트가 사용하는 의존성의 기본 버전 및 메이븐 플러그인의 기본 설정을 포함한다. spring-boot-starter-parent 의존성은 스프링 부트-기반 애플리케이션에 대한 의존성 및 플러그인 관리를 제공하는 부모 POM이다.


spring-boot-starter-parent 의존성은 POM의 상단에 정의된 spring-boot-dependencies를 상속받는다. 


여러 버전의 프레임워크 간 호환성은 개발자가 직면하고 있는 주요 문제중 하나이다. 스프링의 특정 버전과 호환되는 최신 스프링 세션 버전은 어떻게 찾을까? 일반적인 대답은 문서를 읽는 것이다. 그러나 스프링부트를 사용하면 spring-boot-starter-parent로 쉽게 만들 수 있다. 새로운 스프링 버전으로 업그레이드하고 싶다면 스프링 버전에 대한 spring-boot-starter-parent 의존성을 찾아야 한다. spring-boot-starter-parent의 해당 특정 버전을 사용하기 위해 애플리케이션을 업그레이드하면 다른 모든 의존성이 새 스프링 버전과 호환되는 버전으로 업그레이드 된다. 개발자가 처리해야 하는 문제가 하나 적어지는 것이다.

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>



2. 필요한 스타터 프로젝트를 사용해 pom.xml 구성


스프링 부트에서 애플리케이션을 구축하고자 할때마다 스타터 프로젝트를 사용해야할 필요가 있다. 스타터는 여러가지 목적으로 커스텀이 단순화된 의존성 디스크립터다. spring-boot-starter-web은 스프링 MVC를 사용해 RESTful이 포함된 웹애플리케이션을 작성하기 위한 스타터다. 기본 임베디드 컨테이너로 톰캣을 사용한다. 스프링 MVC를 사용해 웹애플리케이션을 개발하고 싶다면 의존성에 spring-boot-starter-web을 포함시키면 된다. 그러면 다음과 같이 자동으로 프로젝트가 구성된다.


 - 스프링 MVC

 - 호환 가능한 버전의 jackson-databind(바인딩용)

 - spring-boot-starter-tomcat(톰캣을 위한 스타터 프로젝트)



만들고자 하는 웹애플리케이션이 단위 테스트가 가능하고, 톰캣에 배포되길 원한다면 다음과 같이 pom.xml 의존성단락을 구성하면 된다.

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
</dependencies>


spring-boot-starter-test 의존성은 단위 테스트에 필요한 다음과 같은 테스트 프레임워크를 제공한다.


 - JUnit: 기본 단위 테스트 프레임워크

 - 모키토: 모킹을 위해

 - Hamcrest, AssertJ: 검증(assert)를 위해

 - 스프링 테스트: 스프링 컨텍스트-기반 애플리케이션을 위한 단위 테스트 프레임워크


spring-boot-starter-tomcat 의존성은 웹 애플리케이션을 실행하는데 있어 기본값이다. 설정을 명확히 하기 위해 포함시킨것이며, spring-boot-starter-tomcat은 톰캣을 임베디드 서블릿 컨테이너로 사용하기 위한 스타터이다.


spring-boot-maven-plugin을 추가하면 스프링 부트 애플리케이션을 실행할 수 있다.



3. spring-boot-maven-plugin 구성


스프링부트를 사용해 애플리케이션을 구축할때는 다음과 같은 두가지 상황이 발생할 수 있다.


 - JAR 또는 WAR를 빌드하지 않고 애플리케이션을 실행하고 싶다.

 - 나중에 배포할수 있도록 JAR 및 WAR를 빌드하고자 한다.


spring-boot-maven-plugin 의존성은 앞의 두가지 상황 모두에 대한 기능을 제공한다. 

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>



4. 첫 스프링 부트 구동 클래스 생성


다음 클래스는 간단한 스프링 부트 구동 클래스를 생성하는 방법이다. 다음은 SpringApplication 클래스에서 정적 구동 메서드를 실행하는 간단한 자바 메인 메서드다.

package com.mastering.spring.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		ApplicationContext ctx = SpringApplication.run(Application.class, args);
	}
}


SpringApplication 클래스는 자바 메인 메서드에서 스프링 애플리케이션을 구동하고 부트스트랩을 사용할 수 있다. 다음은 스프링 부트 애플맄메이션이 부트스트랩될때 일반적으로 수행되는 단계다.


1. 스프링의 ApplicationContext 인스턴스를 생성한다.

2. 명령줄 인수를 받아들이고, 이를 스프링 속성으로 노출하는 기능을 활성화한다.

3. 설정에 따라 모든 스프링 빈을 로드한다.



@SpringBootApplication 어노테이션은 세가지 어노테이션에 대한 바로가기이다.


 - @Configuration: 스프링 애플리케이션 컨텐스트 구성 파일이라는 것을 나타낸다.

 - @EnableAutoConfiguration: 스프링 부트의 중요한 기능인 자동 설정을 가능하게 한다.

 - @ComponentScan: 이클래스의 패키지와 모든 서브패키지에서 스프링 빈을 검색할 수 있도록 한다.


Mapping Servlet: 'dispatcherServlet' to [/] : DispatcherServlet이 설정된다. 이는 스프링 MVC 프레임워크가 요청을 받아들일 준비가 됐다는 것을 의미한다.



spring-boot-starter-web에 의존성을 추가하면, 다음 빈이 자동으로 설정된다.


basicErrorController, handlerExceptionResolver: 기본 예외 처리다. 예외가 발생할때 기본 에러 페이지를 표시한다.

beanNameHandlerMapping: 핸들러(컨트롤러)에 대한 경로를 확인하는데 사용하면 된다.

characterEncodingFilter: 기본 문자 인코딩 UTF-8을 제공한다.

dispatcherServlet: DispatcherServlet은 스프링 MVC 애플리케이션의 프런트 컨트롤러다.

jacksonObjectMapper: 객체를 JSON으로 변환하고, REST 서비스에서는 JSON를 객체로 변환한다.

messageConverters: 객체를 XML 또는 JSON으로 또는 그 반대로 변환하는 기본 메시지 컨버터다.

multipartResolver: 웹 애플리케이션의 파일 업로드 지원을 제공한다.

mvcValidater: HTTP 요청의 검증을 지원하다.

viewResolver: 논리적 뷰 이름을 물리적 뷰로 해석한다.

propertySourcesPlaceholderConfigurer: 애플리케이션 구성의 외부화를 지원한다.

requestContextFilter: 요청에 대한 필터를 기본값으로 지정한다.

restTemplateBuilder: REST 서비스를 호출하는데 사용한다.

tomcatEmbeddedServletContainerFactory: 톰캣은 스프링 부트-기반 웹 애플리케이션을 위한 기본 임베디드 서블릿 컨테이너다.




스프링 이니셜라이저


스프링 이니셜라이저(http://start.spring.io)는 프로젝트 생성에 많은 유연성을 제공하며 다음은 사용할수 있는 옵션이다.


 - 빌드 도구(메이븐 또는 그래들)를 선택

 - 사용할 스프링 부트 버전 선택

 - 구성 요소에 대한 그룹 ID 및 아티팩트 ID 구성

 - 프로젝트에 필요한 스타터 선택

 - 구성 요소를 패키지하는 방법(JAR 또는 WAR)를 선택

 - 사용할 자바 버전 선택

 - 사용할 JVM 언어 선택


Project Generate 버튼을 클릭하면 .zip 파일이 만들어지고 컴퓨터에 다운로드 받을 수있다. 이를 IDE에 import하여 사용하면 된다.