[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐Ÿ๋ฒ”๋ธ”๋น„์˜ MVC Pattern

์Šฌยท2025๋…„ 2์›” 27์ผ

ํ•„์ˆ˜์˜์ƒ

๋ชฉ๋ก ๋ณด๊ธฐ
38/40

[10๋ถ„ ํ…Œ์ฝ”ํ†ก] ๐Ÿ๋ฒ”๋ธ”๋น„์˜ MVC Pattern


์–ด๋–ค ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•จ์— ์•ž์„œ ๊ทธ ๊ธฐ์ˆ ์„ ์™œ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์šฐ์„  MVC ํŒจํ„ด์˜ ์—ญ์‚ฌ๋ฅผ ๋จผ์ € ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

์—ญ์‚ฌ

MVC์˜ ํƒ„์ƒ(1979)

MVC ํŒจํ„ด์˜ ์—ญ์‚ฌ๋Š” 1979๋…„ ๋ฐ์Šคํฌํ†ฑ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋Š” ๋ฐ์Šคํฌํ†ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด์„œ ๋‚˜์˜จ ์„ค๊ณ„.

  • ๋‹น์‹œ์—๋Š” ์‚ฌ๋žŒ์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ๊ณผ ์ปดํ“จํ„ฐ์˜ ๋ชจ๋ธ์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๊ณผ ์ปดํ“จํ„ฐ ์‚ฌ์ด์˜ ์–ด๋–ค ๊ฐ„๊ทน๋“ค์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฑธ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‚˜์˜จ ํŒจํ„ด!

Small-Talk80 (1988)

Small-Talk80 ์ด๋ผ๋Š” ๋…ผ๋ฌธ์—์„œ Model, View, Controller๊ฐ€ ์žˆ๋Š” ์ง€๊ธˆ๊ณผ ์œ ์‚ฌํ•œ ํŒจํ„ด์ด ๋ฐœํ‘œ๋œ๋‹ค.
์ง€๊ธˆ๊ณผ ๋‹ค๋ฅธ ์ ์€ ๋ชจ๋ธ๊ณผ ๋ทฐ๊ฐ€ ๊ฒฐํ•ฉ์ด ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

Cocoa MVC (Apple MVC)

์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ์Šต์˜ MVC ํŒจํ„ด์€ ์• ํ”Œ์—์„œ ๋ฐœํ‘œํ•œ Cocoa MVC๋ผ๋Š” ํŒจํ„ด์ด๋‹ค.
์ฝ”์ฝ”์•„๋Š” ios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋…์ธ๋ฐ, ๊ทธ ios์„ค๊ณ„๋ฅผ ์œ„ํ•ด์„œ ์• ํ”Œ์ด ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ๋ถ„๋ฆฌํ•œ, ํ˜„๋Œ€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ ์ง€๊ธˆ์˜ MVC ํŒจํ„ด์„ ๋ฐœํ‘œ

MVC ํŒจํ„ด์˜ ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ปจํŠธ๋กค๋Ÿฌ์— ์š”์ฒญ
  2. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ชจ๋ธ์—๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰์„ ์š”์ฒญ
  3. ๋ชจ๋ธ์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜
  4. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ทฐ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ถœ๋ ฅ

Model

  • ๋ฐ์ดํ„ฐ์™€ ํ–‰๋™์„ ๊ฐ–๋Š” ๊ฐ์ฒด.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ.
  • ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๋ชจ๋ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ์‘๋‹ต์„ ๋ฐ˜ํ™˜.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ.

์˜ˆ์‹œ

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
}

View

  • ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹น.
  • ๋ชจ๋ธ์ด ์ฒ˜๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์„œ ์‚ฌ์šฉ.
  • ๋ทฐ์—๋Š” ์ง์ ‘์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•จ.
  • HTML, CSS, JavaScript, JSP, Thymeleaf ๋“ฑ์˜ UI ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉ.

์˜ˆ์‹œ

<h1>์‚ฌ์šฉ์ž ์ •๋ณด</h1>
<p>์ด๋ฆ„: ${user.name}</p>
<p>๋‚˜์ด: ${user.age}</p>

Controller

  • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ํ•ด์„ํ•˜์—ฌ ์ ์ ˆํ•œ ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์—ฐ๊ฒฐ.
  • ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž„.
  • ์œ ์ผํ•˜๊ฒŒ ๋‹ค๋ฅธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ ์กด์žฌ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ œ์–ดํ•œ๋‹ค.

์™œ ์‚ฌ์šฉํ• ๊นŒ?

1. ๋„๋ฉ”์ธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ชจ๋ธ์— ์ง‘์ค‘์‹œํ‚ค๊ณ , UI(View)๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Œ.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋ฐ”์ผ, ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ํ™•์žฅ์„ฑ ์ฆ๊ฐ€

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

3. ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ

  • ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด ์ •๋ฆฌ๋˜๋ฉด์„œ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง.
  • View์™€ Model์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋’ค์„ž์ด๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

MVC ํŒจํ„ด์˜ ํ•œ๊ณ„

1. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋น„๋Œ€ํ•ด์ง

  • ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ ์  ๋ฌด๊ฑฐ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Service Layer(์„œ๋น„์Šค ๋ ˆ์ด์–ด)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์‚ฌ์šฉ๋จ.

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์˜ ์• ๋งคํ•จ

  • MVC์—์„œ ๋ชจ๋ธ์ด ์ง์ ‘ DB์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋งž๋Š”์ง€, ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€ ์• ๋งคํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
  • ํ˜„๋Œ€์ ์ธ ๊ฐœ๋ฐœ์—์„œ๋Š” Service Layer์™€ Repository ํŒจํ„ด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ”.

ํ˜„๋Œ€์ ์ธ MVC ํŒจํ„ด์˜ ๊ฐœ์„  (Service Layer ์ถ”๊ฐ€)

๊ธฐ๋ณธ MVC ํŒจํ„ด๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ ์  ๋ฌด๊ฑฐ์›Œ์ง€๊ณ , ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ˜„๋Œ€์ ์ธ MVC ํŒจํ„ด์—์„œ๋Š” 5๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๊ฐœ์„ ๋œ mvc ๊ตฌ์กฐ๋Š” Client โ†’ Controller โ†’ Service โ†’ Repository โ†’ Database

  • Controller: ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ํ•ด์„ํ•˜์—ฌ Service ํ˜ธ์ถœ.
  • Service: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌ.
  • Repository: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ.

0๊ฐœ์˜ ๋Œ“๊ธ€