Spring

003. 스프링 웹 개발 기초 스터디 2편

chandlerxx 2023. 10. 21. 19:39

웹 개발은 크게 3가지로 구분지을 수 있습니다.

1) 정적 컨텐츠

2) MVC와 템플릿 엔진

3) API

 

이번에는 2) / 3) 내용에 대해 중점적으로 다뤄보겠습니다.

 

1. 정적 컨텐츠


정적 파일을 웹 브라우저에 그대로 내려주는 것을 의미합니다. 1편 내용 참고하시기 바랍니다.

 

 

2. Spring MVC와 템플릿 엔진 


MVC는 model, view, control를 의미하고 요즘 개발 트렌트이며 현업에서 주로 사용되고 있다고 하네요.

템플릿 엔진은 과거에 소위 말하는 JSP, PHP, ASP가 이에 해당됩니다.

다만 자바의 경우 공식 템플릿엔진을 `thymeleaf`로 바꾼지 꽤 됐죠.

 

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html

The default handler is based on the `@Controller` and `@RequestMapping` annotations, offering a wide range of flexible handling methods. 

 

정적 컨텐츠와의 구분되는 특징은,

파일(html등)을 그대로 출력하기보단 서버에서 프로그래밍을 통한 동적 컨텐츠 수행이 가능하다는 점입니다.

(*랜더링이 된 html을 클라이언트에게 전달해줌)

 

https://spring.io/guides/gs/serving-web-content/

가이드에서 제시된 예제를 실습해보겠습니다.

 

@RequestParam이 추가되어 url 쿼리 스트링 파라미터 입력시 사용자로부터 입력된 값을 출력합니다.

ㄴ 예를 들면, url/greeting의 리턴값은 `Hello World"인 반면에

ㄴ url/greeting?name=User 입력시 리턴값은 `Hello User`가 되는 것이죠.

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 greetingController {

    @GetMapping("greeting")
    public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name); //@RequestParam 추가
        return "greeting";
        }
    }

 

출력해보면 url 쿼리 스트링에 따라 결과값이 다릅니다

좌 : defaultValue = "World"

우 : RequestParam = Name

 

좌 / 우 

 

소스를 보면 greeting.html 파일에서 작성된 코드를 볼 수 있죠.

 

 

3. API 


JSON이라는 데이터 구조 포맷을 기반으로 클라이언트에게 데이터를 전달하는 방식입니다.

Vue나 react를 통해 API로 데이터를 내려준다거나 혹은 서버끼리 통신할때 API 개발방식 채택합니다.

 

일반적으로 Spring 개발시 API방식은 "객체를 반환해주는 경우"를 의미하고

문자 반환 / 객체 반환 각 케이스에 대해 알아보겠습니다.

 

1. `@ResponseBody` 어노테이션 문자 반환

HTTP의 BODY에 문자 내용을 직접 반환한다.

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 greetingController {

    @GetMapping("greeting") 
    public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }

    @GetMapping("greeting-hello") // url/greeting-hello
    @ResponseBody
    public String greetingString(@RequestParam("name") String name) {
        return "hello " + name; //문자 반환
    }

}

출력값 / 소스코드

 

2. `@ResponseBody` 어노테이션 객체 반환
Controller는 @RequestBody를 통해 hello라는 객체를 넘기고

Jackson2HttpMessageConverter에서 hello객체를 JSON 형변환 해줍니다.

(*2는 version을 의미)

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 greetingController {

    @GetMapping("greeting")
    public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("name", name);
        return "greeting";
    }

    @GetMapping("greeting-hello") // url/greeting-hello
    @ResponseBody
    public String greetingString(@RequestParam("name") String name) {
        return "hello " + name;
    }

    @GetMapping("greeting-api") // url/greeting-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;
        }
    }
}

 

결과


[출처]

https://www.inflearn.com/users/74366/@yh?gad=1&gclid=CjwKCAjwysipBhBXEiwApJOcu11Gmy__QkRwxSjT9pJNflRJSwnlrpg6WfM0r9TRIQD3_uPaKmH3ThoC26QQAvD_BwE

 

김영한님의 소개 - 인프런 | 온라인 강의 플랫폼

인프런 김영한님의 소개 페이지 입니다. - 김영한님 소개 | 인프런

www.inflearn.com

 

@ResponseBody 관련한 개념에 대한 이해를 위해 향로님 블로그 참고했습니다.

https://jojoldu.tistory.com/407

 

@Request Body에서는 Setter가 필요없다?

회사에서 근무하던중 새로오신 신입 개발자분이 저에게 하나의 질문을 했습니다. POST 요청시에 Setter가 필요없는것 같다고. 여태 제가 알던것과는 달라서 어떻게 된 일인지 궁금했습니다. 정말 P

jojoldu.tistory.com