[From Hello To QueryDSL] Hello, World! (1/12)

By | 2020년 3월 8일
Table of Contents

Hello, World!

Spring Boot 2.1 프로젝트를 진행하기에 앞서 공부한 내용을 정리해 둡니다.

개발환경

  • Spring Boot 2.1.x
  • Gradle 4.10.2

Gradle 5.x 를 사용하고 싶었지만, querydsl 을 사용하려고 하니 4.x 를 사용할 수밖에 없네요.(2020-03-08 기준)

스프링 부트 프로젝트가 처음이라면 새 프로젝트 생성하기 를 먼저 참고하시기 바랍니다.

설정

/gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

/build.gradle

buildscript {
    ext {
        springBootVersion = '2.1.13.RELEASE'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

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

group 'kr.co.episode.example'
version '0.0.1-SNAPSHOT'
sourceCompatibility = 11

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

코드

/src/main/java/kr/co/episode/example/ExampleApplication.java

package kr.co.episode.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ExampleApplication {

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

}

/src/main/java/kr/co/episode/example/web/IndexController.java

package kr.co.episode.example.web;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@RequiredArgsConstructor
@Controller
public class IndexController {

    @GetMapping("/")
    public String index() {
        return "index";
    }
}

src/main/resuurces/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
Hello, World!
</body>
</html>

실행

ExampleApplication.java 파일에 마우스를 올리고 오른쪽 클릭을 하면 run ExampleApplication.main() 을 실행할 수 있습니다.

다음에 브라우저에서 http://localhost:8080/ 을 접속하면 Hello, World! 를 볼 수 있습니다.

설명

디렉토리 구조

build.gradle 이 패키지 매니저 설정입니다. dependencies 에 필요한 라이브러리를 추가함으로 프로젝트에서 라이브러리를 사용할 수 있게 됩니다.

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

src/main/java 에는 소스코드가 들어가고, src/test 에는 소스코드 테스트를 위한 코드가 들어갑니다.

src/main/resources/application.properties 가 설정파일입니다. 현재 텅비어 있는데 왜 텅비어 있어도 프로젝트가 작동하는지는 아래에서 설명합니다.

src/main/resources/static 에는 css/js 파일이 들어갑니다. src/main/resources/template 에는 html 파일이 들어갑니다. 정확히는 폴더명 그대로 템플릿이 들어가는건데… 이건 spring-boot-starter-thymeleaf 설명할 때 같이 설명합니다.

Spring Boot 의 작동방식

Application 을 실행한건 알겠는데 왜 WAS 가 실행될까?

Spring Boot 는 WAS 가 지정되어 있지 않으면 자동으로 tomcat 을 다운받아 실행시킵니다.

설정파일이 텅비어 있는데 왜 tomcat 이 작동할까?

Spring Boot 는 build.gradle 에 추가되어 있는 라이브러리를 보고 자동으로 기본적인 설정을 해버립니다. 기본값과 다른 설정을 하고자 하면 그 때 설정파일에 설정을 추가해 주는 방식입니다.

의존성에 spring-boot-starter-web 이 추가되어 있으면, WAS 로 쓰일만한 라이브러리가 의존성에 있는지 확인하고, 없으면 암시적으로 tomcat 을 의존성에 추가해버리는 방식입니다.

그럼, public String index() 는 왜 실행될까?

Spring Boot 는 톰캣 실행과 동시에 @Controller 어노테이션이 붙어있는 클래스를 자동생성합니다.

그리고, 사용자 호출이 오면 해당 url 을 받아주는 @Controller 를 찾아 실행시킵니다.

여기서 중요한건… xxxController 라고 클래스명 지었으니 알아서 실행되겠지? 이거 아닙니다. 클래스명이 아니라 @Controller 어노테이션을 찾아갑니다. 어노테이션이 없으면 404 에러를 반환합니다.

답글 남기기