Skip to content

ShareSpace-Service/ShareSpace-Server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

10 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Share Space

version

์‰์–ด์ŠคํŽ˜์ด์Šค๋Š” ์ข์€ ์ฃผ๊ฑฐ ๊ณต๊ฐ„, ๊ณ„์ ˆ ์šฉํ’ˆ ๋ณด๊ด€ ๋ฌธ์ œ, ์ทจ๋ฏธ ์žฅ๋น„ ๊ด€๋ฆฌ ๋“ฑ

๊ณต๊ฐ„ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ์ด์›ƒ ๊ฐ„์˜ ๊ณต๊ฐ„ ๊ณต์œ  ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

๐Ÿ”— API ๋ช…์„ธ | ๐Ÿ“‹ ๊ธฐ๋Šฅ ๋ช…์„ธ | โ˜ข๏ธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… | ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ๋ฌธ์„œ


๐Ÿ‘ฅ ํŒ€์›

์ด์šฉํ•™ ๋‚จ์œคํ˜• ์ „์ฐฝ๋ฏผ
@Dradradre @yunhyungNAM @thereisname

๐Ÿ› ๏ธ Tech Stacks

๐Ÿท๏ธ Category ๐Ÿš€ Technologies
๐Ÿ“š Frameworks Spring Boot Java
๐Ÿ—„๏ธ Databases MySQL Spring Data JPA Hibernate ORM QueryDSL
๐Ÿ” Security Spring Security JWT
โ˜๏ธ Cloud Services AWS S3
๐Ÿ› ๏ธ Utilities Lombok Spring AOP ANTLR
๐Ÿงช Testing JUnit Mockito
๐Ÿ—๏ธ Build Tools Gradle Dependency Management

๐Ÿ—๏ธ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜

์•„ํ‚คํ…์ฒ˜

ShareSpace ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜


๐Ÿš€ ๊ตฌํ˜„ ์‚ฌํ•ญ

์ด์šฉํ•™

๐Ÿ”„ ๋งค์นญ ์‹œ์Šคํ…œ

  • REQUESTED โ†’ PENDING โ†’ STORED โ†’ COMPLETED ์ƒํƒœ ํ๋ฆ„ ๊ด€๋ฆฌ
  • ๊ฐ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๊ด€๋ จ ๋‹น์‚ฌ์ž๋“ค์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „์†ก
  • ๋งค์นญ ์ทจ์†Œ ๋ฐ ๊ฑฐ์ ˆ ์‹œ๋‚˜๋ฆฌ์˜ค ์ฒ˜๋ฆฌ
  • ์™„๋ฃŒ๋œ Matching ๊ฑด์— ๋Œ€ํ•œ History ๊ด€๋ฆฌ

๐Ÿ” ๊ถŒํ•œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

  • @CheckPermission ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ตฌํ˜„
  • Spring AOP๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ฒ€์ฆ
  • ๊ฒŒ์ŠคํŠธ/ํ˜ธ์ŠคํŠธ ์—ญํ• ๋ณ„ ์ ‘๊ทผ ์ œ์–ด ๊ตฌํ˜„

๐Ÿ“จ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์‹œ์Šคํ…œ

  • SSE(Server-Sent Events) ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ
  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ์˜ ๋‹จ๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ตฌํ˜„
  • ConcurrentHashMap์„ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž๋ณ„ SseEmitter ๊ด€๋ฆฌ
  • ์•Œ๋ฆผ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋งค์ผ ์ž์ •๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๋ฐฐ์น˜ ์ž‘์—… ๊ตฌํ˜„

๐Ÿ“Š Response ๊ตฌ์กฐ ํ‘œ์ค€ํ™”

  • BaseResponse ํŒจํ„ด ๊ตฌํ˜„
  • ์ผ๊ด€๋œ API ์‘๋‹ต ๊ตฌ์กฐ
  • ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€ ํ‘œ์ค€ํ™”
  • HTTP ์ƒํƒœ ์ฝ”๋“œ ๋ฐ ๋ฉ”์‹œ์ง€ ํ†ตํ•ฉ ๊ด€๋ฆฌ

๐Ÿ—๏ธ ์ธํ”„๋ผ ๊ฐœ์„ 

  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋„๋ฉ”์ธ์„ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์ฟ ํ‚ค ์ „์†ก ๋ฌธ์ œ ํ•ด๊ฒฐ
  • GitHub Actions๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ์ž๋™ํ™”
  • React ์ •์  ํŒŒ์ผ์„ Nginx๋ฅผ ํ†ตํ•ด ์„œ๋น™ํ•˜์—ฌ SPA ํ™˜๊ฒฝ ์ตœ์ ํ™”
  • ๋ชจ๋“  API ์š”์ฒญ์— /api ์ ‘๋‘์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ •์  ํŒŒ์ผ๊ณผ ๊ตฌ๋ถ„

๋‚จ์œคํ˜•

๐Ÿ”‘ ํšŒ์›๊ฐ€์ž… ๋ฐ ์ธ์ฆ

  • JavaMailSender๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… ํ›„ ์ด๋ฉ”์ผ ์ธ์ฆ ์ฒ˜๋ฆฌ
  • @Scheduled๋ฅผ ์‚ฌ์šฉํ•ด ์ž์ •๋งˆ๋‹ค ์ด๋ฉ”์ผ ๋ฏธ์ธ์ฆ ์‚ฌ์šฉ์ž ์‚ญ์ œ
  • BCryptPasswordEncoder๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ๋ฐ ์ €์žฅ

๐Ÿ” ๋กœ๊ทธ์ธ ๋ฐ ์ธ์ฆ

  • JWT(JSON Web Token) ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ฟ ํ‚ค์— SameSite=Lax, Secure, HttpOnly ์„ค์ •
  • Custom LoginFilter๋ฅผ ํ†ตํ•œ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ์ธ ์‹คํŒจ ์กฐ๊ฑด ์ฒ˜๋ฆฌ
  • Refresh Token์„ ์‚ฌ์šฉํ•œ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • Access Token์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ(HashSet)๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ฆ‰์‹œ ๋ฌดํšจํ™” ์ฒ˜๋ฆฌ
  • BlackList ๋œ Access Token์„ ์Šค์ผ€์ค„๋Ÿฌ ์ž‘์—…์„ ํ†ตํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์‚ญ์ œ

๐Ÿ“ฉ JavaMailSender

  • 6์ž๋ฆฌ ๋‚œ์ˆ˜ ์ƒ์„ฑ ํ›„ ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ๋กœ ์ „์†ก
  • ConcurrentHashMap ํ™œ์šฉ Java In-Memory ๋‚œ์ˆ˜์ฝ”๋“œ ์ €์žฅ ๋ฐ ๊ฒ€์ฆ
  • ์ „์†ก ์‹คํŒจ ์‹œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ์žฌ์‹œ๋„ ๋กœ์ง ๊ตฌํ˜„

๐Ÿ—บ๏ธ ์นด์นด์˜ค API ์—ฐ๋™

  • ๋„๋กœ๋ช…/์ง€๋ฒˆ ์ฃผ์†Œ ๊ธฐ๋ฐ˜์œผ๋กœ ์นด์นด์˜ค ์ง€๋„ API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์œ„๊ฒฝ๋„ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
  • ์ขŒํ‘œ ์ •๋ณด ์ˆ˜์ง‘ํ•˜์—ฌ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ์œ„ํ•œ ์ •๋ณด ์ œ๊ณต

๐Ÿ–ฅ๏ธ ํ˜ธ์ŠคํŠธ ๋Œ€์‰ฌ๋ณด๋“œ

  • ๋งค์นญ ํ•ญ๋ชฉ STORED ์ƒํƒœ์˜ expiry_date์™€ Java LocalDate ๋น„๊ตํ•˜์—ฌ ๋ฐ˜๋‚ฉ 3์ผ ์ดํ•˜ ํ•ญ๋ชฉ ์ถ”์ถœ
  • ๋งค์นญ ํ•ญ๋ชฉ REQUESTED PENDING STORED ์ƒํƒœ ๊ฐ ๊ฐœ์ˆ˜๋ฅผ ์ถ”์ถœ ๋ฐ ๋ฐ˜ํ™˜

โž•๊ธฐํƒ€ ๋“ฑ๋ก์‹œ์Šคํ…œ

  • ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•œ ๋ฌธ์˜ํ•˜๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • GUEST ์œ ์ €์™€ ๊ด€๊ณ„์„ฑ ์žˆ๋Š” product ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ „์ฐฝ๋ฏผ

๐Ÿก ์žฅ์†Œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

  • ์žฅ์†Œ ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„ (๋‹ค์ค‘ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ์ด๋ฏธ์ง€ URL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ ํฌํ•จ)
  • ํŠน์ • ๋ฌผํ’ˆ์— ์ ํ•ฉํ•œ ์žฅ์†Œ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ (๋งค์นญ ๋กœ์ง ์„ค๊ณ„ ๋ฐ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„)
  • ์žฅ์†Œ ์ˆ˜์ • ์‹œ ์ด๋ฏธ์ง€ ์‚ญ์ œ ๋ฐ ์ถ”๊ฐ€ ๋กœ์ง ์ตœ์ ํ™”
  • ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋กœ์ง ๋ฐ˜์˜ฌ๋ฆผ ์ฒ˜๋ฆฌ ๋ฐ ์ •์ˆ˜ ๋‹จ์œ„ ๋ฐ˜ํ™˜

๐Ÿ“ฌ ์ชฝ์ง€ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

  • ์ชฝ์ง€ ์ „์†ก ๋ฐ ์ˆ˜์‹  ๋กœ์ง ๊ฐœ๋ฐœ
  • ์ฝ์ง€ ์•Š์€ ์ชฝ์ง€ ๊ฐœ์ˆ˜ ์‹ค์‹œ๊ฐ„ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • PENDING, STORED ์ƒํƒœ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ชฝ์ง€ ์ „์†ก ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ถŒํ•œ ๋กœ์ง ์„ค๊ณ„
  • ๋ฐœ์‹  ๋ฐ ์ˆ˜์‹  ๋Œ€์ƒ ์‚ฌ์šฉ์ž ๋ฆฌ์ŠคํŠธ ๋™์  ์กฐํšŒ
  • N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ JPQL ์ตœ์ ํ™” ๋ฐ ํšจ์œจ์  ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ตฌํ˜„

๐Ÿ“ท ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

  • AWS S3๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ๋กœ์ง ๊ฐœ๋ฐœ
  • ๋‹ค์ค‘ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์‚ญ์ œ ์ตœ์ ํ™”
  • ์žฅ์†Œ ์ˆ˜์ • ์‹œ ๊ธฐ์กด ์ด๋ฏธ์ง€ ์œ ์ง€ ๋ฐ ์‹ ๊ทœ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ๋กœ์ง ๊ตฌํ˜„
  • ์ด๋ฏธ์ง€ ํ™•์žฅ์ž ์ œํ•œ (JPEG, PNG)
  • ๋น„์šฉ ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•œ ๋‹ค์ค‘ ํŒŒ์ผ ์‚ญ์ œ ๋กœ์ง ์„ค๊ณ„
  • ์žฅ์†Œ ์ˆ˜์ • ์‹œ ๋ณ€๊ฒฝ๋œ ์ด๋ฏธ์ง€๋งŒ S3์— ๋ฐ˜์˜ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„

๐Ÿ—๏ธ ์ธํ”„๋ผ ๊ตฌ์ถ•

  • ์ˆ˜๋™๋ฐฐํฌ๋ฅผ ํ†ตํ•œ ๋ฐฐํฌํ™˜๊ฒฝ ๊ตฌ์„ฑ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
  • GitHub Actions๋ฅผ ์‚ฌ์šฉํ•œ CI/CD ์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
  • Docker Compose ๊ธฐ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ ํ™˜๊ฒฝ ์„ค๊ณ„
  • AWS VPC, EC2, RDS๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • Public/Private Subnet์„ ํ†ตํ•œ ๋„คํŠธ์›Œํฌ ๋ถ„๋ฆฌ ๋ฐ ๋ณด์•ˆ ๊ทธ๋ฃน ์„ค์ • ์ตœ์ ํ™”
  • Docker Hub์™€ ์—ฐ๋™ํ•ด ์ž๋™ํ™”๋œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ ํ”„๋กœ์„ธ์Šค ๊ตฌํ˜„
  • EC2 ์ƒ์—์„œ Docker Compose๋ฅผ ํ™œ์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ ๊ด€๋ฆฌ
  • Nginx๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๊ตฌ์„ฑ
  • HTTPS ์„ค์ •์œผ๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages