๊นกํต์์ฅ ์ด์ปค๋จธ์ค๋ ๋ถ์ฐ ๊นกํต์์ฅ์ ๋ค์ํ ๋นํฐ์ง ์๋ฅ๋ฅผ ์จ๋ผ์ธ์์๋ ์ ๋ ดํ๊ฒ ํ๋งคํ ์ ์๋๋ก ๊ตฌ์ถํ ์ด์ปค๋จธ์ค ํ๋ก์ ํธ์ ๋๋ค.
- Redis ๊ธฐ๋ฐ ์บ์ฑ์ ์ ์ฉํ์ฌ ์ค์๊ฐ ์ธ๊ธฐ ๊ฒ์์ด ์กฐํ ์๋๋ฅผ ๊ฐ์ ํ๊ณ , ์์ฃผ ์์ฒญ๋๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์๋ฒ ๋ถํ๋ฅผ ์ค์์ต๋๋ค.
- ์ด์ปค๋จธ์ค ํ๋ก์ ํธ ํน์ฑ์ ์ฌ์ฉ์๋ค์ด ์์ฃผ ์กฐํํ๋ ๊ธฐ๋ฅ์ ๋ํด ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ์ ์ฉํ์ฌ ์๋ต ์๋๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ํ ์คํธ ๋ฐ ๋ฐฐํฌ๋๋๋ก ์ค์ ํด ์ด์์ ํธ์์ฑ์ ๋์ด๊ณ , ๋ฐฐํฌ ์๋ํ๋ฅผ ๊ตฌํํ์ต๋๋ค.
๐ ์ฑ๋ฅ ๊ฐ์ : ์ค์๊ฐ ์ธ๊ธฐ ๊ฒ์์ด ๋ชฉ๋ก ์กฐํ, Redis ๋์ ์ผ๋ก ์ฝ 93.75% ์ฑ๋ฅ ํฅ์
- Redis ๋์
์ผ๋ก ๊ธฐ์กด DB ์กฐํ๋ณด๋ค ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋จ
- DB์์ ์ธ๊ธฐ ๊ฒ์์ด ์กฐํ ์ ํ๊ท 320ms
- Redis์์ ์ธ๊ธฐ ๊ฒ์์ด ์กฐํ ์ ํ๊ท 20ms
- ์ฑ๋ฅ ์ฝ 93.75% ํฅ์, ์๋ต ์๋ ์ฝ 13๋ฐฐ ํฅ์
- ์ฌ์ฉ์๋ค์ด ๊ฒ์ํ๋ ํค์๋๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ๊ธฐ ๊ฒ์์ด ์์๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ํจ
- ๊ธฐ์กด ๋ฐฉ์(๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์ ์กฐํ)์์๋ ๊ฒ์์ด ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ DB์์ ์กฐํํด์ผ ํ๋ฏ๋ก ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์
- Redis๋ฅผ ํ์ฉํ์ฌ ์ธ๊ธฐ ๊ฒ์์ด๋ฅผ ์ ์ฅ ๋ฐ ์กฐํํ๋ฉด ํจ์ฌ ๋น ๋ฅผ ๊ฒ์ด๋ผ ํ๋จ
- ๊ธฐ์กด DB ์กฐํ ๋ฐฉ์
- ์ฅ์ : ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง๊ฐ ์ฉ์ดํจ
- ๋จ์ : ์ค์๊ฐ ํธ๋ํฝ์ด ๋ง์ ๊ฒฝ์ฐ ๋ถํ๊ฐ ์ปค์ง๊ณ ์๋ต ์๋๊ฐ ๋๋ ค์ง
- Redis ๊ธฐ๋ฐ ์บ์ฑ ๋ฐฉ์ (์ฑํ)
- ์ฅ์ : ๊ฒ์์ด ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์์ผ๋ฉฐ, DB ๋ถํ๋ฅผ ์ค์ฌ ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ
- ๋จ์ : ์ถ๊ฐ์ ์ธ ์บ์ฑ ์ ๋ต์ด ํ์
- B+Tree ์ธ๋ฑ์ค ์ ์ฉ์ผ๋ก ๊ฐ๊ฒฉ ๋ฒ์ ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ, Slice ๊ฐ์ฒด ํ์ฉ์ผ๋ก ํ์ด์ง ํจ์จ ๊ฐ์
- ๊ธฐ์กด QueryDSL ๋ฐฉ์
- Full Scan ๋ฐ์: ์กฐ๊ฑด ๊ฒ์ ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ์ฌ ์ฑ๋ฅ ์ ํ
- Count ์ฐ์ฐ ๋ถ๋ด: ๊ฒ์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ ๊ฐ์๋ฅผ ํญ์ ๊ณ์ฐํด์ผ ํ๋ฏ๋ก ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ์ฑ๋ฅ ์ ํ ๋ฐ์
- ์ต์ ํ (B+Tree Index + Slice ํ์ด์ง ์ ์ฉ)
- B+Tree ์ธ๋ฑ์ค ์ ์ฉ
- ํธ๋ฆฌ ๊ตฌ์กฐ ๊ธฐ๋ฐ์ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ๊ฒ์์ผ๋ก ๋ถํ์ํ ๋ ธ๋ ํ์ ๊ฐ์
- ๊ฐ๊ฒฉ ๋ฒ์ ๊ฒ์ ์ ๋น ๋ฅธ ํ์ ๊ฐ๋ฅ
- Slice ๊ฐ์ฒด ๊ธฐ๋ฐ ํ์ด์ง ์ ์ฉ
- ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ count ์ฐ์ฐ์ ์ํํ์ง ์์ ์ฑ๋ฅ ์ ํ ๋ฐฉ์ง
- ์ด์ ํ์ด์ง ์ ๋ณด๋ง ์ ์งํ๋ฉด์ ๋ค์ ํ์ด์ง ํ์ ๊ฐ๋ฅ, ํ์ด์ง ๋น์ฉ ์ ๊ฐ
- B+Tree ์ธ๋ฑ์ค ์ ์ฉ
- ์์ ์ ์ธ ๋ฐฐํฌ๋ฅผ ์ํด ์๋ ๋น๋ ๋ฐ ํ ์คํธ, AWS ์๋ฒ ๋ฐฐํฌ๊น์ง ํ ๋ฒ์ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ์์คํ ์ ๊ตฌ์ถ
- ์๋ ๋ฐฐํฌ (๊ธฐ์กด ๋ฐฉ์)
- ๋น๋, ์ ๋ก๋, ๋ฐฐํฌ ๋ฑ ์์ ์ ์๋์ผ๋ก ์งํ
- ๋ฐฐํฌ ์๋๊ฐ ๋๋ฆฌ๊ณ , ๋ฐฐํฌ ํ ์๋ ํ์ธ ํ์
- ๋ฐฐํฌ ๋ด๋น์๊ฐ ํ์ํ์ฌ ํ์ ํจ์จ์ฑ์ด ๋ฎ์
- CI/CD ๊ตฌ์ถ (๊ฐ์ ๋ฐฉ์)
-
์๋ํ๋ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
develop
๋ฐmaster
๋ธ๋์น์pull request
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ํ ์คํธ๋ฅผ ์คํ- ํ
์คํธ ์ฑ๊ณต ์ โ ์๋์ผ๋ก
merge
๋ฅผ ์ํ (Github Settings) - ํ
์คํธ ์คํจ ์ โ ์๋์ผ๋ก๋
merge
ํ ์ ์๋๋ก ์ ํ (Github Settings)
- ํ
์คํธ ์ฑ๊ณต ์ โ ์๋์ผ๋ก
develop
๋ธ๋์น์master
๋ธ๋์น์push
๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ํ ์คํธ๋ฅผ ์คํ- ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ
PR
์ฝ๋ฉํธ๋ก ์ถ๋ ฅ
master
๋ธ๋์น์์ ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ์๋ ๋ฐฐํฌjar
ํ์ผ์ ์์ฑํ์ฌAWS Elastic Beanstalk
์ ๋ฐฐํฌ
- GitHub Actions ํ๋ซํผ ์ด์ฉ
- GitHub์ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ๊ฐํธํ ์ค์ ๊ฐ๋ฅ
- ํ์ฅ์ฑ ๋ฐ์ด๋ ๋ค์ํ ๋ฐฐํฌ ํ๊ฒฝ ์ง์
- ์ฝ๋ ๋ณ๊ฒฝ๋ง๋ค ๋น๋, ํ
์คํธ, ๋ฐฐํฌ ๋ฑ์ ์์
์ ์๋์ผ๋ก ์คํ
- ํ์ ํจ์จ์ฑ ๋ํญ ์ฆ๊ฐ
-
- Soft Delete ์ ์ฉ์ ์ํด @Where ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ is_deleted = false์ธ ๋ฐ์ดํฐ๋ง ์กฐํํ๋๋ก ์ค์
- @SQLDelete ์ด๋ ธํ ์ด์ ์ ํ์ฉํ์ฌ ์ญ์ ์์ฒญ ์ ์ค์ ๋ฐ์ดํฐ ์ญ์ ๋์ Soft Delete ์ฒ๋ฆฌ๋๋๋ก SQL ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑ
- SQL ์คํ ์ค
SQLSyntaxErrorException
๋ฐ์ - ์์ธ ๋ถ์ ๊ฒฐ๊ณผ:
- ์ค์ ํ ์ด๋ธ ์ปฌ๋ผ๋ช : id
- ์๋ชป๋ SQL ๊ตฌ๋ฌธ์์ ์ฌ์ฉํ ์ปฌ๋ผ๋ช : member_id
- member_id ์ปฌ๋ผ์ด ์กด์ฌํ์ง ์์ SQL ๊ตฌ๋ฌธ ์ค๋ฅ ๋ฐ์
- ์๋ชป๋ ์ปฌ๋ผ๋ช member_id๋ฅผ ์ค์ ํ ์ด๋ธ ์ปฌ๋ผ๋ช id๋ก ์์ ํ์ฌ ์ ์์ ์ผ๋ก Soft Delete๊ฐ ๋์ํ๋๋ก ์์
- ํ๋ก์ ํธ ์ด๊ธฐ์ AWS Elastic Beanstalk ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ๋ฐฐํฌํ๊ณ , Postman์ผ๋ก API ํ ์คํธ ์งํ
- API ์์ฒญ ์
502 Bad Gateway
์๋ต ๋ฐ์ - ์์ธ ๋ถ์ ๊ฒฐ๊ณผ:
- ์๋ฒ ๊ฐ์ ํต์ ๊ณผ์ ์์ ์ ํจํ์ง ์์ ์๋ต์ด ๋ฐํ๋จ
- Elastic Beanstalk์ ๊ธฐ๋ณธ ์ค์ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํฌํธ
5000
์์ ์คํ๋จ - Elastic Beanstalk์ ๊ธฐ๋ณธ ํ๊ฒฝ์์๋ NginX๊ฐ Reverse Proxy๋ก ์ฌ์ฉ, ๋ด๋ถ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ํ๋ก์ ์ญํ ์ ์ํํ์ฌ ์์ฒญ์ ํฌํธ
5000
์ผ๋ก ์ ๋ฌํด์ผ ํจ
- Elastic Beanstalk ์ ํ๋ฆฌ์ผ์ด์
ํ๊ฒฝ ์์ฑ์์
SERVER_PORT
์ ๊ฐ์ 5000์ผ๋ก ์ค์ - NginX์ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ํฌํธ ์ผ์น๋ฅผ ๋ณด์ฅํ์ฌ ์ ์์ ์ผ๋ก ์์ฒญ์ ์ ๋ฌํ ์ ์๋๋ก ์์
CI/CD
: GitHub Actions๋ฅผ ํ์ฉํ์ฌ ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
AWS Elastic Beanstalk
: ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌ ๋ฐ ์ด์
Redis
: ๊ฒ์์ด ์บ์ฑ ๋ฐ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ฉ
github Actions
: CI/CD ์๋ํ ์ํฌํ๋ก์ฐ ๊ตฌ์ฑ
RDS
: AWS RDS๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ๋ฐ ์ด์ ์์ ์ฑ ํ๋ณด
MySQL
: ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํธ๋์ญ์
๋ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง
- Redis ์บ์ฑ์ ์ ์ฉํ์ฌ ์ธ๊ธฐ ๊ฒ์์ด ์กฐํ ๊ธฐ๋ฅ ์ ๊ณต
- ๊ธฐ์กด DB ์กฐํ ๋ฐฉ์๋ณด๋ค ๋น ๋ฅด๊ฒ ์ธ๊ธฐ ๊ฒ์์ด ๋ชฉ๋ก์ ๋ฐํํ์ฌ ์ฑ๋ฅ ์ต์ ํ
- ํธ๋ํฝ ์ฆ๊ฐ ์์๋ ์์ ์ ์ธ ๊ฒ์์ด ์กฐํ ๊ฐ๋ฅ
- B+Tree Index์ QueryDSL์ ํ์ฉํ์ฌ ๊ฐ๊ฒฉ ๋ฒ์ ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ
- Slice ๊ธฐ๋ฐ ํ์ด์ง ์ ์ฉ์ผ๋ก ๋ถํ์ํ ๋ฐ์ดํฐ ๋ก๋ฉ ๋ฐฉ์ง ๋ฐ ์ฑ๋ฅ ๊ฐ์
- ๋น ๋ฅธ ๊ฐ๊ฒฉ๋ณ ์ํ ๊ฒ์ ๊ฐ๋ฅ, ํธ๋ํฝ ์ฆ๊ฐ ์์๋ ์ํํ ์กฐํ ์ฑ๋ฅ ์ ์ง
- ์ ๊ธฐ์ ์ธ ๋ฏธํ ์ผ๋ก ์งํ ์ํฉ ๊ณต์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
- ํ ์ฌ๋์ ํตํด ์งํ ์ํฉ ๊ณต์