좋은 프로그램은 마음의 여유에서 나온다.

스프링 부트 시작하기. 헬로우월드 - 2 본문

프로그래밍/Spring

스프링 부트 시작하기. 헬로우월드 - 2

좋은데이 2016. 8. 18. 12:14

1편에서 만들었던 헬로우월드 프로젝트에 대해 자세히 알아 보겠습니다.


공부하면서 글을 쓰는 것이라서 잘못된 내용은 댓글 달아주세요.



1. 그래들 build.gradle 설정하기.

그래들은 ant나 maven같은 자바 빌드 툴 중에 하나입니다. 빌드는 개발한 코드를 제품으로 만드는 과정으로 컴파일, 테스트, 문서화, 배포 과정등을 얘기합니다.

maven의 경우 기본적으로 지원하지 않는 기능일 경우 빌드 과정을 추가해야 하는 것이 까다로운 편이였는데, 그래들은 groovy DSL을 이용하여 빌드 task를 직접 작성할 수 있습니다. 메이븐의 장점은 그대로 살리고 단점을 보완한 빌드 툴이라 할 수 있을 것 같습니다.


아래는 예제에 사용한 그래들 설정(build.gradle)입니다. 


group 'com.tistory.lky1001'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        jcenter()
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

sourceCompatibility = 1.8
targetCompatibility = 1.8

jar {
    baseName = 'springboottutorial'
    version =  '1.0-SNAPSHOT'
}

repositories {
    jcenter()
    maven { url "http://repo.spring.io/snapshot" }
    maven { url "http://repo.spring.io/milestone" }
}

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

항목을 자세히 살펴보면


buildscript : 빌드 스크립트가 외부 플러그인에 있을 경우 작성해 주는 곳.

 -> repositories : 빌드 플러그인 저장소를 정의해줍니다. 

 -> dependencies : 빌드 플러그인 디펜던시를 정의해 줍니다. 규칙은 group:name:version 으로 사용하며 group : 'xxx', name: 'yyy', version: 'z.z' 형태로도 동일하게 사용할 수 있습니다.


apply plugin : 사용할 플러그인을 설정해 줍니다.

 -> java : 자바 프로젝트에 필요한 빌드 프로젝트, 자바닥생성, 테스트 실행 등의 task들이 정의되어 있습니다.

 -> spring-boot : 스프링 부트와 관련된 task들이 정의 되어 있습니다. gradle bootRun을 실행하면 웹서비스가 실행되게 됩니다.


sourceCompatibility : 소스코드 레벨의 자바 버전 설정

targetCompatibility : 빌드시 자바 버전 설정


jar : build시 jar로 생성하는 규칙을 정의(war 플러그인으로 war을 생성할 수도 있음)


repositories : 자바 라이브러리의 저장소를 정의해 줍니다.

dependencies : 사용할 자바 라이브러리를 정의해 줍니다.


헬로우월드 프로젝트에서 별다른 설정없이 웹서버가 실행되는 것을 확인할 수 있는데 스프링부트의 장점중의 하나입니다.

그럼 이런 동작은 어떻게 가능한지 살펴보면 스프링 부트는 디펜던시 중에 spring-boot-starter-* 이라는 규칙을 보고 결정하게 됩니다.

위에 디펜던시 중에 spring-boot-starter-web이라는 것있습니다. 스프링 부트는 web이라는 것을 보고 이 프로젝트는 웹을 만드는 프로젝트라는 것을 짐작하게 되고 그에 맞는 설정을 스스로 하게 됩니다. 다른 예로는 spring-boot-starter-data-jpa 와 같은 디펜던시가 있을 경우 이 프로젝트는 jpa를 이용해서 data에 접근한다는 것을 알고 이에 맞는 설정을 하게 됩니다. 

참고 : 스타터에 대한 내용과 미리 정의된 디펜던시



헬로우월드 소스코드


package com.tistory.lky1001.springboottutorial;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by lee on 2016. 8. 9..
 */
@RestController
@EnableAutoConfiguration
public class Application {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}


어노테이션 설명


@EnableAutoConfiguration : 이 어노테이션은 사용자가 추가한 디펜던시를 통해 사용자가 스프링부트를 어떻게 사용하길 원하는지 추측하도록 스프링부트에게 알려줍니다. 위에서 설명한 spring-boot-starter 라는 키워드로 추측하게 하며 이 예제에서 사용한 spring-boot-starter-web은 사용자가 웹 애플리케이션을 개발하고 있다고 가정하여 tomcat과 spring mvc 등을 설정해줍니다.


@RestController : 스테레오 타입의 어노테이션이며 @Controller은 웹에서 요청이 들어올때 스프링이 고려하도록 정의해줍니다. @RestController은 @Controller과 응답을 렌더링하게 해주는 @ResponseMapping을 합한것으로 @ResponseMapping을 생략할 수 있습니다.


@RequestMapping : 경로 정보를 제공해주는 역할을 합니다. HTTP 요청 중 "/" 패스로 오는 것은 home 메소드로 연결됩니다. @RestController에 의해 스프링은 메소드에서 반환되는 "Hello World!" 문자열을 HTTP를 요청한 곳에 렌더링 해줍니다.


main 메소드

자바의 규칙에 의해 프로그램이 실행되는 지점입니다. SpringApplication 클래스의 run을 호출해 줌으로써 SpringApplication은 톰캣 웹 서버를 자동으로 설정하고 실행해 주는 과정을 진행하게 됩니다. run메소드에 Application 클래스를 넘겨줌으로 SpringApplication에게 프라이머리 스프링 컴포넌트를 알려주며 args 배열을 넘겨줌으로 커멘드 라인 매개변수를 줄수 있습니다.



이것으로 매우 간단한 코드만으로 웹 서버를 만들 준비가 끝났습니다.

Comments