MVC ํŒจํ„ด for SARAMARA

IToriginalยท2023๋…„ 5์›” 21์ผ
0

๋‚จ์ •๋„ค๋“ค: Web Study

๋ชฉ๋ก ๋ณด๊ธฐ
2/7
post-thumbnail
post-custom-banner
์นด์นด์˜ค ํด๋ผ์šฐ๋“œ ์Šค์ฟจ ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ธฐ ์ „์—, ๊ฐœ๋ฐœ์„ ํ•ด๋ดค๋˜(?) ํ•˜๋ คํ–ˆ๋˜(?) ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ˜„์žฌ ์‹œ์ ์—์„œ ์†์„ ๋– ๋‚œ์ง€ ์˜ค๋ž˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—(์•ฝ 3๋‹ฌ์ด์ƒ) ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์‚ดํŽด๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ๊ณ , ๊ทธ ๋‹น์‹œ์˜ ๋‚˜๋ฅผ ํฌํ•จํ•œ ๋‚จ์ •๋„ค๋“ค ํŒ€์›๊ณผ ํ˜„์žฌ์˜ ์šฐ๋ฆฌ๋Š” ๋‹ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์˜ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๊ณ  ์Šคํ„ฐ๋””์™€ ๊ฐœ๋ฐœ์„ ๋ณ‘ํ–‰ํ•ด์„œ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

SARAMARA ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

์•„๋ž˜์˜ ๊ตฌ์กฐ๋Š” ๋‹น์‹œ ๋‚ด๊ฐ€ ๋‹ด๋‹นํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค. ์ง„ํ–‰๋„๊ฐ€ ๋งŽ์ด ๋–จ์–ด์ ธ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ฐจ๊ทผ์ฐจ๊ทผ ๊ฐœ๋ฐœํ•ด ๋‚˜๊ฐ€์•ผ ๊ฒ ๋‹ค๋Š” ์˜์ง€๊ฐ€ ์ƒ๊ฒผ๋‹ค.

๐Ÿ“ saramara-community-server
|-- ๐Ÿ“‚ src
	|-- ๐Ÿ“‚ main
		|-- ๐Ÿ“‚ java
			|-- ๐Ÿ“‚ com.kakao.saramaracommunity
				|-- ๐Ÿ“‚ attach
				|-- ๐Ÿ“‚ auth
				|-- ๐Ÿ“‚ board
				|   |-- ๐Ÿ“‚ dto
				|   |   |-- ๐Ÿ“„ BoardDTO.java
				|   |   |-- ๐Ÿ“„ BoardPageRequestDTO.java
				|   |   |-- ๐Ÿ“„ BoardPageResponseDTO.java
				|   |   
				|   |-- ๐Ÿ“‚ entity
				|   |   |-- ๐Ÿ“„ Board.java
				|   |   |-- ๐Ÿ“„ CategoryBoard.java
				|   |   
				|   |-- ๐Ÿ“‚ repository
				|   |   |-- ๐Ÿ“„ BoardRepository.java
				|   |   
				|   |-- ๐Ÿ“‚ service
				|       |-- ๐Ÿ“„ BoardService.java
				|       |-- ๐Ÿ“„ BoardServiceImpl.java
				|      
				|-- ๐Ÿ“‚ comment
				|-- ๐Ÿ“‚ common
				|-- ๐Ÿ“‚ config
				|-- ๐Ÿ“‚ member
				|-- ๐Ÿ“„ SaramaraCommunityApplication.java

๋จผ์ €, ์•ž์„œ MVC ํŒจํ„ด์— ๊ณต๋ถ€ํ–ˆ๋˜ ์ด๋ก ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•œ ์„ค๋ช…์ด๋‹ค.

โœ… Model

  • ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • Controller์™€ View์— ์˜์กดํ•˜์ง€ ์•Š์•„์„œ Controller์™€ View์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๋Š” ์—†์–ด์•ผ ํ•œ๋‹ค.

โœ… View

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•œ๋‹ค.

โœ… Controller

  • Model๊ณผ View ์‚ฌ์ด์—์„œ ์ค‘๊ณ„์ž์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿค”ย ๊ณ ๋ฏผ [1]

Model๊ณผ View, ๊ทธ๋ฆฌ๊ณ  Controller์˜ ๊ฐœ๋…์€ ์ด๋ก ์ ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ๋Š” ์‰ฌ์› ๋‹ค.

๋‚˜๋Š” ์›น ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ, DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ์›Œ์„œ ์ด ํ”„๋กœ์ ํŠธ์—๋„ ๋‹จ์ˆœํžˆ DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์„ ํ•ด์™”๋‹ค.

