스프링 웹 개발 기초
웹 개발에는 정적 컨텐츠, MVC와 템플릿 엔진, API 라는 세 가지 방식이 있다.
정적 컨텐츠
이전에 웰컴 페이지 했던 것처럼 서버에서 뭐 하는 것 없이 파일을 그냥 내려주는 것
resources-static에 html 등 아무 리소스 파일을 만들면http://localhost:8080/hello-static.html로 접속할 수 있다.

웹 브라우저에서
localhost:8080/hello-static.html을 치면 내장 톱캣 서버가 요청을 받는다.이런 요청이 왔다고 스프링에게 넘긴다.
먼저
hello-static이라는 컨트롤러가 있는지 찾아본다. 즉, 컨트롤러에 우선순위가 있다.없으면
resources안에 있는static/hello-static.html을 찾아서 반환한다.
Reference
MVC와 템플릿 엔진
html을 서버에서 뭔가 동적으로 바꿔서 내려주기 위해 MVC 패턴으로 개발하는 것. 정적 컨텐츠는 파일을 그냥 그대로 내려주는 것이고 이 방식은 서버에서 뭔가 변형을 해서 내려준다.
MVC
Model, View, Controller
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>옛날에는 컨트롤러와 뷰가 나눠져있지 않았다. http://localhost:8080/hello-mvc?name=dodeon → 파라미터로 넘어온 name을 모델에 넘겨주면 return 하는 hello-template 에 표시된다.

웹 브라우저가
/hello-mvc를 던지면 내장 톰캣 서버가 스프링에 던진다. 스프링은hello-mvc가 매핑된 컨트롤러의 메서드로 연결한다. 메서드 로직에 따라 name은 spring으로hello-template을 리턴한다.뷰를 찾아서 템플릿을 연결시켜주는
viewResolver가 return한hello-template이라는 똑같은 이름의 파일을 찾아서 thymeleaf 템플릿 엔진에게 처리해달라고 넘긴다.thymeleaf 템플릿 엔진은 html로 변환을 해서 웹 브라우저에 반환한다.
API
json이라는 데이터 포맷으로 클라이언트에게 전달하는 것
데이터를 내려주면 프론트에서 알아서 보여준다.
서버는 어떤 데이터를 어떻게 다루는지만 신경쓰면 된다.
ResponseBody
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody // 중요
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}http://localhost:8080/hello-string?name=dodeonhttp에서 response의 body에 직접
hello+name을 넣어주겠다는 의미다.view 없이 그냥 리턴하는 값 그대로 대답한다.
Json으로 반환
@Controller
public class HelloController {
@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;
}
}
}hello-api를 요청하면{"name":"dodeon"}이렇게 객체로 반환하는 것을 볼 수 있다.최근 프로젝트는 다 이 방식으로 하면 된다.
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}이렇게 getter, setter 방식으로 만들어서 private인 name에 바로 접근하지 않고 public 메서드로 접근하는 것을 자바 빈 표준 방식 혹은 프로퍼티 접근 방식이라고 한다.

ResponseBodyhttp의 body에 문자 내용을 직접 반환한다.
viewResolver대신HttpMessageConverter가 동작한다.StringHttpMessageConverter기본 문자를 처리한다.
MappingJackson2HttpMessageConverter기본 객체를 처리한다.
json으로 반환해주는 라이브러리. gson이라는 것도 있는데 이 라이브러리가 스프링에 기본으로 들어가있다.
byte 등 기타 여러
HttpMessageConverter가 기본으로 등록되어 있다.
클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보를 조합해서
HttpMessageConverter가 선택된다. 더 자세한 내용은 스프링 MVC 강의에서 설명할 예정이다.
웹브라우저에서 요청이 들어오면 톰캣이 스프링에 던진다. 스프링은 hello-api 라는 컨트롤러를 찾는다. 근데 보니까 @ResponseBody 라는 애너테이션이 붙어있다. 원래 이게 안붙어 있으면 viewResolver에게 던지는데 이제는 http response를 그대로 넘겨야겠다고 판단한다.
근데 그냥 String이 아니라 Hello라는 객체이기 때문에 json 방식으로 만들어서 반환한다. 이때 HttpMessageConverter 라는 게 동작한다. 단순 String이라면 StringConverter, json이라면 JsonConverter 를 이용해 바꾼다.
Last updated
Was this helpful?