Skip to content
ย 
ย 

Latest commit

ย 

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

1. ๋ชฉํ‘œ์™€ ๊ธฐ๋Šฅ

1.1 ๋ชฉํ‘œ

  • JAVA, DB๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ์ œ์ž‘ํ•œ๋‹ค.
  • ์†์ˆ˜ ๊ตฌํ˜„ํ•ด๋ณด๋ฉฐ, ์ค‘๊ฐ„์ค‘๊ฐ„ ๊ธฐ์ˆ  ๋ฐ”ํƒ•์ด ๋˜๋Š” ๊ธฐ๋ณธ ์ด๋ก ๋“ค์„ ์ตํ˜€๋ณธ๋‹ค.

1.2 ๊ธฐ๋Šฅ

  • 3.์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์™€ ๊ธฐ๋Šฅ ๋ช…์„ธ ํ•ญ๋ชฉ ์ฐธ๊ณ 

2. ํŒ€ ์†Œ๊ฐœ ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ / URL ๊ตฌ์กฐ

2.1๊ฒŒ์‹œํŒ ์„œ๋น„์Šค B.EํŒ€ ๊ตฌ์„ฑ

์—ญํ•  ๋ถ„๋‹ด

  • CTO : ๋ฐ• ์กฐ์€
  • BE : ๊น€ ํ˜„์ง€
  • BE : ์šฐ ๋น„์ฃผ
  • BE : ๊น€ ๋„ํ˜„

2.1-1 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Spring Boot 3.4.x
  • MySQL 8.x
  • PostMan

2.1-2 URL ๊ตฌ์กฐ

  • ํšŒ์› API
App URL HTTP Method Note ๋กœ๊ทธ์ธ ๊ถŒํ•œ ํ•„์š”
Auth /sign POST ํšŒ์›๊ฐ€์ž…
Auth /login POST ๋กœ๊ทธ์ธ
Auth /logout ๋กœ๊ทธ์•„์›ƒ
  • ๊ฒŒ์‹œ๊ธ€ API
App URL HTTP Method Note ๋กœ๊ทธ์ธ ๊ถŒํ•œ ํ•„์š”
Post post GET ๊ฒŒ์‹œํŒ ์ „์ฒด ๋ชฉ๋ก
Post post/email GET ์ด๋ฉ”์ผ๋กœ ๋ชฉ๋ก ํ•„ํ„ฐ๋ง
Post post/write POST ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ โœ…
Post post/edit UPDATE ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • โœ…
Post post/delete DELETE ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ โœ…
  • ๋Œ“๊ธ€ API
App URL HTTP Method Note ๋กœ๊ทธ์ธ ๊ถŒํ•œ ํ•„์š”
Comment /comment/post-comments GET ๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€๋ชฉ๋ก
Comment /comment/write POST ๋Œ“๊ธ€ ์ž‘์„ฑ โœ…
Comment /comment/edit/id UPDATE ๋Œ“๊ธ€ ์ˆ˜์ • โœ…
Comment /comment/delete/id DELETE ๋Œ“๊ธ€ ์‚ญ์ œ โœ…
  • ์ข‹์•„์š” API
App URL HTTP Method Note ๋กœ๊ทธ์ธ ๊ถŒํ•œ ํ•„์š”
Good /good/{id} GET ์ข‹์•„์š” check ์—ฌ๋ถ€ โœ…
Good /good{id} DELETE ์ข‹์•„์š” ์‚ญ์ œ โœ…

3. ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๊ธฐ๋Šฅ ๋ช…์„ธ์™€ ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ ๋ช…์„ธ

๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์ƒ์„ธ ์ฐธ๊ณ 
ํšŒ์› 1. ์ด๋ฉ”์ผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… API 2. ์ด๋ฉ”์ผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ•˜์—ฌ ์ ‘์†ํ•˜๋Š” API 3. ์ ‘์†๋œ ์œ ์ € ๋กœ๊ทธ์•„์›ƒ
์กฐํšŒ 1. ๊ฒŒ์‹œ๋ฌผ ์ „์ฒด ์กฐํšŒํ•˜๋Š” API 2. ์ž‘์„ฑ์ž ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ํŠน์ • ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๊ฒ€์ƒ‰ํ•˜๋Š” API 3. ๋Œ“๊ธ€์„ ์กฐํšŒํ•˜๋Š” API
์ƒ์„ฑ 1. ๋Œ“๊ธ€์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” API 2. ๊ฒŒ์‹œ๋ฌผ์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” API
์ˆ˜์ • 1. ๊ธฐ์กด ๋Œ“๊ธ€์˜ ๊ธ€์„ ์ˆ˜์ •ํ•˜๋Š” API 2. ๊ฒŒ์‹œ๋ฌผ์„ ์ƒˆ๋กญ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” API
์‚ญ์ œ 1. ๊ฒŒ์‹œ๋ฌผ์„ ์‚ญ์ œํ•˜๋Š” API 2. ๋Œ“๊ธ€์„ ์‚ญ์ œํ•˜๋Š” API
์˜ต์…˜ 1. ์ด๋ฉ”์ผ๊ณผ ๊ฐ™์ด ๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ API ์ธํ„ฐํŽ˜์ด์Šค ์ŠคํŽ™

์ด๋ฉ”์ผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… API

  • HTTP ๋ฉ”์†Œ๋“œ: POST
  • ์—”๋“œํฌ์ธํŠธ: /api/signup

์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "email": "user@example.com", "password": "user_password" }

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "message": "ํšŒ์›๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." }

โ€‹

์ด๋ฉ”์ผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ•˜์—ฌ ์ ‘์†ํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: POST
  • ์—”๋“œํฌ์ธํŠธ: /api/login

์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "email": "user@example.com", "password": "user_password"

โ€‹ ์‘๋‹ต ๋ณธ๋ฌธ HTTP ( token ํ•ด๋”๋กœ )

HTTP/1.1 200 OK Content-Type: application/json Authorization: Bearer your_access_token_here { "message": "๋กœ๊ทธ์ธ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." }

์ ‘์†๋œ ์œ ์ € ๋กœ๊ทธ์•„์›ƒ

  • HTTP ๋ฉ”์†Œ๋“œ: POST
  • ์—”๋“œํฌ์ธํŠธ: /api/logout

์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "email": "user@example.com" }

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "message": "๋กœ๊ทธ์•„์›ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." }

๊ฒŒ์‹œ๋ฌผ ์ „์ฒด ์กฐํšŒํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: GET
  • ์—”๋“œํฌ์ธํŠธ: /post

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

[
    {
        "idx": 1,
        "title": "์ œ๋ชฉ",
        "body": "๋‚ด์šฉ",
        "email": "์ด๋ฉ”์ผ",
        "author": "์ง์„ฑ์ž",
        "created_at": "์ž‘์„ฑ์ผ์‹œ"
    },
    {
        "idx": 2,
        "title": "์ œ๋ชฉ",
        "body": "๋‚ด์šฉ",
        "email": "์ด๋ฉ”์ผ",
        "author": "์ž‘์„ฑ์ž",
        "created_at": "์ž‘์„ฑ์ผ์‹œ"
    },
 ]

์ž‘์„ฑ์ž ์ด๋ฉ”์ผ์„ ํ†ตํ•ด ํŠน์ • ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๊ฒ€์ƒ‰ํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: GET
  • ์—”๋“œํฌ์ธํŠธ: /post/email
  • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ: ?author_email=user@example.com

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

[
    {
        "idx": 2,
        "title": "์ œ๋ชฉ",
        "body": "๋‚ด์šฉ",
        "email": "์ด๋ฉ”์ผ",
        "author": "์ž‘์„ฑ์ž",
        "created_at": "์ž‘์„ฑ์ผ์‹œ"
    },
 ]

