Skip to content

kitworks-kiring/kiring-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

201 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Kiring: ํšŒ์‚ฌ ์ƒํ™œ์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ

๋Œ€ํ‘œ ์ด๋ฏธ์ง€

์˜ค๋Š˜ ์ ์‹ฌ์—๋Š” ๋ฌด์—‡์„ ๋จน์„์ง€, ์ผ์ •์„ ํ•œ ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์—†์„์ง€, ํ‡ด๊ทผ์€ ๋˜ ์–ด๋–ป๊ฒŒ ํ• ์ง€.. ํšŒ์‚ฌ์›์ด๋ผ๋ฉด ํ•œ๋ฒˆ ์ฏค ํ•ด๋ณธ ๊ณ ๋ฏผ๋“ค์ž…๋‹ˆ๋‹ค.

ํ‚ค๋ง์€ ํšŒ์‚ฌ ๊ทผ์ฒ˜ ์‹๋‹น ๋ฆฌ์ŠคํŠธ, ๊ตํ†ต ์ •๋ณด, ์บ˜๋ฆฐํ„ฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ ๋“ฑ ํšŒ์‚ฌ ์ƒํ™œ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ํ•œ ๊ณณ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํšŒ์‚ฌ ์ƒํ™œ์„ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์˜ฌ์ธ์› ํ”Œ๋žซํผ ํ‚ค๋ง์—์„œ, ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด๋ณด์„ธ์š”!


1๏ธโƒฃ ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ  ์Šคํƒ

BE ๊ธฐ์ˆ  ์Šคํƒ


๐Ÿค– ๋ฐฑ์—”๋“œ

์Šคํƒ ๋ฒ„์ „ ์„ ์ • ์ด์œ  ๋ฐ ํšจ๊ณผ
Spring Boot 3.2.x ยท ๊ฐ•๋ ฅํ•œ DI/AOP, ๋ฐฉ๋Œ€ํ•œ ์ƒํƒœ๊ณ„, ๋‹ค๋ฅธ Spring ํ”„๋กœ์ ํŠธ์™€์˜ ์œ ๊ธฐ์ ์ธ ํ†ตํ•ฉ์„ ํ†ตํ•ด ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ–ˆ์Šต๋‹ˆ๋‹ค.
Spring Security 6.2.x ยท OAuth2์™€ JWT๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ณต์žกํ•œ ์ธ์ฆ/์ธ๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•„ํ„ฐ ์ฒด์ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
ยท ๋ฉ”์„œ๋“œ ์‹œํ๋ฆฌํ‹ฐ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋‹จ์œ„์˜ ์„ธ๋ฐ€ํ•œ ๊ถŒํ•œ ์ œ์–ด๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
Spring Data JPA 3.2.x ยท ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์œ„ํ•ด ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
ยท Fetch Join, BatchSize ๋“ฑ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ์ „๋žต์„ ์ ์šฉํ•˜๋ฉฐ JPA์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.
QueryDSL 5.1.0 ยท ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , ๋ณต์žกํ•œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ํƒ€์ž…-์„ธ์ดํ”„(Type-Safe)ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
ยท ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฟผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
Jib 3.4.x ยท Dockerfile ์—†์ด๋„ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ตœ์ ํ™”๋œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ , ๋ ˆ์ด์–ด ์บ์‹ฑ์„ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋นŒ๋“œ ์†๋„๋ฅผ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
JJWT 0.12.x ยท Stateless ์ธ์ฆ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์ธ JWT์˜ ์ƒ์„ฑ, ํŒŒ์‹ฑ, ๊ฒ€์ฆ์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—‚๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์Šคํƒ ๋ฒ„์ „ ์„ ์ • ์ด์œ  ๋ฐ ํšจ๊ณผ
MySQL 8.0 ยท ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” RDBMS๋กœ ์•ˆ์ •์„ฑ์ด ๊ฒ€์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ยท ํŠนํžˆ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค(Spatial Index)์™€ ๊ด€๋ จ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์ ์ธ ์œ„์น˜ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
Redis 7.x ยท ํ–ฅํ›„ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ์˜ˆ์ •์ธ ์‹ค์‹œ๊ฐ„ ๋žญํ‚น๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๊ณผ ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ ๋‹ค์ค‘์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.
ยท ํ˜„์žฌ ์ข‹์•„์š” ๊ธฐ๋Šฅ, ์˜ค๋Š˜์˜ ํšŒ์›์ถ”์ฒœ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฌ ์ธํ”„๋ผ & ๋ฐ๋ธŒ์˜ต์Šค

