๋ ์ํผ์ ์๋น์ค์ [๋ ์ํผ ์๋ฒ]
๋ฐฐํฌ(์์คํ ์ด): https://m.onestore.co.kr/mobilepoc/apps/appsDetail.omp?prodId=0000774118
์๊ฐ ํ์ด์ง (๋
ธ์
): https://upbeat-willow-06b.notion.site/7ece9e5f602a43f583d7f4cf101e7d69?pvs=4
- ํ๋ก์ ํธ ์๊ฐ
- ๊ฐ๋ฐ ๊ธฐ๊ฐ
- ๊ฐ๋ฐ ํ๊ฒฝ
- ์ฃผ์ ๊ธฐ๋ฅ
- ์ธํ๋ผ
- ERD
- ์ํคํ ์ฒ
- ๊ฐ๋ฐ ์ ๋ต
- ๊ธฐ๋ฅ ์ค๋ช
- ํ ์คํธ ์ฝ๋ ์์ฑ
- ์ฑ๋ฅ(๋ถํ) ํ ์คํธ: nGrinder ์ฌ์ฉ
- ๋ ์ํผ์๋ ๋ ์ํผ๋ฅผ ์ด๋ฏธ์ง์ ํจ๊ป ์์ฑํ๊ณ ๊ณต์ ํ ์ ์๋ SNS์ ๋๋ค.
- ๊ฒ์์ ํตํด ์ฐพ๊ณ ์ถ์ ๋ ์ํผ ์ด๋ฆ์ ๊ฒ์ํ์ฌ ๊ตฌ๊ฒฝํ ์ ์์ต๋๋ค.
- ๋ค์ํ ํ์์ ํ๋ก์ฐํ๋ฉฐ ๋ง์์ ๋๋ ๋ ์ํผ์ ๋๊ธ์ ์์ฑํ ์ ์๊ณ , ์ข์์, ๋ถ๋งํฌ๋ฅผ ํ ์ ์์ต๋๋ค.
- ๋ ์ํผ ์๋ฒ๋ ๊ทธ์ค ๋ ์ํผ์ ๊ด๋ จ๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ๋ด๋นํ๊ณ ์์ต๋๋ค.
- 2023.05 ~ 2023.02 (๋ฒ ํ๋ฒ์ ์ถ์)
- ๊ณ์ํด์ ์ถ๊ฐ๊ฐ๋ฐ์ ์งํ์ค์ ๋๋ค.
- ์ธ์ด: Java 17
- ํ๋ ์์ํฌ: Spring Boot 3.1.2, Spring Security 6
- ORM: JPA, Querydsl
- ํ ์คํธ ๋ฐ ๋ชจ๋ํฐ๋ง: JUnit, Mockito, P6Spy, Zipkin
- API ๋ฐ ์๋น์ค ํต์ : JWT, Feign Client
- ํด๋ผ์ฐ๋: AWS SDK
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: PostgreSQL (RDS), MongoDB, Redis
- ๊ฐ๋ฐ ๋๊ตฌ: IntelliJ IDEA, DataGrip
- ํ์ ๋๊ตฌ: Jira, Confluence, Notion
- JWT๋ก ์ฌ์ฉ์ ๊ฒ์ฆ
- ๋ ์ํผ CRUD (S3์ ์ด๋ฏธ์ง ์ ์ฅ, ์นดํ ๊ณ ๋ฆฌ, ์ฌ๋ฃ, ํด์ํ๊ทธ, ์์์ ์ ์ฅ)
- ๋๊ธ, ๋๋๊ธ ์์ฑ๊ธฐ๋ฅ
- ํ์ํํด์ ์ ์ ์ ๋ ์ํผ ๊ด๋ จ ๋ฐ์ดํฐ ์ญ์
- ๋ ์ํผ ๋ด๋ถ์ ๋๋ค์ ๋ณ๊ฒฝ
- ์ฌ๋ฃ, ํด์ํ๊ทธ ๊ฒ์๊ธฐ๋ฅ
- ๋ถ๋งํฌ ๊ธฐ๋ฅ
- ์ข์์ ๊ธฐ๋ฅ
- ์กฐํ์ ๊ธฐ๋ฅ
- ํ๋ก์ ํธ๋ MSA๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ด 3๊ฐ(๋ฉค๋ฒ, ๋ ์ํผ, ์งํํจ)์ ์๋น์ค๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ๊ทธ์ค ๋ ์ํผ์๋ฒ ECS ํด๋ฌ์คํฐ์ RECIPE ์๋ฒ๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค.
- ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ RDS(PostgreSQL), Redis, MongoDB, S3๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- MessageQueue๋ก๋ SNS, SQS๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ECS ์ธํ๋ผ๋ ๋ค์๊ณผ ๊ฐ์ด ECR์ ์ ์ฅ๋ ์คํ๋ง๋ถํธ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ ์ปจํ ์ด๋๋ก ๋์์ํต๋๋ค.
- ํ๋์ ECS์๋ ํ๋์ ์๋น์ค, ํ๋์ ํ์คํฌ ์ ์๋ก ์คํ๋ฉ๋๋ค.
- SpringBoot์๋ Zipkin์๋ฒ๋ก ๋ก๊ทธ๋ฅผ ์ ์กํ๋๋ก ์ค๊ณํ์์ต๋๋ค.
- CI/CD๋ AWS์ CodePipeline์ผ๋ก ๊ตฌ์ถํ์์ต๋๋ค.
- main ๋ธ๋์น์ merge ๋ฐ์ ์ AWS CodePipeline์ด ์๋์ผ๋ก ํ์ฑํ๋ฉ๋๋ค.
- ์ด ๊ณผ์ ์ GitHub ์นํ ์ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, GitHub์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ์ฌ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
- GitHub์์ ์นํ ์ด ํธ๋ฆฌ๊ฑฐ ๋๋ฉด CodeBuild๊ฐ ๋์ํฉ๋๋ค. ์ด๋ SpringBoot์ ์์ค ์ฝ๋๋ฅผ Docker ์ด๋ฏธ์ง๋ก ๋น๋ํ๊ณ , ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ECR์ ์์ ํ๊ฒ ์ ๋ก๋ํฉ๋๋ค.
- CodeDeploy๊ฐ ECR์ ์ ์ฅ๋ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์งํ๊ณ , ECS์ ๋กค๋ง ์ ๋ฐ์ดํธ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์งํํฉ๋๋ค.
- ๋กค๋ง ์ ๋ฐ์ดํธ๋ฅผ ํตํด ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง์ ์ผ๋ก ๋ฐฐํฌํ๋ฉด์ ์๋น์ค ์ค๋จ ์์ด ์ ๋ฐ์ดํธ๋ฅผ ์๋ฃํ ์ ์์ต๋๋ค.
- ์ ์ ๊ฐ ๋๋ค์์ ๋ณ๊ฒฝํ๋ฉด ๋ฉค๋ฒ ์๋ฒ์์๋ ๋๋ค์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฉค๋ฒ DB์ ๋ฐ์ํ๊ณ Spring Event๋ฅผ ๋ฐํํฉ๋๋ค. (์ด๋ฒคํธ ๋ฆฌ์ค๋๋ 2๊ฐ๋ฅผ ์ ์ธ)
- ์คํ๋ง ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค 1๊ฐ๊ฐ ๋์ํ์ฌ ๋ฉค๋ฒ DB์ Outbox ํ ์ด๋ธ์ ์ด๋ฒคํธ ๋ฐํ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ DB ์ปค๋ฐ์ ํฉ๋๋ค.(ํธ๋์ญ์ ์ปค๋ฐ์๋ฃ)
- ํธ๋์ญ์ ์ปค๋ฐ์ด ์๋ฃ๋๋ฉด AFTER_COMMIT์ ์ ์ด์ค ๋ ๋ค๋ฅธ ์คํ๋ง ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋์ํ์ฌ ๋๋ค์ ๋ณ๊ฒฝ ํ ํฝ์ผ๋ก SNS ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
- SNS ๋ฉ์์ง๊ฐ ๋ฐํ๋๋ฉด 2๊ฐ์ SQS๋ฆฌ์ค๋๊ฐ ๋์์ ๋์ํ๊ฒ ๋ฉ๋๋ค.
- ๋ ์ํผ ์๋ฒ์์ ๋๋ค์ ๋ณ๊ฒฝ ํ ํฝ์ ๋ฆฌ์ค๋ํ๊ณ ์๋ SQS๊ฐ ์คํ๋ฉ๋๋ค.
- ๋ฉค๋ฒ ์๋ฒ์์ ๋๋ค์ ๋ณ๊ฒฝ ํ ํฝ์ ๋ฆฌ์ค๋ํ๊ณ ์๋ SQS๊ฐ ์คํ๋ฉ๋๋ค. ์ด๋ Outbox ํ ์ด๋ธ์ ์ด๋ฒคํธ ๋ฐํ ์ฌ๋ถ(published ์นผ๋ผ)๋ฅผ true๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
- ๋ ์ํผ ์๋ฒ์ SQS ๋ฆฌ์ค๋๊ฐ ๋์ํ ๋ FeignClient๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉค๋ฒ ์๋ฒ์ ๊ฐ์ฅ ์ต์ ์ ์ ์ ๋๋ค์ ์ ๋ณด๋ฅผ ์์ฒญํฉ๋๋ค.
- ๋ฉค๋ฒ ์๋ฒ๋ก๋ถํฐ ๋ฐ์์จ ๊ฐ์ฅ ์ต์ ์ ์ ์ ๋๋ค์ ์ ๋ณด๋ฅผ ๋ ์ํผ DB์ ๋ฐ์ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก์ ๋ฉ์์ง ๋ด๋ถ์๋ memberId๋ง์ ํฌํจํ๋๋ก ํฉ๋๋ค.
- ๋ถ์ฐ์ถ์ ์ ์ํ traceId๋ SNS์ messageAttributes๋ฅผ ์ฌ์ฉํ์ฌ ์ ์กํฉ๋๋ค.
- Spring Batch๋ฅผ ์ฌ์ฉํ์ฌ 5๋ถ๋ง๋ค ๋ฏธ๋ฐํ๋ ๋ฉ์์ง๋ฅผ ์ฌ๋ฐํ ํฉ๋๋ค.
- Outbox ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐํ์ฌ๋ถ(published)๊ฐ false๊ฒ์ ์กฐํํ์ฌ ๋ฐฐ์น๊ฐ ๋์ํฉ๋๋ค.
- Redis์ ๊ธฐ๋ณธ์ ์ธ ๋ณต๊ตฌ์ ๋ต์ AOF, RDB(Redis Database)๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ต๋๋ค.
- Redis์ ์ ์ฅ๋ ์กฐํ์, ์ข์์ ๋ฐ์ดํฐ๋ ์ค์ผ์ฅด๋ฌ๋ฅผ ํตํด ๋งค์ผ 6์๊ฐ๋ง๋ค PostgreSQL์ ์
๋ฐ์ดํธํ๋๋ก ์ค๊ณํ์ต๋๋ค.
- 6์๊ฐ๋ง๋ค ๋ฐฑ์ ์ ์ํํ์ฌ ์ต๊ทผ ์ํ์ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ณด์กดํฉ๋๋ค.
- ๋ง์ฝ Redis ์ธ์คํด์ค์ ๋ฌธ์ ๊ฐ ์๊ฒจ ๋ฐ์ดํฐ๊ฐ ์์ค๋๋๋ผ๋, PostgreSQL์ ์ ์ฅ๋ ์ต๋ 6์๊ฐ ์ ์ ๋ฐ์ดํฐ๋ก ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ฐฑ์ ์ ์์คํ ๋ฆฌ์์ค๋ฅผ ์๋นํ ์ฌ์ฉํ ์ ์์ง๋ง 6์๊ฐ๋ง๋ค ๋ฐฑ์ ์ ์คํํ๋ฉด ์์คํ ์ด ํผํฌ ์๊ฐ ์ธ์ ๋ฐฑ์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ผ์ ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ์๋ฌ์ฝ๋ ์์ฑ
- ๋ ์ํผ์ ์ ์ฉ ์์ธ์ฝ๋ ์์ฑ
- ์ค์์ง์ค ์์ธ์ฒ๋ฆฌ ControllerAdvice ์ฝ๋ ์์ฑ (์ด๋ NPE๋ ๋ฐ๋ก ์ฒ๋ฆฌํ๋๋ก ์์ฑ)
- ์ฝ๋์์ ์๋์ ๊ฐ์ด ์์ธ๋ฅผ throwํด์ ์ปค์คํ ์์ธ๋ฅผ ์ ์ฉ์์ผฐ๋ค.
- ์ฌ๋ฃ, ํด์ํ๊ทธ๋ RDB์ ์ ์ฅ๊ณผ ๋์์ MongoDB์ ์ ์ฅํฉ๋๋ค.
- MongoDB์๋ ์ฌ๋ฃ, ํด์ํ๊ทธ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ๊ฒ์๊ธฐ๋ฅ์์ ์ฐ๊ด๊ฒ์์ด ๊ธฐ๋ฅ์ด ๋์ํ๋๋ก ๊ตฌํํ์ต๋๋ค.
- ์ข์์ ํ์, ์กฐํ์๋ Redis์ ์ ์ฅํ๊ณ ์กฐํํฉ๋๋ค.
- S3์ ์ ์ฅ๋ ์ด๋ฏธ์ง๋ ๋ณด์์ ์ํด pre-signed-url๋ก ๋ณํํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋๋ค.
- ํ์ผ ํ ์ด๋ธ์๋ S3๋ฒํท์ ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ฏธ์ง์ ์ ์ฅ ๊ฒฝ๋ก(path)๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค.
- AWS SDK๋ฅผ ํตํด url์ pre-signed-url๋ก ๋ณํํฉ๋๋ค. (S3์ ์ ๊ทผํ์ฌ ์ฒ๋ฆฌํ๊ณ ๋ฐํ๋ฐ๋๊ฒ ์๋๋ผ ์คํ๋ง ๋ด๋ถ์ SDK ์ฝ๋๋ก ์ฒ๋ฆฌ)
- ๊ธฐ๋ณธ์ ๋ณด, ๋๊ธ, ํ์ผ์ soft delete ์ฒ๋ฆฌ๋ฅผ ํ๋๋ก ์ค๊ณํ์ต๋๋ค.
- soft delete๋ ๋ฐ์ดํฐ๋ ํ๋ฌ์ด ์ง๋๋ฉด ๋ฐฐ์น๋ฅผ ํตํด ์ญ์ ๋ฅผ ์งํํฉ๋๋ค.
- ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํตํด ์ฒ๋ฆฌํฉ๋๋ค.
- ๋จ์/ํตํฉ ํ ์คํธ ์งํ (238๊ฐ)
- Junit5, mockito, S3Mock, BddMockito ์ฌ์ฉ
- ์ธ๋ถ DB (MongoDB, Redis)๋ฅผ ์ฌ์ฉํ ํ ์คํธ๋ ์งํํ์ต๋๋ค.
- ์์ฉ ECS์ ๋ ์ํผ SpringBoot์๋ฒ์ ํ ์คํธ๋ฅผ ์งํํ ๊ฒฐ๊ณผ๋ค.
- ๋ก์ปฌ (Mac): m1(16GB), m2 max(64GB)
- ์์ฉ (ECS): t4g.small
- ํ
์คํธ ๊ฒฐ๊ณผ:
- M2 Max 64GB ๋ชจ๋ธ์ด ๊ฐ์ฅ ๋์ TPS(์ด๋น ์ฒ๋ฆฌ ๊ฑด์)๋ฅผ ๊ธฐ๋กํ๋ฉฐ ์ฑ๋ฅ์ด ๊ฐ์ฅ ์ฐ์ํ๋ค.
- M1 16GB ๋ชจ๋ธ์ M2 Max์ ๋นํด ๋ฎ์ TPS๋ฅผ ๊ธฐ๋กํ์ง๋ง, ์ฌ์ ํ ํฉ๋ฆฌ์ ์ธ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
- ๋ฐ๋ฉด, AWS t4g.small ์ธ์คํด์ค๋ ๋งค์ฐ ๋ฎ์ TPS๋ฅผ ๊ธฐ๋กํ๋ฉฐ ์ฑ๋ฅ์ด ์๋์ ์ผ๋ก ๋ง์ด ๋ถ์กฑํ ๊ฒ์ผ๋ก ๋ํ๋ฌ๋ค.
- ์ด ๊ฒฐ๊ณผ์ ๋ฐ๋ฅด๋ฉด ๋ง์ฝ ์ ์ ๊ฐ 100๋ช ์ด ๋์ด๊ฐ๋ค๋ฉด ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์ฐ๋ฆฌ๋ ์คํ ์ค์ผ์ผ๋ง์ ์ ์ฉํ์ผ๋ ์ค์ ๋ก๋ ํจ์ฌ ์ ๋ฒํฐ๊ฒ ์ง๋ง ์ ์ ๊ฐ ๋์ด๋๋ฉด ์ ๋นํ ์ฌ์์ ๋์ฌ์ฃผ๋๊ฒ๋ ํ์ํด๋ณด์ธ๋ค.