โ€‹

๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€์„ ์กฐํšŒํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: GET
  • ์—”๋“œํฌ์ธํŠธ: /api/comment/post-comments
  • ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ: ?idx=1

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "comments": 
	 [ 
		 { "id": 1, "content": "๋Œ“๊ธ€ ๋‚ด์šฉ", "author": "์ž‘์„ฑ์ž", "post_id": 1, "created_at": "์ž‘์„ฑ์ผ์‹œ" },
		 { "id": 2, "content": "๋Œ“๊ธ€ ๋‚ด์šฉ", "author": "์ž‘์„ฑ์ž", "post_id": 1, "created_at": "์ž‘์„ฑ์ผ์‹œ" },
	 ... 
	 ]
  }

๋Œ“๊ธ€์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: POST
  • ์—”๋“œํฌ์ธํŠธ: /api/comments/write
  • ๋กœ๊ทธ์ธ ํ•„์š” ์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):
{ "content": "๋Œ“๊ธ€ ๋‚ด์šฉ",  "post_id": 1 }

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{
  "message": "๋Œ“๊ธ€์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "status": 200,
  "comment": {
    "id": "๋Œ“๊ธ€id",
    "content": "๋Œ“๊ธ€ ๋‚ด์šฉ",
    "author": "์ž‘์„ฑ์ž",
    "postId": "๊ฒŒ์‹œ๊ธ€ id",
    "createdAt": "์ž‘์„ฑ์ผ์ž"
  }
}

๊ฒŒ์‹œ๋ฌผ์„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: POST
  • ์—”๋“œํฌ์ธํŠธ: /api/posts
  • ๋กœ๊ทธ์ธํ•„์š”(Bearer Token)

์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{
    "title": "์ œ๋ชฉ",
    "body": "๋‚ด์šฉ์šฉ"
}

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "message": "๊ฒŒ์‹œ๋ฌผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." }

๊ธฐ์กด ๋Œ“๊ธ€์˜ ๊ธ€์„ ์ˆ˜์ •ํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: PUT
  • ์—”๋“œํฌ์ธํŠธ: /api/comment/edit/:comment_id
  • ๋กœ๊ทธ์ธํ•„์š”(Bearer Token)

์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{ "content": "์ˆ˜์ •๋œ ๋Œ“๊ธ€ ๋‚ด์šฉ" }

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{
  "message": "21๋ฒˆ ๋Œ“๊ธ€์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "status": 200
}

๊ฒŒ์‹œ๋ฌผ์„ ์ƒˆ๋กญ๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: PUT
  • ์—”๋“œํฌ์ธํŠธ: /api/posts/:post_id
  • ์š”์ฒญ ๋ณธ๋ฌธ(JSON ํ˜•์‹):
{   "idx": 4, 
  "title": "์ œ๋ชฉ",
  "body": "๋‚ด์šฉ"
}

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{
	๊ฒŒ์‹œ๊ธ€์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
}

์ข‹์•„์š”๋ฅผ ์ถ”๊ฐ€ํ• ์ˆ˜ ์žˆ๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: POST
  • ์—”๋“œํฌ์ธํŠธ: /api/goods/:post_id ![์Šคํฌ๋ฆฐ์ƒท 2024-12-13 ์˜ค์ „ 10.05.29.png]

์ข‹์•„์š”๋ฅผ ์ทจ์†Œํ• ์ˆ˜ ์žˆ๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: DELETE
  • ์—”๋“œํฌ์ธํŠธ: /api/goods/:post_id ![์Šคํฌ๋ฆฐ์ƒท 2024-12-13 ์˜ค์ „ 10.06.47.png]

๊ธฐ์กด ๋Œ“๊ธ€์„ ์‚ญ์ œํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: DELETE
  • ์—”๋“œํฌ์ธํŠธ: /api/comment/delete/:comment_id
  • ๋กœ๊ทธ์ธํ•„์š”(Bearer Token)

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{
  "message": "21๋ฒˆ ๋Œ“๊ธ€์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.",
  "status": 200
}

