Java Spring Framework part 1
Java Spring Framework
Development Environment
- Java
- IntelliJ
Open New Spring Project
요즘은 spring을 이용해서 웹서버를 개발하는 경우 예전과 같이 처음부터 끝까지 개발하는 경우는 거의 없다. 아래의 Spring Boot Initializer라는 좋은 tool을 이용해서 필요한 것들만 설정한 후 project을 시작할 수 있다. https://start.spring.io
Dependencies
- Java Version: 18
- Spring Boot Version: 2.7.0
- Spring Web => spring을 활용해서 웹서버를 개발하고자 할때 선택함
- Thymeleaf => html에 대한 template 엔진
위와 같이 dependency를 설정한 build.gradle 파일을 열어보면 위의 설정값들이 설정되어 있는 것을 확인할 수 있다.
plugins {
//spring boot version
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
//Java Version
sourceCompatibility = '18'
repositories {
mavenCentral()
}
//Libraries
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'
}
또한 이러한 library를 설치할 때 gradle engine은 기본적으로 의존관계를 가지는 library들을 같이 설치하므로, 의존성문제는 신경쓰지 않아도 된다. 가령 spring-boot-starter-web 아래의 library를 살펴보면
- spring-boot-starter-tomcat
- spring-webmvc
위의 library들이 자동으로 깔리게 된다.
Sample Static Page
resources/static/index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Document</title>
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
위와 같이 static 폴더 아래에 index.html을 생성하게 되면 이는 Spring Boot에서 Welcome Page로 열리게 된다.
Sample Template Page
Controller, Model
controller/helloController
@Controller
//hello에 대한 routing 처리
@GetMapping("hello")
public class HelloController {
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
}
View 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>
/hello 경로로의 서버 접근 있는 경우, spring boot에서 자동적으로 controller가 있는 지 확인한다. 만약 있는 경우 controller에서 해당 routing이 처리되고, 그렇지 않은 경우 Static/ 폴더에 해당 내용이 있는지 확인한다.
Controller에서는 Model을 이용해서 View로 정보를 넘겨주고, 마지막에 controller의 return 값을 통해 해당하는 viewResolver가 호출되게된다.
resources:templates/+{ViewName}+.html 로 변환되게 되는데
만약 위와 같이 hello가 return되는 경우
resources:templates/hello.html로 변환된다.
Run Server
Windows의 경우 아래의 명령어를 실행하면 웹서버가 구동된다.
gradlew.bat build
dir build/libs
java -jar hello[...].jar
이렇게 spring boot에서는 jar file만 있으면 서버가 구동될 수 있수 있는 장점을 지닌다.
User View Types
user에게 화면을 보여주는 방시은 아래의 3가지가 존재한다.
Static Page
서버에서 만들어져 있는 HTML page를 client에 보여주는 기능만 수행한다. /resources/static/hello-static.html
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
http://localhost:8080/hello-static.html를 들어가면 위의 html이 출력됨을 확인할 수 있다.
MVC Template Page
반면 MVC Pattern을 활용한 html template 엔진을 활용하는 경우 사용자가 접속하는 경로에 따라 controller가 해당 경로에 대한 처리를 수행한 후 최종적으로 viewResolver가 호출되어 View가 출력된다.
Controller, Model
controller/helloController
@GetMapping("hello-mvc")
//RequestParam을 통해 query Parameter을 입력받을 수 있다.
public String helloMvc(@RequestParam("name") String name, Model model){
model.addAttribute("name",name);
return "hello-template";
}
View resources/templates/hello.html
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
API
JSON 형태의 결과를 출력하는 API 방식도 존재한다.
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "hello" + name;
}
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
Hello hello=new Hello();
hello.setName(name);
return hello;
}
//JSON format으로 만들 class object을 생성한다.
static class Hello{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
위와 같이 ResponseBody annotation을 부여하는 경우, spring boot에서는 자동적으로 controller을 호출하지 않고, stringConverter나 JSON Converter을 호출해서 바로 String이나 JSON format을 출력하게 된다.
References
link: inflearn
댓글남기기