SOPT 38๊ธฐ ์๋ฒ ํํธ ์ธ๋ฏธ๋ ์ค์ต๊ณผ ๊ณผ์ ๋ฅผ ์ํด ๋ง๋ ๊ฒ์ํ ์๋ฒ์ ๋๋ค. ๋ํ ์ปค๋ฎค๋ํฐ ์ฑ ์๋ธ๋ฆฌํ์์ ์์ ๊ฒ์ํ์ ๋ชจ๋ธ๋ก ์ก์๊ณ , ์์ ์๋ฐ ์ฝ์ ๊ฒ์ํ์์ ์ถ๋ฐํด ๋งค์ฃผ ํ ๋จ๊ณ์ฉ Spring ๋ฐฑ์๋๋ก ๋ฐ์ ์์ผ ์์ต๋๋ค. ํ์ฐจ๊ฐ ์์ผ ๋๋ง๋ค ๊ทธ๋๊ทธ๋ ์ด๋ค ๊ณ ๋ฏผ์ ํ๊ณ ๋ฌด์์ ์๋ก ๋ฐฐ์ ๋์ง๋ ํจ๊ป ๋จ๊ฒจ๋๋ ค๊ณ ํฉ๋๋ค.
Language & Framework
Database
Auth
Infra & Deploy
Build & Docs & Test
์ฐ์ ์๋ฐ๋ง์ผ๋ก ๊ฒ์ํ์ ์ฝ์์์ ๋ง๋ค์ด๋ดค์ต๋๋ค. ํ๋ ์์ํฌ ์์ด ๊ฐ์ฒด์ ์ปฌ๋ ์ ๋ง์ผ๋ก ๊ธ์ ์ฐ๊ณ ์ฝ์ผ๋ฉด์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ ๊ฒํ๋ ๋จ๊ณ์์ด์.
์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ, ๋๋ฉ์ธ์ผ๋ก ๋๋๋ 4๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ก๊ณ ๊ฒ์๊ธ CRUD๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ฒ์์๋ ํ ํด๋์ค์ ๊ธฐ๋ฅ์ ๋ค ๋ชฐ์๋ฃ์๋๋ฐ, ์์ธ ์ฒ๋ฆฌ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ฐ๋ก ๋ผ์ด๋ด๋ฉด์ ์ฑ ์ ๋ถ๋ฆฌ์ ์ค์์ฑ์ ์๊ฒ ๋์์ต๋๋ค. ์๋ต ํ์๋ ๊ณตํต ํฌ๋งท์ผ๋ก ๋ฌถ์ด ํต์ผํ์ต๋๋ค.
๊ธฐ์กด ์ฝ๋๋ฅผ Spring Boot๋ก ์ฎ๊ฒผ์ต๋๋ค. ์ง์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ๋ถ๋ถ์ ๋น ์ฃผ์
์ผ๋ก ๋ฐ๊พธ๊ณ , ์ปจํธ๋กค๋ฌ๋ REST API ํํ๋ก ๋ฆฌํฉํ ๋งํ์ต๋๋ค. ์์ธ๋ GlobalExceptionHandler์์ ํ๊ณณ์ ๋ชจ์ ์ฒ๋ฆฌํ๊ณ , ErrorCode enum์ผ๋ก ์๋ฌ ์ฝ๋ ์ฒด๊ณ๋ฅผ ์ธ์ ์ต๋๋ค. ๊ฒ์ํ ์ข
๋ฅ๋ณ ์กฐํ์ ํ์ด์ง๋ค์ด์
์ ๋ถ์ด๊ณ , ์ฉ๋์ ๋ง๊ฒ ์์ฒญ๊ณผ ์๋ต DTO๋ฅผ ๋๋ ํ์ฐจ์ด๊ธฐ๋ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋๋ผ DB์ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ์ต๋๋ค. JPA์ H2์์ MySQL๋ก ์ฎ๊ฒผ๊ณ , BaseEntity์ JPA Auditing์ผ๋ก ์์ฑ ์๊ฐ๊ณผ ์์ ์๊ฐ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋๋ก ๋ฆฌํฉํ ๋งํ์ต๋๋ค. ๊ธ ์ญ์ ๋ ์ค์ ๋ก ์ง์ฐ๋ ๋์ ํ๋๊ทธ๋ง ๋ฐ๊พธ๋ ์ํํธ ๋๋ฆฌํธ๋ก ์ฒ๋ฆฌํ์ต๋๋ค. ์ข์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด์ ๊ฐ์ ๊ธ์ ์ข์์๊ฐ ๋ชฐ๋ฆฌ๋ ์ํฉ์ ๋๋นํด ๋๊ด์ ๋ฝ๊ณผ ์ฌ์๋ ๋ก์ง์ ๋ฃ์๊ณ , ๋ชฉ๋ก ์กฐํ์์ ๋ฐ์ํ๋ N+1 ๋ฌธ์ ๋ fetch join์ผ๋ก ํด๊ฒฐํ์ต๋๋ค. ์ ๋ชฉ ๊ฒ์์ JPQL๋ก ๋ง๋ค์๋ค๊ฐ ๋์ค์ QueryDSL๋ก ๋ค์ ๋ฆฌํฉํ ๋งํ์๊ณ , API ๋ฌธ์๋ Swagger๋ก ์๋ํํ์ต๋๋ค.
๋ฐฐํฌ๋ฅผ ์งํํ์ต๋๋ค. ์๋ฒ๋ AWS EC2์ ์ฌ๋ฆฌ๊ณ DB๋ Amazon RDS๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, ์๋จ์๋ Caddy๋ฅผ ๋์ด HTTPS๊น์ง ์ ์ฉํ์ต๋๋ค.
๊ธฐํ, ๋์์ธ, ์น ํํธ์ ํจ๊ป ๋ค์ด๋ฒ N๋ฐฐ์ก์ ๋ฆฌ๋์์ธํ ํฉ๋ ์ธ๋ฏธ๋๋ฅผ ์งํํ์ต๋๋ค. ์์ ์ ๋ณ๋ ๋ ํฌ์์ ์งํํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ฌผ : 38-COLLABORATION-SERVER-NAVER
์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ ์ฉํ์ต๋๋ค. ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธ์ ๋ง๋ค๊ณ , JWT ์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ๋ฐ๊ธํ๊ณ ๊ฒ์ฆํ๋ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค. Spring Security์ ์ง์ ๋ง๋ JwtAuthFilter๋ฅผ ์ฐ๋ํด ์์ฒญ๋ง๋ค ํ ํฐ์ ํ์ธํ๊ณ , ๋น๋ฐ๋ฒํธ๋ BCrypt๋ก ํด์ฑํด์ ์ ์ฅํ์ต๋๋ค. ์ฌํ ๊ณผ์ ๋ก๋ ์นด์นด์ค OAuth 2.0 ์์
๋ก๊ทธ์ธ์ ์ถ๊ฐํ๊ณ , ํ ํฐ์ jti๋ฅผ ๋ฃ์ด ๋ก๊ทธ์์ํ ๋ Redis ๋ธ๋๋ฆฌ์คํธ๋ก ๋ฌดํจํํ๋ ํ๋ฆ๊น์ง ๊ตฌํํด๋ดค์ต๋๋ค. ๊ฒ์๊ธ ๋ชฉ๋ก์ ๋์ณค๋ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ปค์ ๊ธฐ๋ฐ ๋ฌดํ ์คํฌ๋กค๋ก ๋ฐ๊ฟจ๊ณ , ๊ทธ๋์ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ ธ ์๋ ๊ณตํต ์๋ต๊ณผ ์์ธ ๊ตฌ์กฐ, ํจํค์ง ๊ตฌ์กฐ๋ ์ ๋ฐ์ ์ผ๋ก ๋ฆฌํฉํ ๋งํ์ต๋๋ค.
Java 21์ ๊ฐ์ ์ค๋ ๋๋ฅผ ์ ์ฉํด๋ณด๊ณ ์ ์ฉ ์ ํ ์ฑ๋ฅ์ ๋น๊ตํ์ต๋๋ค. on/off๋ฅผ ์ค์ ์ผ๋ก ๋ถ๋ฆฌํ ๋ค k6๋ก ๋ถํ ํ
์คํธ๋ฅผ ์งํํ์ต๋๋ค. ์ปค๋ฅ์
ํ์ด ๋ณ๋ชฉ์ธ ๊ฒฝ์ฐ์๋ ๊ฐ์ ์ค๋ ๋๊ฐ ํฐ ๋์์ด ์ ๋๋๋ฐ, ์ค๋ ๋ ์์ฒด๊ฐ ๋ณ๋ชฉ์ธ ๊ฒฝ์ฐ์๋ ์ฒ๋ฆฌ๋์ด ์ฝ 1.77๋ฐฐ๊น์ง ์ฌ๋ผ๊ฐ์ต๋๋ค. ๋ณ๋ชฉ ์ง์ ์ ๋ฐ๋ผ ๊ฐ์์ค๋ ๋๊ฐ ์ ํจํ ์๊ฐ์ด ์ธ์ ์ธ์ง ํ์ธํ ์ ์์์ต๋๋ค. ์ถ๊ฐ๋ก ๋ฉ์ด์ปค์ค ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ์ฌ ErrorCode๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Swagger ์๋ฌ ์๋ต์ ์๋ ๋ฌธ์ํํ๊ณ , Bean Validation์ผ๋ก ์
๋ ฅ ๊ฒ์ฆ๋ ์ถ๊ฐํ์ต๋๋ค.
์ฑ์ผ ๊ฐ์ด๋์ ๋ ธํ์ฐ๋ฅผ ์ ๋ฌ ๋ฐ๊ณ SOPT ์ถ์ ์ฐ์ฌ๋ถ๋ค์ ๊ฐ์ฐ์ ๋ฃ๋ ์๊ฐ์ด์์ต๋๋ค. ๋ณ๋์ ์ฝ๋ ์์ ์ ์งํํ์ง ์์์ต๋๋ค.
- ๊ฒ์๊ธ ์์ฑ, ์กฐํ, ์์ , ์ญ์ (์ํํธ ๋๋ฆฌํธ)
- ๊ฒ์ํ ์ข ๋ฅ๋ณ ์กฐํ์ ์ปค์ ๊ธฐ๋ฐ ๋ฌดํ ์คํฌ๋กค
- ์ ๋ชฉ ๊ฒ์ (QueryDSL)
- ์ข์์ ์ถ๊ฐ์ ์ทจ์ (๋์์ฑ ๋์)
- ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ๋ด ์ ๋ณด ์กฐํ
- JWT ์ธ์ฆ๊ณผ ํ ํฐ ์ฌ๋ฐ๊ธ, ๋ก๊ทธ์์ ๋ธ๋๋ฆฌ์คํธ
- ์นด์นด์ค ์์ ๋ก๊ทธ์ธ
- Swagger API ๋ฌธ์
src/main/java/org/sopt
โโโ domain
โ โโโ post ๊ฒ์๊ธ
โ โโโ user ํ์
โ โโโ auth ์ธ์ฆ, ํ ํฐ, OAuth
โ โโโ like ์ข์์
โโโ global
โโโ config ๊ณตํต ์ค์
โโโ security ์ธ์ฆ ํํฐ, ํ ํฐ
โโโ persistence BaseEntity
โโโ response ๊ณตํต ์๋ต
โโโ exception ์์ธ ์ฒ๋ฆฌ, ์๋ฌ ์ฝ๋
โโโ swagger ๋ฌธ์ ์๋ํ
๋๋ฉ์ธ๋ง๋ค controller, service, repository, entity, dto, exception์ ๋๊ณ , ๊ณตํต์ผ๋ก ์ฐ๋ ๋ถ๋ถ์ global ์๋์ ๋ชจ์๋ ๊ตฌ์กฐ์ ๋๋ค.
MySQL๊ณผ Redis๋ docker-compose๋ก ๋์๋๋ค.
docker-compose up -d
./gradlew bootRun