๊ธฐ์กด ๊ฒŒ์‹œ์„ ์‚ญ์ œํ•˜๋Š” API

  • HTTP ๋ฉ”์†Œ๋“œ: DELETER
  • ์—”๋“œํฌ์ธํŠธ: /post/DELETE
  • ๋กœ๊ทธ์ธํ•„์š”(Bearer Token)

์‘๋‹ต ๋ณธ๋ฌธ(JSON ํ˜•์‹):

{
	๊ฒŒ์‹œ๊ธ€์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
}

4. ๊ฐœ๋ฐœ ์ผ์ •(WBS)

Example Image

์š”๊ตฌ ์‚ฌํ•ญ ๋ถ„์„ : 2024-12-09, 5d ๊ฒŒ์‹œ๊ธ€API ๊ฐœ๋ฐœ - ๋ฐ•์กฐ์€ : 2024-12-09, 5d ๋Œ“๊ธ€API ๊ฐœ๋ฐœ - ๊น€ํ˜„์ง€ : 2024-12-09, 5d ์ข‹์•„์š”API ๊ฐœ๋ฐœ - ์šฐ๋น„์ฃผ : 2024-12-09, 5d ํšŒ์›API ๊ฐœ๋ฐœ - ๊น€๋„ํ˜„ : 2024-12-09, 5d

ํ…Œ์ŠคํŠธ : 2024-12-13, 1d ๋ฌธ์„œ ์ž‘์„ฑ : 2024-12-11, 1d

5. ํ™”๋ฉด ์„ค๊ณ„( U.I )

๋กœ๊ทธ์ธ ํผ
Example Image
๊ฒŒ์‹œ๊ธ€ ์ „์ฒด ๋ชฉ๋ก ํผ
Example Image
๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ํผ
Example Image
๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ๋‚ด์šฉ ํผ
Example Image
๋Œ“๊ธ€ ์ž‘์„ฑ ํผ
Example Image
๋Œ“๊ธ€ ๋‚ด์šฉ ํผ
Example Image]

์‚ฌ์ง„ ์ž๋ฃŒ๊ฐ€ ์—†๋„ค?

6. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง( ERD )

Example Image

7. ๋ฉ”์ธ ๊ธฐ๋Šฅ

Example Image

  • ์—ฌ๊ธฐ์— ๊ฐ์ž ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑ

Example Image

๋กœ๊ทธ์ธ ์‹œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ํ•˜๊ณ , ์›น ์„œ๋ฒ„๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์š”๊ตฌํ•œ ํ›„, ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •

8. ์—๋Ÿฌ์™€ ์—๋Ÿฌ ํ•ด๊ฒฐ

๋ฐ• ์กฐ ์€

์—๋Ÿฌ ๋ฐ ์—๋Ÿฌ ํ•ด๊ฒฐ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์ปฌ๋Ÿผ๋ช…์€ ์ผ์น˜์‹œ์ผœ์•ผ ํ•˜์ง€๋งŒ, postman์—์„œ ์‘๋‹ตํ•˜๋Š” ๊ฐ’์€ ๋ณ€์ˆ˜๋ช…์„ ์„ค์ •ํ•ด์„œ ๋ฐ”๊ฟ”๋„ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ค์ •์— ๋”ฐ๋ผ์„œ๋„ ์—๋Ÿฌ๊ฐ€ ์—„์ฒญ ๋งŽ์ด ๋‚˜๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜์–ด์„œ ์ผ๋‹จ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ ์œ„ํ•ด์„œ ๋ฌด์ž‘์ • ์ด๊ฒƒ์ €๊ฒƒ ๋งŒ์ง€๋ฉด์„œ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
Posts post = postRepository.findByIdx(postRequest.getIdx())        
.orElseThrow(() -> new InvalidValueException("ํ•ด๋‹น idx์˜ ๊ฒŒ์‹œ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค."));if(!post.getUser().getUserId().equals(postRequest.getUserIdx())) {    throw new AccessDeniedException("์ž‘์„ฑ์ž ๋ถˆ์ผ์น˜ : ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค."); }post.setBody(postRequest.getBody());post.setTitle(postRequest.getTitle());
  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ด์ค‘์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด try-catch๋งŒ ์•Œ์•˜๋Š”๋ฐ, else throw๋ฅผ ๋‘ ๋ฒˆ์”ฉ ์“ฐ๋ฉด ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์ค‘์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
        Integer userId = userDetails.getUserId();
        Integer idx = Integer.valueOf(request.get("idx"));
        String body = request.get("body");
        String title = request.get("title");
        PostRequest postRequest = new PostRequest();
        postRequest.setTitle(title);
        postRequest.setBody(body);
        postRequest.setIdx(idx);
        postRequest.setUserIdx(userId);
        PostResponse updatedPost = postService.updateBodyByIdx(postRequest);
        return ResponseEntity.ok("๊ฒŒ์‹œ๋ฌผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
  • ์ฝ”๋“œ๋Š” ์งง์„ ์ˆ˜๋ก ์ข‹๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์“ฐ๋ฉด ์“ธ์ˆ˜๋ก ๊ธธ์–ด์ง„๋‹ค.

๊น€ ํ˜„ ์ง€

์—๋Ÿฌ ๋ฐ ์—๋Ÿฌ ํ•ด๊ฒฐ

  • ๋Œ“๊ธ€์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒ์„ฑ์ผ์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๊ณ  insert ํ–ˆ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. DB table ์— ์ƒ์„ฑ์ผ ๋ถ€๋ถ„์„ not null ๋กœ ์„ค์ •ํ•ด๋‘๊ณ  ์ €์žฅํ•  ๋•Œ ๋‚ ์งœ๋ฅผ ๋„ฃ์ง€ ์•Š์•„์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์—ˆ๋Š”๋ฐ, ์—”ํ‹ฐํ‹ฐ์— @DynamicInsert์™€ @CreationTimestamp๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. @DynamicInsert ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ insert ํ•  ๋•Œ null์ธ ๊ฐ’์„ ๊ตณ์ด ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š” ์—ญํ• ์ด๊ณ , @CreationTimestamp ๋Š” ์ƒ์„ฑ์ผ ์ปฌ๋Ÿผ ์œ„์— ์ ์–ด์ฃผ๋ฉด, ์ƒ์„ฑ์ผ์„ ์•Œ์•„์„œ ๋„ฃ์–ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด์—ˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์„ ์–ผ๋งˆ๋‚˜ ์•„๋Š”๊ฐ€์— ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋Š” ๋งŒํผ ๊ฐ„๊ฒฐํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • user ํ…Œ์ด๋ธ”๊ณผ ์กฐ์ธํ•˜์—ฌ ์ž‘์„ฑ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ jpa์™€ @Query๋ฅผ ์‚ฌ์šฉ

@Query("SELECT c FROM Comments c JOIN FETCH c.user u")
List<Comments> findAllByPostsIdxOrderByCreatedAtAsc(Integer postIdx);

-> ๋‹จ์ˆœํžˆ ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ์—ˆ๋”๋‹ˆ postIdx์— ํ•ด๋‹นํ•˜๋Š” ๋Œ“๊ธ€๋“ค๋งŒ ๋ถˆ๋Ÿฌ์™”์–ด์•ผํ–ˆ๋Š”๋ฐ ์ „์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธ

@Query("SELECT c FROM Comments c JOIN FETCH c.user u WHERE c.postsIdx = :postIdx ORDER BY c.createdAt ASC")
List<Comments> findAllByPostsIdxOrderByCreatedAtAsc(@Param("postIdx") Integer postIdx);

-> where์ ˆ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ๋ถ€๋ถ„์„ @Param์œผ๋กœ ๋ฐ›์•„์„œ :postIdx ๋กœ ์‚ฌ์šฉํ•ด์„œ ์ฟผ๋ฆฌ์ ˆ ์•ˆ์—์„œ ๋ถˆ๋Ÿฌ์ฃผ๋‹ˆ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ฒŒ์‹œ๊ธ€ ๋‹น ๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์šฐ ๋น„ ์ฃผ

์—๋Ÿฌ ๋ฐ ์—๋Ÿฌ ํ•ด๊ฒฐ

  • ์ข‹์•„์š” ๊ธฐ๋Šฅ ์ž์ฒด๊ฐ€ ์œ ์ €์˜ ๋กœ๊ทธ์ธ ์ •๋ณด์™€ ๊ฒŒ์‹œ๊ธ€์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋Š”๊ฑฐ๋ผ, ํšŒ์›๊ฐ€์ž…๋ถ€ํ„ฐ ์กฐ์ธํ•˜๋ฉด์„œ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•จ
  • user ์‹œ๊ฐ„ ์ƒ์„ฑ๋ถ€๋ถ„์ด null๋กœ ๋œจ๋ฉด์„œ ๋กœ๊ทธ์ธ์ž์ฒด๊ฐ€ ์•ˆ๋˜์„œ ์‹œ๊ฐ„ ์ž๋™์ƒ์„ฑํ•ด์ฃผ๋Š” @PrePersist ์‚ฝ์ž…ํ•จ
@PrePersist
 public void prePersist() {
 if (this.createdAt == null) {
 this.createdAt = LocalDateTime.now(); // ์ž๋™์œผ๋กœ ํ˜„์žฌ ์‹œ๊ฐ„ ์„ค์ •
 }
 }

-> ๊ทธ๋Ÿฐ๋ฐ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‹œ๊ฐ„์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” @CreationTimestamp ๋ฅผ ๋„ฃ์œผ๋ฉด ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค๋Š”๊ฒƒ์„ ๊นจ๋‹ฌ์Œ

  • ๋กœ๊ทธ์ธ ์ง„ํ–‰ํ•˜๋ฉด์„œ X-AUTH-TOKEN ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฑธ๋กœ ์ง„ํ–‰ํ•˜๋‹ˆ ๋กœ๊ทธ์ธ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ์ด ํ•จ๋˜์„œ Bearer Token ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์ž‘์—…ํ•˜๋Š”๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๊ณ  ์ œ์•ˆ

๊น€ ๋„ ํ˜„

์—๋Ÿฌ ๋ฐ ์—๋Ÿฌ ํ•ด๊ฒฐ

  • ์›์ธ : ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ, ์„œ๋ฒ„์—์„œ ์‘๋‹ต์„ ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ

    -> ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ทฐ๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ @ResponseBody ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค (์‚ฌ์‹ค @RestController ์“ฐ๋ ค๊ณ  ์ž‘์„ฑํ•˜๋˜ ๊ฒƒ์ด์—ˆ์„์ง€๋„..)

  • ์›์ธ : HTTP์š”์ฒญ์˜ URL์ด ๋น„ํ”„๋ฆฐํ„ฐ๋ธ” ASCII๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์„œ ๋ฐœ์ƒ๋˜์—ˆ๋‹ค - ์›น ์„œ๋ฒ„๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ URI์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ๋•Œ, ์š”์ฒญ URI์— ํฌํ•จ๋œ ๋ฌธ์ž๊ฐ€ ASCII ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ธ์‡„ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ

.authorizeHttpRequests(authz -> authz
                       .requestMatchers("/").permitAll()
                       .requestMatchers("/api/air-reservation/*").hasAuthority("ROLE_USER")
                       .anyRequest().authenticated()
               )

-> WebConfiguration์„ ์„ค์ •ํ•˜๋Š” ํด๋ž˜์Šค์˜ fliterChain๋ฉ”์„œ๋“œ์—์„œ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ ‘๊ทผ ์ œํ•œ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์›๋“ค์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋’ค์— ์ž‘์„ฑํ•œ URL์— ๋งž์ถฐ์„œ ์žฌ์„ค์ •

  • ์›์ธ : DataSource๋ฅผ ์ƒ์„ฑํ•  ๋•Œ driverClassName์ด ๋น„์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ

-> @ConfigurationProperties(prefix = "spring.datasource")์™€ @EnableConfigurationProperties(DataSourceProperties.class) ์ž‘์„ฑ์ด ๋˜์–ด ์„œ๋กœ ํ•ฉ์ด ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๊ธฐ์— ํ™•์ธ์ด ํ•„์š”ํ•˜๊ณ  prefix์ž‘์„ฑ์‹œ yaml์˜๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ž‘์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.

  • Spring Boot์˜ ๊ธฐ๋ณธ ์„ค์ •์—์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

-> yaml์˜ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํžˆ ํ™•์ธํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”

  • ์›์ธ : yamlํŒŒ์ผ์ด ๋งŽ์€ ์ƒํ™ฉ์—์„œ Active Profiles๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ง€์ •ํ•˜์ง€ ์•Š์€ ํŒŒ์ผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  @Repository๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ Repoํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํŒŒ์ผ ์ฐพ์ง€ ๋ชปํ•  ๋•Œ๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
@EnableJpaRepositories(
        basePackages = {"com.github.movieproject.repository.auth.user","com.github.movieproject.repository.auth.role"},
        entityManagerFactoryRef = "entityManagerFactoryBean1",
        transactionManagerRef = "tmJpa1"
)

-> copy reference๋ฅผ ํ†ตํ•ด basePackage์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๊ณ  @Repository๊ฐ€ ์„ค์ •๋œ ํŒŒ์ผ์„ ์ ๊ฒ€, Active Profies๋ฅผ ํ™•์ธํ•˜์—ฌ yamlํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.

  • JwtProvider์˜ resolveToken๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด X-AUTH-TOKEN์œผ๋กœ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ํ† ํฐ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„์„œ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค?
    public String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
//   ๋ฐ”๊พธ๊ธฐ ์ „ ์ฝ”๋“œ : return request.getHeader("X-AUTH-TOKEN");
    }

