์๋์ ๊ตฌ์กฐ๋ ๋น์ ๋ด๊ฐ ๋ด๋นํ๋ ๋ถ๋ถ์ด๋ค. ์งํ๋๊ฐ ๋ง์ด ๋จ์ด์ ธ์๋ ๊ฒ์ ์ ์ ์์๊ณ , ์ฐจ๊ทผ์ฐจ๊ทผ ๊ฐ๋ฐํด ๋๊ฐ์ผ ๊ฒ ๋ค๋ ์์ง๊ฐ ์๊ฒผ๋ค.
๐ 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
๊ณผ View
, ๊ทธ๋ฆฌ๊ณ Controller
์ ๊ฐ๋
์ ์ด๋ก ์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ๋ ์ฌ์ ๋ค.
๋๋ ์น ๊ฐ๋ฐ์ ์ฒ์ ๋ฐฐ์ธ ๋, DTO๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ฐฐ์์ ์ด ํ๋ก์ ํธ์๋ ๋จ์ํ DTO๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํตํด ๊ฐ๋ฐ์ ํด์๋ค.
๋ฌธ๋, MVC ํจํด์ ๋ํด์ ๊ณต๋ถํ๊ณ ๋ค์ ์ด ํ๋ก์ ํธ์ ๊ตฌ์กฐ๋ฅผ ๋ดค์ ๋, ์๋์ ๊ฐ์ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋์ ์ฒ์๋ถํฐ ๋ค์ ๊ณต๋ถํด๋ณด์๋ ์๊ฐ์ผ๋ก DTO์ ๋ํด์ ์ฐพ์๋ณด๊ฒ ๋์๊ณ , ์๋์ ๊ฐ์ ์ด์ ๋ก DTO๊ฐ Model๊ณผ ์ฐ๊ด์๋ค๋ ๊ฒ
์ผ๋ก ํ๋จ์ ํ๋ค.
DTO๋ MVCํจํด์ Model์์ ์๋ ๊ฐ๋ ์ด ์๋๋ผ ๋ณ๊ฐ์ Layer๋ก ๋ด์ผํ๋ ๊ฒ์ด ๋ง๋ ๊ฒ ๊ฐ๊ณ , MVCํจํด ์ด๋ผ๋ Model, View, Controller ๋ถ๋ถ์ ๊ตณ์ด DTO๋ฅผ ๋ฃ๋๋ค๋ฉด
DTO๋ Model์ ๊ฐ๊น๋ค
๋ผ๊ณ ํํํ๋ ๊ฒ์ด ๋ ๋ง๋ ํํ์ด์ง ์์๊น ํ๋ ์๊ฐ์ด๋ค.
Data Transfer Object๋ก ๊ณ์ธต(Controller, View) ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ธฐ ์ํ Java beans๋ผ๋ ๊ฒ์ ์ด๋ ํ ๋ธ๋ก๊ทธ๋ฅผ ํตํด ๋ณด๊ฒ ๋์๋ค.
Controller๋ View - Model์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ๋ณ๋์ DTO๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
DTO๋ฅผ ๊ฐ๋จํ๊ฒ ์ดํดํ์๋ฉด, ๊ฐ ํด๋ ์ค๋ฅผ ์ด๋ํ ๋๋ง๋ค DTO๋ผ๋ ์ด๋ ์๋จ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ ๊ฐ๋ค.
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๋ฐ์ดํฐ๋ฅผ ์์ง์ผ ๋ Entity ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋ ๋ฏํด ๋ณด์ด๋๋ฐ ์ DTO๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ์ง ์๋ฌธ์ด ์๊ธธ ์ ์๋ค.
DTO๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
์ง๋ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ MVC ํจํด ์ ์ฉ ๋ํด ์ด์ํ ๋ถ๋ถ์ ์ฐพ์๋ณผ ์ ์์๋ค. ํ์ง๋ง, ์งํ์ด ์ผ๋ง๋์ง ์์ ์ํ์ด๋ฏ๋ก, ์ด ํ ๊ฐ๋ฐ ์งํ์ ์์ด MVC ํจํด์ ์ ์ง์ผ์ง๊ณ ์๋์ง๋ฅผ ํ์ธํ๋ฉด์ ์งํ์ด ํ์ํ๋ค ์๊ฐ์ด๋๋ค.
Controller์ View๋ ์ฝ๋ ์์ฑ์ด ๋์ด์์ง ์์์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ ์๋ตํ๋ค.
์ฐ์ , DTO๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ชจ๋ ๊ฐ์ฒด๋ค์ ์ฌ์ฉํ๋ค. DTO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐ๋์์ง๋ง, ๋ช ํํ๊ฒ ์ด๋ค ๋ถ๋ถ์์ ์ฌ์ฉ๋ DTO์ธ์ง ์ธ๋ถํํ ํ์๊ฐ ์์ด๋ณด์ธ๋ค. ์ด ๋ถ๋ถ์ ๊ฐ๋ฐ์ ์งํํ๋ฉด์ ํ์ํ ๋ถ๋ถ์ ๋ง๊ฒ DTO๋ฅผ ๋๋ ์ ํด๋์ค๋ฅผ ์์ฑํ ๊ณํ์ ์ธ์์ผ ํ ํ์๋ฅผ ๋๊ผ๋ค.
BoardPageRequestDTO, BoardPageResponseDTO๋ ์ญ์ ๊ฐ ํ์ํ๋ค ์๊ฐ์ด ๋ค์๋ค.
ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ฑํ DTO ํด๋์ค ์๋๋ฐ, ๊ฐ๋ฐ์ ์์์ ์ง๊ธ ๊ฐ๋ฐ๋ ๋ถ๋ถ์ด ์๋๋ผ๊ณ ํ๋จ์ด ๋๋ค. ์ด ํ๋ก์ ํธ์ ํ์ด์ง ์ฒ๋ฆฌ๋ ๋ฌดํ์คํฌ๋กค์ ํ๊ธฐ๋ก ํ์๊ณ , ๊ทธ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ผ๋ก ์๊ฐ์ด ๋๋ฏ๋ก, ๊ทธ ๋ฐฉ๋ฒ์ด ๊ฒฐ์ ๋๊ณ ๋๋ฉด ๊ทธ์ ๋ง๊ฒ ์์ฑ๋ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ํ์ฌ๋ ์ญ์ ๋ฅผ ํด์ผ๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
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๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
๋ค์ ๊ฐ๋จํ๊ฒ ์์๋ณด์์ง๋ง, ๋ช ํํ๊ฒ ์ด๋ ธํ ์ด์ ์ ์ดํดํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์, ํด๋น ๋ถ๋ถ์ ์ดํด๋ฅผ ๋ช ํํ๊ฒ ํ ๋ค์ ์ ์ฉ์ ํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.(์คํฐ๋๋ฅผ ํด๋ด๋ ์ข์ ๋ฏ ํ๋ค.)
enum ํด๋์ค๋ก์ ๋ฌธ์ ๋ ๊ฒ์ด ์๋ค๊ณ ํ๋จํ๋ค.
Page์ ๋ํ ๋ถ๋ถ์ TODO ์ฃผ์๊ณผ ๊ฐ์ด ํ์ด์ง์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ ๋ค์ ์ ์ฉํด์ผํ๋ฏ๋ก ์ ๊ฑฐ๊ฐ ํ์ํ๋ค ์๊ฐํ๋ค.
ํ์ฌ ์งํ๋ ๋ถ๋ถ๊น์ง๋ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋ณธ๋ค.
Spring์์ Service ์ธํฐํ์ด์ค๋ฅผ ๋๋ ์ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋์ ๊ฐ์๋ค.
- ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ตฌํ์ฒด๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์๋ค.
- ๊ตฌํ์ฒด ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํด๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํ๊ธฐ ์ํจ.
์ด ๊ฐ์ ์ถ์ํ๋ฅผ ํตํ ๊ตฌํ ๋ฐฉ์์ ๊ฐ์ฒด์งํฅ์ ํน์ง ์ค ํ๋์ธ ๋คํ์ฑ
๊ณผ ๊ฐ์ฒด์งํฅ์ ๋ค์ฏ๊ฐ์ง ์์น ์ค ํ๋์ธ OCP ์์น
์ ๊ฐ์ฅ ์ ์คํํด์ฃผ๋ ์ค๊ณ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์๋ค.
ํ์ง๋ง, ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด ํด๋์ค ์ฌ์ด์ ๊ด๊ณ๊ฐ 1:1 ๊ด๊ณ๋ก ๊ตฌ์ฑ๋์ด ์ค์ง์ ์ผ๋ก ์ธํฐํ์ด์ค์ ํด๋์ค ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ด์ ์ ์ ํ ๊ฐ์ ธ๊ฐ์ง ๋ชปํจ์๋ ๋ถ๊ตฌํ๊ณ ๊ด์ต์ ์ผ๋ก ์ด๋ฌํ ์ถ์ํจํด์ ์ ์ฉํ๊ณ ์๋ค.
- OCP (Open Closed Principle)
๊ฐ๋ฐฉ, ํ์ ์์น์ด๋ผ๊ณ ํ๋ฉฐ '์ํํธ์จ์ด ๊ฐ์ฒด(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ)๋ ํ์ฅ์ ๋ํด ์ด๋ ค ์์ด์ผ ํ๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค.'๋ ํ๋ก๊ทธ๋๋ฐ ์์น์ด๋ค.
- ์ ์ถ์ํ๋ฅผ ํตํ ๊ตฌํ ๋ฐฉ์์ ๋จ์
์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๊ณ , ๋ณต์กํด์ง ๊ตฌ์กฐ ๋งํผ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ํ์ธํ๋ ๊ณผ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ฑฐ์ณ ๊ตฌํ์ฒด๋ค์ ํ์ธํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธธ ์ ์๋ค.
๋ฐ๋ผ์, ์ด๋ ๊ฒ ๊ฐ๋ฐ ์ค์ธ ํ๋ก์ ํธ ๋ด์ Service๋ฅผ ๋๋ ์ ์ ๊ตฌ๋ถํ๋์ง๋ฅผ ์ ์์ง ์๋ ์ด์, ๊ด์ต์ ์ผ๋ก ๋ถ๋ฆฌํด์ ๋ฒ๊ฑฐ๋ก์์ง ์ด์ ๊ฐ ์๋ค๊ณ ํ๋จ๋๋ค.
๋ค๋ฅธ ํ์์ด ๋ด๋นํ ์ฝ๋๋ค๋ ์ดํด๋ณผ ์์ ์ธ๋ฐ, ํด๋น ๋ถ๋ถ๋ค์ ๋ดค์ ๋, ํน๋ณํ๊ฒ MVC ํจํด์ ๋ง์ง์๋ ๋ถ๋ถ์ ์ฐพ์ง ๋ชปํ๋ค. ํ์ง๋ง, ๋์ผํ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๋ค์ด ๋ช๋ช์ด ๋ณด์๊ณ , ๋ฏธํ
์ ํตํด ์๋ก ์ปค๋ฎค๋์ผ์ด์
์ ํด์ ์ด๋ ํ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ์ง ๊ณ ๋ฏผํด๋ณผ ํ์๋ฅผ ๋๊ผ๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ด๊ฐ ๋ด๋นํ๋ ๋ถ๋ถ์ ์ด ์ด๋
ธํ
์ด์
์ ์ด๋ ํ ์ด์ ๋ก ์ ์ฌ์ฉํ๋์ง์ ๋ํด์ ๊ผผ๊ผผํ ์ดํด๋ณผ ํ์๋ฅผ ๋๊ผ๊ณ , ํ์ฌ์ ๋ด๊ฐ ๊ธฐ์ต์ ์ ๋ชปํ๊ณ ์๋ ๊ฒ ์ฒ๋ผ ์ฃผ์์ ํตํด ์ด๋ค ๋ด์ฉ์ธ์ง๋ฅผ ์์ธํ ์ ์ด๋ฌ์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๐จ๐ปโ๐ป witwint๋์ ๋ธ๋ก๊ทธ: Spring DTO์ ์ฌ์ฉ ์ด์
๐จ๐ปโ๐ป geesuee๋์ ๋ธ๋ก๊ทธ: MVC์ DTO
๐จ๐ปโ๐ป bepoz๋์ ๋ธ๋ก๊ทธ: [JPA] @PrePersist ์ด๋
ธํ
์ด์
์ ๋ํด
๐จ๐ปโ๐ป Youngho๋์ ๋ธ๋ก๊ทธ: Spring์์ Service ServiceImpl ์ฌ์ฉํด์ผํ๋์ง