Team-MovieToGather / MovieToGather

Home Page:http://movie2gather.net/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

๐Ÿ’ป MovieToGather

๐Ÿ“‘ ๊ฐœ์š”

  • ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ : 24.02.26 ~ 24.04.05
  • ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ : MovieToGather
  • ํ”„๋กœ์ ํŠธ ์„ค๋ช… : ์˜ํ™”๋ฅผ ๋งˆ์Œ์ด ๋งž๋Š” ์‚ฌ๋žŒ๋ผ๋ฆฌ ํ•จ๊ป˜ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค!

๐Ÿคบ MovieToGather Team

  • ํŒ€์žฅ ์˜ค์žฌ์˜
    • github
    • ์—ญํ• 
      • PM
      • ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„
      • ์ง€๋„ API
      • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
      • ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด ๊ตฌ์„ฑ
  • ๋ถ€ํŒ€์žฅ ๋ฐ•์žฌ์€
    • github
    • ์—ญํ• 
      • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ CI/CD
      • ์˜ํ™” ๊ฒ€์ƒ‰ API
  • ํŒ€์› ๊น€์ฒ ํ•™
    • github
    • ์—ญํ• 
      • ์ „๋ฐ˜์ ์ธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
      • ๋ฒ ์ŠคํŠธ ๋ฆฌ๋ทฐ
      • ์ข‹์•„์š” ๊ธฐ๋Šฅ
      • ์ฑ„ํŒ…
  • ํŒ€์› ๊ฐ•๊ตฐํ˜ธ
    • github
    • ์—ญํ• 
      • ์†Œ์…œ ๋กœ๊ทธ์ธ
      • ๊ทธ ์™ธ ํšŒ์›๊ฐ€์ž… ๊ด€๋ จ ์ „๋ฐ˜
  • ํŒ€์› ์ง€ํ˜œ์˜
    • github
    • ์—ญํ• 
      • ๋ฆฌ๋ทฐ CRUD
      • ๋ชจ์ž„ CRUD

๐Ÿ“š๊ธฐ์ˆ ์Šคํƒ


Backend

  • Spring Boot: 3.2.2
  • Kotlin: 1.9.22
  • Data
    • Spring JPA: 3.2.3
    • QueryDsl: 5.0.0
  • Security
    • Spring Security: 6.2.0
    • JWT: io.jsonwebtoken:jjwt-api:0.12.3
    • Oauth 2.0

DB

  • PostgreSql : 16
  • Redis

Monitoring

  • Prometheus
  • Grafana

Frontend

  • Html5
  • CSS
  • JavaScript
  • Vue.js 3
  • Bootstrap
  • Quasar

Collaboration

  • Git, GitHub Issue, Slack

์˜์‚ฌ๊ฒฐ์ •

  • Prometheus & Grafana
    • ์˜คํ”ˆ ์†Œ์Šค์ธ ์ ์ด ์ค‘์š”ํ•˜๊ฒŒ ์ž‘์šฉ
    • Spring Actuator์™€ Spring Metrics์˜ ์กด์žฌ๋กœ ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•œ ์ 
    • ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๋Š” exporter๋„ ์—ญ์‹œ ์˜คํ”ˆ ์†Œ์Šค์ธ ์ 
    • ์ €์žฅ ๊ณต๊ฐ„์ด ๋ชจ์ž๋ž„ ์‹œ์—๋Š” ํ•˜๋“œ์›จ์–ด ์šฉ๋Ÿ‰์„ ๋Š˜๋ ค์•ผ ํ•˜์ง€๋งŒ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ˆ˜์ง‘๋˜๋Š” ๋ฉ”ํŠธ๋ฆญ์ด ์–‘์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•œ ์ 
    • Spring์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Dashboard UI๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ 
  • Github Actions
    • Github ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์˜จ ์นœ์ˆ™ํ•จ์ด ๊ฐ€์žฅ ํฌ๊ฒŒ ์ž‘์šฉ
    • ์ถ”๊ฐ€์ ์ธ ์„ค์น˜ ํ•„์š” ์—†์ด Github ํ™˜๊ฒฝ์—์„œ ์ด์šฉ ๊ฐ€๋Šฅ
    • ํŠน์ • ์‚ฌ์šฉ๋Ÿ‰๊นŒ์ง€ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต
  • Docker
    • ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ„์†Œํ™”
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ๊ณผ ์ข…์†์„ฑ์„ ์บก์Šํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ 
    • ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹จ์ผ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ 
    • ๊ฐœ์ธ ์‚ฌ์šฉ์ž๋กœ์„œ ๋ฌด๋ฃŒ ๋ฒ„์ „ ํ™œ์šฉ ๊ฐ€๋Šฅ
  • Spring JPA
    • MyBatis๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์™€ ์ฟผ๋ฆฌ๋ฌธ์„ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด JPA๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ 
    • JPA๋Š” DTO๊นŒ์ง€ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” MyBatis์™€ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ ์ •๋ณด๋งŒ ๋ฐ”๋€Œ์–ด๋„ ๊ฐ์ฒด๋งŒ ์ˆ˜์ •ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค๋Š” ์ 
    • ์ž๋ฐ” ์ง„์˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ORM์ด๋ผ๋Š” ์ 
    • JPA๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ํž˜๋“ค์ง€๋งŒ, ์ด๋Ÿฐ JPA์˜ ๋‹จ์ ์„ QueryDsl๊ฐ™์€ ๊ธฐ์ˆ ์ด ํ•ด์†Œํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ 
  • QueryDsl
    • QueryDsl๊ณผ Criteria๋Š” JPQL์„ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๊ณ , ์ปดํŒŒ์ผ ์‹œ์ ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ํ•ด ์ฃผ๋Š” JPQL ๋นŒ๋”
    • Criteria๋Š” QueryDsl์— ๋น„ํ•ด ํ•™์Šต ๋‚œ์ด๋„๋„ ๋†’์œผ๋ฉด์„œ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ๋„ ์ข‹์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ
    • ํŒ€์›๋“ค์ด QueryDsl์— ์ต์ˆ™ํ•œ ์ƒํ™ฉ์—์„œ Cretiral์˜ ํŠน์žฅ์ ์„ ์ฐพ์ง€ ๋ชปํ•ด์„œ ์ด์šฉ
  • Spring Security
    • SecurityContextHolder๋ฅผ ํ†ตํ•ด ์ธ๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜์›”ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ 
    • PasswordEncoder๋ฅผ ํ†ตํ•ด ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™”๋ฅผ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ 
  • JWT
    • ์›น ํ‘œ์ค€์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅ
    • Http๋ฅผ Statelessํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋‹ค๋ฅธ ์ธ์ฆ ๋ฐฉ์‹์— ๋น„ํ•ด, ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•จ
  • PostgreSql
    • MySql์ด PostgreSql์— ๋น„ํ•ด ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์„ฑ๋Šฅ์— ๊ฐ•์ ์ด ์žˆ์–ด ์‚ฌ์‹ค MySql์„ ์ด์šฉํ•ด๋„ ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ๊ณ  ์ƒ๊ฐ
    • ๊ทธ๋Ÿฌ๋‚˜ PostgreSql์˜ ๊ฒฝ์šฐ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋‚˜ ํŠธ๋žœ์žญ์…˜ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋” ์ˆ˜์›”ํ•œ ๊ฒฝํ–ฅ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค๊ฐ€ ํ™•์žฅ๋  ์‹œ์— ๋” ์œ ๋ฆฌํ•œ ์ธก๋ฉด์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์œผ๋ฉฐ
    • ํŒ€์›๋“ค์ด MySql๋ณด๋‹ค PostgreSql์— ๋” ์ต์ˆ™ํ•œ ์ƒํ™ฉ์—์„œ MySql์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ •๋„์˜ ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ์š”๊ตฌ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จ
  • WebSocket
    • ์†ก์‹ ๋งŒ ํ• ๊ฒฝ์šฐ HTTP ํ”„๋กœํ† ์ฝœ์œผ๋กœ ์ถฉ๋ถ„
    • ์ฑ„ํŒ… ์‹œ์Šคํ…œ์€ ์†ก์ˆ˜์‹ ์ด ๋˜์–ด์•ผ ๋˜๊ธฐ๋•Œ๋ฌธ์— ํด๋ง, ๋กฑํด๋ง, ์›น์†Œ์ผ“๋“ฑ ์ˆ˜์‹  ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ๋œ๋‹ค
    • ํด๋ง, ๋กฑํด๋ง์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ƒˆ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์€ ํ›„ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ›„ ๋‹ค์‹œ ์š”์ฒญํ•˜์—ฌ ๋ฐ˜๋ณตํ•˜๋Š” ํ˜•์‹์ด๋‹ค
    • ์›น์†Œ์ผ“์€ ํ•œ๋ฒˆ ์—ฐ๊ฒฐ์ด ๋˜๋ฉด ํ•ญ๊ตฌ์ ์ด๋ฉฐ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด์„œ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ• ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค
    • ๊ทธ๋ž˜์„œ ์›น์†Œ์ผ“ ๋Œ€์‹  HTTP๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐ
  • RestClient
    • ์ด์ „์— ์‚ฌ์šฉํ•ด์˜ค๋˜ HTTP Client ์ธ restTemplate ์™€ webClient ์— ๋น„ํ•˜์—ฌ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ์ง๊ด€์ ์ด๊ณ  ๋‹ค๋ฅธ ์˜์กด์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์ ์€ ์ 
  • Redis
    • In-Memory : ๋””์Šคํฌ(DB)๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋น ๋ฅธ ์ž‘์—… ์†๋„
    • Single Thread : ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก๋„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ , ์„ฑ๋Šฅ์ ์ธ ๋ฉด์—์„œ๋„ ์œ ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์กฐ์ ์ธ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ์ข‹์Œ
    • Key : Value ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ง€์›
      • ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์žฅ์ ์ด ์žˆ์Œ
  • Vue.js
    • React.js์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ์™„๋งŒํ•œ ์ 
    • Thymeleaf์— ๋น„ํ•ด ๋™์ ์ธ ํ™”๋ฉด ๊ตฌํ˜„์ด ์‰ฌ์šด ์ 
    • Quasar
      • infinite scroll์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ด์šฉ
      • ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  Vue.js์— ํŠนํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์“ฐ์—ฌ ์žˆ๋Š” ์ 
    • Bootstrap
      • ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ์ค‘์š”๋„๋ฅผ ๋†’๊ฒŒ ์žก์•˜๊ธฐ์— Vue.js๋ฅผ ์ง€์›ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉ
      • ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์— Bootstrap์ด ์ ์šฉ

TroubleShooting

  • CI/CD
    • ๋ฌธ์ œ
      • ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์ค‘, ๋นŒ๋“œ ๊ณผ์ •์—์„œ contextLoads() ์—๋Ÿฌ ๋ฐœ์ƒ
        MovieToGatherApplicationTests > contextLoads() FAILED
          java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180
              Caused by: io.github.cdimascio.dotenv.DotenvException at DotenvParser.java:76
        
      • ec2 ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ ์ง์ ‘ ๋นŒ๋“œ or ๋กœ์ปฌ์—์„œ dotenv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์„ ๋•Œ -> ๋™์ผํ•œ ์—๋Ÿฌ ๋ฐœ์ƒ
    • ์›์ธ
      • ec2 ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ ./gradlew bootRun ์‹คํ–‰ ์‹œ ์ •์ƒ ์ž‘๋™ -> ./gradlew build ์™€ ./greadlew bootRun์˜ ์ž‘๋™ ๋ฐฉ์‹์˜ ์ฐจ์ด์— ์›์ธ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ๊ทธ ์ฐจ์ด๋ฅผ ํ•™์Šต
      • ./gradlew build
        • resources ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ classpath resource๋กœ ์ธ์‹ํ•˜๊ณ  ์ž๋™ ๋กœ๋“œ
      • ./gradlew bootRun
        • root ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ classpath resource ์„ค์ •
    • ํ•ด๊ฒฐ
      • .env ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ์˜ root ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•ด ์žˆ์—ˆ๊ณ , ํŒŒ์ดํ”„๋ผ์ธ ๊ณผ์ •์—์„œ๋„ .env ํŒŒ์ผ์„ root ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ
      • ๊ทธ ๊ฒฐ๊ณผ, build ๊ณผ์ • ์‹œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋กœ๋“œํ•˜์ง€ ๋ชปํ•ด contextLoads() Failed ๊ฐ€ ๋ฐœ์ƒ
      • resources ๋””๋ ‰ํ† ๋ฆฌ ํ•˜์œ„๋กœ .env๋ฅผ ์ƒ์„ฑํ•˜์˜€๊ณ  ์ •์ƒ ์‹คํ–‰ ํ™•์ธ
  • Oauth2
    • ๋ฌธ์ œ
      • redirect๋˜๋Š” ์‹œ์ ์— URI์— ํ† ํฐ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ
    • ์›์ธ
      • Implicit Grant Type์œผ๋กœ ํ† ํฐ ๋ฐœํ–‰ (Only Oauth 2.0)
        • ํ† ํฐ์ด ์ธ์ฆ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฆฌํ„ด๋  ๋•Œ QueryString์œผ๋กœ ์ „๋‹ฌ
        • ๋‹คํšŒ์„ฑ์ธ ํ† ํฐ์ด ํƒˆ์ทจ๋˜๋ฉด ๋ฆฌ์†Œ์Šค๊นŒ์ง€ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ํ•ด๊ฒฐ
      • Oauth 2.0 Grant Type์„ Authorization Code Grant Type์œผ๋กœ ๋ณ€๊ฒฝ
        • 1ํšŒ์„ฑ Authorization Code ๋ฐœํ–‰ -> ์ฝ”๋“œ๊ฐ€ ํ‹€๋ ค๋„ ์ฆ‰์‹œ ํ๊ธฐ
  • WebSocket
    • ๋ฌธ์ œ
      • WebSocket์„ ํ†ตํ•ด message๋ฅผ ์ž‘์„ฑํ•ด๋„ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ „๋‹ฌ์ด ๋˜์ง€์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
    • ์›์ธ
      • message ์ „์†ก ๊ด€๋ จ Handler
        • ๋ณธ์ธ์ด ์ž‘์„ฑํ•œ message์— ๊ด€ํ•ด ์„ค์ • O
        • ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์„ค์ • X
    • ํ•ด๊ฒฐ
      • chat ์ž…์žฅํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ฐฉ์— session์„ ์ถ”๊ฐ€๋˜๋„๋ก ๋ณ€๊ฒฝ
        • WebSocketSession์„ ์ด์šฉํ•˜์—ฌ session ๊ตฌํ˜„
        • message ์ „์†กํ–ˆ์„๋•Œ ํ•ด๋‹น ๋ฐฉ์— ์žˆ๋Š” ๋ชจ๋“  session๋“ค์—๊ฒŒ ์ „๋ถ€ ์ „์†ก

์ฃผ์š”๊ธฐ๋Šฅ

ํšŒ์›

  • ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ/์œ ์ € ์ •๋ณด ํ™•์ธ
  • Spring Security ํ™œ์šฉ
  • ์†Œ์…œ ๋กœ๊ทธ์ธ๋งŒ์œผ๋กœ ํšŒ์› ๊ด€๋ฆฌ ์ง„ํ–‰
  • ๊ตฌ๊ธ€ / ์นด์นด์˜ค / ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ

๋ฆฌ๋ทฐ

  • ๋ฆฌ๋ทฐ Best 3
  • ๋ฆฌ๋ทฐ ๊ฒ€์ƒ‰ํ•˜๊ธฐ
  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œํ•˜๊ธฐ
  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ ์ „ ์˜ํ™” ๊ฒ€์ƒ‰

๋ชจ์ž„

  • ๋ชจ์ž„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ
  • ๋ชจ์ž„ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œํ•˜๊ธฐ
  • ๊ฐ™์€ ๋ชจ์ž„์›๋“ค๋ผ๋ฆฌ ์ฑ„ํŒ…ํ•˜๊ธฐ

๐Ÿ† ํ”„๋กœ์ ํŠธ ์‚ฐ์ถœ๋ฌผ

About

http://movie2gather.net/


Languages

Language:Kotlin 99.8%Language:Dockerfile 0.1%Language:HTML 0.1%