->Bearer Token์œผ๋กœ ๊ต์ฒด ์ž‘์—…์„ ์ง„ํ–‰ํ•จ.

  • createToken์—์„œ username์€ ์žˆ๋Š”๋ฐ email ๊ฐ’์ด ๋“ค์–ด์˜ค์ง„ ์•Š์•˜๋‹ค.
        Claims claims = Jwts.claims()
                .setSubject(email);
                .setSubject(username);
        claims.put("roles", roles);
{
          "sub": "acron",
          "roles": [
            "ROLE_USER"
          ],
          "iat": 1733901025,
          "exp": 1733904625
}

-> setSubject๋Š” ์ฃผ์ฒด๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•œ๋ฒˆ๋งŒ ์ ์šฉ์ด ๋˜๊ณ  ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑํ•œ ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์ฒด๋ฅผ ์‚ผ๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ๋‹ค.

        Claims claims = Jwts.claims()
                .setSubject(email);
        claims.put("username", username);
        claims.put("roles", roles);

9. ๊ฐœ๋ฐœํ•˜๋ฉฐ ๋А๋‚€์ 

๋ฐ• ์กฐ ์€

๊ฐœ๋ฐœํ•˜๋ฉฐ ๋А๋‚€์ 

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

๊น€ ํ˜„ ์ง€