์Šคํƒ ๋ฒ„์ „ ์„ ์ • ์ด์œ  ๋ฐ ํšจ๊ณผ
AWS - ยท EC2, RDS, ALB, ACM, Route 53 ๋“ฑ AWS์˜ ๊ฐ•๋ ฅํ•œ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.
Docker 26.x ยท ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆํ™”ํ•˜์—ฌ ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋“  ๋™์ผํ•œ ์‹คํ–‰์„ ๋ณด์žฅํ•˜๊ณ , ๋ฐฐํฌ์˜ ์ผ๊ด€์„ฑ๊ณผ ์ด์‹์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
GitHub Actions - ยท JIB์„ ์‚ฌ์šฉํ•ด ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ์ด๋ฏธ์ง€ ํ‘ธ์‹œ, EC2 ๋ฐฐํฌ๊นŒ์ง€์˜ ์ „ ๊ณผ์ •์„ ์ตœ์ ํ™”์™€ ์ž๋™ํ™”ํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ฃผ์š” ๊ตฌํ˜„ ์ „๋žต

์ฃผ์š” ๊ตฌํ˜„ ์ „๋žต

๐Ÿ›๏ธ ์•„ํ‚คํ…์ฒ˜

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

  • AWS์˜ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์ธํ”„๋ผ ๊ด€๋ฆฌ ๋ถ€๋‹ด์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋ชจ๋“  ๋ฐฐํฌ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์š”์ฒญ โ†’ Route 53 โ†’ ALB (HTTPS, ACM ์ธ์ฆ์„œ) โ†’ EC2 (Docker) โ†’ RDS (MySQL) ์˜ ํ๋ฆ„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.


โœจ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  • ์ธ์ฆ/์ธ๊ฐ€: ์นด์นด์˜ค OAuth2 ์†Œ์…œ ๋กœ๊ทธ์ธ๊ณผ JWT (Access/Refresh Token) ๊ธฐ๋ฐ˜์˜ Stateless ์ธ์ฆ ์‹œ์Šคํ…œ

  • ๋ง›์ง‘(Place) ์„œ๋น„์Šค: ์œ„์น˜ ๊ธฐ๋ฐ˜ ๊ทผ์ฒ˜ ๋ง›์ง‘ ๊ฒ€์ƒ‰, ๋™์  ์ •๋ ฌ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ๋ง, ์ข‹์•„์š”/์ทจ์†Œ ๊ธฐ๋Šฅ

  • ํŒ€/๋ฉค๋ฒ„ ๊ด€๋ฆฌ: ํŒ€ ์ƒ์„ฑ ๋ฐ ๋ฉค๋ฒ„ ์†Œ์† ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ ๋ฐ ์ˆ˜์ •

  • ์บ˜๋ฆฐ๋” ์„œ๋น„์Šค: ํŒ€ ๊ณต์œ  ์บ˜๋ฆฐ๋”, ์ผ๋ฐ˜ ์ผ์ • ๋“ฑ๋ก ๋ฐ ํŒ€์› ์ƒ์ผ ๋™์  ํ‘œ์‹œ

  • ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ: ์—‘์…€ ํŒŒ์ผ ์ผ๊ด„ ์—…๋กœ๋“œ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Bulk Insert

  • API ๋ฌธ์„œ: Swagger (OpenAPI 3.0)๋ฅผ ํ†ตํ•œ ์ž๋™ API ๋ฌธ์„œํ™”


3๏ธโƒฃ ๊ธฐ์ˆ ์  ๋„์ „๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •

๐Ÿ‘ ์‹ค์‹œ๊ฐ„ '์ข‹์•„์š”'๊ธฐ๋Šฅ์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ•ด๊ฒฐ

โ˜‘๏ธ ์ฃผ์š” ๊ธฐ์ˆ 

  • Redis, Spring @Async, @EventListener

