BackEnd/Spring

[Spring] 스프링 웹 개발 기초

샤아이인 2022. 1. 12.

 

내 돈 내고 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다.

 

섹션 2. 스프링 웹 개발 기초

 

지난번 환경설정 이후 본격적인 스프링에 대한 입문을 하게 되었다.

이번 시간에는 간단하게 staitc, MVC, API 들에 대한 이해와 간단한 설명을 들을 수 있었다.

 

(이 강의는 전반적은 스프링의 흐름을 잡는 강의이다. 세세한 개별 내용훈 추후 따로 더 공부할 예정이다)

 

1. 정적 컨텐츠

 

정적 컨텐츠는 html, 이미지 등 변경이 없는 파일을 말한다. 그냥 파일 그대로 내려주는 방식이다.

보통 서버에서 이런 정적 파일들은 다른 작업 없이 바로 client에게 반환하여 결과를 보여주곤 한다.

 

공부할 때 가장 많이 보는 정적 컨텐츠는 HTML 파일일 것이다.

 

기억에 남길점은 스프링 부트에서 스프링 컨테이너가 static 파일의 request에 대해 대응하는 방식이었다. 우선 다음 그림을 봐보자!

출처 - 인프런 스프링 입문 (김영한) 강의

1) 우선 Client 측에서 /hello-static.html 라는 URI를 통해 요청하면, 톰캣이 이를 인지한다.

2) 스프링 컨테이너의 Controller에서 먼저 mapping 된 것이 있는지 찾아본다.

3) mapping 된 것이 없다면 그다음 /static 폴더 안에서 찾아본다. /static/hello-static.html 을 찾을 수 있었다.

 

2. MVC와 템플릿 엔진

과거에 JSP를 사용할 때는 JSP안에 모든 로직을 처리하는 model1 방식을 사용했었다.

이러한 방식은 view 파일(JSP파일) 안에 모든 로직을 담았기 때문에 유지보수가 매우 떨어지며, 역할의 분할 또한 되지 않는 진짜 구식 방식이다.

 

하지만! 최근 방식은 Modle-View-ControllerModle-View-Controller를 분리하여 구현한다. 각자의 역할을 나누며, 유지보수성이 좋아지는 것이다.

혹시 Servlet과 JSP를 안다면 다음 글을 읽어보면 조금이나마 도움이 될 것이다.

https://blog.naver.com/zbqmgldjfh/222493534792

 

간단한 controller를 구현해 봅시다.

package hello.hellospring.controller;

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";
    }
}
 

우선 컨트롤러에서는 hello-mvc와 mapping을 이루고 있다.

 

사용자가 http://localhost:8080/hello-mvc?name=zbqmgldjfhhttp://localhost:8080/hello-mvc? name=zbqmgldjfh라는 URL로 요청을 보내왔다고 해보자.

 

1) 내장 톰캣 서버에서 요청을 인지한다.

2) 우선 URL 부분에서 URI(hello-mve?name=zbqmgldjfh) 부분만을 추출한다.

3) 스프링 컨테이너 내부의 HelloController에서 mapping 되는 메서드를 찾는다.

4) helloMvc() 메서드에 인자로 query문에서 파싱 한 데이터가 넘어온다. 그 정보는 name이라는 변수에 담긴다.

5) model에 {"name" : name}이라는 key:value 쌍으로 저장한다.

6) "hello-template"라는 html 파일을 찾아 반환하여 사용자에게 보여준다.

 

이를 그림으로 보면 다음과 같다.

출처 - 인프런 스프링 입문 (김영한) 강의
 

viewResolver에서 해당 html을 찾아 처리한다.

resources:templates/ + viewName + .html 로 찾으며, viewName은 우리가 controller에서 반환한 String 값이다.

추가적으로 타임리프는 로직없이 절대 경로를 바로 열어봐도 html껍데기를 확인할 수 있다는 장점이 있다.

3. API

@ResponseBody 는 HTTP의 body 부분에 데이터를 직접 넣어주겠다는 의미이다. 우선 이점을 기억해 두자!

 

API 방식이 가장 재미있었던 부분이었다. 우선 다음 코드를 살펴보자.

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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 {

    static class Hello{
        private String name;

        public String getName() {
            return name;
        }

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

    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name){
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
}
 

HelloController class안에 Hello라는 클래스를 하나 만들었다. 간단하게 이름을 저장하는 객체를 만들 수 있다.

helloApi의 메서드를 보면 메소드 몸체에서 hello 객체를 하나 생성한 후, 이름은 query문에서 가져온 name으로 저장한 후, 객체를 반환한다.

 

이렇게 반환하면 이전까지 html에 표현되던 방식과 다르게 json 형식으로 데이터가 그대로 전달되어 오는 것을 알 수 있었다.

실행 결과는 다음과 같다.

 

query에서 넘겨줬던 API_data라는 정보를 json 형태로 반환받았다.

 

Spring에서는 객체가 반환되면 기본적으로 JSON 형식으로 만들어서 HTTP 응답에 반환하겠다는 것 이 기본정책이다.

다음 그림을 통해 다시 한번 확인해 봅시다.

출처 - 인프런 스프링 입문 (김영한) 강의

Controller에서 @ResponseBody가 있으면 viewResolver가 아닌 HttpMessageConverter에게 데이터를 전달한다.

이때 HttpMessageConverter가 전달받는 것 이 객체이면 JSON 형태로 변환하고,

전달받는 것이 객체가 아니라면 String형태로 변환하여 Client에게 다시 전달하게 된다.

 

참고로 객체를 처리하는 Jackson2 는 객체를 JSON으로 변환하는 유명한 라이브러리 입니다.

 

 

 

 

 

 

댓글