YesAladin Shop์ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ฉ์ ํ์ํ API๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ด์ ์๋น์ค๋ฅผ ์ํํ๋ API Server์ ๋๋ค.
./mvnw spring-boot:run
- NHN Dooray!์ ์นธ๋ฐ ํ์ฉ
- @WBS(Work Breakdown Structure)๋ฅผ ๊ตฌ๊ธ ์คํ๋ ๋์ํธ๋ก ๊ด๋ฆฌ
- ํ์ ๊ด๋ฆฌ
- ํ์ ๊ฐ์
- ์ผ๋ฐ ํ์ ๊ฐ์
- OAuth2 ํ์ ๋ฑ๋ก ์ ์ถ๊ฐ ์ ๋ณด ์ ๋ ฅ ํ ๋ฑ๋ก (Member ํ ์ด๋ธ ๋จ์ผํ)
- ํ์ ์ ๋ณด ์์
- ํ์ ํํด
- ํ์ ํต๊ณ
- ํ์ ๊ฐ์
- Shop API Server ๋ณด์ (Co-authored-by: @๊นํ๋)
- Shop API Server ๋ด Spring Security๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ API ๋ณ Method Security ์ ์ฉ
- Object Storage
Object Storage
Properties ์ค์ - ์ธ์ฆ ํ ํฐ ๋ฐ๊ธ ๋ฐ ํ ํฐ ๋ง๋ฃ ์ ๊น์ง
Redis
๋ด ๋ณด๊ด - Front์์ Object Storage ์ธ์ฆ ํ ํฐ ์์ฒญ ์
Redis
๋ด ํ ํฐ ํ๋ ํน์ ๋ฐ๊ธํ์ฌ Front์ ์ ๋ฌ - Front -> Shop ์ผ๋ก
MultipartFile
์ ์ ๋ฌ๋ฐ์ Object Storage ํ์ผ ์ ๋ก๋ ํ ์ ๋ก๋ ์ ๋ณด๋ฅผ Front์ ์ ๋ฌ
- ํ์ผ ๊ด๋ฆฌ
- DB์ ์ ๋ก๋ํ ํ์ผ์ ์ ๋ณด(URL, ์ ๋ก๋ ์๊ฐ)์ ๋ฑ๋ก ๋ฐ ์กฐํ
- ์ํ ๊ด๋ฆฌ
- ์ํ ๋ฑ๋ก/์์ /Soft Delete
- ์ํ์ ํ๋งค์ฌ๋ถ, ๊ฐ์ ํ์ ์ฌ๋ถ, ๋ ธ์ถ์ฌ๋ถ, ์ฌ๊ณ ์๋ ์์
- ์ํ ์ ๋ชฉ, ์ค๋ณต์ฌ๋ถ, ์๋ ์กฐํ
- ์ํ ์์ธ ์กฐํ
- ์ํ ์์ ์ฉ ์ ๋ณด ์กฐํ
- ๊ด๋ฆฌ์์ฉ, ์ผ๋ฐ์ฌ์ฉ์์ฉ
Paging
์กฐํ - ์ฅ๋ฐ๊ตฌ๋ ๋ด ์ํ์ ์ ๋ณด ์กฐํ
- ์ํ ์ ํ ์ ์ฒด ์กฐํ
- ์ ์ฒด ํ ์ธ์จ ์กฐํ/์์
- ์ํ ์ฐ๊ด๊ด๊ณ ๊ด๋ฆฌ
- ์ํ ๊ฐ ์ฐ๊ด๊ด๊ณ ์์ฑ/์ญ์
- ๊ด๋ฆฌ์์ฉ, ์ผ๋ฐ์ฌ์ฉ์์ฉ
Paging
์กฐํ
- ์ถํ์ฌ, ์ถํ ๊ด๋ฆฌ
- ์ถํ์ฌ ๋ฑ๋ก/์์
- ์ถํ์ฌ ๋จ๊ฑด ์กฐํ
- ๊ด๋ฆฌ์์ฉ ์ถํ์ฌ
Paging
์กฐํ - ์ถํ์ฌ์ ์ํ ์ฌ์ด์ ๊ด๊ณ(=์ถํ) ๋ฑ๋ก/์ญ์
- ์ํ์ผ๋ก ์ถํ์ฌ์ ์ํ ์ฌ์ด์ ๊ด๊ณ(=์ถํ) ์กฐํ
- ํ๊ทธ, ํ๊ทธ๊ด๊ณ ๊ด๋ฆฌ
- ํ๊ทธ ๋ฑ๋ก/์์
- ํ๊ทธ ๋จ๊ฑด ์กฐํ
- ๊ด๋ฆฌ์์ฉ ํ๊ทธ
Paging
์กฐํ - ํ๊ทธ์ ์ํ ์ฌ์ด์ ๊ด๊ณ ๋ฑ๋ก/์ญ์
- ์ํ์ผ๋ก ํ๊ทธ์ ์ํ ์ฌ์ด์ ๊ด๊ณ ์กฐํ
- ์ ์, ์งํ ๊ด๋ฆฌ
- ์ ์ ๋ฑ๋ก/์์
- ์ ์ ๋จ๊ฑด ์กฐํ
- ๊ด๋ฆฌ์์ฉ ์ ์
Paging
์กฐํ - ์ ์์ ์ํ์ฌ์ด์ ๊ด๊ณ(=์งํ) ๋ฑ๋ก/์ญ์
- ์ํ์ผ๋ก ์ ์์ ์ํ ์ฌ์ด์ ๊ด๊ณ(=์งํ) ์กฐํ
- ๋งค์ถ ํต๊ณ ๋ฐ ๋ฒ ์คํธ์
๋ฌ
- ์ ํด์ง ๊ธฐ๊ฐ์ ๋งค์ถ ํต๊ณ ์กฐํ
- 1๋ ๊ธฐ์ค ๋ฒ ์คํธ์ ๋ฌ 12๊ฐ ์กฐํ
- ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ/์ญ์ , ์๋ ์์ , ์ฃผ๋ฌธ ํ ์ฅ๋ฐ๊ตฌ๋ ์ํ ์ญ์
- ์ฃผ๋ฌธ
- ํ์/๋นํ์ ์ผ๋ฐ ์ฃผ๋ฌธ ์์ฑ
- ์ฃผ๋ฌธ ์จ๊น์ฒ๋ฆฌ
- ์ฃผ๋ฌธ ํ์
- ์ฟ ํฐ ์ฌ์ฉ
- ํฌ์ธํธ ์ฌ์ฉ
- ํ์ ๊ด๋ฆฌ
- ํ์ ๋ฐฐ์ก์ง ๋ฑ๋ก/์์ /์ญ์
- ํ์ ๋ฑ๊ธ ๋ด์ญ ๊ธฐ๊ฐ๋ณ
Paging
์กฐํ - ํ์ ๋ฑ๊ธ ์กฐํ
- ํ์ ์ฐจ๋จ/์ฐจ๋จํด์ง
- ํฌ์ธํธ ๊ด๋ฆฌ
- ํฌ์ธํธ ์ฌ์ฉ/์ ๋ฆฝ/์ง๊ณ ๋ด์ญ ์์ฑ
- ํฌ์ธํธ ์ฌ์ฉ/์ ๋ฆฝ
Paging
๋ด์ญ ์กฐํ - ํ์์ ํฌ์ธํธ ์กฐํ
- ์ฃผ๋ฌธ ๋ณ๊ฒฝ ์ํ ๋ด์ญ ๊ด๋ฆฌ
- ์ฃผ๋ฌธ ๋ณ๊ฒฝ ์ํ ๋ด์ญ ์์ฑ
- ์ฃผ๋ฌธ ์ํ ๊ด๋ฆฌ
- ์ฃผ๋ฌธ ์ํ ์์ฑ
- ์นดํ
๊ณ ๋ฆฌ
- 1์ฐจ, 2์ฐจ ์นดํ ๊ณ ๋ฆฌ์ ๊ฐ์ด ์๊ธฐ์ฐธ์กฐ ํ์์ ์นดํ ๊ณ ๋ฆฌ ๊ตฌํ
- ์ํฐํฐ์ Pk๋ฅผ
Auto Increment
๊ฐ ์๋ staticํ ๊ฐ์ผ๋ก ์ฌ์ฉ- ์์ฑ : 1์ฐจ ์นดํ ๊ณ ๋ฆฌ 10000๋ง์ฉ ์ฆ๊ฐ, 2์ฐจ ์นดํ ๊ณ ๋ฆฌ 100์ฉ ์ฆ๊ฐ
- ์๋์ผ๋ก ์์ฑ๋ ๊ฒฝ์ฐ, ์ํ-์นดํ ๊ณ ๋ฆฌ๊ฐ์ ๊ด๊ณ ๋งตํ์ด ํ๋ค์ด์ง??? <- ์ค๋ช ์ถ๊ฐ
- ์นดํ ๊ณ ๋ฆฌ ๋ฑ๋ก/์์ /์ญ์
- ์นดํ
๊ณ ๋ฆฌ ๋จ๊ฑด/๋ค๊ฑด
paging
์กฐํ - ์นดํ ๊ณ ๋ฆฌ ์์ ๋ณ๊ฒฝ
- ๊ฒฐ์
- ๊ฒฐ์ ์์ฒญ ๋ฐ ์น์ธ ์ฒ๋ฆฌ by Toss
- ์นด๋
- ๊ฐํธ ๊ฒฐ์
- ๊ฒฐ์ ๋ด์ญ ์กฐํ
- ๊ฒฐ์ ์์ฒญ ๋ฐ ์น์ธ ์ฒ๋ฆฌ by Toss
- ์ฃผ๋ฌธ ์กฐํ
- ๊ธฐ๊ฐ๋ณ ์ฃผ๋ฌธ ์กฐํ ๋ฐ ์ผ์ ์ง์ ๋ณ ์ฃผ๋ฌธ ์กฐํ
- ์ฃผ๋ฌธ ์ํ ๋ณ ์ฃผ๋ฌธ ์กฐํ
- ์ฃผ๋ฌธ ์์ธ ์กฐํ (์ฃผ๋ฌธ์ ๋ณด + ์ํ์ ๋ณด + ๋ฐฐ์ก์ ๋ณด + ๊ฒฐ์ ์ ๋ณด)
- ์ฟ ํฐ
- Kafka๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํฐ ์๋ฒ์ ๋ฉ์์ง ๊ธฐ๋ฐ ๋น๋๊ธฐ ํต์ ๊ตฌํ
- ๋ง์ดํฌ๋ก์๋น์ค์ ํธ๋์ญ์ ๋ณด์ฅ์ ์ํ ์์คํ ์ค๊ณ
- Project Management
- NHN Cloud Log & Crash๋ฅผ ์ฐ๋ํ์ฌ ๋ชจ๋ํฐ๋ง ํ๊ฒฝ ๊ตฌ์ถ
- Spring Cloud Config๋ฅผ ์ฐ๋ํ์ฌ ์ค์ ์ ๋ณด ์ธ๋ถํ
- ์ฟ ํฐ
- ์๋ ๋ฐํ ์ฟ ํฐ
- Batch ์๋ฒ์์ API ํต์ ์ ํตํด n์ผ ํ ์์ผ์ธ ํ์์๊ฒ ์ฟ ํฐ ์๋ ๋ฐํ ๊ตฌํ
- ์์ผ ํ์ ์กฐํ
- MyBatis๋ฅผ ์ฌ์ฉํ์ฌ ์ฟ ํฐ ์ง๊ธ Batch Insert ๊ตฌํ
- Batch ์๋ฒ์์ API ํต์ ์ ํตํด n์ผ ํ ์์ผ์ธ ํ์์๊ฒ ์ฟ ํฐ ์๋ ๋ฐํ ๊ตฌํ
- ์ ์ฐฉ์ ์ฟ ํฐ
- ์ด๋ฒคํธ ์คํ ์๊ฐ ์ด์ ์ ๋ฐํ๋ ์์ฒญ ์ฒ๋ฆฌ
- Redis๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์๊ฐ์ ๋ค์ด์ค๋ ์ค๋ณต ๋ฐํ ์์ฒญ ์ ์ ์ฒ๋ฆฌ
- ์๋ ๋ฐํ ์ฟ ํฐ
- ๊ฒ์
- ๋ฉ์ธ ์ํ ๊ฒ์
- ES์ Nori Plugin์ ์ด์ฉํ ์ํ ๊ฒ์ ๊ตฌํ
- ๋ฉ์ธ ์ํ ๋ฑ๋ก์ ์ํ ํ๊ทธ, ์นดํ ๊ณ ๋ฆฌ, ์ถํ์ฌ, ์ ์ ๊ฒ์
- ํ์
- ๊ด๋ฆฌ์๊ฐ ํ์ ์ฐจ๋จ/์ญ์ ๊ด๋ฆฌ ๊ฒ์(DB)
- ๋ฉ์ธ ์ํ ๊ฒ์
- ์์๋ฆฌ์คํธ
- ์์๋ฆฌ์คํธ ๋ฑ๋ก/์ญ์
- ์์๋ฆฌ์คํธ ํ์ด์ง ์กฐํ
- ์ต๊ทผ ๋ณธ ์ํ
- ์ต๊ทผ ๋ณธ ์ํ ์ถ๊ฐ/์ญ์
- ์ต๊ทผ ๋ณธ ์ํ ํ์ด์ง ์กฐํ
- ์ ๊ฐ
- ์ ๊ท ์ํ SQL ์์ฑ
- SonarQube ๋ฐ ์ฒดํฌ ์คํ์ผ์ ํ์ฉํ ์ฝ๋ ํ์ง ๊ฐ์ ๋ฐ ์ปจ๋ฒค์ ์ฒดํฌ
- Unit Test ์ํ
- ๊ฒฐ์ ์๋น์ค ๋ฉ์๋ ์คํ ์ค, RollBack ๋์ด์ผ๋ ์ํฉ์ ํ ์ค์์ ํต์ ์ด ์ ์ ์ข
๋ฃ๋ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํธ๋์ญ์ ์ด ๋น์ ์ ์ข ๋ฃ๋์ด rollback์ด ๋์๋ค.
- ํ์ง๋ง ํ ์ค ๊ฒฐ์ ์ทจ์๋ HTTP ํต์ ์ด๋ฏ๋ก rollback๊ณผ๋ ๋ฌด๊ดํ๊ฒ ๋์ํ๋ฏ๋ก ๋์ฑ ์ด ํ์
- TransactionEventListener ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐ
- phase๋ฅผ TransactionPhase.AFTER_ROLLBACK ์ผ๋ก ์ค์ ํ์ฌ ์ฌ์ฉ
- ์๋ฒ๊ฐ ์ด์คํ ๋์ด์์ด ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ณ ์ ํ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์ง ์์ ์ ์๋ ๋ฌธ์ ๋ฐ์
- Redis์ PUB/SUB์ ์ด์ฉํ์ฌ ๋ชจ๋ ์ธ์คํด์ค์์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์๋๋ก ๊ตฌํ
- ์ค๊ณ ๋ฐ flow์ ๋ณต์ก๋ ์ฆ๊ฐ ๋ฐ ์์ผ ์ฐ๊ฒฐ ์ ์ง๋ก ์ธํ ์๋ฒ ๋ถ๋ด ์ฆ๊ฐ
- ์ต์ข ์ ์ผ๋ก ์์ผ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ์ฌ ํด๊ฒฐ
- JWT ํ ํฐ ๊ฒ์ฆ ๊ฒฐ๊ณผ payload์ ํฌํจ๋ ์๋ณ ์ ๋ณด๋ฅผ ํตํด Shop API Server ๋ด
OncePerRequestFilter
๋ก ์์ฒด ์ธ์ฆ ๊ฐ์ฒด ์์ฑ- ์์ฑ๋
Authentication
์ ํฌํจ๋Roles
๋ฅผ ์ฌ์ฉํ์ฌ API์ Method Security ์ ์ฉ - ์์ฑ๋
Authentication
์ ํฌํจ๋loginId
๋ฅผ ํตํด AOP๋ฅผ ๊ตฌ์ฑํ์ฌ ํ์ ์์ ์ ๊ฐ์ธ์ ๋ณด์ ๊ด๋ จ๋ API ํธ์ถ ์ ๊ฐ์ธ์ ๋ณด ๋ ธ์ถ ์ต์ํ
- ์์ฑ๋
- ELK ์คํ์ ์ด์ฉํ ์ํ๊ฒ์(๋น์ ํ ๋ฐ์ดํฐ์ ๋ํ ์์ธ๊ณผ ๊ฒ์ ์ ๊ณต)
- ๊ด๋ฆฌ์๊ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํ DB ๊ฒ์(๋ฐ์ดํฐ์ ์ ํฉ์ฑ, ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด)
- Git Flow ์ ๋ต์ ์ฌ์ฉํ์ฌ Branch๋ฅผ ๊ด๋ฆฌํ๋ฉฐ Main/Develop Branch๋ก Pull Request ์ ์ฝ๋ ๋ฆฌ๋ทฐ ์งํ ํ merge ํฉ๋๋ค.
- Main: ๋ฐฐํฌ์ ์ฌ์ฉ
- Develop: ๊ฐ๋ฐ ๋จ๊ณ๊ฐ ๋๋ ๋ถ๋ถ์ ๋ํด Merge ๋ด์ฉ ํฌํจ
- Feature: ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋จ๊ณ
- Hot-Fix: Merge ํ ๋ฐ์ํ ๋ฒ๊ทธ ๋ฐ ์์ ์ฌํญ ๋ฐ์ ์ ์ฌ์ฉ