Light Red Pointer [Spring] 04.MVC ๋ž€? - MVC ๊ตฌ์กฐ ์ดํ•ด
 

[Spring] 04.MVC ๋ž€? - MVC ๊ตฌ์กฐ ์ดํ•ด


 

 

 

 

์„œ๋ก 

MVC ํŒจํ„ด์€ ๋ฉด์ ‘ ๋ณผ ๋•Œ ๋‹จ๊ณจ ์งˆ๋ฌธ์ด๋ผํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹๋งŒํผ ์ž์ฃผ ์–ธ๊ธ‰๋˜๋Š” ์ฃผ์ œ์ด๋‹ค. Model, View, Controller ๋ผ๋Š” ์˜๋ฏธ๋ผ๋Š” ๊ฒƒ์€ ์•Œ๊ณ  ์žˆ์–ด๋„ ๊ทธ ์˜๋ฏธ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์‰ฝ์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์Šคํ”„๋ง MVC์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 

MVC ํŒจํ„ด์ด๋ž€?

- MVC ํŒจํ„ด์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Model, View, Controller๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก 

- ์„œ๋กœ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™” + ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋ฉฐ + ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ ํ–ฅ์ƒ

  • Model(๋ชจ๋ธ) : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณ„์ธต, DB์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” DAO, Entity, Service ๋“ฑ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹น
  • View(๋ทฐ) : ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ณด๋Š” ํ™”๋ฉด(UI), Model์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•จ → HTML, JSP, JSON ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ 
  • Contorller(์ปจํŠธ๋กค๋Ÿฌ) : ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์•„ ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์‹คํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ view์— ์ „๋‹ฌ
//Controller(์ปจํŠธ๋กค๋Ÿฌ) ์˜ˆ์‹œ
@Controller
public class MemberController {
    @GetMapping("/members")
    public String getMembers(Model model) {
        List<Member> members = memberService.findAll();
        model.addAttribute("members", members);
        return "memberList"; // View ์ด๋ฆ„(jsp๋‚˜ htmlํ˜•์‹ ๋“ฑ)
    }
}

 

 

MVC ๋“ฑ์žฅ ์ด์œ 

- ์ดˆ์ฐฝ๊ธฐ ํ”„๋กœ๊ทธ๋žจ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ์˜ ๋ฌธ์ œ์ 

  • ์ดˆ๊ธฐ์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ชจ๋…ธ๋ฆฌ์Šค ํ˜•ํƒœ์˜€์Œ ์ฆ‰
// ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋ชจ๋“  ๊ฑธ ์ฒ˜๋ฆฌ
public void onClick() {
   connectDB();
   getData();
   calculate();
   renderScreen();
}
  • ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, UI ํ‘œ์‹œ๊ฐ€ ํ•œ ์ฝ”๋“œ ์•ˆ์—์„œ ์ด๋ฃจ์–ด์ง
    → ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€, ์žฌ์‚ฌ์šฉ ์–ด๋ ค์›€, ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€, ํ˜‘์—…์ด ๋น„ํšจ์œจ์  ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ๋ฐœ์ƒ

- ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด MVC ํŒจํ„ด

  • Controller์—์„œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•จ, Model์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•จ, View์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•จ
    → UI, ๋น„๋‹ˆ์Šค ๋กœ์ง, ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ์‹œ์ผœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

 

 

MVC ๊ตฌ์กฐ

 

  1. ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์š”์ฒญ์€ DispatcherServlet(FrontController)์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋จ
  2. DispatcherServlet์€ ๋ฐ›์€ ์š”์ฒญ์„ HandlerMapping์œผ๋กœ ์ „๋‹ฌ
  3. DispatcherServlet์ด HandlerAdapter๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž‘๋™์‹œํ‚ด
  4. ์‹ค์ œ ๊ฐœ๋ฐœ์ž๋Š” Controller์— ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ณ  View์— ์ „๋‹ฌํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Model์ด๋ผ๋Š” ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ „๋‹ฌํ•จ
  5. Controller๋Š” View์˜ ์ด๋ฆ„์„ DispatcherServlet์— ๋ฐ˜ํ™˜
  6. DispatcherServlet์€ ViewResolver๋ฅผ ํ˜ธ์ถœํ•ด Controller๊ฐ€ ๋ฐ˜ํ™˜ํ•œ View ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹น๋˜๋Š” View๋ฅผ ์ฐพ์•„์คŒ
  7. DispatcherServlet์ด View์— ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋„˜๊ฒจ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ์š”์ฒญ
  8. View๋Š” ์‹ค์ œ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ jsp, html๋“ฑ์„ ์ด์šฉํ•ด ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•จ, ๋งŒ๋“ค์–ด์ง„ ์‘๋‹ต์€ DispatcherServlet์„ ํ†ตํ•ด ์ „๋‹ฌ

- ์œ„ ๊ทธ๋ฆผ์ด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ ์ฐธ๊ณ  (๊ทธ๋ฆผํŒ์œผ๋กœ ๊ทธ๋ ค์„œ ํ€„๋ฆฌํ‹ฐ ๋‚ฎ์Œ)

 

 

์„ค์ • ํŒŒ์ผ

- ์Šคํ”„๋ง MVC๋Š” ์Šคํ”„๋ง์˜ ์„œ๋ธŒ ํ”„๋กœ์ ํŠธ์ž„ → ๋ณ„๋„์˜ ์„ค์ •์ด ์กด์žฌ

