1. Spring initializr를 이용한 프로젝트 생성
이 장에서는 spring initializr를 통해 프로젝트 zip 파일을 만들고, eclipse에서 import 하는 방식으로 프로젝트를 생성하여 보도록 하겠습니다.
https://start.spring.io/ 에 접속하여 아래와 같이 dependency를 추가하여 줍니다.
이 프로젝트는 Gradle을 사용하여 Spring boot 2로 개발을 진행할 것입니다. (Spring boot 1에서는 Reactive가 지원되지 않습니다.)
Project Metadata
- group : build.gradle 파일의 group 정보로 들어갈 내용. Java의 root package명.
- artifact : 프로젝트명.
Dependencies
- Reactive Web : embedded Netty + Spring WebFlux
- Reactive MonoDB : Spring Data MongoDB
- Thymeleaf template engine
- Lombok : simplify writing POJOs
참고. Lombok은 다른 jar 라이브러리 파일과 달리, 이클립스 실행환경에 설치되어야 사용이 가능합니다.
Generate Project를 클릭하여 zip파일을 다운로드하고, 이 파일을 Existing Gradle Project로 import 하여 개발 준비를 끝마칩니다.
Spring initialzr에 의해 생성된 build.gradle 파일에 추가적으로 필요한 maven dependency를 추가할 수 있습니다.
*만약 검색했을 때 Existing Gradle Project가 보이지 않으신다면 (eclipse neon 이하의 version을 사용하고 계신 경우)
Marketplace에서
Buildship Gradle Integration 2.0을 install하시거나 new spring starter project로 생성하여 사용하시기 바랍니다.
(eclipse > new project > spring starter project를 이용하여 동일하게 프로젝트 생성이 가능합니다.)
2. build.gradle
spring initializr에서 생성한 프로젝트를 import하면 아래와 같은 build.gradle이 생성된 것을 확인할 수 있습니다.
buildscript {
ext {
springBootVersion = '2.0.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.wiki.reactivewithspringboot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.projectlombok:lombok')
compile('org.springframework.boot:spring-boot-starter-data-mongodb-reactive')
compile('de.flapdoodle.embed:de.flapdoodle.embed.mongo')
compile('org.synchronoss.cloud:nio-multipart-parser')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('io.projectreactor:reactor-test')
}
- spring-boot-starter-webflux : Reactive Web Dependency를 추가하면 생성되는 것으로 Reactive Spring Web 애플리케이션을 생성하기 위한 기반이 되는 Dependency입니다. Embedded Netty를 포함하고 있고, server는 별도로 tomcat과 같은 dependency를 추가하여 변경할 수 있습니다.
- spring-boot-starter-thymeleaf : Thymeleaf의 template engine을 가져오는 Dependency입니다.
- spring-boot-starter-test : 프로젝트를 생성하면 스프링 부트는 기본적으로 테스트 dependency를 포함시키는데, 이 Dependency는 JUnit, Spring Boot Test, Mockito, AssertJ, JSONassert, Hamcrest 등의 테스트 라이브러리를 포함하는 컬렉션입니다.
- nio-multipart-parser : Synchronoss의 third-party 라이브러리로, 리액티브한 multipart file 업로드를 지원합니다.
우리는 간단한 이미지 업로드 서비스를 만들어 줄 것이기 때문에 nio-multipart-parser와 embedded mongodb인 flapdoodle을 추가하여 줍니다.
참고. gradle은 build.gradle이 변경되는 경우 수동으로 refresh gradle project를 해 주어야 변경 사항이 적용됩니다.
3. SpringBootApplication class
다음으로 살펴볼 부분은 default로 생성되는 spring boot를 run하기 위해 꼭 필요한 클래스인 ReactiveWithSpringBootApplication입니다. 클래스명은 프로젝트명을 참조하여 만들어지게 되고 내부는 main 메서드와 그 내부에 SpringApplication.run 코드로 이루어집니다.
package com.wiki.reactivewithspringboot.reactivewithspringboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ReactiveWithSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(ReactiveWithSpringBootApplication.class, args);
}
}
@SpringBootApplication 은 아래와 같은 세 가지 annotation의 기능을 수행합니다.
- @Configuration : applicationContext를 위해 bean을 정의하는 source 역할 class. 즉 Spring의 설정 파일 역할을 하는 클래스임을 알려주는 것입니다.
- @EnableAutoConfiguration : Spring Boot가 classpath setting, 또 다른 beans, 그리고 다양한 property settings에 기초하여 bean들을 등록하도록 지시합니다.
- @ComponentScan : Spring이 다른 components, configurations, services을 확인하도록 지시합니다.
ComponentScan의 기능이 제대로 동작하기 위해서 이 어노테이션이 선언된 클래스는 패키지 최상위에 위치하게 됩니다.
4. application.properties
마지막으로 살펴 볼 세팅은 application.properties파일입니다.
server.port=8080
# tag::logging[]
logging.level.com.wikit=DEBUG
logging.level.org.springframework.data=TRACE
logging.level.reactor.core=TRACE
logging.level.reactor.util=TRACE
# end::logging[]
default로 아무런 내용도 적혀 있지 않은 이 properties 파일에 port 정보와 log에 관련된 정보를 기재해 주었습니다. Netty는 default port로 8080을 사용하기 때문에 이 부분은 생략하셔도 상관없습니다.
properties 파일과 동일하게 yml 파일을 만들어 사용하셔도 무방합니다.
server:
port: 8080
# tag::logging[]
logging:
level:
com:
wikit: DEBUG
org:
springframework:
data: TRACE
reactor:
core: TRACE
util: TRACE
# end::logging[]
src/main/resource 폴더 내에 이 파일이 생성된 것을 보실 수 있는데, 이 위치에 두게 되면 Spring Boot가 애플리케이션이 실행될 때 자동으로 이 설정 파일을 로드합니다. 따로 properties파일을 읽도록 설정할 필요가 없어 편리합니다.
* Reactive 관련 주의사항
Reactive Application을 만들 때 주의해야 할 점은 전체 stack이 reactive해야 한다는 점입니다. 중간에 어느 한 stack이라도 reactive하지 않다면 전체 application은 reactive 하게 동작하지 못하게 됩니다. 어느 한 곳에 blocking 될 수 있는 가능성이 생기기 때문입니다. 그렇기 때문에 Spring Boot는 default로 reactive application의 가장 유명한 솔루션 중 하나인 Netty를 default로 채택하고 있는 것입니다. 같은 맥락으로 Spring webflux dependency를 추가했다면, Spring mvc dependency는 함께 추가하면 안 됩니다. 두 dependency를 함께 추가하게 되면 spring boot는 run 되지 않습니다.
'Reactive Programming > Reactive Programming with Spring Boot' 카테고리의 다른 글
[WebFlux] 5. Spring Reactive Data로 Reactive Repository 구성하기 (0) | 2020.08.03 |
---|---|
[WebFlux] 4. WebFlux로 Reactive Controller Bean 작성하기 (0) | 2020.08.03 |
[WebFlux] 3. WebFlux로 Reactive Service Bean 구성하기 (0) | 2020.08.03 |
[WebFlux] 1. Reactive Programming 개요 (0) | 2020.08.03 |
[WebFlux] 0. 이 카테고리에서는.. (0) | 2020.08.03 |
댓글