웹 개발 방법
- 정적 컨텐츠: 파일을 그대로 웹브라우저에 전달하는 것
- MVC와 템플릿 엔진: 서버에서 프로그래밍해서 html을 동적으로 바꾸는 것 (대부분 이 방식 채택)
- API: json 등의 포맷으로 클라이언트에 데이터 전달하는 방식
정적 컨텐츠
스프링 부트에서 제공하는 정적 컨텐츠 기능은 다음과 같이 작동한다.
static/hello-static.html 파일이 존재할 때, 웹 브라우저에서 localhost:8080/hello-static.html에 접속한 경우
1) 내장 톰캣 서버에서 스프링 컨테이너에 데이터 요청
2) 스프링 컨테이너는 hello-static 관련 컨트롤러가 있는지 탐색 (컨트롤러가 우선순위를 가짐)
3) 매핑된 컨트롤러가 없으므로 resources: static/hello-static.html을 찾아 반환함
MVC와 템플릿 엔진
MVC: Model, View, Controller
hello-mvc 컨트롤러와 hello-template.html 파일을 생성하고 매핑해 놓은 상태일 때
1) 내장 톰캣 서버에서 스프링 컨테이너에 데이터 요청
2) helloController의 hello-mvc 메소드에 매핑이 되어 있으므로 호출함
3) name에 'spring'이라는 값을 넣은 경우 해당 값도 함께 스프링에 반환
4) 스프링이 viewResolver를 통해 templates/hello-template.html을 찾아 Thymeleaf 템플릿에 처리 요청
5) 템플릿 엔진에서 값을 변환하여 웹 브라우저에 넘김
실제로 파일을 만들어 놓고 웹 브라우저에서 name 파라미터 값으로 'spring!!!!'을 넣어 요청해 보면 아래와 같은 화면을 볼 수 있다.
http://localhost:8080/hello-mvc?name=spring!!!!
API
HelloController.java에 아래 내용을 추가하여 API 동작 방식을 확인해보자.
1) String을 반환하는 경우
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name; // "hello spring"
}
@ResponseBody를 사용하면 ViewResolver를 사용하지 않고 HTTP의 Body에 문자 내용을 직접 반환한다.
2) 객체를 반환하는 경우
@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;
}
}
@ResponseBody를 사용하고 객체를 반환하면, 객체가 JSON 형태로 변환된다.
(내 경우는 크롬 확장 프로그램인 JSON Viewer를 사용하여 위와 같이 보이지만, 원래 {"name": "spring"} 부분만 보인다.)
@ResponseBody를 사용하면 ViewResolver 대신 HttpMessageConverter가 동작한다.
기본 문자 처리는 StringHttpMessageConverter가,
기본 객체 처리는 MappingJackson2HttpMessageConverter가 담당한다.
보통 스프링에서 이야기하는 API 방식은 객체 반환 방식을 의미한다.
'Spring > Study' 카테고리의 다른 글
[스프링 입문] 5. 회원 관리 예제 - 웹 MVC 개발 (0) | 2023.01.24 |
---|---|
[스프링 입문] 4. 스프링 빈과 의존관계 (0) | 2023.01.24 |
[스프링 입문] 3. 회원 관리 예제 - 백엔드 개발 (0) | 2023.01.22 |
[스프링 입문] 1-1~3. 라이브러리 살펴보기, View 환경설정, 빌드하고 실행하기 (1) | 2023.01.13 |
[스프링 입문] 1-0. 스프링 부트 프로젝트 생성 (1) | 2023.01.13 |