์„ค์ • ํŒŒ์ผ ์„ค๋ช…
web.xml ์„ค์ •์„ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ, WAS ๊ตฌ๋™๊ณผ ๊ด€๋ จ๋œ ์„ค์ •
root-context.xml ์ผ๋ฐ˜ Java ์˜์—ญ์— ๋Œ€ํ•œ ์„ค์ •
servlet-context.xml WEB ๊ด€๋ จ ์˜์—ญ์— ๋Œ€ํ•œ ์„ค์ •

 

> web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ๊ณผ ํ•„ํ„ฐ๊ฐ€ ๊ณต์œ ํ•  Spring์˜ root-context.xmlํŒŒ์ผ์˜ ์œ„์น˜ ์ง€์ • -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- ์œ„์—์„œ ์ •์˜ํ•œ context-param์„ ์ฝ๊ณ  ์ „์—ญ Bean๋“ค์„ ๋กœ๋”ฉํ•˜๋Š” ์—ญํ•  -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์•„ ์ ์ ˆํ•œ Controller์— ๋ถ„๋ฐฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ View๋กœ ์—ฐ๊ฒฐ -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<!-- appServlet(DispatcherServlet)์ด ๋ชจ๋“  ์š”์ฒญ(/)์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ง€์ • -->	
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

 

> root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">	
</beans>

- ์ผ๋ฐ˜ Java ์˜์—ญ์— ๋Œ€ํ•ด ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ → Service๋‚˜ DAO, DB ์—ฐ๋™์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” DataSource ๋“ฑ์„ ๋“ฑ๋กํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋จ

 

> servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- @Controller, @RequestMapping, @ResponseBody ๊ฐ™์€ Spring MVC ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์„ฑํ™” -->
	<annotation-driven />

	<!-- /resources/** ๊ฒฝ๋กœ๋กœ ์š”์ฒญ๋œ ์ •์  ํŒŒ์ผ(CSS, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ /resources/ ํด๋”์—์„œ ์ฐพ์•„ ์„œ๋น™ -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ JSP ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ทฐ ๋ฆฌ์กธ๋ฒ„(ViewResolver) ์„ค์ • -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<!-- com.controller ํŒจํ‚ค์ง€ ๋‚ด์˜ ํด๋ž˜์Šค ์ค‘ @Controller, @Service, @Component, @Repository ๋“ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋“ค์„ ์ž๋™์œผ๋กœ Bean์œผ๋กœ ๋“ฑ๋ก -->
	<context:component-scan base-package="com.controller" />

</beans:beans>

 

 

์ •๋ฆฌ

  ์—ญํ•  ์˜ˆ์‹œ ์ฃผ์š” ๊ธฐ๋Šฅ
Model ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹น Service, Repository, Entity, DTO - ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
- DB ์ ‘๊ทผ
- ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™
View ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI JSP, Thymeleaf, HTML, JSON - ํ™”๋ฉด ์ถœ๋ ฅ
- ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ
Controller ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ฐ ํ๋ฆ„ ์ œ์–ด @Controller, @RequestMapping - ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ˆ˜์‹ 
- Model ํ˜ธ์ถœ
- View๋กœ ์ด๋™ ๊ฒฐ์ •

 


 

Reference

https://amy-it.tistory.com/106

 

[Spring] ์Šคํ”„๋ง MVC์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

๋ชฉ์ฐจ MVC ํŒจํ„ด์ด๋ž€? MVC ํŒจํ„ด์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ธ ๊ฐ€์ง€ ์˜์—ญ, ์ฆ‰ ๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํŠธ๋กค๋Ÿฌ(Controller)๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ์„œ, ์„œ๋กœ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ตœ

amy-it.tistory.com

https://imgzon.tistory.com/137

 

[Spring] MVC ํŒจํ„ด, ์Šคํ”„๋ง MVC ๊ตฌ์กฐ ์ดํ•ด

1. ๊ฐœ์š” ์ด๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” MVC ํŒจํ„ด์— ๋Œ€ํ•œ ์†Œ๊ฐœ, ์žฅ์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ ํ›„, ์Šคํ”„๋ง์€ ์ด MVC ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋Š”์ง€๋ฅผ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด ์ด์™€ ๋น„์Šทํ•œ MVC ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ

imgzon.tistory.com

https://skorea6.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-MVC-%ED%8C%A8%ED%84%B4-%EC%9D%98%EB%AF%B8%EC%99%80-%EA%B5%AC%EC%A1%B0-%EC%9D%B4%ED%95%B4

 

์Šคํ”„๋ง MVC ํŒจํ„ด ์˜๋ฏธ์™€ ๊ตฌ์กฐ [์ •๋ฆฌ]

์•ˆ๋…•ํ•˜์„ธ์š”, ์Šค์ฝ”๋ฆฌ์•„์ž…๋‹ˆ๋‹ค.์˜ค๋Š˜์€ ์Šคํ”„๋ง MVC ํŒจํ„ด์˜ ์˜๋ฏธ์™€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. MVC ํŒจํ„ด ์˜๋ฏธMVC๋Š” Model View Controller์˜ ์ค„์ž„๋ง์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์˜์—ญ์„ Model, View, Controller๋กœ ๊ตฌ๋ถ„

skorea6.tistory.com