개발/스프링 입문

(스프링 입문) 2. 스프링 웹 개발 기초

용꿀 2022. 9. 24. 02:01

 글은 김영한 님의 스프링 입문 강좌 수강 후에 정리한 글입니다.

(https://www.inflearn.com/course/스프링-입문-스프링부트/dashboard)

1. 정적 컨텐츠

<!DOCTYPE HTML>
<html>
<head>
    <title>static content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>

 

브라우저에서 보여지는 정적 컨텐츠(hello-static.html)

 

웹 브라우저에서 특정 html을 요청하면 (ex. hello.html) 서버는 스프링 컨테이너에 등록된 hello 관련 컨트롤러를 찾는다.

만약 컨트롤러가 존재하지 않는다면 이때 서버는 resource:static 이하에 위치한 hello-static.html을 찾는다.

그 후 브라우저는 서버가 찾아준 resource:static/hello-static.html을 보여준다.

이렇게 html 파일을 그대로 보여주는 것을 정적 컨텐츠라고 한다.

 

2. MVC와 템플릿 엔진

● MVC 

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다.

이러한 "관심사 분리" 는 더 나은 업무의 분리와 향상된 관리를 제공합니다. 

 Model - 데이터와 비즈니스 로직을 관리

 View - 화면과 레이아웃을 처리 

 Controller - 명령을 모델과 뷰 부분으로 라우팅

(출처 : MDN Web Docs)

 

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

@Controller
public class HelloController {
    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}

 

1. @RequestParam

http 요청 파라미터의 값을 메서드의 파라미터로 전달받을 때 사용한다.

이 어노테이션이 적용된 파라미터는 기본적으로 필수이며, 요청 파라미터가 없을 경우에는 status=400의 에러가 발생한다.

required 속성 값을 false로 지정함으로써 필수 파라미터로 지정하지 않을 수도 있으며,  defaultValue 속성값을 이용하여 기본값 지정을 할 수도 있다. 

 

<!-- hello-template.html -->
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

 

 

웹 애플리케이션이 /hello-mvc를 요청하여 @GetMapping("hello-mvc") 하단의 메소드가 호출되었다.

또한 http에서 요청 파라미터인 name=Spring!!을 확인할 수 있다.

이로 인해 View에 name으로 요청 파라미터인 "Spring!!"이 전달되었고, Controller에서 "hello-mvc" 문자열이 리턴된다.

다음으로 viewResolver가 hello-mvc.html를 찾아 처리한다.

View로 넘어온 name인 "Spring!!"은 hello-mvc.html에서 ${name}를 대체하여 최종적으로 브라우저에서 "hello Spring!!"으로 표시된다.

 

3. API

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @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;
    }
    
    static class Hello {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

 

1. @ResponseBody

View 페이지 없이 리턴 값을 그대로 http의 body에 리턴하고 싶을 때 사용한다.

위 예시의 hello-string처럼 문자열을 반환할 수도 있으며, hello-api처럼 객체를 반환할 수도 있다.

 

/hello-string의 실행 결과

웹 애플리케이션이 /hello-stirng을 요청하여 @GetMapping("hello-string") 하단의 메소드가 호출되었다.

또한 http에서 요청 파라미터인 name=Spring!!을 확인할 수 있다.

@ResponseBody에 의해 viewReslover가 아닌 HttpMessageConverter가 동작하고 메소드에서 문자열이 반환되었으므로 StringHttpMessageConverter가 처리를 하여 최종적으로 "hello Spring!!"가 출력된다.

 

/hello-api의 실행 결과

웹 애플리케이션이 /hello-api를 요청하여 @GetMapping("hello-api") 하단의 메소드가 호출되었다.

또한 http에서 요청 파라미터인 name=Spring!!을 확인할 수 있다.

hello 객체가 만들어지고, http 요청 파라미터인 "Spring!!"이 hello 객체의 name으로 set된다.

@ResponseBody에 의해 viewReslover가 아닌 HttpMessageConverter가 동작하고 메소드에서 hello라는 객체가 반환되었으므로 MappingJackson2HttpMessageConverter가 처리를 하여 최종적으로 {"name" : "Spring!!"}가 출력된다.