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

댓글남기기