이 글은 김영한 님의 스프링 입문 강좌 수강 후에 정리한 글입니다.
(https://www.inflearn.com/course/스프링-입문-스프링부트/dashboard)
1. 정적 컨텐츠
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
웹 브라우저에서 특정 html을 요청하면 (ex. hello.html) 서버는 스프링 컨테이너에 등록된 hello 관련 컨트롤러를 찾는다.
만약 컨트롤러가 존재하지 않는다면 이때 서버는 resource:static 이하에 위치한 hello-static.html을 찾는다.
그 후 브라우저는 서버가 찾아준 resource:static/hello-static.html을 보여준다.
이렇게 html 파일을 그대로 보여주는 것을 정적 컨텐츠라고 한다.
2. MVC와 템플릿 엔진
● MVC
MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다.
이러한 "관심사 분리" 는 더 나은 업무의 분리와 향상된 관리를 제공합니다.
Model - 데이터와 비즈니스 로직을 관리
View - 화면과 레이아웃을 처리
Controller - 명령을 모델과 뷰 부분으로 라우팅
(출처 : MDN Web Docs)
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";
}
}
1. @RequestParam
http 요청 파라미터의 값을 메서드의 파라미터로 전달받을 때 사용한다.
이 어노테이션이 적용된 파라미터는 기본적으로 필수이며, 요청 파라미터가 없을 경우에는 status=400의 에러가 발생한다.
required 속성 값을 false로 지정함으로써 필수 파라미터로 지정하지 않을 수도 있으며, defaultValue 속성값을 이용하여 기본값 지정을 할 수도 있다.
<!-- hello-template.html -->
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
웹 애플리케이션이 /hello-mvc를 요청하여 @GetMapping("hello-mvc") 하단의 메소드가 호출되었다.
또한 http에서 요청 파라미터인 name=Spring!!을 확인할 수 있다.
이로 인해 View에 name으로 요청 파라미터인 "Spring!!"이 전달되었고, Controller에서 "hello-mvc" 문자열이 리턴된다.
다음으로 viewResolver가 hello-mvc.html를 찾아 처리한다.
View로 넘어온 name인 "Spring!!"은 hello-mvc.html에서 ${name}를 대체하여 최종적으로 브라우저에서 "hello Spring!!"으로 표시된다.
3. API
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
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 {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
return "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 name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
1. @ResponseBody
View 페이지 없이 리턴 값을 그대로 http의 body에 리턴하고 싶을 때 사용한다.
위 예시의 hello-string처럼 문자열을 반환할 수도 있으며, hello-api처럼 객체를 반환할 수도 있다.
웹 애플리케이션이 /hello-stirng을 요청하여 @GetMapping("hello-string") 하단의 메소드가 호출되었다.
또한 http에서 요청 파라미터인 name=Spring!!을 확인할 수 있다.
@ResponseBody에 의해 viewReslover가 아닌 HttpMessageConverter가 동작하고 메소드에서 문자열이 반환되었으므로 StringHttpMessageConverter가 처리를 하여 최종적으로 "hello Spring!!"가 출력된다.
웹 애플리케이션이 /hello-api를 요청하여 @GetMapping("hello-api") 하단의 메소드가 호출되었다.
또한 http에서 요청 파라미터인 name=Spring!!을 확인할 수 있다.
hello 객체가 만들어지고, http 요청 파라미터인 "Spring!!"이 hello 객체의 name으로 set된다.
@ResponseBody에 의해 viewReslover가 아닌 HttpMessageConverter가 동작하고 메소드에서 hello라는 객체가 반환되었으므로 MappingJackson2HttpMessageConverter가 처리를 하여 최종적으로 {"name" : "Spring!!"}가 출력된다.
'개발 > 스프링 입문' 카테고리의 다른 글
(스프링 입문) 6. 스프링 DB 접근 기술 (0) | 2022.09.24 |
---|---|
(스프링 입문) 5. 회원 관리 예제 (웹 MVC 개발) (0) | 2022.09.24 |
(스프링 입문) 4. 스프링 빈과 의존관계 (0) | 2022.09.24 |
(스프링 입문) 3. 회원 관리 예제 (0) | 2022.09.24 |
(스프링 입문) 1. 프로젝트 환경 설정 (0) | 2022.09.06 |