๋ฌธ๋“, MVC ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๋‹ค์‹œ ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ๋ดค์„ ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๐Ÿ‹๏ธโ€โ™€๏ธย DTO๋Š” Model์— ์†ํ•˜๋Š” ๊ฒƒ์ด ๋งž์„๊นŒ?

๊ทธ๋ž˜์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด๋ณด์ž๋Š” ์ƒ๊ฐ์œผ๋กœ DTO์— ๋Œ€ํ•ด์„œ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์œ ๋กœ DTO๊ฐ€ Model๊ณผ ์—ฐ๊ด€์žˆ๋‹ค๋Š” ๊ฒƒ ์œผ๋กœ ํŒ๋‹จ์„ ํ–ˆ๋‹ค.

DTO๋Š” MVCํŒจํ„ด์˜ Model์•ˆ์— ์žˆ๋Š” ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ ๋ณ„๊ฐœ์˜ Layer๋กœ ๋ด์•ผํ•˜๋Š” ๊ฒƒ์ด ๋งž๋Š” ๊ฒƒ ๊ฐ™๊ณ , MVCํŒจํ„ด ์ด๋ผ๋Š” Model, View, Controller ๋ถ€๋ถ„์— ๊ตณ์ด DTO๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด DTO๋Š” Model์— ๊ฐ€๊น๋‹ค๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งž๋Š” ํ‘œํ˜„์ด์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด๋‹ค.

๐Ÿ‹๏ธโ€โ™€๏ธย DTO๋ž€?

Data Transfer Object๋กœ ๊ณ„์ธต(Controller, View) ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ Java beans๋ผ๋Š” ๊ฒƒ์„ ์–ด๋Š ํ•œ ๋ธ”๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.
Controller๋Š” View - Model์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ๋ณ„๋„์˜ DTO๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๐Ÿ‹๏ธโ€โ™€๏ธย ๊ทธ๋ ‡๋‹ค๋ฉด DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

DTO๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ดํ•˜์ž๋ฉด, ๊ฐ ํด๋ ˆ์Šค๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค DTO๋ผ๋Š” ์ด๋™ ์ˆ˜๋‹จ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์›€์ง์ผ ๋•Œ Entity ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋„ ๋  ๋“ฏํ•ด ๋ณด์ด๋Š”๋ฐ ์™œ DTO๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ง€ ์˜๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • View Layer์™€ DB Layer์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ:
    ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„์ธต๊ณผ ์ €์žฅํ•˜๋Š” ๊ณ„์ธต์˜ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•ด DTO๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Entity ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ:
    Entity ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์˜๋„์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€์งˆ๋  ์ˆ˜ ์žˆ๋‹ค.
  • View์™€ ํ†ต์‹ ํ•˜๋Š” DTO๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋œ๋‹ค:
    View์™€ ํ†ต์‹ ํ•˜๋Š” DTO ํด๋ž˜์Šค, ์˜ˆ๋กœ, ResponseDTO, RequsetDTO๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ž์ฃผ ๋ณ€๊ฒฝ์ด๋œ๋‹ค. ์–ด๋–ค ์š”์ฒญ์—๋Š” ํŠน์ • ๊ฐ’์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๊ณ , ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Entity ํด๋ž˜์Šค์™€ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Board

์ง€๋‚œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ MVC ํŒจํ„ด ์ ์šฉ ๋Œ€ํ•ด ์–ด์ƒ‰ํ•œ ๋ถ€๋ถ„์€ ์ฐพ์•„๋ณผ ์ˆ˜ ์—†์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ง„ํ–‰์ด ์–ผ๋งˆ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฏ€๋กœ, ์ด ํ›„ ๊ฐœ๋ฐœ ์ง„ํ–‰์— ์žˆ์–ด MVC ํŒจํ„ด์„ ์ž˜ ์ง€์ผœ์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ ์ง„ํ–‰์ด ํ•„์š”ํ•˜๋‹ค ์ƒ๊ฐ์ด๋œ๋‹ค.

โœ… Controller, View

Controller์™€ View๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋˜์–ด์žˆ์ง€ ์•Š์•„์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋Š” ์ƒ๋žตํ•œ๋‹ค.

โœ… Model

๐Ÿ“„ dto.BoardDTO

์šฐ์„ , DTO๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฐ์ฒด๋“ค์„ ์‚ฌ์šฉํ–ˆ๋‹ค. DTO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ž์ฒด์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ์ง€๋งŒ, ๋ช…ํ™•ํ•˜๊ฒŒ ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋  DTO์ธ์ง€ ์„ธ๋ถ„ํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด๋ณด์ธ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ๋งž๊ฒŒ DTO๋ฅผ ๋‚˜๋ˆ ์„œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ณ„ํš์„ ์„ธ์›Œ์•ผ ํ•  ํ•„์š”๋ฅผ ๋Š๊ผˆ๋‹ค.

๐Ÿ“„ dto.BoardPageRequestDTO

๐Ÿ“„ dto.BoardPageResponseDTO

BoardPageRequestDTO, BoardPageResponseDTO๋Š” ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ƒ์„ฑํ•œ DTO ํด๋ž˜์Šค ์˜€๋Š”๋ฐ, ๊ฐœ๋ฐœ์˜ ์ˆœ์„œ์ƒ ์ง€๊ธˆ ๊ฐœ๋ฐœ๋  ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จ์ด ๋œ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์˜ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋Š” ๋ฌดํ•œ์Šคํฌ๋กค์„ ํ•˜๊ธฐ๋กœ ํ•˜์˜€๊ณ , ๊ทธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ์ด ๋˜๋ฏ€๋กœ, ๊ทธ ๋ฐฉ๋ฒ•์ด ๊ฒฐ์ •๋˜๊ณ  ๋‚˜๋ฉด ๊ทธ์— ๋งž๊ฒŒ ์ž‘์„ฑ๋  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋Š” ์‚ญ์ œ๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

๐Ÿ“„ entity.Board

MVC ํŒจํ„ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ๋‹ค๋งŒ, ์ž‘์„ฑ๋œ PrePersist๋‚˜ Lob๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ–ˆ๋˜ ์ด์œ ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์™œ ์‚ฌ์šฉํ–ˆ๋Š”์ง€๋ฅผ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.
๋”ฐ๋ผ์„œ, ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด๋ ค ํ•œ๋‹ค.

@Lob: Large Object์˜ ์ค„์ž„๋ง์ธ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, ํ•„๋“œ์— ํŠน์ • ๋ฌธ์ž์—ด ๊ธธ์ด๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Default๋กœ varchar(255)๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์ง„์„ ์ €์žฅํ•˜๋Š” ์ปฌ๋Ÿผ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๋” ๋งŽ์€ ์ž๋ฆฌ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— @Lob ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์ ˆํžˆ ์ €์žฅํ•œ๋‹ค.

๋‹น์‹œ, ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ธ€์ด ๋งŽ์•„์งˆ ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ? ์‚ฌ์šฉ์ž์— ๋”ฐ๋ผ ๊ธ€์„ ๋งŽ์ด ์“ธ ์ˆ˜๋„ ์žˆ์ž–์•„? ํ•˜๊ณ  ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ–ˆ๋‹ค.

@PrePersist: JPA ์—”ํ‹ฐํ‹ฐ ๋ผ์ดํ”„ ์‹ธ์ดํด์˜ ์ฝœ๋ฐฑ์„ ์กฐ์ข…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์ด ์กด์žฌํ•˜๊ณ  ์ด๋Ÿฐ ์ฝœ๋ฐฑ ์ด๋ฒคํŠธ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—”ํ‹ฐํ‹ฐ ๋‚ด๋ถ€์— ์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ EntityListener๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

EntityListener๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜ํ•  ์ ์€ ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋“ค์€ void ํƒ€์ž…์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.
entity๋ฅผ ๋งŒ๋“ค๊ณ  repository์˜ save ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ @PrePersist๊ฐ€ ๋‹ฌ๋ฆฐ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ์ด ๋˜๊ณ  DB์— insert ๋œ ํ›„์— @PostPersist ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ์ด ๋œ๋‹ค.
๋งŒ์•ฝ, @GeneratedValue๋กœ PK๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น PK๋Š” @PostPersist๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์•˜์ง€๋งŒ, ๋ช…ํ™•ํ•˜๊ฒŒ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋ถ€๋ถ„์€ ์ดํ•ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•œ ๋’ค์— ์ ์šฉ์„ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.(์Šคํ„ฐ๋””๋ฅผ ํ•ด๋ด๋„ ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.)

๐Ÿ“„ entity.CategoryBoard

enum ํด๋ž˜์Šค๋กœ์„œ ๋ฌธ์ œ๋  ๊ฒƒ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๐Ÿ“„ repository.BoardRepository


Page์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ TODO ์ฃผ์„๊ณผ ๊ฐ™์ด ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ•œ ๋’ค์— ์ ์šฉํ•ด์•ผํ•˜๋ฏ€๋กœ ์ œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค ์ƒ๊ฐํ•œ๋‹ค.

๐Ÿ“„ service.BoardService

๐Ÿ“„ service.BoardServiceImpl

ํ˜„์žฌ ์ง„ํ–‰๋œ ๋ถ€๋ถ„๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ๋ณธ๋‹ค.