๊ฐœ๋ฐœํ•˜๋ฉฐ ๋А๋‚€์ 

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

  • jpa๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด ์–ด๋ ค์› ๋‹ค. ์ฟผ๋ฆฌ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด๋˜๋Š” ์ง€ ์•Œ๊ฒ ๋Š”๋ฐ jpa์—์„œ๋Š” ๋„ค์ด๋ฐ ๊ทœ์น™์ด ์žˆ์—ˆ๊ณ , ์กฐ์ธ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์“ฐ๋Š” ์ฟผ๋ฆฌ๋„ ๊ธฐ๋ณธ์˜ ์ฟผ๋ฆฌ์™€๋Š” ์‚ด์ง ๋‹ฌ๋ž๋‹ค. ์กฐ์ธ์„ ํ–ˆ์„ ๊ฒฝ์šฐ ๋„ค์ด๋ฐ๊ทœ์น™์— ์˜ํ•ด ์ผ๋˜ ์กฐ๊ฑด์ด ์•ˆ๋จนํžˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์–ด์„œ ๋‹ค์‹œ @Query์—์„œ ์กฐ๊ฑด์„ ๋‹ค์‹œ ์“ฐ๊ธฐ๋„ ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•œ @Param ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ•ด์•ผํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€๋ฅผ ๊ณ ๋ฏผํ–ˆ๋‹ค. ์šฐ์„ ์€ String์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋’€๋Š”๋ฐ, ๋‹ค์Œ์— ๋” ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๋ฉ”์„ธ์ง€์™€ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์„œ ๋ณด๋‚ด๊ณ  ์‹ถ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค์—์„œ ๋‚˜๋ˆ ์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ๋Š”๋ฐ, ๋ถ„๋ช… ๋ฐฐ์šธ ๋•Œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์งง์„ ์ˆ˜๋ก ์ข‹๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์—ฌ๊ธฐ์—์„œ ํ•˜๋Š” ๊ฒŒ ๋งž๋Š”๊ฐ€? ํ•˜๋Š” ์˜๋ฌธ๋„ ๋“ค์—ˆ๋‹ค. ์–ด๋А์ •๋„์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๊ณ , ๊ทธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ ์ฝ”๋“œ ์ค„ ์ˆ˜๋ฅผ ๊ธธ๊ฒŒ ์“ฐ์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋Š”์ง€ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.

