[Spring] MVC Model2


Spring MVC MODEL2



mvc2_1

Model(๋ชจ๋ธ)

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ์ด๋ฉฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ด์šฉํ•˜๋ ค๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•˜๋ฉฐ, View(๋ทฐ) ๋˜๋Š” Controller(์ปจํŠธ๋กค๋Ÿฌ)์— ๋Œ€ํ•ด ์–ด๋–ค ์ •๋ณด๋„ ์•Œ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.
  • ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.


View(๋ทฐ)

์‹œ๊ฐ์ ์ธ UI ์š”์†Œ๋ฅผ ์ง€์นญํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

  • Model(๋ชจ๋ธ)์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • Model(๋ชจ๋ธ)์ด๋‚˜ Controller(์ปจํŠธ๋กค๋Ÿฌ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ๋ฉด ์•ˆ๋˜๋ฉฐ ๋‹จ์ˆœํžˆ ํ‘œ์‹œํ•ด์ฃผ๋Š” ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.


Controller(์ปจํŠธ๋กค๋Ÿฌ)

Model(๋ชจ๋ธ)๊ณผ View(๋ทฐ)๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • Model(๋ชจ๋ธ) ๋˜๋Š” View(๋ทฐ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
  • Model(๋ชจ๋ธ) ๋˜๋Š” View(๋ทฐ)์˜ ๋ณ€๊ฒฝ์„ ์ธ์ง€ํ•˜์—ฌ ๋Œ€์ฒ˜๋ฅผ ํ•ด์•ผํ•œ๋‹ค.


๋ชจ๋ธ2์˜ ํŒจํ„ด์€

์–ด๋–ค ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์š”์ฒญ์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋œ ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ(์‘๋‹ต)๋ฅผ ๋ณด๋‚ด๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ์—๊ฒŒ ์ „์†กํ•˜๋Š” ์›๋ฆฌ์ž…๋‹ˆ๋‹ค.

(์š”์ฒญ -> ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ -> ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘ -> ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ -> ์ปจํŠธ๋กค๋Ÿฌ -> ๋กœ์ง ์ˆ˜ํ–‰(์„œ๋น„์Šค) -> ์ปจํŠธ๋กค๋Ÿฌ -> ๋ทฐ ๋ฆฌ์กธ๋ฒ„ -> ์‘๋‹ต(jsp, html))


mvc2_2


MVC์˜ ์ฒ˜๋ฆฌ ์ˆœ์„œ

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ํ•˜๋ฉด, front controller์ธ DispatcherServlet ํด๋ž˜์Šค๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.
  2. DispatcherServlet๋Š” ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๋‚ด์˜ servlet-context.xml ํŒŒ์ผ์˜ @Controller ์ธ์ž๋ฅผ ํ†ตํ•ด ๋“ฑ๋กํ•œ ์š”์ฒญ ์œ„์ž„ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ๋งคํ•‘(mapping)๋œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์กด์žฌํ•˜๋ฉด @RequestMapping์„ ํ†ตํ•ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋ฉ”์†Œ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  Service(์„œ๋น„์Šค)๋ฅผ ๋ฐ›์•„ ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง์„ ์„œ๋น„์Šค์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.
  4. Service(์„œ๋น„์Šค)๋Š” ์š”์ฒญ์— ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์š”์ฒญ์— ๋Œ€ํ•ด DB์— ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค๋ฉด DAO์— ์š”์ฒญํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค.
  5. DAO๋Š” DB์ •๋ณด๋ฅผ DTO๋ฅผ ํ†ตํ•ด ๋ฐ›์•„ ์„œ๋น„์Šค์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  6. ์„œ๋น„์Šค๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  7. ์ปจํŠธ๋กค๋Ÿฌ๋Š” Model(๋ชจ๋ธ) ๊ฐ์ฒด์—๊ฒŒ ์š”์ฒญ์— ๋งž๋Š” View(๋ทฐ) ์ •๋ณด๋ฅผ ๋‹ด์•„ DispatcherServlet์—๊ฒŒ ์ „์†กํ•œ๋‹ค.
  8. DispatcherServlet๋Š” ViewResolver์—๊ฒŒ ์ „๋‹ฌ๋ฐ›์€ View์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  9. ViewResolver๋Š” ์‘๋‹ตํ•  View์— ๋Œ€ํ•œ JSP๋ฅผ ์ฐพ์•„ DispatcherServlet์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  10. DispatcherServlet๋Š” ์‘๋‹ตํ•  ๋ทฐ์˜ Render๋ฅผ ์ง€์‹œํ•˜๊ณ  ๋ทฐ๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  11. 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