# [Project] Billim / ์ค‘๊ณ  ๋ฌผํ’ˆ ๋Œ€์—ฌ ์„œ๋น„์Šค ํŒ€ ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ
Study Repository

[Project] Billim / ์ค‘๊ณ  ๋ฌผํ’ˆ ๋Œ€์—ฌ ์„œ๋น„์Šค ํŒ€ ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ

by rlaehddnd0422

DNS ์„ค์ •๊นŒ์ง€ ๋งˆ์นœ ํ›„ ์“ฐ๋ ค ํ–ˆ์œผ๋‚˜ ์ƒ๊ฐ๋ณด๋‹ค ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ธธ์–ด์ ธ ๋จผ์ € ์ผ์ฐ์ด ๋๋‚œ ๋ฐฑ์—”๋“œ ํŒŒํŠธ์— ๋Œ€ํ•œ ํ›„๊ธฐ๋ฅผ ๋จผ์ € ๋‚จ๊ฒจ๋ณด๋ ค ํ•œ๋‹ค.
 


๊ธฐํš ๋ฐฐ๊ฒฝ

Spring ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•œ ์ง€ 10๊ฐœ์›” ์ •๋„๊ฐ€ ์ง€๋‚ฌ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ ์šฉ ํ•ด๋ณด์ง€ ์•Š์œผ๋ฉด ๊ธˆ๋ฐฉ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ํƒ“์— ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ ์šฉ์‹œ์ผœ๋ณด๊ฒ ๋‹ค๋Š” ์ทจ์ง€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๋งˆ์นจ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ตฌ์‹ค์˜ ์นœ๊ตฌ๋„ ๋‚˜์™€ ๋œป์ด ๋น„์Šทํ•˜์—ฌ ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•˜๋˜ ๋„์ค‘, ์ค‘๊ณ  ๋ฌผํ’ˆ์„ ์‚ฌ๊ณ  ํŒŒ๋Š” '๋‹น๊ทผ๋งˆ์ผ“'์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด ์ค‘๊ณ  ๋ฌผํ’ˆ์„ ๋Œ€์—ฌํ•ด์ฃผ๋Š” ํ”Œ๋žซํผ์„ ๋งŒ๋“ค์–ด ๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค๋ผ๋Š” ์•„์ด๋””์–ด์—์„œ ์‹œ์ž‘ํ•ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ค‘๊ณ  ๋ฌผํ’ˆ ๋Œ€์—ฌ ์„œ๋น„์Šค ๊ฐœ๋ฐœ๋กœ ์ฃผ์ œ๋ฅผ ์žก๊ณ  ์ง„ํ–‰ํ•˜์˜€๋‹ค. 


๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Language : Java 11, Javascript
  • Framework 
    • BE : Spring Boot 2.7.13
    • FE : React 18.2.0
  • DataBase : MySQL
  • ERD Diagram : ERDCloud
  • IDE : IntelliJ, MySQL WorkBench
  • API Docs : Swagger, Notion
  • ํ˜‘์—… ํˆด : GitHub, Notion
  • ์ธํ”„๋ผ : AWS(EC2, S3)

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ : 2023/06/28 ~ 2023/08/16
 
๊ฐœ๋ฐœ ์ธ์›

  • Front-End (2)
 

leejaejae - Overview

leejaejae has 8 repositories available. Follow their code on GitHub.

github.com

 

choimyeongsu - Overview

choimyeongsu has 18 repositories available. Follow their code on GitHub.

github.com

  • Back-End (2)

 

park0jae - Overview

park0jae has 25 repositories available. Follow their code on GitHub.

github.com

 

Dongwoongkim - Overview

Dongwoongkim has 25 repositories available. Follow their code on GitHub.

github.com


ERD Diagram


ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ

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


์›๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์ ์šฉ
 

[Security] Jwt Authentication ๊ตฌํ˜„ by Overriding Spring Security ์ธ์ฆ ์•„ํ‚คํ…์ณ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Spring Security์— Jwt ์„ ์ ์šฉํ•œ ์ธ์ฆ(Authentication)๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ , ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ธ์ฆ์— ๊ธฐ๋ฐ˜ํ•œ ์ธ๊ฐ€(๊ถŒํ•œ๊ฒ€์‚ฌ,Authorization)๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐ŸšฉSecuri

rlaehddnd0422.tistory.com

  • Spring ๊ธฐ๋ฐ˜์˜ ๋ณด์•ˆ์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ Spring Security ์‚ฌ์šฉํ•˜๋ฉด์„œ JWT ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌํ•˜๋Š” ๋กœ์ง์—์„œ Security Filter๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์›๋ฆฌ๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ „์ฒด์ ์ธ ์ธ์ฆ๊ด€๋ จ ์•„ํ‚คํ…์ณ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์„ ์ˆ˜์ ์œผ๋กœ ์žก๊ณ  ์ง„ํ–‰ํ•˜๋‹ˆ, ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ์ฐธ์กฐ๋ฅผ ํ•  ๋•Œ ๋งŽ์ด ๋„์›€์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.  
public abstract class Guard {

    public final boolean check(Long id){
       return SecurityUtil.isAuthenticated() && hasAuthority(id);
    }

    private boolean hasAuthority(Long id){
        return SecurityUtil.extractMemberRolesFromContext().contains(RoleType.ADMIN) || isResourceOwner(id);
    } 

    abstract protected boolean isResourceOwner(Long id);
}
  • abstract class์˜ ๊ฐœ๋…๋งŒ ์•Œ๊ณ  ์‹ค์ œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์€ ์ฒ˜์Œ์ด์˜€๋‹ค. ์ถ”์ƒํด๋ž˜์Šค๋ฅผ ์–ธ์ œ ์“ฐ๋Š”์ง€ ๋จธ๋ฆฌ๋กœ๋Š” ์ดํ•ดํ–ˆ์ง€๋งŒ ์ง๊ด€์ ์œผ๋กœ ์™€๋‹ฟ์ง€๋Š” ์•Š์•˜์—ˆ๋‹ค. ์ด๋ฒˆ์— ๋ฆฌ์†Œ์Šค์˜ Owner์ด๊ฑฐ๋‚˜ ๋˜๋Š” ๊ถŒํ•œ์ด ADMIN์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, ์ด ๋•Œ ์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ•  ๊ฒƒ ์ธ์ง€์— ์ž‘์„ฑ ํ•˜๊ธฐ ์ „, ์ถ”์ƒ ํด๋ž˜์Šค์— ๊ณตํ†ต ๋ถ„๋ชจ๋“ค์„ ํ‘œํ˜„(check(), hasAuthority()) ํ•˜๊ณ , ์ƒ์†์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ Guard ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•ด๋‚˜๊ฐ์œผ๋กœ์จ ์ƒ์œ„ Guard ์ถ”์ƒ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค (PostGuard, CommentGuard) ๊ฐ„์˜ ์˜๋ฏธ์žˆ๋Š” ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ดˆ๊ธฐ ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ
  • ์š”๊ตฌ์‚ฌํ•ญ ์ž‘์„ฑ๋ถ€ํ„ฐ ERD ์„ค๊ณ„๊นŒ์ง€ ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๋ฐฐํฌ๊นŒ์ง€ ํ•ด๋ณด์ง€ ์•Š์€ ๊ฒƒ๋“ค์„ ํ•ด๋ณด๋ฉด์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ERD ์„ค๊ณ„๋Š” ์ฒ˜์Œ ๋‹จ๊ณ„์—์„œ๋Š” ๋ง‰์—ฐํžˆ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ๋‚˜์—ดํ•ด๋†“๊ณ  ์ด๋ ‡๊ฒŒ ์ €๋ ‡๊ฒŒ ์—ฎ์œผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ๋ฉฐ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์™ธ๋ž˜ํ‚ค ์ œ์•ฝ์กฐ๊ฑด์ด๋‚˜ 1:N ๋งคํ•‘์œผ๋กœ ์ธํ•œ N+1๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ผ๋Œ€๋‹ค ๋งคํ•‘์„ ์ง€์–‘ํ•˜๊ณ , ํŽ˜์น˜์กฐ์ธํ•˜๋Š” ์†”๋ฃจ์…˜๊ณผ ํ•จ๊ป˜ ERD๋„ ๊ณ„์† ์ˆ˜์ •ํ•ด๊ฐ€๋ฉด์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ์ดˆ๊ธฐ ERD ์„ค๊ณ„๋ฅผ ์ž˜ ํ•ด๋†“๋Š”๊ฒƒ์ด ๋งค์šฐ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋ฐฐํฌ์˜ ๊ฒฝ์šฐ์—๋Š” ์•„์˜ˆ ๋ฌธ์™ธํ•œ์ด์˜€๋Š”๋ฐ ์นœ๊ตฌ์˜ ๋„์›€์„ ๋งŽ์ด ๋ฐ›์•˜๋‹ค. ์ธํ”„๋ผ์  ์ง€์‹์ด ์ „๋ฌดํ•ด์„œ ์žฅ๋ฒฝ์ด ๊ฝค ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋ถ€๋”ชํ˜€๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค. ๋‚ด๊ฐ€ ํ•ด๋ณด์ง€ ์•Š์€ ๊ฒƒ, ์ƒˆ๋กœ์šด ๊ฒƒ๋“ค์„ ๋ฐ›์•„๋“œ๋ฆฌ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ง‰์—ฐํ•œ ๋‘๋ ค์›€์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ทธ๋ƒฅ ๋‹น์‹œ์— ์ฃผ๋ณ€์—์„œ ์ข…๊ฐ•ํ•˜๋‹ˆ ๋‚˜๋„ ๋ฉ๋‹ฌ์•„ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹ซ์—ˆ๋˜ ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค. 

์•ž์œผ๋กœ์˜ ๋ฐฉํ–ฅ์„ฑ
  • ๋ถ€์กฑํ•œ ๋ถ€๋ถ„๋“ค์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ณ  ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜์•„๊ฐ€์•ผ ํ•  ์ง€์— ๋Œ€ํ•ด ๋ฐฉํ–ฅ์„ ์žก์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • ์‹œ๋„ ๋•Œ๋„ ์—†์ด ์นœ๊ตฌ์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์š”์ฒญํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„๋“ค์„ ๋…์ž ์ž…์žฅ์—์„œ ๋“ฃ๊ณ  ์‹ถ์—ˆ๋‹ค. ์‹ค์ œ๋กœ ์นœ๊ตฌ์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋“ค์œผ๋ฉฐ ๋ฐฐ์šธ ์ ์ด ๋งŽ์•˜๊ณ , ์ž‘์„ฑ์ž์ธ ๋‚ด ์ž…์žฅ์—์„œ๋Š” ์ด๊ฒŒ ์ตœ์„ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์€ ์ตœ์„ ์ด ์•„๋‹ˆ์˜€๋˜ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. ๋ฉ”์†Œ๋“œ/URI ๋„ค์ด๋ฐ, ๊ณ„์ธต ๋ถ„๋ฆฌ์™€ ํด๋ฆฐ ์ฝ”๋“œ ์‚ฌ์ด์—์„œ ์˜ค๋Š” ๋”œ๋ ˆ๋งˆ๋‚˜, ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๊ฐ€๋…์„ฑ์—์„œ ์‚ฌ์ด์—์„œ ์˜ค๋Š” ๋”œ๋ ˆ๋งˆ๋“ค์€ ์•„์ง๋„ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐ€๋…์„ฑ ๋†’์€ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•˜๋Š” ์‹œ์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ( ์ผํ•˜๊ณ  ์žˆ๋Š” ์นœ๊ตฌ์ž…์žฅ์—์„œ๋Š” ๊ฝค ๊ท€์ฐฎ์€ ์ผ์ผ์ˆ˜ ์žˆ๋Š”๋ฐ ํ•ญ์ƒ ํ”์พŒํžˆ ๊ทธ๋ฆฌ๊ณ  ์‹ฌ์ง€์–ด ์ด ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ง€๊ธˆ๋„ ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ทฐํ•ด์ฃผ๊ณ  ๋””๋น„์ž๋Ÿฌ๊ฐ„ ์นœ๊ตฌ์—๊ฒŒ ๊ณ ๋งˆ์›€์„ ๋Š๋‚€๋‹ค )
  • Java ( ํŠนํžˆ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์‚ฌ๊ณ ๋ ฅ ) ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๊ธฐ : ๊ฐ์ฒด, ํด๋ž˜์Šค, ์ƒ์†, ๋‹คํ˜•์„ฑ, ์บก์Šํ™” ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ '๊ฐœ๋…'๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ '์‚ฌ๊ณ ๋ ฅ'์€ ์ „ํ˜€ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ง€ํ–ฅ '๊ฐœ๋…'์€ ๋‹จ์ˆœ OOP์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์ผ ๋ฟ, ๊ทธ ์ž์ฒด์— ์ง‘์ค‘ํ•˜๊ธฐ ๋ณด๋‹ค ์ด์ œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์‚ฌ๊ณ ๋ ฅ์„ ๊ธธ๋Ÿฌ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ์ƒ๊ฐํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
  • Github ์‚ฌ์šฉ๋ฒ• ์ˆ™์ง€ : ๊นƒํ—ˆ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์ต์ˆ™์น˜ ์•Š์•„, branch๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์— ์ ์‘ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค. branch ํ•˜๋‚˜๋งŒ ํŒŒ์„œ ์ž‘์—…ํ•˜๊ณ  main์œผ๋กœ mergeํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ์ด๋กœ ์ธํ•ด merge ๊ณผ์ •์—์„œ ์ถฉ๋Œ๋„ ์ž์ฃผ ๋ฐœ์ƒํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๊ผฌ์ด๋Š” ์‚ฌํƒœ๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ–ˆ๋‹ค. 

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

๊ผผ๊ผผํžˆ ์‹ ๊ฒฝ์จ์•ผ ํ•  ๊ฒƒ๋“ค
  • ํ”„๋ก ํŠธ์™€์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜
    • CORS ๋Œ€์‘ : CORS ์„ค์ •์„ ๋ถ„๋ช… ์ž˜ ํ•ด์ค€ ๊ฒƒ ๊ฐ™์Œ์—๋„, CORS๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ Security ํ•„ํ„ฐ์—๋„ CORS ์„ค์ •์„ ์ ์šฉ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค. 
    • API Docs : Swagger๋ฅผ ์ด์šฉํ–ˆ์ง€๋งŒ ํ”„๋ก ํŠธ๋‹จ์—์„œ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด, ์ง์ ‘ Notion์— ์ž‘์„ฑํ–ˆ๋‹ค. ์ด ๊ณผ์ •์ด ๊ดด๋กœ์›Œ ๋ถ€๋ถ„๋ถ€๋ถ„ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„๋“ค์ด ์ข…์ข… ์žˆ์–ด ํ”„๋ก ํŠธ์—๊ฒŒ ๋ฏธ์•ˆํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ท€์ฐฎ๋”๋ผ๋„ ๋†“์น˜๋Š” ๋ถ€๋ถ„์—†์ด ์ž‘์„ฑํ•˜๋„๋ก ์‹ ๊ฒฝ์จ์•ผ๊ฒ ๋‹ค. 
  • S3์˜ ํŒŒ์ผ ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ : ๋‹จํŽธ์ ์œผ๋กœ S3 ๋ฒ„ํ‚ท์— ์˜ฌ๋ผ๊ฐ„ ์ด๋ฏธ์ง€์˜ URL์„ ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ํŒŒ์ผ์˜ path๊ฐ€ ์†Œ์Šค์ฝ”๋“œ ๋‚ด์— ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์ƒ ์ข‹์ง€ ์•Š์•„ ๋ณด์ธ๋‹ค.
  • ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ : ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์„ ์ง€ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. 
    • ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•ด ์กฐํšŒ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๋†’์ด๋ฉฐ ๋น„๊ตํ•ด๋ด์•ผ๊ฒ ๋‹ค.
    • N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๋งŒํ•œ ์ฝ”๋“œ๊ฐ€ ๊ฝค ์กด์žฌ
  • ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜๋‹ค๋ฉด ๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€์„ ๋‚จ๊ธฐ์ž.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ค‘์š”์„ฑ

  • ๋‚œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์€ ์•„์ง๋„ ์–ด๋ ต๋‹ค. ์ž‘์„ฑ ์ž์ฒด์— ์‹œ๊ฐ„๋„ ์˜ค๋ž˜๊ฑธ๋ฆด ๋ฟ๋”๋Ÿฌ, ์„œ๋ฒ„์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ๋Š” ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋๋˜์ง€, ๋˜๋Š” ๋ฉ”์ธ ์ฝ”๋“œ์— ์ˆจ์€ ๋ฌธ์ œ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ํ™•๋ฅ ์ด ๋†’์•˜๋‹ค. ๋ฒˆ์™ธ๋กœ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์œผ๋กœ ๋ฉ”์ธ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ…Œ์ฝ”๋ฅผ ๋ฆฌํŽ™ํ•ด์•ผ ํ•˜๋‹ˆ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ์˜€๋‹ค.
  • ์ผ๋‹จ ์™œ ์ค‘์š”ํ•œ์ง€ ๋ชจ๋ฅธ์ฑ„๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๋Œ์•„๊ฐ€๋„๋ก ์ž‘์„ฑ์€ ํ•ด๋‘์—ˆ์—ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ค„๋ฏธ๋ค„ ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑํ•˜๋ คํ•˜๋‹ˆ ์ฃฝ์„ ๋ง›์ด์˜€๋‹ค(๋Œ€๋ถ€๋ถ„ ๋‚ด๊ฐ€์•„๋‹Œ ํŒŒํŠธ๋„ˆ๊ฐ€ ์ž‘์„ฑํ•˜๊ธดํ–ˆ์ง€๋งŒ์„œ๋„). ์–ธ์ œ์จ๋จน์„์ง€๋„ ๋ชจ๋ฅด๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋Š” ์˜ค๋ž˜ ์ „ ์ž‘์„ฑํ•œ ๋ฉ”์ธ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ํŒŒ์•…ํ•  ๋•Œ ๋•์„ ๋ณด์•˜๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ์ „์ฒด์ ์ธ ๋กœ์ง์„ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ , ๊ตฌํ˜„ํ•ด๋†“์€ ๋ถ€๋ถ„๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์•„์ง ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๋ชธ์œผ๋กœ ์ง์ ‘ ๋Š๋‚€ ๋ฐ”๋Š” ์—ฌ๊ธฐ๊นŒ์ง€์ธ๋ฐ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ž˜ ์งœ๋‘” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋น›์„ ๋ณผ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž˜(๊น”๋”, ์ฝ๊ธฐ์ข‹๊ฒŒ) ์งœ๋Š” ๋ฒ•์„ ๋ฐฐ์›Œ๋‘์–ด์•ผ๊ฒ ๋‹ค.

๋งˆ์น˜๋ฉฐ
  • ํœดํ•™ํ•œ์ง€ ํ•œ ํ•™๊ธฐ๊ฐ€ ์ง€๋‚ฌ๋‹ค. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์‹ถ์–ด Spring์„ ์‹œ์ž‘ํ•œ์ง€๋Š” 10๊ฐœ์›” ์ •๋„๊ฐ€ ์ง€๋‚œ ์‹œ์ ์ด๋‹ค. ํ˜„์žฌ๋Š” ์Šคํ”„๋ง์„ ์ž ๊น ๋’ค๋กœํ•˜๊ณ  ์กฐ๋งŒ๊ฐ„ ๋‹ค๊ฐ€์˜ฌ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค ์ง€์›์— ์•ž์„œ Java ๋ฌธ๋ฒ•๊ณผ ๊ฐœ๋…๋“ค์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ๋‹ค. ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๋Š๋ผ์ง€๋งŒ, ์—ด์‹ฌํžˆ + ์ž˜ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ฐธ ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋Š๋ผ๊ณ , ๋‚˜์˜ ๋ถ€์กฑํ•จ๊ณผ ๋ฌด์ง€๋ฅผ ๋Š๋‚„ ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ๊ฑฐ๊ธฐ์—๋‹ค๊ฐ€ ๋‚˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐฐ์šธ ๋•Œ ์˜๋ฌธ์ ์ด ์ƒ๊ธฐ๋ฉด ์ž‘์€ ์˜๋ฌธ์ผ์ง€๋ผ๋„ ์ผ๋‹จ ํŒจ์Šคํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ง€ ๋ชปํ•˜๋Š” ๋ปฃ๋ปฃํ•œ ์œ ์—ฐ์„ฑ ํƒ“์— ๋ฐฐ์›€์˜ ์†๋„๊ฐ€ ๋Š๋ฆด ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์ฉŒ๋ฉด ๋Š๋ฆฐ ๋•๋ถ„์— ์ง€์น˜์ง€ ์•Š๊ณ  ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๋‹ค. ์ด ๊พธ์ค€ํ•จ์œผ๋กœ ๊ณ„์† ๋ฐฐ์šฐ๋ฉฐ ์„ฑ์žฅํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

์†Œ์Šค์ฝ”๋“œ ๋งํฌ

 

GitHub - Dongwoongkim/Billim-SharingPlatform: ์ค‘๊ณ  ์ œํ’ˆ ๋Œ€์—ฌ ์„œ๋น„์Šค ํ”Œ๋žซํผ ์ œ์ž‘ Spring/React

์ค‘๊ณ  ์ œํ’ˆ ๋Œ€์—ฌ ์„œ๋น„์Šค ํ”Œ๋žซํผ ์ œ์ž‘ Spring/React. Contribute to Dongwoongkim/Billim-SharingPlatform development by creating an account on GitHub.

github.com

์•„์ง์€ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋‚จ์•„์žˆ์–ด ์ถ”ํ›„์— ์ตœ์ข…๋ฐฐํฌ๊นŒ์ง€ ์™„๋ฃŒ๋˜๋ฉด ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋ฉฐ, ์ง„ํ–‰๊ณผ์ •ํ•ด์˜จ ๊ณผ์ •๋“ค์„ ์„ธ๋ถ€์ ์œผ๋กœ ๊ธฐ๋กํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