Spring HTTP Server by MVC

Model-View-Controller ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

MVC ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ํŒจํ„ด์ด๋‹ค.

  • View๋Š” GUI์— ๊ด€๋ จ๋œ ํ‘œํ˜„๊ณ„์ธต.

  • Controller๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋“ค์–ด์˜ค๋Š” ์ž…๋ ฅ์— ๊ด€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ณ„์ธต์ด๋‹ค.

  • Model์€ ๊ทธ ์™ธ์˜ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ณ„์ธต์ด๋‹ค.

๊ตณ์ด M, V, C๋กœ ๋ ˆ์ด์–ด๋ฅผ ๋‚˜๋ˆ„๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ? ์ด์œ ๋Š” Model์— ๋Œ€ํ•œ 2๊ฐ€์ง€ ์˜๋ฏธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  1. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ์˜ ์ฐจ์›. MVC์—์„œ ์ถ”๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

    • Model์€ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค๋งŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๋ฆฌํ–ˆ๋‹ค.

    • ์˜ˆ์‹œ) View๊ณ„์ธต์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ on/off ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

    • Controller์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋“ค์–ด์˜จ ์ž…๋ ฅ์„ ํ†ตํ•ด toggle.onOff()๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    • Model๊ณ„์ธต์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

  2. (์ฃผ๋กœ ์›น์—์„œ) View์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ํ‘œํ˜„์œผ๋กœ์„œ Model

    • MVC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Rails์˜ ๊ฒฝ์šฐ๋Š” Active Record์•„ํ‚คํ…์ณ ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    • Active Record๋ผ๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ DBํ…Œ์ด๋ธ” ์ž์ฒด๋ฅผ 1:1๋กœ ๋งคํ•‘ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

      • DB์— ์ง์ ‘ ๋ช…๋ น์„ ๋‚ด๋ฆฌ๊ฑฐ๋‚˜ ์กฐ์ž‘์—†์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ DB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ํ•˜์ง€๋งŒ Active Record๊ฐ€ ๋งˆ๋ƒฅ ์ข‹์ง€๋งŽ์€ ์•Š๋‹ค. Active Record considered harmfulํ•˜๋‹ค๋Š” ์˜๊ฒฌ๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ๋‹˜์ด goto์˜ hamfulํ•จ์„ ์ ์€ ๊ธ€์„ ํŒจ๋Ÿฌ๋”” ํ•œ ํ˜•์‹์ด๋ผ๊ณ  ํ•œ๋‹คใ…‹

    • Spring Web MVC์—์„œ๋Š” Map๊ณผ ์œ ์‚ฌํ•œ ModelMap์ด๋ผ๋Š” ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

      • Spring web MVC์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ฑธ์ณ์„œ ์ด ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ(์›น, UI Layer)์™€ ๊ด€๋ จ๋œ Layer๊นŒ์ง€๋งŒ ์ด MVC ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ ๋ฐ‘์˜ Domain Layer์—์„œ๋Š” ๊ทธ ๋น„์ฆˆ๋‹ˆ์Šค์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•œ๋‹ค.

    • ๊ฒฐ๋ก ์€ Model์ด ๊ผญ DB์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฐœ๋…์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์ตœ๊ทผ์—๋Š” UI Layer๋ฅผ ์•„์˜ˆ Front๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , Backend๋Š” api๋งŒ ์ œ๊ณตํ•˜๋Š” ํ˜•์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ UI Layer๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—†์ด Controller๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์•„๊ฐ€ Spring5๋ถ€ํ„ฐ ์ƒ๊ธด WebFlux์˜ ๊ฒฝ์šฐ Controller๊ฐ€ ์•„๋‹Œ handler๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Hexagonal ์•„ํ‚คํ…์ณ์˜ ๊ฒฝ์šฐ์—๋Š” Adapter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.(Hexagonal์€ ๋‚˜์ค‘์—...)

package com.example.app.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WelcomController {
	@GetMapping("/")
	public String home() {
		return "Hello world.";
	}
	
	@GetMapping("/hi")
	public String hi() {
		return "Hi, world.";
	}
}

Annotation ๊ธฐ๋ก

Last updated