메뉴

문서정보

목차

Spring Boot 개발환경 구성

개발 환경

$ uname -a
Linux yundream 5.0.0-38-generic #41-Ubuntu SMP Tue Dec 3 00:27:35 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ java -version
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Ubuntu-0ubuntu1.119.04)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Ubuntu-0ubuntu1.119.04, mixed mode, sharing)

gradle 설치

apt-get으로 설치 할 수 있는데, 올드한 4.x 버전이 설치된다. 자바 버전이 11.0.5 최신버전이라서 이런 올드버전을 사용했다가는 빌드실패한다. 최신버전을 설치하기로 했다.
$ sudo add-apt-repository ppa:cwchien/gradle
$ sudo apt update
$ sudo apt install gradle
$ gradle -version

------------------------------------------------------------
Gradle 6.0.1
------------------------------------------------------------

Build time:   2019-11-18 20:25:01 UTC
Revision:     fad121066a68c4701acd362daf4287a7c309a0f5

Kotlin:       1.3.50
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.5 (Private Build 11.0.5+10-post-Ubuntu-0ubuntu1.119.04)
OS:           Linux 5.0.0-38-generic amd64

maven 설치

# mvn -version
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 11.0.5, vendor: Private Build, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ko_KR, platform encoding: UTF-8
OS name: "linux", version: "5.0.0-38-generic", arch: "amd64", family: "unix"

Spring Boot 프로젝트

MyProject라는 이름의 프로젝트를 진행하기로 했다.
$ mkdir $HOME/workspace/MyProject
$ cd $HOME/workspace/MyProject
gradle init명령으로 프로젝트를 초기화 한다.
 gradle init --type java-application
Starting a Gradle Daemon (subsequent builds will be faster)

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter
Enter selection (default: JUnit 4) [1..4] 

Project name (default: MyProject): 
Source package (default: MyProject): 

> Task :init
Get more help with your project: https://docs.gradle.org/6.0.1/userguide/tutorial_java_projects.html

BUILD SUCCESSFUL in 15s
2 actionable tasks: 2 executed

프로젝트 구조는 아래와 같다.
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

build.gradle 설정

buildscript {
    repositories {
    ¦   mavenCentral()
    }
    dependencies {
    ¦   classpath("org.springframework.boot:spring-boot-gradle-plugin:2.2.2.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("junit:junit")
}

buildscript 블록에서 "classpath"를 설정해서 해당 클래스 경로에 있는 클래스를 사용 할 수 있다. 내가 만들려고 하는 "spring boot"는 gradle에 기본으로 import 된 클래스가 아니기 때문에 여기에 등록해줘야 한다. plugins을 이용해서 Gradle의 모델을 확장 할 수 있다. ext는 전역변수를 설정하기 위해서 사용한다. 2019년 12월 현재 srping boot 의 최신버전은 2.2.2다.

Gradle은 Plugin을 이용해서 기능을 확장한다. 자바코드를 컴파일하는 등의 일은 모두 플러그인으로 수행한다.

테스트 코드

디렉토리를 만들고 Application.java와 HelloController.java 코드를 개발한다.
$ mkdir src/main/java/hello
$ cd src/main/java/hello
Application.java
package hello;

import java.util.Arrays;

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);

        System.out.println("Let's inspect the beans provided by Spring Boot:");
        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
    }

}

HelloController.java
package hello;
                                
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
  
@RestController
public class HelloController {
    
    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }
}

Build

gradle

gradle로 빌드하고 애플리케이션을 실행해보자.
# ./gradlew build                              

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 996ms
2 actionable tasks: 2 up-to-date

# java -jar build/libs/gs-spring-boot-0.1.0.jar
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.2.RELEASE)

2019-12-25 01:53:13.009  INFO 28447 --- [           main] hello.Application                        : Starting Application on yundream with PID 28447 (/home/yundream/workspace/java/myProject/build/libs/gs-spring-boot-0.1.0.jar started by yundream in /home/yundream/workspace/java/myProject)
2019-12-25 01:53:13.012  INFO 28447 --- [           main] hello.Application                        : No active profile set, falling back to default profiles: default
......
테스트를 해보자.
# curl localhost:8080
Greetings from Spring Boot!

marven

marven 빌드를 위해서 pom.xml를 만들었다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>


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

</project>

패키지를 만들고 실행하자.
# mvn package
# java -jar target/gs-spring-boot-0.1.0.jar 

코드 수정

/hello API를 추가했다.
package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {
    
    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

	@RequestMapping("/hello")
	public String hello() {
		return "Hello World";
	}
}

정리