Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

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
  • gradlew : 유닉스 쉘 스크립트다. 이 스크립트를 이용해서 빌드작업을 단순화 할 수 있다. 프로젝트가 초기화된 다음에는 이녀석만 사용하면 된다고 한다.
  • build.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";
	}
}

용어들

pom.xml

Maven은 자바 프로젝트의 빌드를 도와주는 빌드 툴이다. Maven을 사용해서 C#, Ruby, Scala 기타 언어로 작성된 프로젝트를 빌드하고 관리 할 수 있다. Maven은 빌드를 위해서 두 개의 파일을 사용한다.
  • settings.xml
  • pom.xml
pom.xml은 프로젝트의 최상위 디렉토리에 만들어진다. pom은 Project Object Model로 프로젝트의 빌드 정보를 설정하는 파일이다. 다른 이름으로 설정 할 수 있기는 한데 관습적으로 pom.xml을 사용한다.

pom.xml의 형식은 아래와 같다.
<project>
  <!-- model version is always 4.0.0 for Maven 2.x POMs -->
  <modelVersion>4.0.0</modelVersion>
  <!-- project coordinates, i.e. a group of values which uniquely identify this project -->
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0</version>
  <!-- library dependencies -->
  <dependencies>
    <dependency>
      <!-- coordinates of the required library -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <!-- this dependency is only used for running and compiling tests -->
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

정리

  • Java는 해 본적이 없다.
  • 어쩌다가 spring boot를 하게 됐는데, "Java가 아닌 spring boot를 사용한다"라는 느낌이 될 거 같다. "python은 모르지만 Django는 사용한다. Ruby는 잘 모르겠는데 Rails는 합니다" 이런 느낌.
  • Spring boot는 왜 하느냐 하면, 많이들 사용하니까. 그리고 간단? 하다고 하니까.
  • GoLang 사용하다가 Spring boot로 개발 하면서 느끼는 점. 아 GoLang이 간단하긴 하구나. Java는 개발 환경 세팅 부터 왜 이렇게 복잡한가 ? 나중에 더 구조화된(거대한) 프로그램을 만들게 되면 Java와 Spring boot의 장점을 찾을 수 있겠지 ?