개인공부/[Spring] / / 2020. 12. 17. 23:34

[Spring] 스프링 URI 매칭 방법

스프링에서 URI를 매칭 하는 방법을 크게 3가지로 정리하여 분류하려 한다.

 

1. 정적 콘텐츠

2. MVC와 템플릿 엔진

3. API


1. 정적 콘텐츠

우선 가장 기본이 되는 URI 매칭은 정적 콘텐츠이다.

동적인 웹페이지가 아닌 정적인 html페이지를 단순히 전달해주기만 하는 것이다.

 

이러한 정적 콘텐츠 기능을 당연히 스프링 부트에서 제공하고 있다.

 

resources/static/hello-static.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>

 

이처럼 resource> static> hello-static.html을 생성해주고 실행해보면

 

localhost:8080/hello-static.html

Controller에 Mapping을 하지 않아도 스프링 컨테이너는 hello-static관련 컨트롤러가 없기 때문에 resource에서 hello-static.html을 찾아서 전달해준다.

 

요약 

localhost:8080/hello-static.html 요청 > 스프링 컨테이너에서 hello-static관련 컨트롤러 찾음 > 없음 > resources에서 hello-static.html 찾아서 전달

 

2. MVC와 템플릿 엔진

다음으로는 MVC패턴과 템플릿 엔진을 통한 매칭이다.

 

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

 

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

 

localhost:8080/hello-mvc?name=컴붕이

hello-mvc 관련 컨트롤러가 등록되어있으므로 이를 실행한다.

Get요청의 파라미터로 name=컴붕이를 전달하고 있고 이를 Spring에서는 @RequestParam("name") String name으로 받고 있다. 

 

받은 파라미터를 Model 객체에 전달하여 thymeleaf 템플릿 엔진에서 동적으로 HTML을 생성하여 viewResolver가 변환된 HTML을 전달한다.

 

C(Controller)가 받은 파라미터를 이용하여 M(Model)로 데이터를 전달하고 V(View)는 전달받은 데이터를 이용하여 동적으로 HTML생성 후 보여준다.

 

동적으로 생성하는 게 정적 콘텐츠와의 큰 차이다.

 

3. API

마지막으로 API다

API는 객체 반환과 String문자반환이 있다.

 

String 문자반환
@GetMapping("hello-string")
    @ResponseBody
    public String hellString(@RequestParam("name") String name){
        return "hello"+name;
    }

 

ResponseBody 어노테이션을 사용하면 ViewResolver를 사용하지 않는다.

대신에 HTTP의 BODY에 문자 내용을 직접 반환한다(HTML BODY 태그 아님) //웹에서 HTML BODY 직접 만들어줌

localhost:8080/hello-string?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;
        }
    }

객체 반환은 String이 아닌 Class객체를 반환한다

이때 ResponseBody를 사용하고 객체를 반환하면 객체가 JSON으로 변환되어 전달된다.

 

localhost:8080/hello-api?name=컴붕이

 

위에서 살펴본 API(String, 객체) 반환 매칭의 동작 과정은 다음과 같다

URI 입력 > 컨트롤러 찾음 > @Responsebody확인 후 HTTP의 BODY에 문자 내용을 직접 반환(ViewResolver 사용 X)

-> ViewResolver 대신에 HttpMessageConverter가 동작 -> String(StringHttpMessageConverter) , 객체(MappingJackson2 HttpMessageConverter) 동작 -> BODY처리 

 

 

 

 

 

'개인공부 > [Spring]' 카테고리의 다른 글

스프링 빈과 의존관계  (0) 2020.12.24
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유