프로젝트를 하면서 Spring MVC 를 사용하게 되었고, 그때 공부한 내용들을 정리하고자합니다.
프로그래밍을 배울때 개념은 대략적으로 파악하고 직접 코딩해보는게 가장 빨리 배우는 방법이라고 믿고있습니다. 구체적인 구조 분해부터 시작해버리면 다음 내용으로 넘어가는 속도가 느려지고, 흥미를 잃어버리게 되기 때문입니다. 따라서 MVC관련 포스팅은 깊이있게 분석하기 보다는 어떻게 동작하는지 이해한 내용을 다룰 예정입니다.
따라서 이번 포스팅에서는 간단하게 MVC의 개념과 예제를 다룹니다.
MVC 라는 말을 분리해보면 다음과 같습니다.
[model]
요청을 받을때 데이터를 담는 공간으로 활용하거나 뷰에 데이터를 전송할때 사용하는 객체라고 이해했습니다. 간단히 말해서 DTO의 역할이죠.
[view]
말그대로 보여지는 영역을 담당합니다. model의 정보를 기반으로 html정보를 생성하기도 합니다.
[controller]
다음과 같은 역할을 수행합니다.
view와 controller가 분리되기 전에는 하나의 코드 뭉치에서 두 영역을 관리해야했는데, 얼마나 불편했을까 싶습니다.
스프링 MVC 코드 구조는 다음과 같습니다.
@Controller // (1) 컨트롤러 에노테이션
public class myController {
@RequestMappin("{url}") // (2) 핸들러 매핑 정보
public String items(Model model) // (3) 파라미터
{
// (4) 서비스 로직
return "{viewName}"; // (5) view반환
}
}
(1) 컨트롤러 에노테이션
컨틀롤러를 스프링의 컴포넌트로 등록하기 위한 에노테션으로, 스프링 컨테이너가 해당 컴포넌트는 컨트롤러라는 것을 인식하도록 합니다.
(2) 핸들러 매핑 정보
어떤 url이 호출되었을때 해당 메서드가 동작할지 매핑하는 것이다. get 방식, post 방식에 맞춰서 바꿔줄 수 있습니다.
(3) 파라미터
예시에서는 Model 이라는 객체로 들어가 있지만 들어오는 정보에 맞춰서 DTO를 만들 수도 있으며, HttpServletRequest가 들어오는 등 다양한 파라미터를 줄 수 있습니다.
(4) 서비스 로직
이 부분에서 실제로 실행될 로직을 만듭니다.
(5) view 반환
여기서는 view의 논리적인 이름을 반환합니다.
논리적인 이름이란, https://fakeUrl/main view가 반환되어야 한다면 main
만 반환하는 것을 의미합니다.
간단하게 MVC를 구현하기 위해 의존성을 추가합니다.
web : MVC 포함
thymeleaf : view 반환을 위한 viewtemplate
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
그러면 src/main/resource 경로에 templates 라는 디렉터리가 생성되어 있을 것입니다.
기본적으로 controller로 매핑되는 view 자산들은 해당 디렉터리에 위치해 있어야 합니다. 해당 경로에 main.html 파일을 만들고 아무내용이나 작성하면 됩니다.
만약 기본 경로를 바꾸고 싶다면 src/main/resource경로의 application.properties파일에 다음과 같이 입력
spring.mvc.view.prefix={논리이름 앞에 붙을 경로}
spring.mvc.view.suffix=.html (경우에 따라서는 .jsp)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Main</title>
</head>
<body>
Hello Main
</body>
</html>
컨트롤러는 다음과 같이 만들자, 위치는 ComponentScan이 될 수 있는 위치면 됩니다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class myController {
@RequestMapping("/main")
public String rendMain() {
return "main";
}
}
어플리케이션을 실행하고 http://localhost:8080/main 를 입력하면 작성된 main.html이 브라우저에 등장합니다.
다음 포스트에서는 요청매핑(핸들러)에 대해서 다루겠습니다.