Spring 체험을 위해 선택한 것은 인프런의 spring 무료강의이다. 제목도 Spring 입문에 평이 매우 좋다. 이제 준비할 것은 내 시간과 기여와 이해도뿐이다. Java를 오래 안 하다보니 IDE가 고민이 된다. 이전엔 Eclipse를 사용했는데 나쁘지는 않았지만 UI가 매우 취향이 아니었던 기억이 난다. 지금은 달라졌을 테지만 어쩐지 Intellij를 따라가고 싶은 마음이 든다. 게다가 학생에게는 무료로 제공해주니 이때 써봐야한다.
데스크탑에 설치된 JDE 버전이 애매한 15버전이라는 게 믿기지 않는다. 서둘러 17버전을 설치해준다.
스프링 부트 사이트 (https://start.spring.io)에서 프로젝트를 생성한다. react-node만 다루다 이렇게 프로젝트를 생성하려니 생소하다. 강의와 조금 많이 달라졌지만, 그나마 호환할 수 있을만한 설정으로 생성한다.
Dependecy로 Spring Web, template engine인 Thymeleaf를 추가한 후, generate 버튼을 클릭하면 다운로드 받을 수 있다. IntelliJ에서 다운로드 받은 파일의 build.gradle을 연다. 처음 intelliJ로 Spring 프로젝트를 사용하면 패키지 설치하는데 시간이 꽤 걸린다.
web을 구성하는 소스코드는 /src/main/java에 위치한다. /src/test는 테스트코드가 저장되는 곳이다. build.gradle 파일에는 프로젝트 설정이 기록되어있다. 스프링 부트 사이트로 설정한 내역과 동일하다.
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.9'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'rinm.spring'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
간단한 Application 코드가 기본으로 주어진다.
package rinm.spring.spring_test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringTestApplication.class, args);
}
}
main 함수를 실행해 본다.
spring이 실행된다. Tomcat 기본포트는 8080번이다. localhost:8080으로 접속하면 다음과 같은 화면이 뜬다. 적어도 웹서버는 제대로 실행은 되고 있다.
IntelliJ의 설정에서 Build Tools > gradle을 변경해서 gradle이 아닌 intelliJ로 실행되게 하면 조금 더 빠르게 어플리케이션이 실행된다고 한다.
gradle은 build tool kit의 하나로 java가 아니어도 다른 많은 언어를 제공한다. node의 npm 같은 존재인 것 같다. gradle은 패키지를 설치할 때 의존관계의 다른 패키지를 모두 설치해 준다.
이제 페이지를 만들어보자. /src/resources/static/index.html을 추가하면 이 html 문서를 웰컴 페이지로 사용할 수 있다. a태그를 사용하는 간단한 html을 작성한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>R1NM Spring Test</title>
</head>
<body>
<h1>Hello Spring!</h1>
<a href="/hello">click here</a>
</body>
</html>
웰컴 페이지가 만들어졌다.
템플릿 엔진을 사용하면 java object를 템플릿에 맞게 html 문서로 변환해준다.
controller 패키지를 생성한다. express.js의 라우팅 기능을 담당하는 부분인 것 같다. HelloController를 작성해본다.
package rinm.spring.spring_test.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data","hello!");
return "hello";
}
}
@Controller로 컨트롤러 클래스를 지정해준다. @GetMapping()으로 맵핑될 경로를 지정해줄 수 있다. 위 코드는 /hello와 맵핑된다. model.addAttribute()함수를 사용하여 key값 "data"에 value "hello"를 넣어준다.
src/resource/templates에 /hello 페이지에서 사용할 html 파일을 생성해준다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<p th:text="'안녕,'+${data}">Blank</p>
</body>
</html>
xmlns:th="http://www.thymeleaf.org"를 사용하면 html 문서 안에서 thymeleaf를 사용할 수 있다. 이제 ${data} 부분이 제공된 value 값인 "hello"로 치환된다. 실행 중인 spring을 껐다가 다시 실행한다. click here를 통해 /hello 페이지로 이동하면 다음과 같이 '안녕, hello!'라는 문자열이 화면에 출력된 것을 볼 수 있다.
controller에서 data 값이 제대로 전달이 된 것이다. 다시 controller의 소스코드를 살펴본다.
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data","hello!");
return "hello";
}
이 부분이 실행되면서 hello 페이지가 만들어 졌다. model이 인자로 들어온다. 이 인자에 "data":"hello" attribute를 추가한 후, "hello"를 리턴했다. "hello"를 리턴했기 때문에 hello.html에 이것이 적용되어 랜더링된다.
windows 환경에서는 gradle.bat 파일을 실행하여 build할 수 있다. cmd 창에서 gradlew build를 입력한다.
빌드가 완료되면 build 폴더가 생성된다. build/libs의 [project_name]-[release]-SNAPSHOT.jar를 java로 실행한다.
마찬가지로 8080포트에 웹 서버가 실행된다. 만약 build 과정에서 오류가 생기면 gradlew clean build로 build 내역을 삭제하고 다시 build할 수 있다.