ย ๋ด๊ฐ ๊ธฐ์ฌํ ๋ถ๋ถ
โข
๋ณธ์ฌ ๊ด๋ฆฌ์, ๊ฐ๋งน์ ์ฃผ, ๋ฐฐ์ก๊ธฐ์ฌ์ ๋ํ ์ ๋ณด๋ฅผ ์์ฑ ๋ฐ ๊ด๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํ
โข
๋ก๊ทธ์ธ๋ณ RULE ์ค์ ์ ํตํด ํ์ด์ง ์ ๊ทผ ๊ถํ์ ์ธ๋ถํํ๊ณ , ๊ฐ ์ฌ์ฉ์๋ณ๋ก ์ ์ ํ ๊ถํ์ ๋ถ์ฌ
โข
JWT๋ฅผ ํ์ฉํ ์ธ์ฆ ์ ์ฐจ๋ฅผ ๊ตฌ์ถํ๊ณ , Redis์ ํ ํฐ์ ์ ์ฅํ์ฌ ๋ณด์์ฑ์ ๊ฐํ
โข
ํ๋ก์ ํธ์์ ์๋ ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ , ์ฌ์ฉ์ ๋ถํธ์ ์ค์ด๊ธฐ ์ํด ํ๋ก ํธ๋ถ๋ถ์์ Swal(SweetAlert)์ ๋์
ํ์ฌ ๋ก๋ฉ ์ ํ๋ฉด์ ๋์ฒด, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ UX๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ๊ธฐ์ฌ
โข
๋์๋ณด๋์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด JPA์ default_batch_fetch_size๋ฅผ ์ค์ ํ์ฌ N+1 ์ฟผ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ต์ ํํ์ฌ ์กฐํ์๋๋ฅผ 88.9% ๊ฐ์
โข
GitHub์ ํตํ ํ์ ๊ด๋ฆฌ๋ฅผ ์ํํ๋ฉฐ, Git Flow ์ ๋ต, ์ปค๋ฐ ๋ฐ PR ์ปจ๋ฒค์
์ ์ฉ, ์ปจ๋ฒค์
์ ์ด๋ ค์ํ๋ ํ์๋ค์ ์ํด ๊ฐ์ด๋ ์ ๊ณต
โข
ํ
์คํธ์ฝ๋ ๋์
์ผ๋ก์ธํ์ฌ ์ฝ๋ํ์ง์ ๋์ด๋๋ก ๊ธฐ์ฌ
โข
์นด์นด์ค ๋ฉ์์ง API๋ฅผ ํ์ฉํ์ฌ ์ฌ๊ณ ๋ถ์กฑ ์ํฉ ๋ฐ์ ์ ์๋์ผ๋ก ์๋ฆผํก์ ๋ฐ์กํ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ
โข
GitHub Actions์ AWS๋ฅผ ํ์ฉํ์ฌ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ , ๋ฐฐํฌ๋ฅผ ์ค์
โข
์ด์ PM ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ด์ปค๋จธ์ค์ ๋ฌผ๋ฅ ์๋น์ค์ ์ค๊ณ ๋ฐ Flow Chart ์์ฑ์ ์ฃผ๋์ ์ผ๋ก ๊ธฐ์ฌํ๋ฉฐ, ํ๋ก์ ํธ ์ ๋ฐ์ ๋ฐฉํฅ์ฑ์ ์ค์
โข
ํ๋ก์ ํธ ๊ธฐ๊ฐ ๋ด ์ฐจ์ง์ด ์๋๋ก ์๋น์ค ๊ธฐํ๊ณผ ๋ฐฉํฅ์ฑ์ ์ค์ ํ๊ณ , Daily Scrum๋์
๋ฐ ์๋ฌต์ง๋ฅผ ์ ๊ฑฐํ๋ฉฐ ๋ช
ํํ ๊ท์น๊ณผ ๋ช
๋ช
์ ํตํด ํ๋ก์ ํธ์ ์ผ๊ด์ฑ์ ์ ์ง
โข
๋ชจ๋ ํ๋ฉด์ ๊ท์น์ ์ธ ์ ๋ฆฌ๋ฅผ ํตํด ํ๋ก ํธ์๋ ์์
์๋ ๊ธฐ์ฌ
ย ์ฌ์ฉ ๊ธฐ์
โข
DataBase
โฆ
MariaDB / Redis / H2
โข
BackEnd
โฆ
Java / Spring Boot / Spring Data JPA / Spring Security / JWT / Junit5 / Mokito
โข
API
โฆ
Swagger / Kakao Message
โข
Software Architecture Pattern
โฆ
Microservices Architecture
โข
FrontEnd
โฆ
HTML / CSS / JavaScript / Vue.js / VueX
โข
DevOps
โฆ
GitHub Actions / AWS(Elastic Beanstalk, EC2, RDS, S3, Route53)
โข
Collaboration
โฆ
GitHub / Slack / Notion / Figma / Miro
System Architecture
PIOMS System Architecture
ํธ๋ฌ๋ธ ์ํ 1
๋ฌธ์ ๋ฐฐ๊ฒฝ
PIOMS ํ๋ก์ ํธ์์ JPA ์ฌ์ฉ ์ค N+1 ๋ฌธ์ ๋ก ์ธํด API ์๋ต ์๊ฐ์ด ๋น์ ์์ ์ผ๋ก ๊ธธ์ด์ก์ต๋๋ค. ํนํ Admin ์ํฐํฐ์ ์ฐ๊ด๋ Franchise ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋, ๊ฐ๊ฐ์ ์ํฐํฐ๊ฐ ๊ฐ๋ณ ์ฟผ๋ฆฌ๋ก ํธ์ถ๋๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ถํ์ํ ์๋ง์ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๋์๋ณด๋ ๊ฐ์๊ฒฝ์ฐ๋ ์๋ต ์๊ฐ์ด 9์ด ์ด์์ผ๋ก ์ฆ๊ฐํ๋ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
1.
Batch Fetching ์ค์ : application.yml์์ hibernate.default_batch_fetch_size ๊ฐ์ ์ค์ ํ์ฌ ์ฐ๊ด๋ ์ํฐํฐ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด์ ์ผ๋ก ๊ฐ์ ธ์ค๋๋ก ํ์ฌ ์ฟผ๋ฆฌ ํ์๋ฅผ ์ค์์ต๋๋ค.
2.
Lazy Loading ์ ์ฉ: @OneToMany ๊ด๊ณ์์ ๊ธฐ๋ณธ์ ์ผ๋ก Lazy Loading์ ์ฌ์ฉํ์ฌ, ์ค์ ๋ก Franchise ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋๋ง ์กฐํํ๋๋ก ํ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด์ Admin ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋ ๋ถํ์ํ Franchise ๋ฐ์ดํฐ ๋ก๋ฉ์ ๋ฐฉ์งํ ์ ์์์ต๋๋ค.
๊ฐ์ ๊ฒฐ๊ณผ
โข
N+1 ๋ฌธ์ ํด๊ฒฐ์ ํตํด ์๋ต ์๊ฐ์ด 9์ด์์ 1์ด๋ก ๋ํญ ๊ฐ์ ๋์์ต๋๋ค.
โข
Batch Fetching๊ณผ Lazy Loading ์ค์ ๋ง์ผ๋ก๋ ๋ณต์กํ ๊ด๊ณ์์ ๋ฐ์ํ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋น ๋ถ๋ถ ๊ฐ์ ํ ์ ์์์ต๋๋ค.
ํด๋น ๊ฒฝํ์ ํตํด ์๊ฒ ๋ ์
Lazy Loading๊ณผ Batch Fetching๋ง์ผ๋ก๋ JPA ์ฑ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์์์ ํ์ธํ์ต๋๋ค.
์ด๋ฒ ๊ฒฝํ์ ํตํด, ๋ณต์กํ ์ํฐํฐ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋ค๋ฃฐ ๋ N+1 ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ํญ์ ์ ๊ฒํ๊ณ , ํ์์ ๋ฐ๋ผ ์ ์ ํ Fetch ์ ๋ต์ ์ ํํ๋ ๊ฒ์ด ํ์์ ์ด๋ผ๋ ๊ฒ์ ๋ค์ ํ ๋ฒ ๋๊ผ์ต๋๋ค.
Lazy Loading ์ ์ฉ
application.yml์ default_batch_fetch_size๊ฐ ์ค์
ํธ๋ฌ๋ธ ์ํ 2
๋ฌธ์ ๋ฐฐ๊ฒฝ
PIOMS ํ๋ก์ ํธ์ CI/CD ํ์ดํ๋ผ์ธ์์ GitHub Actions๋ฅผ ์ฌ์ฉํด ์๋ ๋ฐฐํฌ๋ฅผ ์ค์ ํ๋ ์ค, ํ๊ฒฝ ๋ณ์ ์ค์ ๋๋ฝ์ผ๋ก ์ธํด AWS์์ ํต์ ๋ฌธ์ ์ ํ์ผ ์
๋ก๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํนํ, application.yml ํ์ผ์์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํ๊ฒฝ ๋ณ์๋ก ์ ๋๋ก ์ฃผ์
๋์ง ์์ผ๋ฉด์ ๋ฌธ์ ๊ฐ ์์๋์์ต๋๋ค. ์ด๋ก ์ธํด, ๋ฐฐํฌ ์คํจ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๊ฒฝ ๋ณ์ ๋ฏธ์ฒ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
1.
๋ฐฐํฌ ๊ณผ์ ์์ ๋๋ฝ๋ ํ๊ฒฝ ๋ณ์๋ฅผ GitHub Secrets๋ฅผ ํตํด ์ค์ ํ์ต๋๋ค. envsubst๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ YAML ํ
ํ๋ฆฟ์ ์ฃผ์
ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ผ๋ฉฐ, ๋ฐฐํฌ ์ AWS_ACCESS_KEY_ID์ ๊ฐ์ ๋ฏผ๊ฐ ์ ๋ณด๊ฐ GitHub Secrets์์ ์ ๋๋ก ๊ฐ์ ธ์์ง ์ ์๋๋ก ์ค์ ํ์ต๋๋ค.
2.
ํ์ผ์ด ์ ๋๋ก ์์ฑ๋๊ณ ํ๊ฒฝ ๋ณ์๊ฐ ์ฃผ์
๋์๋์ง ํ์ธํ๊ธฐ ์ํด cat ๋ช
๋ น์ด๋ก application.yml๊ณผ application-test.yml ๋ด์ฉ์ ๋ก๊ทธ์ ์ถ๋ ฅํ์ฌ ํ์
ํ์ต๋๋ค.
3.
JAR ํ์ผ ๋ฐ Elastic Beanstalk์์ ํ์ํ ํ์ผ๋ค์ด ์กด์ฌํ๋์ง ํ์ธํ๋ ๋ก์ง์ ์ถ๊ฐํ๊ณ , ๋ง์ฝ ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ ์กฐ๊ธฐ์ ๋ฌธ์ ๋ฅผ ํ์ธํ ์ ์๋๋ก ์ฒ๋ฆฌํ์ต๋๋ค.
๊ฐ์ ๊ฒฐ๊ณผ
โข
๋ฐฐํฌ ๊ณผ์ ์์ ๋ฐ์ํ๋ ํ๊ฒฝ ๋ณ์ ๋๋ฝ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์์ ์ ์ธ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.
โข
์๋ํ๋ ํ
์คํธ๊ฐ ์ ๋๋ก ๋์ํ๋ฉฐ, AWS S3 ๋ฐ Elastic Beanstalk์ ๋ฐฐํฌ ํจํค์ง๋ฅผ ์ฌ๋ฆฌ๋ ๊ณผ์ ์ด ์ํํ๊ฒ ์งํ๋์์ต๋๋ค.
ํด๋น ๊ฒฝํ์ ํตํด ์๊ฒ ๋ ์
CI/CD ํ์ดํ๋ผ์ธ์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง๋ฅผ ๊นจ๋ฌ์์ต๋๋ค. ํนํ, ๋ฏผ๊ฐํ ์ ๋ณด๋ GitHub Secrets, .env ํน์ Spring Boot์ Configurations์๊ฐ์ ์์ ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ค์ ํด์ผ ํ๋ฉฐ, ํ๊ฒฝ ๋ณ์ ์ฃผ์
๋ฐ ์ค์ ํ์ผ ์์ฑ ๊ณผ์ ์์ ์ธ์ฌํ ํ์ธ๊ณผ ํ
์คํธ๊ฐ ํ์ํ๋ค๋ ์ ์ ๋ค์ ํ๋ฒ ๋๊ผ์ต๋๋ค.
GitHub Secrets์ ์ค์ ํ ๋ณ์
envsubst ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ
ํ๋ฆฟ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฃผ์
ํ๊ณ ํ์ธํ๋ ๋ถ๋ถ
ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๋ก์ง
ํธ๋ฌ๋ธ ์ํ 3
๋ฌธ์ ๋ฐฐ๊ฒฝ
ํ
์คํธ ์ฝ๋ ์์ฑ ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Redis ์๋ฒ์ ๋ํ ์์กด์ฑ์ด ๋์ ํ
์คํธ ํ๊ฒฝ์ ์ค์ ํ๋ ๋ฐ ์ด๋ ค์์ด ๋ฐ์ํ์ต๋๋ค. ํนํ, ํ
์คํธ ์ค์ ์ค์ Redis ์๋ฒ์ ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉด ํ
์คํธ๊ฐ ์คํจ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
MockRedisConfig๋ฅผ ๋์
ํด Redis ์์กด์ฑ์ ์ ๊ฑฐํ์ต๋๋ค. ์ค์ Redis ์๋ฒ ๋์ ๊ฐ์ ํ๊ฒฝ์์ Redis์ ์ญํ ์ ๋์ฒดํ ์ ์๋๋ก ์ค์ ํ์์ต๋๋ค.
๊ฐ์ ๊ฒฐ๊ณผ
Redis ์์กด์ฑ ์์ด ๋
๋ฆฝ์ ์ธ ํ
์คํธ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์์๊ณ , ๋น ๋ฅด๊ณ ์์ ์ ์ธ ํ
์คํธ๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.
ํด๋น ๊ฒฝํ์ ํตํด ์๊ฒ ๋ ์
ํ
์คํธ ํ๊ฒฝ์์ ์ธ๋ถ ์๋น์ค์ ๋ํ ์์กด์ฑ์ ์ต์ํํ๋ ๊ฒ์ด ํ
์คํธ์ ์์ ์ฑ๊ณผ ํจ์จ์ฑ์ ๋์ผ ์ ์์์ ๋ฐฐ์ ์ต๋๋ค. Mocking์ ํตํ ์์กด์ฑ ์ ๊ฑฐ๋ ๊ฐ๋ฐ ๋จ๊ณ์์ ํฐ ๋์์ด ๋๋ฉฐ, CI/CD ํ์ดํ๋ผ์ธ์์ ์์ ์ ์ธ ํ
์คํธ ์คํ์ ๋ณด์ฅํ ์ ์์์ ์๊ฒ ๋์์ต๋๋ค.
ํ
์คํธ ํ๊ฒฝ์์ Redis ์์กด์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํ Mock Redis ์ค์
ํ
์คํธ ํ๊ฒฝ์์ Redis ์์กด์ฑ์ Mockingํ์ฌ AdminInfoService์ ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ ํ
์คํธ ํด๋์ค ์ค์
ํ
์คํธํ๊ฒฝ์์์ application-test.yml ์ค์
๐ซกย ํ๊ณ
โํค์ด ๋์ฌ ์ ์๋ ๋ฏธ๋ก ์์์ ๊ธธ์ ์ฐพ๋ ์ฌ์ "
PIOMS ํ๋ก์ ํธ๋ ์ ์ธ์ ์ฌ๋ก๊ฑด์ธ โํ๊ณจํํโ๋ฅผ ์ค์ฒํ๋ฉฐ ๊ธฐ์ ์ ์ญ๋๊ณผ ํ์
๋ฅ๋ ฅ์ ํฌ๊ฒ ์ฑ์ฅ์ํจ ๊ฒฝํ์ด์์ต๋๋ค. ๋ค์ํ ๊ธฐ์ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ๋ฐฐ์ด ๊ฒ๋ค์ ๋ฐํ์ผ๋ก ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ๋์ฑ ํค์๋๊ฐ์ต๋๋ค. ํ์๋ค๊ณผ ํ๋ ฅํ์ฌ ์๋ก ๋ค๋ฅธ ์๊ฐ๊ณผ ์ ๊ทผ ๋ฐฉ์์ ํตํฉํ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์ฑํ ์ ์์๊ณ , ํ์ํฌ์ ์ค์์ฑ๋ ๋ค์๊ธ ๊นจ๋ฌ์์ต๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ ์๋ก์ด ๊ธฐ์ ์ ์ต๋ํ๊ณ , ๋ฐ์ ํด ๋๊ฐ ์ ์๋ ์ค์ํ ์ ํ์ ์ด์์ต๋๋ค.