스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 들으며 정리하는 POST입니다.
전체적인 흐름
- Spring Project 생성
- Spring boot로 웹 서버 실행
- 회원 도메인 개발
- 웹 MVC 개발
- DB 연동 - JDBC, JPA, Spring data JPA
- 테스트 케이스 작성
Springboot Starter를 사용하여 프로젝트 생성
https://start.spring.io
빌드 관리 도구란 ?
프로젝트에서 작성한 파일들을 JVM이나 WAS에서 인식할 수 있도록 패키징해주는 도구
이후 GENERATE
로 .zip 파일을 다운로드한 후, unzip 한 파일을 Intellij
로 OPEN
Project open시, 외부의 library를 로딩하는 과정이 필요하기 때문에, 시간이 좀 걸릴 수 있다.
src
main
, test
로 나뉜다.main/java
에 실제 패키지들과 소스 파일이 존재main/resources
에는 설정 파일들이 존재, java 파일을 제외한 모든 파일test/java
에 test 관련 코드들이 존재build.gradle
plugins {
id 'org.springframework.boot' version '2.5.6' // starter에서 선택한 버전
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java' // 선택한 언어
}
// Metadata
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11' // java version
// 아래에 선택한 library를 다운로드받는 곳, 필요하면 특정 사이트 url 지정 가능
repositories {
mavenCentral() //
}
// 선택한 library들
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:2.5.6'
implementation 'org.springframework.boot:spring-boot-starter-web:2.5.6'
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.5.6'
}
test {
useJUnitPlatform()
}
이제 src/main/java/hello.hellospring
안에 있는 메인 코드를 실행시켜보자.
실행한 후, http://localhost:8080 으로 접속해보자.
아직은 아무런 View를 구성하지 않았기에, 위와 같은 화면이 뜨게 된다.
프로젝트안의 build.gradle
을 보면, 아래와 같이 스타터로 프로젝트 생성할 때 추가했던 3개의 라이브러리들을 확인할 수 있다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:2.5.6'
implementation 'org.springframework.boot:spring-boot-starter-web:2.5.6'
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.5.6'
}
그리고, External Libraries
에서는 프로젝트 생성 시 땡겨온 라이브러리들을 확인할 수 있는데, 처음에 추가했던 3개의 라이브러리보다 훨씬 더 많은 수의 라이브러리가 땡겨와진 것을 확인할 수 있다.
이러한 이유는 우리가 사용하기 위해 추가한 3개의 라이브러리도 동작하기 위해서는 필요한 다른 라이브러리들이 존재한다. Gradle은 이러한 추가적인 라이브러리를 자동으로 External Libraries
에 추가해주기 때문에 많은 라이브러리들이 추가되어 있는 것이다.
위 화면에서 보이듯, Gradle > hello-spring > Dependencies에서 라이브러리간의 의존관계를 확인할 수 있다.
여기서 중요한 라이브러리로는 먼저 spring-boot-starter-tomcat
라이브러리가 있는데, 이는 Spring boot가 톰캣 웹서버를 내장되어 있기 때문에 존재하는 라이브러리이다.
또한, spring-boot-starter-logging
이라는 것이 있는데, 이는 서버 개발자들이 어떠한 에러들을 출력하고 한 눈에 모아서 보기 위해 사용하는 것이다. 내부에는 logback
, slf4j
라는 라이브러리가 내장되어 있다.
현재 서버를 실행하고 http://localhost:8080 으로 접속하면, 아까 위에서 본 화면이 뜬다.
이제 화면 구성을 한 번 해보도록 하자.
을 생성하게 되면, 이를 자동으로 welcome page로 설정해준다. 이는 정적 페이지로서, 작성한 코드를 그대로 브라우저에 던져주는 것이다.
<!-- index.html -->
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
코드를 작성하고 서버를 재시작하면, 아래의 화면을 볼 수 있을 것이다.
Spring은 그 생태계가 어마어마하게 크기 때문에, 머릿속에 모든 것을 다 넣을 수는 없다.
따라서, 원하는 것을 잘 찾는 능력이 필요하다.
https://docs.spring.io/spring-boot/docs/current/reference/html/
위 홈페이지에서 관련 문서를 찾아보도록 하자.
위 홈페이지에서, Welcome page에 대한 설명을 찾아보았다.
설명을 가져오자면, 스프링 부트는 static & templated welcome page 모두 지원한다. 먼저 static/index.html
을 찾고, 없다면 template/index.html
을 찾아 Welcome Page로서 사용한다.
static
과 다른 동적 페이지를 구성하는데 사용한다. 여기서 우리는 처음에 추가했던 thymeleaf 라는 템플릿 엔진을 사용할 것이다.
이와 관련된 문서로는 여기를 참고하면 된다.
스프링 부트는 FreeMarker, Groovy, Thymeleaf, Mustache의 총 4개의 템플릿 엔진에 대한 auto-configuration 지원을 한다.
auto-configuration이란?
이제, 실제로 동작하고, 프로그래밍이 되는 화면을 구현해보도록 하자.
먼저, src/main/java/hello.hellospring
에 controller
라는 Package를 생성한다. 이후 HelloController
라는 Class를 생성한다.
// HelloController
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
@Controller
public class HelloController {
}
이때, @Controller
라는 Annotation이 필요한데, 이는 일종의 메타데이터로서, 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는데 사용된다. 참고
@Controller
public class HelloController {
@GetMapping("hello")
public String Hello(Model model) {
}
}
클래스 안에 @GetMapping("hello")
는 Web application에서 "/hello"가 들어오면, Hello(Model model)
을 실행하도록 한다. 여기서 model은 Model, View, Controller의 model이고, Get은 Get or Post method를 의미한다.
@GetMapping("hello")
public String Hello(Model model) {
model.addAttribute("data", "hello!!!");
return "hello";
}
<!-- resources/templates/hello.html -->
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
를 작성하도록 한다. 일단은 따라서 쳐보도록 하자.
위 코드에서 th
라는 것을 볼 수 있는데, 이는 제일 윗 코드에서 선언한 xmlns:th="http://www.thymeleaf.org"
를 의미하고, 이 선언으로 thymeleaf 문법을 사용할 수 있게 된 것이다.
그리고 <p th:text="'안녕하세요. ' + ${data}">안녕하세요. 손님</p>
에서 data는 아까 위의 HelloController
에서 작성한 model.addAttribute("data", "hello!!!");
의 data를 의미한다. 이 메소드에서 "data"는 attributeName이고, "hello!!!"는 attributeValue가 된다. 이후 일단 서버를 재시작해보자.
위와 같이 /hello로 접속하게 되면, ${data}가 "hello!!!"로 치환된 것을 확인할 수 있다.
localhost:8080/hello
에 GET
방식으로 접근하게 되면, 생성한 HelloController
안의 statement들을 실행하게 된다.return hello;
에서 hello는 templates/hello.html
의 hello로 매칭되어 해당 html 파일을 렌더링하라는 의미이다. (ViewName = hello)resources:templates/ + {ViewName} + .html
파일을 찾는다.꼭 서버를 종료한 후,
./gradlew build
"필요한 lib들을 다운받고 빌드가 수행"이와 같이 뜨면 빌드가 성공된 것이다.cd build/libs
"해당 폴더에 빌드된 jar
파일이 생성됨"jar
파일이 생성된다.위와 같이 hello-spring-0.0.1-SNAPSHOT-plain.jar
이라는 파일도 같이 생성되는데, 이는 Spring-boot 2.5.0 이상부터 생성되는 듯하다.build.gradle
파일 안에 jar { enabled = false }
코드를 추가해주고 build를 수행하면 된다.java -jar hello-spring-0.0.1-SNAPSHOT.jar
이제 빌드된 결과물인 hello-spring-0.0.1-SNAPSHOT.jar
만 파일만 실행시키면 서버가 동작할 수 있게 되었다.
./gradlew clean
:build
폴더가 삭제된다.
./gradlew clean build
:build
폴더를 삭제하고 새로 build 수행
Spring Boot DevTools
: 파일 수정 이후 별도로 서버를 재시작할 필요 없이 변경 사항이 적용되도록 해주는 도구
// application.properties
spring:
devtools:
restart:
enabled: true
thymeleaf:
cache: false
prefix: file:src/main/resources/templates/
Preferences
Build, Execution, Deployment
Compiler
Build project automatically
check!