Lined Notebook

🍃 스프링 입문 스터디 1일 차 정리

by juraffe juraffe
이 글은 김영한 님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 학습하며 작성된 글입니다.

스프링 입문 스터디 1일 차 정리

 

프로젝트 생성

스프링 부트는 start.spring.io에서 제공되는 Initializr를 통해서 필요한 의존성, 언어 및 버전에 따른 프로젝트를 손쉽게 생성할 수 있다. 이전의 스프링의 경우 프로젝트 생성에 있어 필요한 의존성 및 프로퍼티 설정을 직접 작성하는 등의 번거로운 작업이 많이 필요하였지만, 스프링 부트의 경우 앞서 소개한 사이트를 활용하여 기존의 불편한 점을 많이 해소할 수 있었다.

단, 프로젝트 생성 이후에 프로젝트에 필요한 설정과 의존성이 변경이 있을 시 프로젝트를 직접 수정할 필요는 있다. 따라서 프로젝트의 구조와 쓰임새를 파악할 필요가 있다. Kotlin으로 생성한 스프링 부트 프로젝트의 경우 프로젝트에 필요한 의존성과 기타 정보가 들어있는 build.gradle.kts파일에 기록되어 있다.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
	id("org.springframework.boot") version "2.5.0"
	id("io.spring.dependency-management") version "1.0.11.RELEASE"
	id("org.asciidoctor.convert") version "1.5.8"
	kotlin("jvm") version "1.5.10"
	kotlin("plugin.spring") version "1.5.10"
	kotlin("plugin.jpa") version "1.5.10"
}

group = "dev.juraffe"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
	mavenCentral()
}

val snippetsDir = file("build/generated-snippets").also { extra["snippetsDir"] = it }

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
	implementation("org.springframework.boot:spring-boot-starter-hateoas")
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
	implementation("org.jetbrains.kotlin:kotlin-reflect")
	implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
	developmentOnly("org.springframework.boot:spring-boot-devtools")
	runtimeOnly("com.h2database:h2")
	runtimeOnly("org.postgresql:postgresql")
	testImplementation("org.springframework.boot:spring-boot-starter-test")
	testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
}

tasks.withType<KotlinCompile> {
	kotlinOptions {
		freeCompilerArgs = listOf("-Xjsr305=strict")
		jvmTarget = "11"
	}
}

tasks.withType<Test> {
	useJUnitPlatform()
}

tasks.test {
	outputs.dir(snippetsDir)
}

tasks.asciidoctor {
	inputs.dir(snippetsDir)
	dependsOn(tasks.test)
}

build.gradle.kts파일에는 plugins/repositories/dependencies/tasks.{withType, test, asciidoctor}가 포함되어 있다. 여기서 입문 단계에서는 dependencies(의존성)을 관리하는 부분을 주로 다루게 되는데 여기는 프로젝트에서 사용되는 여러 가지 의존성을 Maven repository에서 찾아서 넣어줄 수 있다.

 

라이브러리 살펴보기

라이브러리의 뜻은 프로그램 개발시 사용되는 하부 프로그램들의 모임이라고 소개된다. 즉, 이런 라이브러리를 활용하면 우리가 구현해야 할 부분에만 집중하여 개발을 할 수 있다.

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}

스프링에선 다양한 라이브러리가 존재하는데 그 중 웹을 개발하기 위하여 가장 기본적으로 필요한 라이브러리가 spring-boot-starter-web, spring-boot-starter-test이다. starter-web은 이름에서 알 수 있듯 웹과 관련된 라이브러리이며, spring-boot-starter-test는 테스트 코드 작성에 도움을 주는 라이브러리이다. 요즘 개발 트렌드인 TDD(Test driven development)를 위해 다양한 예제 프로젝트에서 포함될 것을 볼 수 있다.

 

View 환경설정

View는 웹 MVC에서 V를 의미한다. 즉, 사용자에게 실질적으로 보일 부분이 이에 해당한다. 사용자에게 웹페이지를 보여주기 위한 HTML 파일은 spring 프로젝트 구조에서 resources/templates 아래에 위치하게 된다. 그러면 어떻게 웹페이지를 사용에게 보여줄 수 있을까? 웹은 사이트에 접속하기 위해선 주소를 알 필요가 있다. 이를 담당하는 부분이 C(Controller 이하 컨트롤러)이다. 컨트롤러는 View와 주소를 연결하고, 또 View와 함께 M(Model 이하 모델)의 데이터를 함께 보내 View에서 실질적인 데이터를 보여줄 수 있게 된다.

package com.inflearn.springbeginner.springbeginner.controllers

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HomePageController {

    @GetMapping("hello")
    fun hello(model: Model): String {
        model.addAttribute("name", "world")
        return "hello"
    }
}

먼저 @Controller 어노테이션을 통해 클래스가 컨트롤임을 빈으로 등록하게 된다. 그러면 컨트롤러 클래스 메서드에서 @GetMapping 어노테이션을 통해 GET 요청에 대한 처리를 할 수 있게 된다. GET 요청은 일반적으로 사용자가 주소를 입력하거나, 링크를 클릭하여 웹페이지를 방문할 때 사용되는 메서드이다. 컨트롤로 메서드는 모델을 매개변수로 가지게 되는데, 이를 통해서 뷰에게 서버에서 가공한 데이터를 보낼 수 있게 된다.

하지만 단순한 HTML 문서의 경우 모델에 넘겨준 데이터에 대해서 접근할 수 있는 방법이 없다. 따라서 뷰와 모델을 적절히 치환하는 과정이 필요한데 이때 필요한 것이 템플릿 엔진이다. 강의에선 Thymeleaf 엔진을 사용하기 때문에 이 글에서도 같은 템플릿 엔진을 활용하겠다. 위 코드에서 12행에 있는 model.addAttribute("name", "world")는 name이라는 키에 world라는 값을 모델에 넣어준 것 이다.

이것을 템플릿 엔진인 Thymeleaf는 key를 통해 데이터에 접근하여 그 부분을 해당하는 값으로 치환하여 사용자에게 보여줄 최종 HTML을 작성하여 보여주게 된다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello, World!</title>
</head>
<body>
Hello, <span th:text="${name}">placeholder</span> !!!
</body>
</html>

위 HTML에서 8행에 th:text="${name}" 부분이 컨트롤러에서 모델에 넣어준 키와 연결되어 최종적으로 사용자에게 보여지게 된다.

 

블로그의 정보

🦒 Juraffe's note

juraffe juraffe

활동하기