개발/Spring

[Spring] 스프링 입문 - MVC, API

y_lime 2024. 11. 5. 21:08

정적 컨텐츠의 반대 = API

 

MVC(Model, View, Controller)

관심사 분리 !

 

View about 화면

Controller about  비즈니스 로직, 내부 로직 처리

Model 관련된 로직을 화면에 넘겨주는 방식

 

@GetMapping("hello")
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello";
    }

model에 담아서 보내면 View에서 렌더링 할 때 사용

실제 서버에서 돌면 hello! empty값이 th:text 값으로 바뀐다

API

- 문자를 내놓을 때

http에서 body부분에 데이터에 return값을 직접 넣어주겠다는 뜻

@Controller
public class HelloController {
    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name){
        return "hello" + name;
    }
}

http://localhost:8080/hello-string?name=spring!! 로 검색하면

화면에는 아래와 같이 뜨고 페이지 소스 코드를 보면 html 코드 없이 그대로 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 getName() {
            return name;
        }

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

        private String name;
    }

 

http://localhost:8080/hello-api?name=spring!! 

왼쪽 사진과 같이 key : value인 json형태로 화면에 나타난다.

 

 

 

 


@ResponseBody 사용 원리

  • HTTP의 BODY에 문자 내용을 직접 반환
  • `viewResolver` 대신에 `HttpMessageConverter` 가 동작
  • 기본 문자처리: `StringHttpMessageConverter`
  • 기본 객체처리: `MappingJackson2HttpMessageConverter`
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

@ResponseBody가 없으면 → viewResolver에게 던짐

 

@ResponseBody가 있으면 → 그대로 데이터를 넘겨야 되겠구나 !

- 문자를 넘기면? StringConverter

- 객체를 넘기면? httpMessageConverter가 동작한다 -> JsonConverter

 

Hello 라는 객체가 오면, json 방식으로 데이터를 만들어서 http body에 반환을 하는 방식

 

 

@참고자료

[인프런] 김영한 - 스프링 입문 강의 (무료)