[Spring] MVC Model2
in SPRING
Spring MVC MODEL2
Model(๋ชจ๋ธ)
์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ์ด๋ฉฐ, ๋ชจ๋ ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ ๊ฐ๊ณตํ์ฌ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ์ด๋ค.
- ์ฌ์ฉ์๊ฐ ์ด์ฉํ๋ ค๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํ๋ฉฐ, View(๋ทฐ) ๋๋ Controller(์ปจํธ๋กค๋ฌ)์ ๋ํด ์ด๋ค ์ ๋ณด๋ ์ ์ ์์ด์ผ ํ๋ค.
- ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ตฌํํด์ผ ํ๋ค.
View(๋ทฐ)
์๊ฐ์ ์ธ UI ์์๋ฅผ ์ง์นญํ๋ ์ฉ์ด์ด๋ค.
- Model(๋ชจ๋ธ)์ด ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ์๋๋ค.
- Model(๋ชจ๋ธ)์ด๋ Controller(์ปจํธ๋กค๋ฌ)์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฉด ์๋๋ฉฐ ๋จ์ํ ํ์ํด์ฃผ๋ ์ญํ ์ ๊ฐ์ง๊ณ ์๋ค.
- ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ตฌํํด์ผ ํ๋ค.
Controller(์ปจํธ๋กค๋ฌ)
Model(๋ชจ๋ธ)๊ณผ View(๋ทฐ)๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- Model(๋ชจ๋ธ) ๋๋ View(๋ทฐ)์ ๋ํ ์ ๋ณด๋ฅผ ์์์ผ ํ๋ค.
- Model(๋ชจ๋ธ) ๋๋ View(๋ทฐ)์ ๋ณ๊ฒฝ์ ์ธ์งํ์ฌ ๋์ฒ๋ฅผ ํด์ผํ๋ค.
๋ชจ๋ธ2์ ํจํด์
์ด๋ค ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ์์ฒญ์ ๋ฐ๊ณ ์์ฒญ์ ํด๋นํ๋ ๋ชจ๋ธ์ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. ํธ์ถ๋ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ค์ ์ฒ๋ฆฌํ ํ ์ปจํธ๋กค๋ฌ์๊ฒ ์์ฒญ์ ๋ํ ๊ฒฐ๊ณผ(์๋ต)๋ฅผ ๋ณด๋ด๊ณ ์ปจํธ๋กค๋ฌ๋ ๋ทฐ์๊ฒ ์ ์กํ๋ ์๋ฆฌ์
๋๋ค.
(์์ฒญ -> ํ๋ก ํธ ์ปจํธ๋กค๋ฌ -> ํธ๋ค๋ฌ ๋งคํ -> ํธ๋ค๋ฌ ์ด๋ํฐ -> ์ปจํธ๋กค๋ฌ -> ๋ก์ง ์ํ(์๋น์ค) -> ์ปจํธ๋กค๋ฌ -> ๋ทฐ ๋ฆฌ์กธ๋ฒ -> ์๋ต(jsp, html))
MVC์ ์ฒ๋ฆฌ ์์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ํ๋ฉด, front controller์ธ DispatcherServlet ํด๋์ค๊ฐ ์์ฒญ์ ๋ฐ๋๋ค.
- DispatcherServlet๋ ํ๋ก์ ํธ ํ์ผ ๋ด์ servlet-context.xml ํ์ผ์ @Controller ์ธ์๋ฅผ ํตํด ๋ฑ๋กํ ์์ฒญ ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ์ ๋งคํ(mapping)๋ ์ปจํธ๋กค๋ฌ๊ฐ ์กด์ฌํ๋ฉด @RequestMapping์ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ ๋ฉ์๋๋ก ์ด๋ํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ Service(์๋น์ค)๋ฅผ ๋ฐ์ ๋น์ฆ๋์ค๋ก์ง์ ์๋น์ค์๊ฒ ์์ํ๋ค.
- Service(์๋น์ค)๋ ์์ฒญ์ ํ์ํ ์์ ์ ์ํํ๊ณ , ์์ฒญ์ ๋ํด DB์ ์ ๊ทผํด์ผํ๋ค๋ฉด DAO์ ์์ฒญํ์ฌ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
- DAO๋ DB์ ๋ณด๋ฅผ DTO๋ฅผ ํตํด ๋ฐ์ ์๋น์ค์๊ฒ ์ ๋ฌํ๋ค.
- ์๋น์ค๋ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค๋ฌ์๊ฒ ์ ๋ฌํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ Model(๋ชจ๋ธ) ๊ฐ์ฒด์๊ฒ ์์ฒญ์ ๋ง๋ View(๋ทฐ) ์ ๋ณด๋ฅผ ๋ด์ DispatcherServlet์๊ฒ ์ ์กํ๋ค.
- DispatcherServlet๋ ViewResolver์๊ฒ ์ ๋ฌ๋ฐ์ View์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
- ViewResolver๋ ์๋ตํ View์ ๋ํ JSP๋ฅผ ์ฐพ์ DispatcherServlet์๊ฒ ์ ๋ฌํ๋ค.
- DispatcherServlet๋ ์๋ตํ ๋ทฐ์ Render๋ฅผ ์ง์ํ๊ณ ๋ทฐ๋ ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
- DispatcherServlet๋ ํด๋ผ์ด์ธํธ์๊ฒ Rendering๋ ๋ทฐ๋ฅผ ์๋ตํ๋ฉฐ ์์ฒญ์ ๋ง์น๋ค.
Front Controller์ ์ญํ ์ ์๋ฒ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํฉ๋๋ค.
๊ณตํต ์ฒ๋ฆฌ ์์ ์ ๋จผ์ ์ํ ํ ํ ์ ์ ํ ์ธ๋ถ์ปจํธ๋กค๋ฌ์๊ฒ ์์ ์ ์์ํด์ฃผ๊ณ ์์ธ ๋ฐ์์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ์ผ์ ํฉ๋๋ค.
์ด๋ฐ ์ผ๋ค์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ปจํธ๋กค๋ฌ๋ค ์ฌ์ด์ ์ค๋ณต๋ ์ฝ๋ ๋ฌธ์ ๋ ํ์ ์ ๊ฐ๋ฐ์๋ค์ ๊ฐ๋ฐ ๋ฐฉ์์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฑ์ ํด๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์คํ๋ง์์ ์ ๊ณตํ๋ FrontController์ธ DispatcherServlet์ ์ญํ ์ ๋ฌด์์ผ๊น์??
DispatcherServlet์ ๋ฑ์ฅ์ผ๋ก ์์ฒญ๋๊ฒ web.xml์ ์ญํ ์ด ์ถ์ ๋ ๊ฒ์ ๋๋ค.
DispatcherServlet๊ฐ ์๊ธฐ์ ์๋ ์ฌ์ฉ์์ URL์ ์ผ์ผ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด
web.xml์ ๋ฑ๋ก(์๋ธ๋ฆฟ๊ณผ ๋งคํ์์ผ์ฃผ๋ ์์ )์ ๋ฐ๋์ ํด์ผํ์์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ web.xml์ด ์์ฐ์ด๋ ๊ฒ์ ์๋๋๋ค.
web.xml์์ ์์ฃผ ์ฐ์ด๋ ์๋ธ๋ฆฟ ๋งคํ์ DispatcherServlet์ด ํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋๊ณ
๋๋จธ์ง web.xml์ ๊ธฐ๋ฅ๋ค์ ๊ทธ๋๋ก web.xml์ ์ด์ฉํ์ ๋ค๊ณ ์๊ฐํ์๋ฉด๋ฉ๋๋ค.
(web.xml์ ๊ธฐ๋ฅ์ DispatcherServlet๋ฑ๋ก, ๊ฐ์ฒด์ URL๋ฒ์ , ํํฐ ๋ฑ์ด ์์ต๋๋ค.)
Spring MVC ๊ตฌํ
- DispatcherServlet ์ frontController๋ก ์ธํ
<!-- web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Spring JavaConfig Sample</display-name>
<servlet>
<!-- 2. ํด๋น ์๋ธ๋ฆฟ์ ๊ตฌํ์ฒด๋ DispatcherServlet ๋ก ์ ์-->
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 3. contextClass๋ AnnotationConfigWebApplicationContext ๋ฅผ ์ฌ์ฉ-->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<!-- 4. context ์ ๋ํด ๋ฐ๋ก ์ค์ ํด๋ ํด๋์ค์ ์์น๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ค.
์ฌ๊ธฐ์๋ ์ฌ์ฉ์๊ฐ ์ ์ํ WebMvcContextConfiguration ์ ์ฌ์ฉ-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>kr.or.connect.mvcexam.config.WebMvcContextConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- 1. / ๋ก ๋ค์ด์ค๋ ์์ฒญ์ mvc ๋ผ๋ ์ด๋ฆ์ servlet ์ด ์ฒ๋ฆฌ-->
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
// WebMvcContextConfiguration.java
package org.example.guestbook.config;
...
// ์ค์ ํ์ผ์์ Spring์ด ์๊ฒํจ.
@Configuration
// Web์ ํ์ํ ๋น๋ค์ ๋๋ถ๋ถ ์๋์ผ๋ก ์ค์ . ์ฃผ๋ก ์๋์ฒ๋ผ ์ปค์คํ
์ผ๋ก ์ค์ ํด์ผํ ๋, WebMvcConfigurerAdapter ๋ฅผ ์์๋ฐ์ ํด๋์ค๋ก ๊ตฌํ
@EnableWebMvc
// ํด๋น ํจํค์ง์ ์ ์๋ ํด๋์ค์ค ์ปดํฌ๋ํธ๋ค์ ๋น์ผ๋ก ๋ฑ๋กํด๋์.
// @Controller, @Service, @Repository, @Component ๊ฐ ๋ฌ๋ฆฐ ๊ฐ์ฒด๋ฅผ ์ฐพ์.
@ComponentScan(basePackages = { "kr.or.connect.mvcexam.controller" })
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
// ์๋ฐ ํ์ผ์ด ์๋, Resource ํ์ผ๋ค์ ๋ํ url ์์ฒญ์ด ์์ ๊ฒฝ์ฐ, ํด๋น ๊ฒฝ๋ก์์ ์ฐพ์ ์ ์๊ฒ ์ค์
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
// default servlet handler๋ฅผ ์ฌ์ฉํ๊ฒ ํจ
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// / ๋ก ์ ๊ทผ์ main ํ
ํ๋ฆฟ(jsp) ๋ก ๊ฐ๊ฒํจ.
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
System.out.println("addViewControllers๊ฐ ํธ์ถ๋ฉ๋๋ค. ");
registry.addViewController("/").setViewName("main");
}
// ๋ ๋๋ง๋๋ view ํ์ผ๋ค์ ๊ฒฝ๋ก์ ํ์ฅ์๋ช
์ค์
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
์ด์ธ ๋ชจ๋ ๊ตฌ์ฑ
config/
- ๊ฐ์ข ์ค์ ํด๋์ค ํ์ผ๋ค์ ๋ด๊ณ ์์.
- ํด๋์ค ์์
@Configuration
์ด ๋ถ์. - WebMvc ์ค์ ๊ด๋ จ Config ๋ฅผ ์ ์ธํ๊ณ ๋๋จธ์ง๋ ๋ชจ๋ํํ ๋ค Application ์์ ๋ชจ๋ import
@Controller
๊ด๋ จ ๋น๋ค์WebMvcContextConfiguration
์์@ComponentScan
์ผ๋ก ์ฐพ์์ค์ผํ๊ณ ,@Service
,@Service
,@Component
๊ด๋ จ ๋น๋ค์ApplicationConfig
์์ ์ฐพ์์ค์ผ ํจ.
controller/
- ๊ฐ์ข ์ปจํธ๋กค๋ฌ ํด๋์ค ํ์ผ๋ค์ ๋ด๊ณ ์์.
- ํด๋์ค ์์
@Controller
๊ฐ ๋ถ์. - ๊ฐ ์ปจํธ๋กค๋ฌ ์ฝ๋๋ URI ๋งคํ์ ๋ด๋น.
- Serivce ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ ๋ก์ง์ ์คํํ๊ณ , View ๋จ์ ๋๊ฐ๊ธฐ ์ ํ ์์ ์ ๋ด๋น
dto/
- ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ๋งํ ํด๋์ค ํ์ผ๋ค์ ๋ด๊ณ ์์.
- ํ๋(ํ๋กํผํฐ)์ Getter, Setter ๋ฅผ ๊ฐ์ง.
dao/
- DB ์ ๋ํด ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ํด๋์ค ํ์ผ๋ค์ ๋ด๊ณ ์์.
- ํด๋์ค ์์
@Repository
๊ฐ ๋ถ์. - ์ค์ dao ํด๋์ค์, ์ฌ์ฉํ SQL ๋ง์ ๋ด๊ณ ์๋ ํด๋์ค๊ฐ ๋ฐ๋ก ๋ชจ๋ํํด์ ์ฌ์ฉํจ.
service/
- ์๋น์ค ๋ก์ง์ ๋ด๋ ํด๋์ค ํ์ผ๋ค์ ๋ด๊ณ ์์.
- ํด๋์ค ์์
@Service
๊ฐ ๋ถ์. - Interface๋ก ํต์ฌ ๋ก์ง ๋จผ์ ์ ์ํ ํ, ํด๋์ค๋ก ๊ตฌํ.
- ํ์ํ ๊ฒฝ์ฐ,
Dao
๋ฅผ ์ง์ ์ฌ์ฉํ๋ ํด๋์ค์.
webapp/WEB-INF/views/
- ๋ ๋๋ง ๋๋ ๋ทฐ ๊ด๋ จ ํ์ผ(
.jsp
)๋ค์ ๋ด๊ณ ์์. - ์ด ํ์ผ๋ค์ ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ๊ฑฐ์ณ, ์ต์ข ์ ์ผ๋ก ๋ ๋๋ง ๋๊ธฐ ์ง์ ์ ํ์ผ์.
[์ฐธ์กฐ]
https://min-it.tistory.com/7