안녕하세요 이번에는 Spring framework에서 제공하는 Model이라는 interface에 대해서 알아보려고 합니다.☺️
Model Interface의 역할
Spring MVC에서 MVC는 Model, View, Controller의 약자입니다. 이 중에 Model은 애플리케이션에서 사용되는 데이터를 담고 있는 역할을 합니다.
Model interface는 그런 model의 역할과 맞게 data를 다룰 수 있는 interface입니다. 조금 더 정확히 이야기 하자면 model에 "attributes"를 추가하기 위해 고안된 interface입니다. Model에 담길 수 있는 데이터는 String, Object 등 여러 type의 데이터가 있습니다.
그리고 view와 controller 사이에서 데이터를 전송하는 역할도 수행합니다.
Model Interface에 정의된 method
Model interface에는 몇가지 메서드가 정의되어 있습니다. 그 중에 제가 사용 사례를 보았던 두 가지 메서드는 addAttribute(String attributeName, Object attributeValue)와 getAttribute(String attributeName)가 있었습니다. 메서드명 그대로 attribute를 추가하고 attribute의 값을 가져오는 것입니다. 나머지 메서드들 역시 이 두가지 메서드가 수행하는 역할과 유사합니다. 즉, 데이터를 넣고 넣은 데이터가 무엇인지 값을 가져오고 이 두 행동을 하는 것입니다!
사용 방법 살펴보기
구체적으로 어떻게 사용하는지 간단한 예시로 살펴보겠습니다.
Controller
@Controller
public class DemoController {
@GetMapping("/")
public String viewPage(Model model) { //데이터를 저장할 Model을 매개변수로 사용
Member member = new Member("Anne-Marie");
model.addAttribute("name", member.getUsername()); //Model 인스턴스에 attribute 추가!
return "demo";
}
}
Model을 매개변수로 설정하면, Spring Mvc가 자동으로 Model을 사용한 객체를 만들어주어 사용할 수 있게 된다고 합니다.
Member clas의 인스턴스가 가진 name이라는 field와 값을 attribute로써 model에 add 해주었습니다.
Entity(Member)
public class Member {
private String username;
public Member(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
}
Member class의 모습입니다.
ViewResolver
Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//Mustache를 사용하였습니다.
MustacheViewResolver resolver = new MustacheViewResolver();
resolver.setCharset("UTF-8");
resolver.setContentType("text/html; charset=UTF-8");
resolver.setPrefix("classpath:/templates/");
resolver.setSuffix(".html");
registry.viewResolver(resolver);
}
}
🏷 Mustache (템플릿 엔진)
Mustache는 템플릿 엔진(template engine) 중의 하나입니다. 템플릿 프로세서(template processor)라고도 불리는 템플릿 엔진은 템플릿들과 데이터 모델을 결합하여 문서 결과물(HTML, etc)를 만들어내는 소프트웨어입니다.
Mustache는 문법이 다른 템플릿 엔진들보다 비교적 쉬운 것으로 유명합니다. 또한 로직코드를 사용할 수 없기 때문에 view와 서버의 역할이 명확하게 분리된다는 장점이 있습니다. (참고: https://velog.io/@roo333/Mustache-1
demo.html(View)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Demo page</title>
</head>
<body>
<h2>데모입니다 ㅎㅎ</h2>
<td>{{name}}</td>
</body>
</html>
{{name}} 부분에 위 Controller 소스코드에서 model.addAttribute("name", member.getUsername()) 으로 설정해 준 attribute의 value가 들어가게 됩니다!
Server를 구동한 뒤에 url로 들어가 보면
이렇게 attribute로 설정했던 값이 view에 잘 나오고 있음을 확인할 수 있습니다.
Model interface에 대해 요약하자면,
1) model에 "attributes"를 추가하기 위한 인터페이스이다.
2) view와 controller 사이에서 데이터를 전송한다. (위의 예시에서 Controller에서 View로 데이터를 보냈음을 확인할 수 있었습니다.)
라고 할 수 있습니다.
잘 사용하면 유저 경험을 더욱 높혀줄 수 있을 것 같습니다. ㅎㅎ 재미있는 기능도 넣어볼 수 있을 것 같구요!
추가적인 내용이 있으면 학습해서 내용을 추가해보겠습니다.
감사합니다. :)
참고자료
https://www.tutorialandexample.com/spring-model-interface
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/ui/Model.html
[템플릿 프로세서란?]
https://en.wikipedia.org/wiki/Template_processor
[Mustache]
https://velog.io/@roo333/Mustache-1
[Model을 파라미터로?]
https://okky.kr/article/666338
[SpringMVC: MVC 각각의 역할에 대해서]
'Java Spring > MVC' 카테고리의 다른 글
@RequestParam 애노테이션 (0) | 2022.09.12 |
---|---|
@Nullable 사용 시 warning 발생 없애기 (0) | 2022.09.09 |
@Controller와 @RestController의 차이점 (3) | 2022.08.06 |
em.flush() vs tx.commit() (1) | 2022.07.23 |
Spring Rest Docs 만들기 (1) | 2022.07.19 |