โ˜‘๏ธ ํ•ด๊ฒฐ ์ „๋žต ๋ฐ ํšจ๊ณผ

  • ๋™์‹œ์„ฑ์— ๋”ฐ๋ฅธ DB ์“ฐ๊ธฐ ๋ฝ ๊ฒฝํ•ฉ ๋ฐ ์ปค๋„ฅ์…˜ ํ’€ ๊ณ ๊ฐˆ ๋ฌธ์ œ๋ฅผ Redis์˜ Atomic ์—ฐ์‚ฐ๊ณผ Spring์˜ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Redis์—์„œ ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ์ฒ˜๋ฆฌ ํ›„, DB ์ €์žฅ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ์š”์ฒญ ์‹คํŒจ์œจ์„ 72% โ†’ 0%, 95% ์‘๋‹ต์‹œ๊ฐ„์„ 1์ดˆ โ†’ 255ms๋กœ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ” ๊ฒ€์ƒ‰ API์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ™•๋ณด

โ˜‘๏ธ ์ฃผ์š” ๊ธฐ์ˆ 

  • QueryDSL

โ˜‘๏ธ ํ•ด๊ฒฐ ์ „๋žต ๋ฐ ํšจ๊ณผ

  • Native Query ๋ฐฉ์‹์œผ๋กœ ์ธํ•œ ์ฝ”๋“œ ์ค‘๋ณต ๋ฐ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฌธ์ œ๋ฅผ QueryDSL์˜ ํƒ€์ž… ์„ธ์ดํ”„ ๋™์  ์ฟผ๋ฆฌ๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ •๋ ฌ ์กฐ๊ฑด ์ถ”๊ฐ€ ์‹œ๋„๋งˆ๋‹ค ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ํ•„์š” ์—†์ด BooleanExpression๊ณผ OrderSpecifier ์กฐํ•ฉ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.


4๏ธโƒฃ ํŒ€ ํ˜‘์—… ๊ณผ์ •

๐Ÿ—ƒ๏ธ Github์„ ์ด์šฉํ•œ ๊ฐœ๋ฐœ ๊ณผ์ • ๋ฌธ์„œํ™”

ํ˜‘์—…1: Github


๐Ÿฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ AI ๋„์ž…

ํ˜‘์—…2: ์ฝ”๋“œ๋ฆฌ๋ทฐ AI


๐Ÿ“” Notion์„ ์ด์šฉํ•œ ๋กœ๋“œ๋งต ๊ด€๋ฆฌ

ํ˜‘์—…3: Notion


5๏ธโƒฃ ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ” ์†Œ์…œ ๋กœ๊ทธ์ธ

์†Œ์…œ ๋กœ๊ทธ์ธ ์ด๋ฏธ์ง€


๐Ÿ  ํ™ˆ

๋ฉ”์ธ ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


๐Ÿด ํ”Œ๋ ˆ์ด์Šค

ํ”Œ๋ ˆ์ด์Šค ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


๐Ÿš ๊ตํ†ต

๊ตํ†ต ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


๐Ÿ“… ์บ˜๋ฆฐ๋”

์บ˜๋ฆฐ๋” ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


๐Ÿ’ฌ ์ปค๋ฎค๋‹ˆํ‹ฐ

์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


๐Ÿ’Œ ์ข…์ด๋น„ํ–‰๊ธฐ

์ข…์ด๋น„ํ–‰๊ธฐ ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


๐Ÿ“„ ๋งˆ์ดํŽ˜์ด์ง€

๋งˆ์ดํŽ˜์ด์ง€ ์ด๋ฏธ์ง€


6๏ธโƒฃ ํ‚ค๋ง ๊ฐœ๋ฐœํŒ€

๋ฐฑ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ
๊น€ํƒœ๋ฏผ ๊น€ํ•œ์†” ๋ฐฑํ˜œ์ธ ์–‘๋‹ค์œ—

About

๐Ÿ”— ์‚ฌ๋‚ด ๊ตฌ์„ฑ์›์„ ์œ„ํ•œ ํšŒ์‚ฌ ์ƒํ™œยท์†Œํ†ต ์˜ฌ์ธ์› ์›น์•ฑ

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages