๐ฐ SNS ๊ธฐ๋ฐ ๋ด์คํผ๋ ํ๋ก์ ํธ
ํ์ด์ค๋ถ, ์ธ์คํ๊ทธ๋จ๊ณผ ๊ฐ์ ํํ์ SNS ํ๋ซํผ
- ์ฌ์ฉ์, ๊ฒ์๊ธ, ๋๊ธ์ CRUD ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
- ๊ฒ์๊ธ๊ณผ ๋๊ธ์ ์ข์์(โค๏ธ) ๋ฅผ ๋จ๊ธธ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์๋ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์น๊ตฌ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋๋ฐฉ์ด ์๋ฝํ๋ฉดํ์ฌ ์น๊ตฌ ๋ชฉ๋ก์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ,
์ธ์ ๋ ์ง ์น๊ตฌ ๋ชฉ๋ก์์ ์ญ์ ํ ์ ์์ต๋๋ค.
- ๐โโ๏ธ INXJ
- ๐๊ฐ๋ฐ ๊ท์น
- โ ๊ธฐ์ ์คํ
- ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
- ๐ ERD
- ๐ ์์ด์ด ํ๋ ์
- ๐ ๊ธฐ๋ฅ
- ๐๏ธ APIs
โ ๏ธ ํธ๋ฌ๋ธ ์ํ
![]() |
![]() |
![]() |
![]() |
![]() |
| ํ์ฅ ๋ฐ์ค์ฐ @jypLord |
ํ์ ๊น์ฑ์ง @kmchaejin |
ํ์ ์ค์์ง @YejinY00n |
ํ์ ์๊ฒฝ์ @rabitis99 |
ํ์ ์์ง์ค @jiyun-im-dev |
- ์ ์ ๋๋ฉ์ธ (CRUD, ๋ก๊ทธ์ธ)
- ๋น๋ฐ๋ฒํธ ์ธ์ฝ๋ฉ
- ์น๊ตฌ ๋๋ฉ์ธ
- ๊ฒ์๊ธ ๋๋ฉ์ธ
- ์นดํ ๊ณ ๋ฆฌ ๋๋ฉ์ธ
- ๋๊ธ ๋๋ฉ์ธ
- ExceptionHandler ๊ตฌํ
- ์ด๋ฉ์ผ ์ธ์ฆ ๊ธฐ๋ฅ ๊ตฌํ
- ๋ก๊ทธ์ธ ํํฐ
- ์ข์์ ๋๋ฉ์ธ
- ํด๊ฒฐ๋์ง ์๋ ๋ถ๋ถ์ 30๋ถ๊น์ง๋ง ๊ณ ๋ฏผํ๊ณ , ๋ฐ๋ก ํ์์๊ฒ ์ง๋ฌธํ๊ธฐ
- ํค๋:
ํ๊ธ - ๋ณธ๋ฌธ:
ํ๊ธ - ์์) ๊ธฐ๋ฅ: ๋๊ธ ์กฐํ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๋ชจ๋ PR์ ์ต์ 2๋ช ์ด์์ ๋ฆฌ๋ทฐ ์น์ธ ํ์
- ๋ฆฌ๋ทฐ์ด ์ง์
main: โ ์ต์ข ๋ฐฐํฌ ๋ธ๋์นdevelop: ๐ง ๊ฐ๋ฐ ํตํฉ ๋ธ๋์นfeat/#issue-number: ๐งฉ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ฉ ๋ธ๋์น
(ex.feat/#12)
๐ Git issue ์ฐ๋
์ปค๋ฐ ๋ฉ์์ง ๋๋ PR ์ค๋ช ์ ์ด์ ๋ฒํธ ํฌํจํ๊ธฐ (#12๋ฑ)
โโ๐ newsfeed
โโ domain
โโ๐ฌcomment
โ โโcontroller, dto, entity, repository, service
โโ๐งcommon
โ โโannotation, config, dto, entity, enums, filter, util
โโโ ๏ธexception
โโโ ๏ธexceptionHandler
โโ๐คfriend
โ โโcontroller, dto, entity, repository, service
โโโค๏ธlike
โ โโcontroller, entity, repository, service
โโโ๏ธpost
โ โโcontroller, converter, dto, entity, initializer, repository, service
โโ๐คuser
โโcontroller, entity, repository, service
โโdto
โโrequest
โโresponse- ํ์ ๊ฐ์
/๋ก๊ทธ์ธ
- ์ด๋ฉ์ผ์ ํตํ ์ธ์ฆ
- ๊ฒ์๊ธ ์์ฑ
- ์นดํ ๊ณ ๋ฆฌ ์ง์
- ๊ณต๊ฐ ๋ฒ์ ์ค์
- ๋๊ธ ์์ฑ
- ๊ฒ์๊ธ/๋๊ธ ์ข์์
- ์น๊ตฌ ์ถ๊ฐ
- ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ
- ํ์ ์ ๋ณด ์กฐํ
- ํ์ ์ ๋ณด ์์
- ํ์ ํํด
- ์น๊ตฌ ์์ฒญ ๋ณด๋ด๊ธฐ / ์๋ฝ / ๊ฑฐ์
- ์น๊ตฌ ๋ชฉ๋ก ํ์ธ
- ์ ๊ฒ์๊ธ ์์ฑ
- ๊ฒ์๊ธ ๋ชฉ๋ก ์กฐํ
- ์กฐ๊ฑด ๊ฒ์: ์นดํ ๊ณ ๋ฆฌ ๋ณ, ์ ์ฒด/์น๊ตฌ ๊ณต๊ฐ
- ๊ฒ์๊ธ ์์ / ์ญ์
- ๋๊ธ ์์ฑ / ์์ / ์ญ์
- ๋๊ธ ๋ชฉ๋ก ํ์ธ
- ๊ฒ์๊ธ์ ์ข์์ ์ถ๊ฐ ๋ฐ ์ทจ์
- ๋๊ธ์ ์ข์์ ์ถ๊ฐ ๋ฐ ์ทจ์
๐ ์ํฉ
develop ๋ธ๋์น๊ฐ ์๋ main ๋ธ๋์น์ PR์ด merge ๋จ.
๐ง ํด๊ฒฐ
1๏ธโฃ ๋กค๋ฐฑ
- ๋ธ๋์น ๋กค๋ฐฑ ๊ณ ๋ คํ์์ผ๋, ์๊ฒฉ ๋ธ๋์น ์ถฉ๋์ด ์์๊ณ ํ๋ก์ ํธ ์ด๊ธฐ ์ค์ ์ด์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์งํ
2๏ธโฃโ
๋์ main ๋ธ๋์น๋ฅผ develop ๋ธ๋์น๋ก mergeํ์ฌ ์ต์ ์ํ๋ก ๋ง๋ฆ
๐ ์ํฉ
- ์น๊ตฌ ์์ฒญ์์ user1, user2๊ฐ ์๋ก receiver, requester ๊ฐ ๋ ์ ์๋ ์ฐ๊ด๊ด๊ณ โก๏ธ ์๋ฐฉํฅ ์กฐํ ํ์
๐ง ํด๊ฒฐ
โ
JPQL ๋ก ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํจ์จ์
๐ก JPQL ์ด๋?
์ํฐํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ฒ ํ๋ ๋๊ตฌ
๐ ๏ธ ๊ตฌํ ๋ฐฉ์
@Query์ด๋ ธํ ์ด์ ์ ํตํด ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑ- ํ ์ด๋ธ ๋ช , ์ปฌ๋ผ๋ช ์ด ์๋ ์ํฐํฐ ๋ช ๊ณผ ํ๋ ๋ช ์ฌ์ฉ ๊ฐ๋ฅ
- ์ค์ ํ
์ด๋ธ ๋ช
๊ณผ ์ปฌ๋ผ๋ช
์ฌ์ฉํ๊ณ ์ถ์ ์
@Query(nativeQuery=true)๋ก ์ค์
๐ ์ํฉ
๊ฒ์๋ฌผ์ ๋ฌ๋ฆฐ ๋๊ธ(Comment)์ ๋ํด ๊ถํ ๊ฒ์ฌ๋ฅผ ํ๋ ๋ก์ง
if (!userId.equals(comment.getUser().getId())&&!userId.equals(comment.getPost().getUser().getId())) {
throw new CustomException(ErrorCode.UNAUTHORIZED_USER_ID);
}์ด๋ comment.getUser()๋ comment.getPost().getUser()๊ฐ Lazy Loading ์ํ๋ผ๋ฉด ๊ฐ๊ฐ ํธ์ถ๋ ๋ ๋ง๋ค ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์คํ๋จ
์ฆ ํ๋์ ๋๊ธ์ ๋ถ๋ฌ์ค๋๋ผ๋
comment.getUser() โ ์ถ๊ฐ ์ฟผ๋ฆฌ 1ํ
comment.getPost().getUser() โ ์ถ๊ฐ ์ฟผ๋ฆฌ 1ํ
โก๏ธ ์ด 3๊ฐ์ ์ฟผ๋ฆฌ ๋ฐ์ (Comment, User, PostUser)
๐ง ํด๊ฒฐ
โ
fetch join์ ํตํด ๊ด๋ จ ์ํฐํฐ๋ค์ ํ ๋ฒ์ ์กฐํํ๋๋ก Repository ์์
๐ ๊ฒฐ๊ณผ
- DB์ ๋ถํ์ํ ์ฟผ๋ฆฌ ์์ฒญ์ด ์ค์ด๋ค์ด ์ฑ๋ฅ ํฅ์
- N+1 ๋ฌธ์ ์๋ฐฉ
- ์ํฐํฐ ์ ๊ทผ ์ LazyLoading์ผ๋ก ์ธํ ์์ธ ๊ฐ๋ฅ์ฑ ์ ๊ฑฐ (LazyInitializationException ๋ฐฉ์ง)
- ์ ์ฒด ๋ก์ง์ ์๋ต์๋ ํฅ์
๐ ์ํฉ
Enum Category๋ฅผ ๋ฃฉ์ ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํ์ฌ DB์์ ๊ด๋ฆฌ.- ์ ์ ์ด๊ณ ์์ฃผ ์ฐธ์กฐ๋๋ ๊ฐ์ DB ํ ์ด๋ธ๋ก ๋ง๋ค์ด ์ ์ฐํ ๊ด๋ฆฌ์ ์ฐ๊ด๊ด๊ณ ์ค์ ์ ์ฉ์ดํ๊ฒ ํจ
โ ๋ฌธ์
- ์์์ฒ๋ผ ์ฌ์ฉ๋ ๊ฐ์ด๋ฏ๋ก ์ด๊ธฐ๊ฐ์ DB์ ์ด๋ป๊ฒ ๋ฃ์์ง ๊ฒฐ์ ์ด ํ์.
๐ง ํด๊ฒฐ โ ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ @PostConstruct๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ์ด๊ธฐํ.
- ์ฝ๋์ DB ๋๊ธฐํ ์ฌ์
- ํด๋ผ์ด์ธํธ ์์ฒญ ์ enum ๊ธฐ๋ฐ ๊ฒ์ฆ ๊ฐ๋ฅ
- ์ฝ๋ ๋ด์์๋ ์ง๊ด์ ์ฌ์ฉ ๊ฐ๋ฅ
๐ ๏ธ ๊ตฌํ ๋ฐฉ์
@Component+@PostConstruct์กฐํฉ์ผ๋ก CategoryInitializer ์์ฑ- ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ enum ๊ฐ ๊ธฐ์ค์ผ๋ก DB์ ๊ฐ ์ฝ์
โ ๊ฒฐ๋ก
- enum๋ณด๋ค ํ์ฅ์ฑ/์ ์ฐ์ฑ ํฅ์
- ์ฝ๋์ DB์ ๋ถ์ผ์น ๋ฐฉ์ง
- ์๋ก์ด ๊ฐ ํ์ ์ enum์ ์ถ๊ฐ๋ง ํ๋ฉด ์๋ ๋ฐ์๋จ







