์๋ ํ์ธ์! ์คํฐ๋ ํ๋ซํผ ํ๋ก์ ํธ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฐธ์ฌํ๊ธฐ๋ฅผ ํฌ๋งํ์๋ ์ฌ๋ฌ๋ถ๋ค์ด ์ํํ์ค ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ๋ค๋ฃจ๊ฒ ๋ ํ๋ก์ ํธ์ ๋๋ค. ์ ํฌ ํ์ด ์ง๊ธ๊น์ง ๊ฐ๋ฐํ ์ฝ๋ ์ค์ "ํ์" ์ปดํฌ๋ํธ๋ง ๋ผ์ด๋์ต๋๋ค. ์ฌ๋ฌ๋ถ๊ป์๋ ํ์ ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ๋ํด ๋ฆฌํฉํ ๋ง์ ์งํํด ์ฃผ์๊ณ , ๋ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ฑฐ๋ญ ๋ง์๋๋ฆฌ์ง๋ง, ์ด ๊ณผ์ ๋ ์ ํฌ๊ฐ ์ฌ๋ฌ๋ถ์ ์ฝ๋ฉ ์คํ์ผ, ์ญ๋์ ํ์ ํ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ๋ถ ๋ํ ์ ํฌ์ ์์ค์ ํ์ ํ์ค ์ ์๋ ๊ธฐํ์ ๋๋ค. ํ๋ก์ ํธ์ ์ฐธ์ฌํ์ ๋ค๊ณ ํด์ ์ ํฌ๊ฐ ์๊ธ์ ๋๋ฆฌ๋ ๊ฒ๋ ์๋๋ผ ๊ณผ์ ๋ฅผ ๋๋ฆฌ๋ ๊ฒ ์กฐ๊ธ ๋ฏผ๋งํ์ง๋ง, ๊ทธ๋๋ ์๋ก๋ฅผ ์์๊ฐ๋ค๋ ์๋ฏธ์์ ์ด ๊ณผ์ ์ ์ฐธ์ฌํด ์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค!
๊ณผ์ ๋ด์ฉ์ ํฌ๊ฒ ๋ ๊ฐ์ง์ ๋๋ค. ์ฒซ์งธ, ๊ฐ๋จํ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ, ๋์งธ, ๊ธฐ์กด ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ๋๋ค. ์ ํฌ๊ฐ ์ด๋ฌํ ๋ด์ฉ์ ๊ณผ์ ๋ฅผ ๋๋ฆฌ๋ ์ด์ ๋, ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ์ฌ๋ฌ๋ถ์ ๊ฐ๋ฐ ๊ฐ์น๊ด๊ณผ ์ง์์ ์ ํ์ ํ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฒ์์๋ ๋จ์ CRUD ๊ฐ๋ฐ ๊ณผ์ ๋ฅผ ์๊ฐํ๋๋ฐ์, ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด ๊ณผ์ ๋ฅผ ๋๋ฆฌ๋ ์ ํฌ ์ ์ฅ์์๋ ์๊ตฌ์ฌํญ ์ ์ํ๋ฉด์ ์๊ฐ์ ๋น์ฉ์ด ๋ฐ์ํ๊ณ , ๊ณผ์ ๋ฅผ ์ํํ๋ ์ฌ๋ฌ๋ถ ์ ์ฅ์์๋ ์ฌ๋ฏธ๋ ์๊ณ , ์ง๋ํ๊ณ , ๋ ์ ํฌ ํ๋ก์ ํธ์ ๊ฐ๋ฐ ๋ฐฉ์์ ํ์ ํ๊ธฐ ์ด๋ ค์ธ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋์ ์ฐจ๋ผ๋ฆฌ ๋ฆฌํฉํ ๋ง ๊ณผ์ ๋ฅผ ๋๋ฆฌ์, ํ๋ ์๊ฐ์ ์ด๋ฌํ ๊ณผ์ ๋ฅผ ๋๋ฆฌ๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋จ์ํ ์ฝ๋๋ง ๋๋ฆฌ๊ณ ๋ฆฌํฉํ ๋ง์ ์์ฒญํ๊ธฐ๋ง ํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ด ๋ฐฉํฅ์ฑ์ ์ก๊ธฐ ์ด๋ ต๊ฒ ๋ค๋ ์ด์ผ๊ธฐ๊ฐ ๋์์ต๋๋ค. ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ ๊ณผ์ ๋ฅผ ๋๋ฆฌ๋ฉด, ๊ธฐ๋ฅ ๊ตฌํํ๋ฉด์ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ณผ์ ์์ ๊ฐ์ ์ด ํ์ํ ๋ถ๋ถ์ ๋ณด๋ค ์์ํ๊ฒ ๋ฐ๊ฒฌํ์ค ์ ์๋ค๋ ์๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ณผ์ ๋ ์์ฒญ๋๋ฆฌ๊ฒ ๋์์ต๋๋ค.
๋ํ ์ฝ๋ ๊ตฐ๋ฐ๊ตฐ๋ฐ TODO๋ฅผ ๋ฌ์์ ๋ฆฌํฉํ ๋ง ์ง์ ์ ๋ณด๋ค ์ฝ๊ฒ ์ฐพ์ ์ ์๋๋ก ํ์ต๋๋ค.
์๋ ์ ์๋ ๋ชจ๋ ํญ๋ชฉ์ ์ถฉ์กฑ์ํค์ค ํ์๋ ์์ต๋๋ค. ๋ฌผ๋ก ๋ง์ ํญ๋ชฉ์ด ์๋ฃ๋๋ฉด ์ข๊ฒ ์ง๋ง, ๊ผญ ๊ทธ๋ฌ์ง ์๋๋ผ๋ ์ ํฌ์ ์ฌ๋ฌ๋ถ์ด ์๋ก๋ฅผ ์ถฉ๋ถํ ์ ์ ์์ ๋งํผ ์ํํ์๋ฉด ๋๊ฒ ์ต๋๋ค. ์ด ๊ณผ์ ์ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ ์๋ ๋ถ์ด ์๋ ๋ฐ๋ฉด, ํ์ฌ์ ๋ค๋๊ณ , ์ผ๊ทผ์ ํ๋ ๋ฑ์ ์ฌ์ ๋๋ฌธ์ ์๊ฐ์ ๋ง์ด ํฌ์ํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ ์์ ์ ์์ผ๋๊น์.
๊ณผ์ ๋ domain ํจํค์ง ์๋์ ์๋ ๊ฒ๋ง ๋์์ผ๋ก ์ํํ์๋ฉด ์ ์ ํ์ง ์์๊น ์ถ์ต๋๋ค. global ํจํค์ง๊น์ง ํฌํจ์ํค๋ฉด ๋๋ฌด ๋ง์ ๊ฒ ๊ฐ๋ค์. ์ณ๋ผ ๊ฑฐ ์ณ๋ธ๋ค๊ณ ํ๋๋ฐ๋
์ฝ๋ ๋ผ์ธ ์ํจ๊ฐ ์ข ๋ง๋ค์... ใ
ใ
global ํจํค์ง์ ์๋ ์ฝ๋๋ค์ ํ๋ฒ ์ฝ์ด๋ง ๋ด ์ฃผ์ธ์! ๋ฌผ๋ก global ํจํค์ง์ ์๋ ์ฝ๋์์๋ ๊ฐ์ ์ฌํญ์ด ๋ณด์ฌ์ ๋ฆฌํฉํ ๋งํด ์ฃผ์๋ฉด
๋งค์ฐ ์ข์ต๋๋ค.
์ ํฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์น๊ด์ ๊ฐ์ง๊ณ ๊ฐ๋ฐํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
- ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ
- ๋น์ฆ๋์ค ๋ก์ง์ด ์ธ๋ถ ์ธํ๋ผ๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ก
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
- ์ฑ๋ฅ์ ๊ณ ๋ คํ ๊ตฌํ
- ๋จ์ํจ์์ ์ถ๋ฐํ์ฌ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ
- ํ ์คํธ ์ฝ๋ ์์ฑ
- ๋ฌธ์๋ฅผ ํตํ ์ํต (API ๋ช ์ธ, Javadocs ๋ฑ)
- ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ์ง ์๊ธฐ
- ์๋ฏธ๊ฐ ๋ช ํํ๊ณ ์์ ์ด๋ฆ
์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ ์ ํ์ํ ์นผ๋ผ์ด ์์ผ๋ฉด ์ถ๊ฐํ์๋ฉด ๋๊ณ , ํ์์๋ ์นผ๋ผ์ด ์์ผ๋ฉด ์ ๊ฑฐํ์ ๋ ์ข์ต๋๋ค.
| ์ ๋ชฉ | ์๊ตฌ์ฌํญ | ์ค๋ช |
|---|---|---|
| ํ์ ํํด | ํ์์ ํ์ ํํด๋ฅผ ์ํํ๊ธฐ๋ฅผ ์ํ๋ค. | ์์ง ํ์ ํํด ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ง ์์ ์ํ์ ๋๋ค. ํ์ ํํด ๊ธฐ๋ฅ์ ์์ฑํด ์ฃผ์๋ฉด ๋๊ฒ ์ต๋๋ค. |
| ํ์ ์ ์ง | ๊ด๋ฆฌ์๋ ํ์์ ๊ณ์ ์ ์ ์ง์ํค๊ธฐ๋ฅผ ์ํ๋ค. | MemberStauts๋ฅผ ํ์ฉํด ์ฃผ์๋ฉด ๋๊ฒ ์ต๋๋ค. ๊ด๋ฆฌ์๋ง ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ access_permission๊ณผ access_permission_role ํ
์ด๋ธ๊ณผ ๊ด๋ จ ์์ต๋๋ค. |
| ํ์ ๋ชฉ๋ก ์กฐํ | ๊ด๋ฆฌ์๋ ํ์ ๋ชฉ๋ก์ ์กฐํํ๊ธฐ๋ฅผ ์ํ๋ค. | Pagination์ ์ ์ฉํด์ผ ํ๊ณ , ํ์ด์ง ํฌ๊ธฐ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋, ํด๋ผ์ด์ธํธ๋ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ด์ผ ํฉ๋๋ค. ๋ชฉ๋ก ์์ดํ ์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค: ํ์ ID, ์ด๋ฆ, ์์ฑ์๊ฐ, ํ์ ์ด๋ฆ, ์ฐ๋ฝ์ฒ, ์๋ ์์ผ, ์ ํธํ๋ ์คํฐ๋ ์ฃผ์ |
| ์์ ๋ฏธ๋์ด ํ์ ์ถ๊ฐ | ๊ด๋ฆฌ์๋ ์์ ๋ฏธ๋์ด ํ์ ์ ์ถ๊ฐํ๊ธฐ๋ฅผ ์ํ๋ค. | SocialMediaType ์ํฐํฐ๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค. |
| ์์ ๋ฏธ๋์ด ํ์ ๋ชฉ๋ก ์กฐํ | ๊ด๋ฆฌ์๋ ์์ ๋ฏธ๋์ด ํ์ ๋ชฉ๋ก์ ์กฐํํ๊ธฐ๋ฅผ ์ํ๋ค. | |
| ์์ ๋ฏธ๋์ด ํ์ ์ญ์ | ๊ด๋ฆฌ์๋ ์์ ๋ฏธ๋์ด ํ์ ์ ์ญ์ ํ๊ธฐ๋ฅผ ์ํ๋ค. |
์ฐ๋ฆฌ ๊ฐ๋ฐํ์ ๊ณ ๋ฏผ์ ๋ง์๋๋ฆฌ๋ฉด ์ข ๋ ๋ฆฌํฉํ ๋งํ์๊ธฐ ํธํ์ค ๊ฒ ๊ฐ๋ค์!
- ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ๋ผ๋ฆฌ ์์กดํ ๋, ์๋น์ค ๋ ์ด์ด์ ์์กดํด์ผ ํ๋๊ฐ, ๋ ํฌ์งํ ๋ฆฌ ๋ ์ด์ด์ ์์กดํด์ผ ํ๋๊ฐ?
- ๋น์ฆ๋์ค ๋ก์ง ์ฝ๋๋ฅผ JPA์ ๋ํ ์์กด์ฑ์ ์ด๋ป๊ฒ ํ๋ฉด ์๋ฆ๋ต๊ฒ ์ ๊ฑฐํ ์ ์์๊น?
- ์ด๋ป๊ฒ ํ๋ฉด Persistence ํ๋ ์์ํฌ๋ฅผ JPA์์ MyBatis๋ก ๋ฐ๊พธ๋ , JOOQ๋ก ๋ฐ๊พธ๋ , Spring Data JDBC๋ก ๋ฐ๊พธ๋ , ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ ์ฐํ๊ฒ ๋ฐ๊ฟ ์ ์์๊น?
@ManyToMany์ ์ฌ์ฉํด๋ ๊ด์ฐฎ์๊น?- ๋ก๊ทธ๋ฅผ ์ด๋ป๊ฒ ๋จ๊ธฐ๋ฉด ์ข์๊น?
- Authorization ํค๋์ ๋ด๊ฒจ์ ์ ๋ฌ๋๋ Bearer ํ ํฐ์์ ํ์ID๋ฅผ ์ถ์ถํ ์ ์๋ค. ์ด๋ค ํ์์ด ์์ ์ด ์์ ํ๊ณ ์๋ ๋ฆฌ์์ค (์๋ฅผ ๋ค์ด ํ์์ด ์์ฑํ ๊ฒ์๊ธ ๋ฑ)์ ๋ํ Operation์ ์ํํ๋ API์์ ํ์ID๋ URI์ ๋ํ๋ด์ผ ํ ๊น, ์๋๋ฉด URI์๋ ๋ํ๋ด์ง ์๊ณ Bearer ํ ํฐ์์ ํ์ID๋ฅผ ๊บผ๋ด์ ์ฌ์ฉํด์ผ ํ ๊น?
- DDL์ SCM์์ ๊ด๋ฆฌํด๋ ๊ด์ฐฎ์๊น?
- Springdoc์ ํ์ฉํ์ฌ Swagger UI๋ฅผ ์๋ํํ๊ณ ์๋ค. ๊ทธ๋ฌ๋ Example Parameter๋ Example Response๋ ์๋์ผ๋ก ์์ฑํด์ผ ํ๋ค (์๋ํํ๋ ๋ฐฉ๋ฒ์ด ์์์ง๋ ๋ชจ๋ฅด์ง๋ง, ์์ง ๊ทธ
๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ๋ค). API ์์ ์ด ๋ฐ์ํ ๋๋ง๋ค Example๋ ๊ฐ์ด ์์ ํด ์ฃผ์ด์ผ ํ๋๋ฐ, Example์ ์ ์งํ ํ์๊ฐ ์์๊น? ์๋๋ฉด Example์ ์๋ํํ ํ์๊ฐ ์์๊น? (
Springdoc์
@ExampleObject) - ์ด๋ฏธ์ง ํ์ผ ํ์ฅ์๋ฅผ
enum์ผ๋ก ๊ทธ ์ข ๋ฅ๋ฅผ ์ ์ฝํ๊ณ ์๋๋ฐ, ๊ทธ๋ด ํ์๊ฐ ์์๊น? - ์ด๋ฏธ์ง ํ์ผ๋ช ์ ๋ฐฑ์๋ ์๋ฒ์์ UUID์ Unix Time์ ์กฐํฉํ์ฌ ์์ฑํด ์ฃผ๊ณ ์๋ค. ์ด ๋ฐฉ๋ฒ์ด ์ด๋ฏธ์ง ํ์ผ๋ช ์ ์ ์ผ์ฑ์ ๋ฐ๋์ ๋ณด์ฆํ๋๊ฐ? ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์๊น?
- Repository ๊ฐ์ฒด๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์๋ง ๊ตญํ์ํค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
- ํ์ฌ ํ์ ๊ฐ์ฒด์ ๋ํด์ soft delete๋ฅผ ์ ์ฑ
์ ์ฑํํ๋ค. ์ญ์ ๋์ง ์์ ํ์์ ๊ฐ์ ธ์ค๋ Repository ๊ฐ์ฒด API๋ ๋ค์ ๋ ๊ฐ ์ค ์ด๋ค ํํ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅผ๊น?
findNotDeletedByMemberId(Long memberId)findByMemberIdAndDeleted(Long memberId, boolean deleted)
- ํ์ฌ ํ์ ๊ฐ์ฒด์ ๋ํด์ soft delete๋ฅผ ์ ์ฑ
์ ์ฑํํ๋ค. ์ญ์ ๋์ง ์์ ํ์์ ๊ฐ์ ธ์ค๋ Repository ๊ฐ์ฒด API๋ ๋ค์ ๋ ๊ฐ ์ค ์ด๋ค ํํ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅผ๊น?
- ๊ฐ ์๋ํฌ์ธํธ์ ๋ํ ์ ๊ทผ ๊ถํ์ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํ๊ณ ์๋๋ฐ, ํ ์ด๋ธ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ Java ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค ์ด๋ค ๊ฒ์ด ์ฌ๋ฐ๋ฅผ๊น?
- ํ ์คํธ ์ฝ๋์ ๊ธธ์ด๋ฅผ ํ๊ฒฉํ๊ฒ ์ฆ๊ฐ์ํค๋ Given ๋ฐ์ดํฐ ์ฝ์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ํด์ํ ์ ์์๊น?
@BeforeEach์๋ ์ด๋ค ์ฝ๋๊ฐ ์ฌ ์ ์๊ณ ์ด๋ค ์ฝ๋๊ฐ ์ฌ ์ ์์๊น?- Composite key๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?
๊ณผ์ ๋ฅผ ์ํํ์ค ๋ ๋์์ด ๋๋๋ก, ์ ํฌ ํ๋ก์ ํธ ์ฝ๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ํฌ ํ๋ก์ ํธ๋ ์ฐธ์ฌ์๋ค์ด ๋์ฉ ์ง์ง์ด ์กฐ๋ฅผ ์ด๋ฃจ๊ณ ์๋ก ๋ฒ๊ฐ์๊ฐ๋ฉด์ ๋ฉด์ ์์ ํผ๋ฉด์ ์์ ์ญํ ์ ์ํํ๋ฉฐ ๋ฉด์ ์ ํตํด ๊ณต๋ถํ ๊ฒ๋ค์ ๋ณต์ตํ๋ ๋ฐฉ์์ ์คํฐ๋๋ฅผ ํ๋ซํผํํ๋ ํ๋ก์ ํธ์ ๋๋ค. ๊ธฐ์กด์ ์คํ ์นด์นด์คํก๊ณผ ๋ ธ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์งํ๋๋ ์คํฐ๋๋ฅผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ๋ซํผ์์ ์งํํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๋ชฉ์ ์ ๋๋ค.
์ด ๊ณผ์ ํ๋ก์ ํธ์ ํฌํจ๋ ์๋ธ๋๋ฉ์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ (
member)- ์ธ์ฆ/์ธ๊ฐ (
auth) - ํ์ (
member) - ํ์ ํ๋กํ (
member profile)
- ์ธ์ฆ/์ธ๊ฐ (
- ์ด๋ฏธ์ง (
image) - ์นดํ
๊ณ ๋ฆฌ (
category)- ๊ธฐ์ ์คํ (
tech stack)
- ๊ธฐ์ ์คํ (
StudySubject: ์คํฐ๋ ์ฃผ์ ์ ๋๋ค. ํ์์ด ๊ด์ฌ์ ๊ฐ์ง๊ณ ๋ ์คํฐ๋ํ๋ ค๋ ์ฃผ์ ๋ฅผ ์ผ์ปซ์ต๋๋ค. ์ง๊ธ์ CS, ๋ฐฑ์๋, ํ๋ก ํธ์๋ ์ธ ๊ฐ์ง ์ฃผ์ ๊ฐ ์์ต๋๋ค. ํ์์ ์ด ์ธ ๊ฐ์ง ์ฃผ์ ์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค.MemberInterest: ํ์์ ๊ด์ฌ์ฌ์ ๋๋ค. ํ์์ด ์์๋ก ์์ ์ ๊ด์ฌ์ฌ๋ฅผ ์ ๋ ฅํ์ฌ ๋ฑ๋กํ ์ ์์ต๋๋ค.AvailableStudyTime: ์คํฐ๋ ๊ฐ๋ฅ ์๊ฐ๋์ ๋๋ค. ๊ฐ ์คํฐ๋ ์ฐธ์ฌ์๋ค์ด ๋ฉด์ ์ ์งํํ ์ ์๋ ์๊ฐ๋๋ฅผ ๋งํฉ๋๋ค. ํ์ฌ๋ 6๊ฐ์ง์ ์คํฐ๋ ๊ฐ๋ฅ ์๊ฐ๋๊ฐ ์์ต๋๋ค.base_record.sql์ ์ ์๋available_study_timeINSERT๋ฌธ์ ๋ณด์๋ฉด ์ ์ดํด๊ฐ ๋์๋ฆฌ๋ผ ์๊ฐํฉ๋๋ค.SocialMedia: ํ์์ ์์ ์ GitHub, ํน์ ๋ธ๋ก๊ทธ ๋ฑ์ ์์ ๋ฏธ๋์ด ๋งํฌ๋ฅผ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์ ํ ์ ์์ต๋๋ค.SocialMedia๋ ๊ฐ ํ์์ด ์๋น์ค์ ํ์ํ ์์ ์ SNS ๋งํฌ๋ฅผ ๋ํ๋ ๋๋ค.
-
Java 21
-
Amazon Corretto
-
Amazon Corretto๋ฅผ ์ฑํํ ์ด์
- AWS์ ๋ฐฐํฌ๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ AWS์์ ์ฅ๊ธฐ ์ ๋ฐ์ดํธ ์ง์์ ์ ๊ณตํด ์ฃผ๋ Amazon Corretto ๋ฐฐํฌํ์ ์ฑํ
- amazoncorreto:21
-
mariadb:10.11
-
MariaDB๋ฅผ Docker๋ก ์คํํ๊ธฐ
docker run --name ${์ค์ ํ๊ณ ์ถ์ ์ปจํ ์ด๋ ์ด๋ฆ} -d -p 3306:3306 -e MARIADB_ROOT_PASSWORD=${๋ฃจํธ ์ ์ ํจ์ค์๋} -e MARIADB_DATABASE=${๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ} -e MARIADB_USER=${์ ์ ์ด๋ฆ} -e MARIADB_PASSWORD=${๋ฃจํธ๊ฐ ์๋ ์ ์ ์ ํจ์ค์๋} mariadb:10.11๋ณผ๋ฅจ/๋ฐ์ธ๋ ๋ง์ดํธ๋ฅผ ํ์ฉํด ์ปจํ ์ด๋ ๋ด๋ถ /docker-entrypoint-initdb.d ๊ฒฝ๋ก์ ์ด๊ธฐํ DDL ์คํฌ๋ฆฝํธ๋ฅผ ์์น์ํด์ผ๋ก์จ ์ปจํ ์ด๋ ์์ฑ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ํ, DDL๋ฌธ์ ์คํํ์ฌ ํ
์ด๋ธ์ ์์ฑํ์๊ณ , base_record.sql์ ์คํํ์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์ค๋๋ค.
ํ๊ฒฝ๋ณ์๋ Spring configuration ํ์ผ์ property์ ๋์
๋ฉ๋๋ค (application.yml). ํ๊ฒฝ๋ณ์๊ฐ ์ธํ
๋ผ ์์ง ์๋๋ผ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ธํ
๋ผ ์๊ธฐ ๋๋ฌธ์
ํ๊ฒฝ๋ณ์๊ฐ ์๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ ์๋๋ฉ๋๋ค.
| Name | ์ค๋ช | Example value | Required on profile (v2 ์ถ๊ฐ) | Default (v2 ์ถ๊ฐ) |
|---|---|---|---|---|
DB_URL |
์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ URL์
๋๋ค. ์ค๋ฅธ์ชฝ Example value์์ localhost์ zto_local_core ๋ถ๋ถ์ ์ ์ ํ๊ฒ ๋ฐ๊พธ์๋ฉด ๋ฉ๋๋ค. |
(๋ก์ปฌ DB๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ) jdbc:mariadb://localhost:3306/zto_local_core?createDatabaseIfNotExist=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 |
jdbc:mariadb://localhost:3306/zto_local_core?createDatabaseIfNotExist=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8 |
|
DB_USERNAME |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์ ์์ด๋์ ๋๋ค. | user |
root |
|
DB_PASSWORD |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์ ๋น๋ฐ๋ฒํธ์ ๋๋ค. | secret |
root |
|
GOOGLE_CLIENT_ID |
๊ตฌ๊ธ ๋ก๊ทธ์ธ์ฉ Client ID์ ๋๋ค. | qa.test, prod | ||
GOOGLE_CLIENT_SECRET |
๊ตฌ๊ธ ๋ก๊ทธ์ธ์ฉ Client Secret์ ๋๋ค. | qa.test, prod | ||
KAKAO_CLIENT_ID |
์นด์นด์ค ๋ก๊ทธ์ธ์ฉ Client ID์ ๋๋ค. | qa.test, prod | ||
SERVER_ORIGIN |
๋ฐฑ์๋ ์๋ฒ์ ์ค๋ฆฌ์ง์ ๋๋ค. scheme, domain, port๋ฅผ ๋ชจ๋ ํฌํจํ ๊ฐ์ ๋๋ค. | http://localhost:8080 |
http://localhost:8080 |
|
CLIENT_ORIGIN |
ํด๋ผ์ด์ธํธ ์๋ฒ์ ์ค๋ฆฌ์ง์
๋๋ค. ์์
๋ก๊ทธ์ธ ์ ํ๋ก ํธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ์
๋ฑ์ ์ํฉ์์ ์ฌ์ฉ๋๋ ๋ณ์์
๋๋ค. ํ๋ก ํธ ์๋ฒ๊ฐ localhost์์ 3000๋ฒ ํฌํธ์์ ๋์๊ฐ๊ณ ์๋ค๋ฉด CLIENT_ORIGIN ๊ฐ์ http://localhost:3000์ด ๋ฉ๋๋ค. |
http://localhost:3000 |
http://localhost:3000 |
|
CLIENT_DOMAIN |
ํด๋ผ์ด์ธํธ ์๋ฒ์ ๋๋ฉ์ธ์
๋๋ค. ์ฟ ํค์ ๋๋ฉ์ธ ๊ฐ์ ์ธํ
ํ๊ธฐ ์ํด ํ์ํ ๋ณ์์
๋๋ค. ํ๋ก ํธ์๋ ์๋ฒ๊ฐ localhost์์ ๋์๊ฐ๊ณ ์๋ค๋ฉด, CLIENT_DOMAIN์ ๊ฐ์ localhost๊ฐ ๋ฉ๋๋ค. ํ๋ก ํธ์๋ ์๋ฒ๊ฐ test.zeroone.it.kr:3000์์ ๋์๊ฐ๊ณ ์๋ค๋ฉด, CLIENT_DOMAIN์ ๊ฐ์ zeroone.it.kr์ด ๋ฉ๋๋ค. |
localhost |
localhost |
|
SPRING_PROFILES_ACTIVE |
ํ์ฑํํ Spring Profile์ ๋ช ์ํ ํ๊ฒฝ๋ณ์์ ๋๋ค. | qa.test |
default |
|
STATIC_RESOURCE_PATH |
ํ๋กํ ์ด๋ฏธ์ง ๋ฑ์ ์
๋ก๋ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. none์ผ ๊ฒฝ์ฐ, ์ ์ ์ฝํ
์ธ ์
๋ก๋ ์ classpath:/static ์๋์ ์ฝํ
์ธ ๊ฐ ์ ์ฅ๋ฉ๋๋ค. |
/app/app-resource |
none |
- OAuth 2.0 ๊ฐ์ด๋
- ๊ธฐ๋ณธ ๋ฐ์ดํฐ
- ์๋ฌ ์ฝ๋ ๊ฐ์ด๋
- ๊ณตํต ์๋ต ํ์
- Git ์ปจ๋ฒค์
- ์ฝ๋ฉ ์ปจ๋ฒค์
- ์์ฒญ์ ๋ณด๋ธ ํ์ ID ๊ฐ์ ธ์ค๊ธฐ
- ์๋ํฌ์ธํธ ๊ถํ ๋ฑ๋ก
- Spring Profiles
์ธ์ฆ/์ธ๊ฐ ๊ธฐ๋ฅ์ no-auth Profile์ ํ์ฑํํจ์ผ๋ก์จ ๋ ์ ์์ต๋๋ค.
์ธ์ฆ/์ธ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด ์ ๊ทผ์ด ์ ํ๋ ์๋ํฌ์ธํธ์ ์ ๊ทผํ ๋ Authorization ํค๋์ Bearer ํ ํฐ์ ๋ฃ์ด์ผ ํฉ๋๋ค. Postman์ ์ฌ์ฉํ์๋ ๊ฒ ํธํ ๊ฒ๋๋ค.
qa.test, prod Profile์ ํ์ฑํํ์ง ์๋๋ค๋ฉด JSON ํ ํฐ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ ํฌ ํ๋ก์ ํธ ์ฌ์ ์ OAuth 2.0 API ํค๋ฅผ ์ ๊ณตํด ๋๋ฆฌ๊ธฐ ์ด๋ ค์ธ ๋ฏํฉ๋๋ค.
๋ฐ๋ผ์ ๊ณผ์ ๋ฅผ ์ํํ ๋๋ JSON ํ ํฐ์ ์ฌ์ฉํด ์ฃผ์ธ์. JSON ํ ํฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
ํฌ์คํธ๋งจ ๋ฑ์ ์ฌ์ฉํ ๋, Authorization ํค๋์ {"id": "123"} ์ด๋ฐ ์์ผ๋ก JSON ํ์์ ๊ฐ์ ์๋์ผ๋ก ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ์ด๋, JSON ํ ํฐ์ id ํ๋กํผํฐ๋ memberId๊ฐ
์๋
oidcId์ฌ์ผ ํฉ๋๋ค. oidcId์ ๋ํด์๋ ์๋ ERD ์น์
์์ member ํ
์ด๋ธ์ ๋ํ ์ค๋ช
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์. ํน์ OAuth 2.0 ๊ฐ์ด๋ ๋ฌธ์๋ฅผ ๋ณด์๋ฉด ๋๊ฒ ์ต๋๋ค.
OAuth 2.0 ๊ฐ์ด๋ ๋ฌธ์์ JSON ํ ํฐ์ ๋ํ ์ค๋ช
๋ ๋์ ์์ต๋๋ค.
ํน์, ์์๋ก ์นด์นด์ค ๋ก๊ทธ์ธ ํน์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ API ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค. API ํค๋ฅผ ๋ฐ๋ก ๋ฐ๊ธ๋ฐ์ผ๋ฉด ํด๋น API ํค๋ฅผ ํ๊ฒฝ๋ณ์์ ์ธํ
ํ์๊ณ (ํ๊ฒฝ๋ณ์์ ๋ํ ์ค๋ช
์ ์์ ๋ํ๋
์ค๋ช
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์) Spring Profile ์ค qa.test ํน์ prod๋ฅผ ํ์ฑํํด ์ฃผ์ธ์. ์ฌ๋งํ๋ฉด qa.test๋ฅผ ํ์ฑํํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค (prod๋ ์์ง ๊ฒ์ฆ์ด ๋ถ์กฑํฉ๋๋ค).
ํท๊ฐ๋ฆด ์ ์๋ ํ ์ด๋ธ๊ณผ ์นผ๋ผ๋ง ์ทจ์ฌ์ ํํด์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ ์ด๋ธ์ ๋๋ค.
oidc_id- ์์ ๋ก๊ทธ์ธ์ ํ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
- OAuth 2.0 Authorization ์๋ฒ์์ ์ ๊ณตํ๋ ํ์ ๊ณ ์ ๊ฐ์ ๋๋ค.
login_id- ์ ํฌ ์๋น์ค ์์ฒด ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์์ ์ ํจํ ์นผ๋ผ์ ๋๋ค.
- ์ง๊ธ ์ ํฌ ์๋น์ค๋ ์์ฒด ๋ก๊ทธ์ธ์ด ์์ผ๋ฏ๋ก, ์ง๊ธ์ ์๋ฏธ ์๋ ์นผ๋ผ์ ๋๋ค.
deleted_at- ํ์์ด ์ญ์ ๋ ์๊ฐ์ ๋๋ค.
deleted_at์ดNULL์ผ ๊ฒฝ์ฐ, ์ญ์ ๋์ง ์์ ํ์์ ์๋ฏธํฉ๋๋ค.
์ ๊ทผํ๊ฐ ํ ์ด๋ธ์ ๋๋ค. ๋ชจ๋ ์์ฒญ์ ๋ํด ์ ๊ทผ์ ํ๊ฐํ๊ณ ์ ํ๋ ์๋ํฌ์ธํธ์ HTTP ๋ฉ์๋๋ ์ด ํ ์ด๋ธ์ ์ถ๊ฐํ์ง ์์ผ๋ฉด ๋ฉ๋๋ค.
endpoint- ์ ๊ทผํ๊ฐ๋ฅผ ์ ์ํ ์๋ํฌ์ธํธ์ ๋๋ค.
http_method- HTTP ๋ฉ์๋์ ๋๋ค.
GET,POST,PATCH,PUT,DELETE, ...
access_permission ํ
์ด๋ธ๊ณผ role ํ
์ด๋ธ์ ์ฐ๊ด ํ
์ด๋ธ์
๋๋ค.
ํ์ ํ๋กํ ํ ์ด๋ธ์ ๋๋ค. ํ์ ํ ์ด๋ธ๊ณผ ์ญํ ์ด ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. ํ์ ํ ์ด๋ธ์ด ํ์์ ๊ถํ, ๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋๋ค๋ฉด, ํ์ ํ๋กํ ํ ์ด๋ธ์ ํ๋กํ ์ด๋ฏธ์ง, ์๊ธฐ์๊ฐ, ์ฐ๋ฝ์ฒ, ์ด๋ฆ ๋ฑ ํ์ ํ๋กํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
member_idmemberํ ์ด๋ธ์ ์ฐธ์กฐํ๋ FK์ด์,member_profileํ ์ด๋ธ์ PK์ ๋๋ค.member_profileํ ์ด๋ธ๊ณผmemberํ ์ด๋ธ์ ์๋ณ ๊ด๊ณ์ ๋๋ค.
์คํฐ๋ ๊ฐ๋ฅ ์๊ฐ๋์
๋๋ค. ํ์ฌ ์ด 6๊ฐ์ ์๊ฐ๋๊ฐ ์๊ณ , ํ์๋ค์ 6๊ฐ์ ์๊ฐ๋ ์ค ๊ฐ๋ฅํ ์๊ฐ๋๋ฅผ ๊ณ ๋ฅผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ member_profile
ํ
์ด๋ธ๊ณผ ๋ค๋๋ค ๊ด๊ณ๋ฅผ ๋งบ์ต๋๋ค.
label- "์ค์ ", "์คํ", "์ ๋ ", "์ฌ์ผ" ๋ฑ ๊ฐ ์๊ฐ๋์ ๋ ์ด๋ธ์ ๋๋ค.
ํ์์ ๊ด์ฌ์ฌ์ ๋๋ค. ๊ด์ฌ์ฌ๋ ํ์์ด ์ง์ ์ ๋ ฅํ ์ ์์ต๋๋ค.
ํ์์ SNS, ๋ธ๋ก๊ทธ ๋ฑ ์์ ๋ฏธ๋์ด์ ๋๋ค. ํ ๋ช ์ ํ์์ ๋ธ๋ก๊ทธ๋ SNS, GitHub ๋ฑ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฏธ๋์ด ๋งํฌ๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค.
ํ์์ด ๋ฑ๋กํ ์์ ๋ฏธ๋์ด์ ์ข ๋ฅ์ ๋๋ค. GitHub, ๋ธ๋ก๊ทธ/SNS ๋ฑ์ด ์์ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง ํ
์ด๋ธ์
๋๋ค. ์ค์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ์ง ์๊ณ , ์ค์ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ resized_image ํ
์ด๋ธ์ ๋ด๊ฒจ ์์ต๋๋ค.
location- ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ์์น์ ๋๋ค. ์ด๋ฏธ์ง ๊ฒฝ๋ก๊ฐ ์๋, ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ์๋ฒ ๋๋ฉ์ธ์ด ๋ด๊ธธ ์ ์์ต๋๋ค.
- ex)
http://localhost:8080,https://aws.s3.com(S3 ๊ฒฝ๋ก๊ฐ ์ด๋ค ์์ด์๋์ง ๊ธฐ์ต ์ ๋๋ค์),sftp://some.fileserver.com - ๊ฐ ๊ฐ์
/๋ก ๋๋์ง ์์ต๋๋ค.
๋ฆฌ์ฌ์ด์ง ์ด๋ฏธ์ง์ ๋๋ค. ํ์ฌ๋ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง์ด ๊ตฌํ๋์ง ์์๊ณ , ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋๋ก ์ ์ฅํฉ๋๋ค.
image_size_type- ์ด๋ฏธ์ง ์ฌ์ด์ฆ์ ํ์ ์ ๋งํฉ๋๋ค. ์ด๋ฏธ์ง ํฌ๊ธฐ, ์ด๋ฏธ์ง ๋น์จ ๋ฑ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ ์ด๋ฏธ์ง ์ฌ์ด์ฆ ํ์ ์ด ์์ ์ ์์ต๋๋ค.
- ์์ง ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง์ด ๊ตฌํ๋์ง ์์ ์ํ์ด๊ธฐ ๋๋ฌธ์,
ORIGINAL๊ฐ๋ง ๊ฐ์ต๋๋ค.
ํ์ดํ ! ์ฆ๊ฒ๊ฒ ํฉ์๋ค :)
