Study/Java

[TIL] MVC : ์„œ๋น„์Šค ๊ณ„์ธต

hong- 2022. 6. 27. 13:43

๐Ÿ‘๐Ÿป Spring MVC : ์„œ๋น„์Šค ๊ณ„์ธต

 ๐Ÿ“ ์„œ๋น„์Šค ๊ณ„์ธต

   - API ๊ณ„์ธต์—์„œ ์ „๋‹ฌ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์งˆ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต

   - Spring DI๋ฅผ ํ†ตํ•ด API ๊ณ„์ธต๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต ์—ฐ๋™

   - API ๊ณ„์ธต์—์„œ ์ „๋‹ฌ๋ฐ›์€ DTO ๊ฐ์ฒด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ „๋‹ฌ

   ๐Ÿ’ก Spring MVC

     - ์›น ๊ณ„์ธต์„ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ๋กœ ์„œ๋ธ”๋ฆฟ API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“ˆ

     - ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

     - Model : ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ

     - View : Model ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด ์›น ๋ธŒ๋ผ์šฐ์ € ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋ฆฌ์†Œ์Šค ์ œ๊ณต

     - Controller : ํด๋ผ์ด์–ธํŠธ ์ธก ์š”์ฒญ์„ ์ง์ ‘ ๋ฐ›๋Š” ์—”๋“œํฌ์ธํŠธ๋กœ Model๊ณผ View์˜ ์ƒํ˜ธ์ž‘์šฉ ์—ญํ• 

      โ–ช๏ธโ–ช๏ธ Spring MVC ๋™์ž‘ ํ๋ฆ„ โ–ช๏ธโ–ช๏ธ

       : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ „์†ก → Controller๊ฐ€ ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  → ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ → Model ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

         → Controller์—๊ฒŒ Model ๋ฐ์ดํ„ฐ ์ „๋‹ฌ → Controller๊ฐ€ View์—๊ฒŒ Model ๋ฐ์ดํ„ฐ ์ „๋‹ฌ → View๊ฐ€ ์‘๋‹ต ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

   ๐Ÿ’ก 3-Tier Architeure

     โ‘  API ๊ณ„์ธต (Controller, DTO)

     โ‘ก ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต (Model, Service)

     โ‘ข ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต (Repository)


๐Ÿ“ DI๋ฅผ ํ†ตํ•œ API ๊ณ„์ธต๊ณผ ์„œ๋น„์Šค ๊ณ„์ธต ์—ฐ๋™

  - API ๊ณ„์ธต์—์„œ ๊ตฌํ˜„ํ•œ Controller ํด๋ž˜์Šค๊ฐ€ ์„œ๋น„์Šค ๊ณ„์ธต์˜ Service ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ ํ•œ๋‹ค๋Š” ์˜๋ฏธ

  - DTO๋Š” API ๊ณ„์ธต์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋˜๋Œ๋ ค ์ค„ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์—ญํ• 

  - ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” API ๊ณ„์ธต์—์„œ ์ „๋‹ฌ ๋ฐ›์€ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด

     ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌํ›„ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‹ค์‹œ API ๊ณ„์ธต์œผ๋กœ ์ „๋‹ฌ

 ๐Ÿ’ก Service

   - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋น„์Šค ๊ณ„์ธต์€ ๋Œ€๋ถ€๋ถ„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ํฌํ•จ

   - ๋„๋ฉ”์ธ ์—…๋ฌด ์˜์—ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ

   - ํด๋ผ์ด์–ธํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž˜ ๋งŒ์กฑํ•˜๋Š” Controllerํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด์™€ ์—ฐ๋™ํ•˜๋Š” Service ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ

   - Controller์˜ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์ „๋‹ฌ ๋ฐ›์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ Service ํด๋ž˜์Šค์— ์ž‘์„ฑ

     โ–ช๏ธ ๋„๋ฉ”์ธ ๋ชจ๋ธ

      - ๋น„์•ฝํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ + ํ’๋ถ€ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ

      - DDD(Domain Driven Design : ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„)์™€ ๊ด€๋ จ

     โ–ช๏ธ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

     - ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต๊ณผ ์—ฐ๋™ ํ•˜๋ฉด์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์—ญํ• 

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Member {
    private long memberId;
    private String email;
    private String name;
    private String phone;
 }

   โ–ธ @Getter, @Setter 

    : lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” getter/setter ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ž‘์„ฑํ•ด์คŒ

   โ–ธ @AllArgsConstructor

    : ํ˜„์žฌ Member ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ–๋Š” Member ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑ

   โ–ธ @NoArgsConstructor

    : ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑ


๐Ÿ’ก Spring Bean ๋“ฑ๋ก

  - Controller ํด๋ž˜์Šค์— @RestController์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ๋“ฑ๋ก

  - Service ํด๋ž˜์Šค์— @Service๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ๋“ฑ๋ก

  - ์ƒ์„ฑ์ž ๋ฐฉ์‹์˜ DI๋Š” ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ @Autowired๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ DI ์ ์šฉ


๐Ÿ“ Mapper๋ฅผ ํ†ตํ•œ DTO ํด๋ž˜์Šค์™€ Entity ํด๋ž˜์Šค ๋งคํ•‘

 โœ๐Ÿป Controller์˜ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ 'DTOํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…'

                                           → ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๊ฒŒ ๋ณ€ํ™˜ํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๊ธฐ

 โœ๐Ÿป ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์‘๋‹ต์„ ์ „์†กํ•˜์—ฌ '๊ณ„์ธต ๊ฐ„ ์—ญํ•  ๋ถ„๋ฆฌ X'

                                          → ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ DTO ํด๋ž˜์Šค ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

 

          ์ฆ‰, DTO ํด๋ž˜์Šค์™€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋งคํผ(Mapper)๊ฐ€ ํ•„์š” !


โ–ช๏ธ MapStruct

 - ๋งคํผ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ๊ธฐ

 - ๋งคํผ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ MapStrut ๊ฐ™์€ ๋งคํ•‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ƒ์‚ฐ์„ฑ ์ธก๋ฉด์—์„œ ๋” ์šฐ์ˆ˜

 - ๋งคํผ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๊ฐ€ ํ•„์š”ํ•จ

@Mapper(componentModel = "spring")
public interface MemberMapper{
   Mapperํด๋ž˜์Šค์—์„œ
   ์ˆ˜์ž‘์—…์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ๋ฉ”์„œ๋“œ๋“ค ๊ตฌํ˜„
 }

  โ–ธ @Mapper

   - ์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด MapStruct์˜ ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜๋จ

   - componentModel = "spring" ์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ์Šคํ”„๋ง์˜ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋จ

   - ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” MapStruct๊ฐ€ MemberMapper ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ 

      ๋งคํผ ๊ตฌํ˜„ ํด๋ž˜์Šค ์ž๋™ ์ƒ์„ฑํ•ด์คŒ

    → ์ž๋™ ์ƒ์„ฑ๋œ Mapper ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ํด๋ž˜์Šค ํ™•์ธ : Gradle์˜ build task ์‹คํ–‰


๐Ÿ’ก DTO ํด๋ž˜์Šค์™€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ์—ญํ•  ๋ถ„๋ฆฌ ํ•„์š” ์ด์œ 

  โ‘  ๊ณ„์ธต๋ณ„ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ 

   - ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋‹ค๋ฆ„

   - DTO ํด๋ž˜์Šค๋Š” API ๊ณ„์ธต์—์„œ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๊ณ  ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ์ฃผ๋œ ๋ชฉ์ 

   - Entitiy ํด๋ž˜์Šค๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต๊ณผ ์—ฐ๋™ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃธ์ด ์ฃผ๋œ ๋ชฉ์ 

  โ‘ก ์ฝ”๋“œ ๊ตฌ์„ฑ์˜ ๋‹จ์ˆœํ™”

   - DTO ํด๋ž˜์Šค์˜ ์œ ํšจ์„ฑ ์• ๋„ˆํ…Œ์ด์…˜์ด Entity ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด JPA์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์• ๋„ˆํ…Œ์ด์…˜๊ณผ ๋’ค์„ž์—ฌ ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€

  โ‘ข REST API ์ŠคํŽ™์˜ ๋…๋ฆฝ์„ฑ ํ™•๋ณด

   - Entity ํด๋ž˜์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ์›์น˜ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ „์†ก๋  ์ˆ˜ ์žˆ์Œ