본문 바로가기
Reactive Programming/Reactive Programming with Spring Boot

[WebFlux] 2. Project setting (Eclipse, Gradle based)

by kellis 2020. 8. 3.

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 되지 않습니다. 

 

댓글