Skip to content

38-lets-sopt-server/jinsu.shin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

131 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

banner_server.png

์—๋ธŒ๋ฆฌํƒ€์ž„ ํด๋ก  ์„œ๋ฒ„

SOPT 38๊ธฐ ์„œ๋ฒ„ ํŒŒํŠธ ์„ธ๋ฏธ๋‚˜ ์‹ค์Šต๊ณผ ๊ณผ์ œ๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ๊ฒŒ์‹œํŒ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ๋Œ€ํ•™ ์ปค๋ฎค๋‹ˆํ‹ฐ ์•ฑ ์—๋ธŒ๋ฆฌํƒ€์ž„์˜ ์ž์œ ๊ฒŒ์‹œํŒ์„ ๋ชจ๋ธ๋กœ ์žก์•˜๊ณ , ์ˆœ์ˆ˜ ์ž๋ฐ” ์ฝ˜์†” ๊ฒŒ์‹œํŒ์—์„œ ์ถœ๋ฐœํ•ด ๋งค์ฃผ ํ•œ ๋‹จ๊ณ„์”ฉ Spring ๋ฐฑ์—”๋“œ๋กœ ๋ฐœ์ „์‹œ์ผœ ์™”์Šต๋‹ˆ๋‹ค. ํšŒ์ฐจ๊ฐ€ ์Œ“์ผ ๋•Œ๋งˆ๋‹ค ๊ทธ๋•Œ๊ทธ๋•Œ ์–ด๋–ค ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ  ๋ฌด์—‡์„ ์ƒˆ๋กœ ๋ฐฐ์› ๋Š”์ง€๋„ ํ•จ๊ป˜ ๋‚จ๊ฒจ๋‘๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์Šคํƒ

Language & Framework

Java Spring Boot Spring Security JPA QueryDSL

Database

MySQL Redis

Auth

JWT Kakao

Infra & Deploy

EC2 RDS Caddy

Build & Docs & Test

Gradle Swagger k6

ํšŒ์ฐจ๋ณ„ ๊ธฐ๋ก

๋ชธํ’€๊ธฐ ๊ณผ์ œ

์šฐ์„  ์ž๋ฐ”๋งŒ์œผ๋กœ ๊ฒŒ์‹œํŒ์„ ์ฝ˜์†”์—์„œ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ๊ฐ์ฒด์™€ ์ปฌ๋ ‰์…˜๋งŒ์œผ๋กœ ๊ธ€์„ ์“ฐ๊ณ  ์ฝ์œผ๋ฉด์„œ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ ๊ฒ€ํ•˜๋Š” ๋‹จ๊ณ„์˜€์–ด์š”.

1์ฐจ ์„ธ๋ฏธ๋‚˜

์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, ๋„๋ฉ”์ธ์œผ๋กœ ๋‚˜๋ˆ„๋Š” 4๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์žก๊ณ  ๊ฒŒ์‹œ๊ธ€ CRUD๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ•œ ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ์„ ๋‹ค ๋ชฐ์•„๋„ฃ์—ˆ๋Š”๋ฐ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋”ฐ๋กœ ๋–ผ์–ด๋‚ด๋ฉด์„œ ์ฑ…์ž„ ๋ถ„๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ํ˜•์‹๋„ ๊ณตํ†ต ํฌ๋งท์œผ๋กœ ๋ฌถ์–ด ํ†ต์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

2์ฐจ ์„ธ๋ฏธ๋‚˜

๊ธฐ์กด ์ฝ”๋“œ๋ฅผ Spring Boot๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋˜ ๋ถ€๋ถ„์„ ๋นˆ ์ฃผ์ž…์œผ๋กœ ๋ฐ”๊พธ๊ณ , ์ปจํŠธ๋กค๋Ÿฌ๋„ REST API ํ˜•ํƒœ๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋Š” GlobalExceptionHandler์—์„œ ํ•œ๊ณณ์— ๋ชจ์•„ ์ฒ˜๋ฆฌํ•˜๊ณ , ErrorCode enum์œผ๋กœ ์—๋Ÿฌ ์ฝ”๋“œ ์ฒด๊ณ„๋ฅผ ์„ธ์› ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œํŒ ์ข…๋ฅ˜๋ณ„ ์กฐํšŒ์™€ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๋ถ™์ด๊ณ , ์šฉ๋„์— ๋งž๊ฒŒ ์š”์ฒญ๊ณผ ์‘๋‹ต DTO๋ฅผ ๋‚˜๋ˆˆ ํšŒ์ฐจ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

3์ฐจ ์„ธ๋ฏธ๋‚˜

๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ DB์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. JPA์™€ H2์—์„œ MySQL๋กœ ์˜ฎ๊ฒผ๊ณ , BaseEntity์™€ JPA Auditing์œผ๋กœ ์ƒ์„ฑ ์‹œ๊ฐ๊ณผ ์ˆ˜์ • ์‹œ๊ฐ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธ€ ์‚ญ์ œ๋Š” ์‹ค์ œ๋กœ ์ง€์šฐ๋Š” ๋Œ€์‹  ํ”Œ๋ž˜๊ทธ๋งŒ ๋ฐ”๊พธ๋Š” ์†Œํ”„ํŠธ ๋”œ๋ฆฌํŠธ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๊ฐ™์€ ๊ธ€์— ์ข‹์•„์š”๊ฐ€ ๋ชฐ๋ฆฌ๋Š” ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•ด ๋‚™๊ด€์  ๋ฝ๊ณผ ์žฌ์‹œ๋„ ๋กœ์ง์„ ๋„ฃ์—ˆ๊ณ , ๋ชฉ๋ก ์กฐํšŒ์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ N+1 ๋ฌธ์ œ๋Š” fetch join์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๋ชฉ ๊ฒ€์ƒ‰์€ JPQL๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— QueryDSL๋กœ ๋‹ค์‹œ ๋ฆฌํŒฉํ† ๋งํ•˜์˜€๊ณ , API ๋ฌธ์„œ๋Š” Swagger๋กœ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

4์ฐจ ์„ธ๋ฏธ๋‚˜

๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” AWS EC2์— ์˜ฌ๋ฆฌ๊ณ  DB๋Š” Amazon RDS๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, ์•ž๋‹จ์—๋Š” Caddy๋ฅผ ๋‘์–ด HTTPS๊นŒ์ง€ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

5์ฐจ ์„ธ๋ฏธ๋‚˜

๊ธฐํš, ๋””์ž์ธ, ์›น ํŒŒํŠธ์™€ ํ•จ๊ป˜ ๋„ค์ด๋ฒ„ N๋ฐฐ์†ก์„ ๋ฆฌ๋””์ž์ธํ•œ ํ•ฉ๋™ ์„ธ๋ฏธ๋‚˜๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์€ ๋ณ„๋„ ๋ ˆํฌ์—์„œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ : 38-COLLABORATION-SERVER-NAVER

6์ฐจ ์„ธ๋ฏธ๋‚˜

์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๋งŒ๋“ค๊ณ , JWT ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Spring Security์™€ ์ง์ ‘ ๋งŒ๋“  JwtAuthFilter๋ฅผ ์—ฐ๋™ํ•ด ์š”์ฒญ๋งˆ๋‹ค ํ† ํฐ์„ ํ™•์ธํ–ˆ๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” BCrypt๋กœ ํ•ด์‹ฑํ•ด์„œ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ฌํ™” ๊ณผ์ œ๋กœ๋Š” ์นด์นด์˜ค OAuth 2.0 ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ํ† ํฐ์— jti๋ฅผ ๋„ฃ์–ด ๋กœ๊ทธ์•„์›ƒํ•  ๋•Œ Redis ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋กœ ๋ฌดํšจํ™”ํ•˜๋Š” ํ๋ฆ„๊นŒ์ง€ ๊ตฌํ˜„ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์€ ๋†“์ณค๋˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ์ปค์„œ ๊ธฐ๋ฐ˜ ๋ฌดํ•œ ์Šคํฌ๋กค๋กœ ๋ฐ”๊ฟจ๊ณ , ๊ทธ๋™์•ˆ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ ธ ์žˆ๋˜ ๊ณตํ†ต ์‘๋‹ต๊ณผ ์˜ˆ์™ธ ๊ตฌ์กฐ, ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋„ ์ „๋ฐ˜์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

7์ฐจ ์„ธ๋ฏธ๋‚˜

Java 21์˜ ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์šฉํ•ด๋ณด๊ณ  ์ ์šฉ ์ „ํ›„ ์„ฑ๋Šฅ์„ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. on/off๋ฅผ ์„ค์ •์œผ๋กœ ๋ถ„๋ฆฌํ•œ ๋’ค k6๋กœ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋„ฅ์…˜ ํ’€์ด ๋ณ‘๋ชฉ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ๊ฐ€ ํฐ ๋„์›€์ด ์•ˆ ๋๋Š”๋ฐ, ์Šค๋ ˆ๋“œ ์ž์ฒด๊ฐ€ ๋ณ‘๋ชฉ์ธ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์•ฝ 1.77๋ฐฐ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ”์Šต๋‹ˆ๋‹ค. ๋ณ‘๋ชฉ ์ง€์ ์— ๋”ฐ๋ผ ๊ฐ€์ƒ์Šค๋ ˆ๋“œ๊ฐ€ ์œ ํšจํ•œ ์ˆœ๊ฐ„์ด ์–ธ์ œ ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ ๋ฉ”์ด์ปค์Šค ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ErrorCode๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Swagger ์—๋Ÿฌ ์‘๋‹ต์„ ์ž๋™ ๋ฌธ์„œํ™”ํ•˜๊ณ , Bean Validation์œผ๋กœ ์ž…๋ ฅ ๊ฒ€์ฆ๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

8์ฐจ ์„ธ๋ฏธ๋‚˜

์•ฑ์žผ ๊ฐ€์ด๋“œ์™€ ๋…ธํ•˜์šฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›๊ณ  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

About

๋‚ดํž˜๋“ค๋‹ค ๐Ÿ˜ญ

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors