๊ณผ์ ํธ๋ฌ๋ธ ์ํ
๋ฌธ์ ์ํฉ
์ผ์ ์์ฑ API๋ฅผ ์์ฑํ๊ณ Postman์ผ๋ก ํ ์คํธํ์ง๋ง 500 Internal Server Error๊ฐ ๋ฐ์ํ๋ค.
๋ฌธ์ ์์ธ
์ฝ๋์์ @EntityListeners ์ด๋
ธํ
์ด์
์ด ์๋ชป๋ ํด๋์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์์๋ค.
์๋ชป๋ ์ฝ๋
@EntityListeners(EntityListener.class)
- ์ด๋ก ์ธํด EntityListener๊ฐ ์ ๋๋ก ๋์ํ์ง ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
@EntityListeners ์ด๋ ธํ ์ด์ ์ ์ฌ๋ฐ๋ฅธ ํด๋์ค์ธ AuditingEntityListener๋ก ์์ ํ๋ค.
์์ ๋ ์ฝ๋
@EntityListeners(AuditingEntityListener.class)
์์ ํ Postman์ผ๋ก ๋ค์ ์์ฒญ์ ๋ณด๋๊ณ , ์ ์์ ์ผ๋ก ์ผ์ ์ด ์์ฑ๋์๋ค.
๊ฒฐ๋ก
์ฝ๋๋ฅผ ์์ฑํ ๋ ์ด๋
ธํ
์ด์
์ด ์ฐธ์กฐํ๋ ํด๋์ค๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํด์ผ ํ๋ค๋ ์ ์ ๋ฐฐ์ ๋ค.
Spring JPA์ ๊ฐ์ ํ๋ ์์ํฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋๋ ๊ด๋ จ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ํํ ์ดํดํ๊ณ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋ฌธ์ ์ํฉ
์ผ์ ์์ API๋ฅผ ๊ตฌํํ ํ Postman์ผ๋ก ์์ฒญ์ ๋ณด๋์ง๋ง, ์์ ํ ๋ค์ ์ ํ ์ผ์ ์กฐํ๋ฅผ ํ์ ๋ ๋ด์ฉ์ด ๋ฐ๋์ง ์์๋ค.
๋ฌธ์ ์์ธ
@Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ง ์์ ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ ์์ ์ด ์ ๋๋ก ๋ฐ์๋์ง ์์๊ณ , ์์ ์ ์ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ์ ์ง๋์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
@Transactional ์ด๋ ธํ ์ด์ ์ ์์ ๋ฉ์๋์ ์ถ๊ฐํ์ฌ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ์ฑํํ๋ค.
- Postman์ผ๋ก ๋ค์ ์์ฒญ์ ๋ณด๋ธ ํ, ์์ ๋ ๋ด์ฉ์ด ์ ์์ ์ผ๋ก ๋ฐ์๋์๋ค.
๊ฒฐ๋ก
Spring์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์
์๋ @Transactional ์ด๋
ธํ
์ด์
์ ํ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
ํธ๋์ญ์
์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ์ค์ํ ๊ธฐ๋ฅ์ด๋ฉฐ, ์ด๋ฅผ ํตํด ์์ ์์
์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์๋๋๋ก ํด์ผ ํ๋ค๋ ์ ์ ๊นจ๋ฌ์๋ค.
๋ฌธ์ ์ํฉ
์ผ์ ์กฐํ ์ ๋ฉค๋ฒ ์ ๋ณด๋ ํจ๊ป ๋ฐํ๋๋๋ก ๊ตฌํํ์ผ๋, ์ ์ฒด ์ ๋ณด๊ฐ ๋ฐํ๋๋ฉด์ ์์ฑ์ผ๊ณผ ๋น๋ฐ๋ฒํธ๊น์ง ๋ ธ์ถ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฌธ์ ์์ธ
๋ฉค๋ฒ ์ ๋ณด๋ฅผ ๋ฐํํ ๋, DTO(Data Transfer Object)๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Entity๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ฉด์ ๋ถํ์ํ ์ ๋ณด๊ฐ ํจ๊ป ๋
ธ์ถ๋์๋ค.
Entity๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ก, ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
- MemberResponseDto๋ฅผ ๋ง๋ค์ด์ ํ์ํ ๊ฐ๋ง ๋ฐํํ๋๋ก ์์ ํ๋ค.
{
"id": 1,
"title": "ํ ์ผ ์ ๋ชฉ",
"contents": "ํ ์ผ ๋ด์ฉ",
"member": {
"id": 1,
"username": "ํ์ ์ด๋ฆ1",
"email": "tmvkfmxk@email.com"
}
}
- ์ผ์ ์กฐํ ์ MemberResponseDto๋ฅผ ์ฌ์ฉํด์ ์ ์ ์ ๋ณด๋ฅผ ๋ฐํํ๋๋ก ๊ตฌํํ๋ค.
๊ฒฐ๋ก
API์์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋
ธ์ถ๋์ง ์๋๋ก DTO๋ฅผ ์ฌ์ฉํด ํ์ํ ๋ฐ์ดํฐ๋ง ์ ๋ฌํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
์ํฐํฐ๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ฉด ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ํญ์ DTO๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ดํด์ผ ํ๋ค๋ ์ ์ ๊นจ๋ฌ์๋ค.
๋ฌธ์ ์ํฉ
๊ตฌํํ ์ฝ๋๋ฅผ ํํฐ๋๊ป ํ์ธ๋ฐ์๋๋ฐ, ๋ถํ์ํ ์ฝ๋๊ฐ ๋ง๋ค๋ ํผ๋๋ฐฑ์ ๋ฐ์๋ค.
ํนํ, ์๋น์ค์์ ์ด๋ฏธ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ์์๋ ์ปจํธ๋กค๋ฌ์์ ๋ค์ ์์ด๋๋ฅผ ๋ฐํ๋ฐ๊ณ , ์ด๋ฅผ ์ด์ฉํด ํ์์ ์ฐพ๋ ๋ณต์กํ ๋ก์ง์ด ๋ฌธ์ ๋ก ์ง์ ๋์๋ค.
๋ฌธ์ ์์ธ
์๋น์ค ๊ณ์ธต์์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ํด๋น ์์ ์ด ๋๋์ผ ํ์ง๋ง,
- ์ปจํธ๋กค๋ฌ์์ ๋ถํ์ํ๊ฒ ์ถ๊ฐ์ ์ธ ๋ก์ง(์์ด๋ ๋ฐํ, ํ์ ์ฌ์กฐํ ๋ฑ)์ ์ํํ๊ณ ์์๋ค.
- ์ด๋ฌํ ๊ตฌ์กฐ๋ ์ฝ๋๊ฐ ์ง๋์น๊ฒ ๋ณต์กํด์ง๊ณ , ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ ์ํ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ ๊ณ์ธต์ ์ญํ ์ ์ฌ๊ตฌ์ฑํ์ฌ ๋ถํ์ํ ์์ ์ ์ ๊ฑฐํ๊ณ ,
- ์๋น์ค์์ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ ์๋ฃ ์ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐํํ๋๋ก ์์ ํ๋ค.
- ์ปจํธ๋กค๋ฌ๋ ์๋น์ค์์ ๋ฐํํ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ์ญํ ๋ก ๋จ์ํํ๋ค.
- ์ต์ข ์ ์ผ๋ก ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ์๋ํ๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๋ค.
๊ฒฐ๋ก
๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ธ ์ฝ๋ ์ค๊ณ์ ์ค์์ฑ์ ๊นจ๋ฌ์๋ค.
๋ถํ์ํ ๋ก์ง์ ์ฝ๋ ๊ฐ๋
์ฑ์ ๋จ์ด๋จ๋ฆฌ๊ณ ์ ์ง๋ณด์๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ์ ์ ๊ฒฝํํ๋ค.
๊ฐ ๊ณ์ธต์ ์ญํ ์ ๋ช
ํํ ๋๋๊ณ , ๋จ์ผ ์ฑ
์ ์์น์ ๋ฐ๋ผ ์ค๊ณํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
๋ฌธ์ ์ํฉ
๋๊ธ ์์ฑ API ์์ฑ ํ Postman์ผ๋ก ์คํํ์ง๋ง NullPointException์ด ๋ฐ์ํ๋ค.
๋ฌธ์ ์์ธ
์๋ฌ ๋ฉ์์ง๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ, comment.getMember( ) ํธ์ถ ์ ๋ฉค๋ฒ ๊ฐ์ฒด๊ฐ null์ธ ์ํ์๋ค.
- ์ฝ๋๋ฅผ ๋ค์ ์ดํด๋ณธ ๊ฒฐ๊ณผ, ํ์ ์ ๋ณด์ ์ผ์ ์ ๋ณด๊ฐ ๋ฑ๋ก๋์ง ์์ ์ํ์์ ๋๊ธ์ ์์ฑํ๋ ค๊ณ ํ๋ ๊ฒ์ด ์์ธ์ด์๋ค.
- ๋๊ธ์ ์์ฑํ๊ธฐ ์ํด ํ์ํ ์ ์ (Member)๊ณผ ์ผ์ (Todo)์ด ์ค์ ๋์ง ์์ ์ํ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํ์(Member)๊ณผ ์ผ์ (Todo) ์ ๋ณด ๋ฑ๋ก
- ๋๊ธ ์์ฑ ์ด์ ์, ํ์๊ณผ ์ผ์ ์ ๋ณด๋ฅผ ์ ์ ํ ์ค์ ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
- ๋๊ธ ์์ฑ ์, ๋ฑ๋ก๋ ํ์๊ณผ ์ผ์ ์ ๋ณด๋ฅผ ๋งคํํ์ฌ ์ ๋๋ก ์๋ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค.
- Postman์ผ๋ก ํ ์คํธํ์ ๋ ์ ์์ ์ผ๋ก ๋๊ธ์ด ์์ฑ๋์๋ค.
๊ฒฐ๋ก
API๋ฅผ ๊ตฌํํ ๋ ํ์์ ์ธ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ์ค์ ๋์๋์ง ํ์ธํ๋ ์ต๊ด์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.
๋๊ธ๊ณผ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๊ฐ ๋ง์ Entity์์๋ ๋ฐ์ดํฐ์ ์์ฑ ์์์ ์์กด์ฑ์ ๊ผผ๊ผผํ ๊ด๋ฆฌํด์ผ ํ๋ค๋ ์ ์ ๊นจ๋ฌ์๋ค.
์๋ฌ ๋ฉ์์ง๋ฅผ ์ ๋ถ์ํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํฐ ๋์์ด ๋๋ค๋ ์ ๋ ๋ค์ ํ ๋ฒ ๊ฒฝํํ๋ค.
๋ฌธ์ ์ํฉ
์ ์ ๋ฅผ ์์ฑํ ํ ์ผ์ ๊ณผ ๋๊ธ์ ์์ฑํ๊ณ , ์ ์ ๋ฅผ ์ญ์ ํ๋ ค๊ณ ์๋ํ์ผ๋ SQLIntegrityConstraintViolationException์ด ๋ฐ์ํ๋ค.
๋ฌธ์ ์์ธ
์ ์ ์ ์ผ์ ๋ฐ ๋๊ธ ๊ฐ์ ์ธ๋ํค ์ฐธ์กฐ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ ์ ๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ ๋, ํด๋น ์ ์ ๊ฐ ์ผ์ ๋ฐ ๋๊ธ๊ณผ ์ฐ๊ด๋์ด ์์ด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์๋ฐํ๋ค๋ ์๋ฏธ๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ํด๊ฒฐ ๊ฐ๋ฅ
- Soft Delete
- ์ ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ญ์ ํ์ง ์๊ณ , ์ญ์ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ํ๋๋ฅผ ์ถ๊ฐํด ์ํํธ ์ญ์ ๊ตฌํ.
- ์ฐ๊ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ฉด์ ์ญ์ ๋ ๊ฒ์ฒ๋ผ ๋์ํ ์ ์์.
- Hard Delete
- ์ ์ ์ญ์ ์ ๊ด๋ จ ์ผ์ ๋ฐ ๋๊ธ์ Cascade ์ต์ ์ผ๋ก ํจ๊ป ์ญ์ ํ๊ฑฐ๋, ์ธ๋ํค ๊ด๊ณ๋ฅผ ์๋์ผ๋ก ํด์ ํ ์ญ์ .
ํ์ฌ ์๊ฐ ๋ถ์กฑ์ผ๋ก ๊ณผ์ ์ ์ถ ํ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌํํ ์์ .
๊ฒฐ๋ก
๋ฐ์ดํฐ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ(์ธ๋ํค ์ฐธ์กฐ)๋ฅผ ์ค์ ํ ๋ ์ญ์ ์ ๊ด๋ จ๋ ์ ๋ต(Soft Delete vs. Hard Delete)์ ์ฌ์ ์ ๊ณ ๋ฏผํด์ผ ํ๋ค๋ ์ ์ ๋ฐฐ์ ๋ค.
์ญ์ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ช
ํํ ์ ์ํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๋ ์ค๊ณ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๊ณผ์ ์ดํ, ์ ์ ํ ์ญ์ ์ ๋ต์ ์ ํํ๊ณ ์ด๋ฅผ ๊ตฌํํ ๊ณํ์ด๋ค.
'ํ๋ก์ ํธ > ๊ฐ์ธ ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผ์ ๊ด๋ฆฌ ์ฑ ๋ง๋ค๊ธฐ ๊ณผ์ _KPT ํ๊ณ (0) | 2024.12.10 |
---|---|
์ผ์ ๊ด๋ฆฌ ์ฑ ๊ณผ์ _ํธ๋ฌ๋ธ ์ํ (0) | 2024.12.10 |
ํค์ค์คํฌ ๊ณผ์ _KPT ํ๊ณ (0) | 2024.11.28 |
ํค์ค์คํฌ ๊ณผ์ _ํธ๋ฌ๋ธ ์ํ (0) | 2024.11.28 |
๊ณ์ฐ๊ธฐ ๊ณผ์ _ํธ๋ฌ๋ธ ์ํ (0) | 2024.11.20 |