๐Ÿค”ย ๊ณ ๋ฏผ [2]

๐Ÿ‹๏ธโ€โ™€๏ธย Service ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์™€ Impl ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆ ์„œ ๊ฐœ๋ฐœํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?

Spring์—์„œ Service ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋ฅผ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ตฌํ˜„์ฒด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•ด๋„ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ.

์ด ๊ฐ™์€ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์€ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ๋‹คํ˜•์„ฑ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๋‹ค์„ฏ๊ฐ€์ง€ ์›์น™ ์ค‘ ํ•˜๋‚˜์ธ OCP ์›์น™์„ ๊ฐ€์žฅ ์ž˜ ์‹คํ˜„ํ•ด์ฃผ๋Š” ์„ค๊ณ„ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„๊ฐ€ 1:1 ๊ด€๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์‹ค์งˆ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด์ ์„ ์ „ํ˜€ ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ด€์Šต์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ถ”์ƒํŒจํ„ด์„ ์ ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

  • OCP (Open Closed Principle)
    ๊ฐœ๋ฐฉ, ํ์‡„ ์›์น™์ด๋ผ๊ณ  ํ•˜๋ฉฐ '์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์ฒด(ํด๋ž˜์Šค, ๋ชจ๋“ˆ, ํ•จ์ˆ˜ ๋“ฑ)๋Š” ํ™•์žฅ์— ๋Œ€ํ•ด ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.'๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™์ด๋‹ค.
  • ์œ„ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์˜ ๋‹จ์ 
    ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ๋ณต์žกํ•ด์ง„ ๊ตฌ์กฐ ๋งŒํผ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑฐ์ณ ๊ตฌํ˜„์ฒด๋“ค์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ ์ค‘์ธ ํ”„๋กœ์ ํŠธ ๋‚ด์— Service๋ฅผ ๋‚˜๋ˆ ์„œ ์™œ ๊ตฌ๋ถ„ํ•˜๋Š”์ง€๋ฅผ ์ž˜ ์•Œ์ง€ ์•Š๋Š” ์ด์ƒ, ๊ด€์Šต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋ฒˆ๊ฑฐ๋กœ์›Œ์งˆ ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จ๋œ๋‹ค.

๐Ÿš€ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

๋‹ค๋ฅธ ํŒ€์›์ด ๋‹ด๋‹นํ•œ ์ฝ”๋“œ๋“ค๋„ ์‚ดํŽด๋ณผ ์˜ˆ์ •์ธ๋ฐ, ํ•ด๋‹น ๋ถ€๋ถ„๋“ค์„ ๋ดค์„ ๋•Œ, ํŠน๋ณ„ํ•˜๊ฒŒ MVC ํŒจํ„ด์— ๋งž์ง€์•Š๋Š” ๋ถ€๋ถ„์€ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋™์ผํ•œ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๋“ค์ด ๋ช‡๋ช‡์ด ๋ณด์˜€๊ณ , ๋ฏธํŒ…์„ ํ†ตํ•ด ์„œ๋กœ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ํ•ด์„œ ์–ด๋– ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐˆ์ง€ ๊ณ ๋ฏผํ•ด๋ณผ ํ•„์š”๋ฅผ ๋Š๊ผˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ , ๋‚ด๊ฐ€ ๋‹ด๋‹นํ–ˆ๋˜ ๋ถ€๋ถ„์€ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์–ด๋– ํ•œ ์ด์œ ๋กœ ์™œ ์‚ฌ์šฉํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๊ผผ๊ผผํžˆ ์‚ดํŽด๋ณผ ํ•„์š”๋ฅผ ๋Š๊ผˆ๊ณ , ํ˜„์žฌ์˜ ๋‚ด๊ฐ€ ๊ธฐ์–ต์„ ์ž˜ ๋ชปํ•˜๊ณ  ์žˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ์ฃผ์„์„ ํ†ตํ•ด ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€๋ฅผ ์ƒ์„ธํžˆ ์ ์–ด๋‘ฌ์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.


Reference

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป witwint๋‹˜์˜ ๋ธ”๋กœ๊ทธ: Spring DTO์˜ ์‚ฌ์šฉ ์ด์œ 
๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป geesuee๋‹˜์˜ ๋ธ”๋กœ๊ทธ: MVC์™€ DTO
๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป bepoz๋‹˜์˜ ๋ธ”๋กœ๊ทธ: [JPA] @PrePersist ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด
๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Youngho๋‹˜์˜ ๋ธ”๋กœ๊ทธ: Spring์—์„œ Service ServiceImpl ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€

profile
๐Ÿ‘พISTP์˜ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ๐Ÿง
post-custom-banner

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