์šฐ ๋น„ ์ฃผ

๊ฐœ๋ฐœํ•˜๋ฉฐ ๋А๋‚€์ 

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

๊น€ ๋„ ํ˜„

๊ฐœ๋ฐœํ•˜๋ฉฐ ๋А๋‚€์ 

  • OneToOne๊ณผ ManyToOne์—์„œ ์ง€์ •ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž… ์„ค์ •์„ ๋ชฐ๋ž์Œ, repository์—์„œ @Query์—์„œ SQL๋ฌธ ์ž‘์„ฑ ์‹œ Join๋ฌธ์—์„œ ๋™์ž‘์ด ์•ˆ๋˜์—ˆ์Œ, OneToOne๊ณผ ManyToOne์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž‘์„ฑ์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋ชฐ๋ž์Œ ->ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋„์™€ join๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค. ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค.

  • Spring Security์—์„œ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ UserDetailsService์˜ loadByUsername๋ฉ”์„œ๋“œ ์ž‘์„ฑ ์‹œ authorities()์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊นŒ์ง€ ์ƒ๋‹นํžˆ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋จ -> ์ŠคํŠธ๋ฆผ๊ณผ ๋žŒ๋‹ค์‹์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค. ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค.

  • JwtToken ๊ตฌํ˜„ ํ›„ ๊ตฌ์กฐ๊ฐ€ ๋น„์Šทํ•œ RefreshTokenํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•จ, Argument Resolver๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋Š” ์œ„์น˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Œ -> JWT Token,RefreshToken,Argument Resolver์— ๋Œ€ํ•œ ์ดํ•ด ๋ฐ ์‚ฌ์šฉ ์ด์œ ๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค.

About

๐Ÿ“„ supercoding project-1

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages