- JAVA, DB๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ํ๋ค.
- ์์ ๊ตฌํํด๋ณด๋ฉฐ, ์ค๊ฐ์ค๊ฐ ๊ธฐ์ ๋ฐํ์ด ๋๋ ๊ธฐ๋ณธ ์ด๋ก ๋ค์ ์ตํ๋ณธ๋ค.
- 3.์๊ตฌ์ฌํญ ๋ช ์ธ์ ๊ธฐ๋ฅ ๋ช ์ธ ํญ๋ชฉ ์ฐธ๊ณ
- CTO : ๋ฐ ์กฐ์
- BE : ๊น ํ์ง
- BE : ์ฐ ๋น์ฃผ
- BE : ๊น ๋ํ
- Spring Boot 3.4.x
- MySQL 8.x
- PostMan
- ํ์ 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 | ์ข์์ ์ญ์ | โ |
| ๊ธฐ๋ฅ | ์์ธ | ์ฐธ๊ณ |
|---|---|---|
| ํ์ | 1. ์ด๋ฉ์ผ ๋น๋ฐ๋ฒํธ ์ ๋ ฅํ์ฌ ํ์๊ฐ์ API 2. ์ด๋ฉ์ผ ๋น๋ฐ๋ฒํธ ์ ๋ ฅํ์ฌ ์ ์ํ๋ API 3. ์ ์๋ ์ ์ ๋ก๊ทธ์์ | |
| ์กฐํ | 1. ๊ฒ์๋ฌผ ์ ์ฒด ์กฐํํ๋ API 2. ์์ฑ์ ์ด๋ฉ์ผ์ ํตํด ํน์ ๊ฒ์๋ฌผ๋ค์ ๊ฒ์ํ๋ API 3. ๋๊ธ์ ์กฐํํ๋ API | |
| ์์ฑ | 1. ๋๊ธ์ ์๋กญ๊ฒ ๋ง๋ค ์ ์๋ API 2. ๊ฒ์๋ฌผ์ ์๋กญ๊ฒ ๋ง๋ค ์ ์๋ API | |
| ์์ | 1. ๊ธฐ์กด ๋๊ธ์ ๊ธ์ ์์ ํ๋ API 2. ๊ฒ์๋ฌผ์ ์๋กญ๊ฒ ์์ ํ ์ ์๋ API | |
| ์ญ์ | 1. ๊ฒ์๋ฌผ์ ์ญ์ ํ๋ API 2. ๋๊ธ์ ์ญ์ ํ๋ API | |
| ์ต์ | 1. ์ด๋ฉ์ผ๊ณผ ๊ฐ์ด ๊ฒ์๊ธ ์ข์์๋ฅผ ํ ์ ์๋ ๊ธฐ๋ฅ |
- HTTP ๋ฉ์๋: POST
- ์๋ํฌ์ธํธ: /api/signup
์์ฒญ ๋ณธ๋ฌธ(JSON ํ์):
{ "email": "user@example.com", "password": "user_password" }์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{ "message": "ํ์๊ฐ์
์ด ์๋ฃ๋์์ต๋๋ค." }โ
- 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": "๋ก๊ทธ์์๋์์ต๋๋ค." }- HTTP ๋ฉ์๋: GET
- ์๋ํฌ์ธํธ: /post
์๋ต ๋ณธ๋ฌธ(JSON ํ์):
[
{
"idx": 1,
"title": "์ ๋ชฉ",
"body": "๋ด์ฉ",
"email": "์ด๋ฉ์ผ",
"author": "์ง์ฑ์",
"created_at": "์์ฑ์ผ์"
},
{
"idx": 2,
"title": "์ ๋ชฉ",
"body": "๋ด์ฉ",
"email": "์ด๋ฉ์ผ",
"author": "์์ฑ์",
"created_at": "์์ฑ์ผ์"
},
]- HTTP ๋ฉ์๋: GET
- ์๋ํฌ์ธํธ: /post/email
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ: ?author_email=user@example.com
์๋ต ๋ณธ๋ฌธ(JSON ํ์):
[
{
"idx": 2,
"title": "์ ๋ชฉ",
"body": "๋ด์ฉ",
"email": "์ด๋ฉ์ผ",
"author": "์์ฑ์",
"created_at": "์์ฑ์ผ์"
},
]โ
- 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": "์์ฑ์ผ์" },
...
]
}- HTTP ๋ฉ์๋: POST
- ์๋ํฌ์ธํธ: /api/comments/write
- ๋ก๊ทธ์ธ ํ์ ์์ฒญ ๋ณธ๋ฌธ(JSON ํ์):
{ "content": "๋๊ธ ๋ด์ฉ", "post_id": 1 }์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{
"message": "๋๊ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์์ต๋๋ค.",
"status": 200,
"comment": {
"id": "๋๊ธid",
"content": "๋๊ธ ๋ด์ฉ",
"author": "์์ฑ์",
"postId": "๊ฒ์๊ธ id",
"createdAt": "์์ฑ์ผ์"
}
}- HTTP ๋ฉ์๋: POST
- ์๋ํฌ์ธํธ: /api/posts
- ๋ก๊ทธ์ธํ์(Bearer Token)
์์ฒญ ๋ณธ๋ฌธ(JSON ํ์):
{
"title": "์ ๋ชฉ",
"body": "๋ด์ฉ์ฉ"
}์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{ "message": "๊ฒ์๋ฌผ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์์ต๋๋ค." }- HTTP ๋ฉ์๋: PUT
- ์๋ํฌ์ธํธ: /api/comment/edit/:comment_id
- ๋ก๊ทธ์ธํ์(Bearer Token)
์์ฒญ ๋ณธ๋ฌธ(JSON ํ์):
{ "content": "์์ ๋ ๋๊ธ ๋ด์ฉ" }์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{
"message": "21๋ฒ ๋๊ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ๋์์ต๋๋ค.",
"status": 200
}- HTTP ๋ฉ์๋: PUT
- ์๋ํฌ์ธํธ: /api/posts/:post_id
- ์์ฒญ ๋ณธ๋ฌธ(JSON ํ์):
{ "idx": 4,
"title": "์ ๋ชฉ",
"body": "๋ด์ฉ"
}์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{
๊ฒ์๊ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ๋์์ต๋๋ค.
}
- HTTP ๋ฉ์๋: POST
- ์๋ํฌ์ธํธ: /api/goods/:post_id ![์คํฌ๋ฆฐ์ท 2024-12-13 ์ค์ 10.05.29.png]
- HTTP ๋ฉ์๋: DELETE
- ์๋ํฌ์ธํธ: /api/goods/:post_id ![์คํฌ๋ฆฐ์ท 2024-12-13 ์ค์ 10.06.47.png]
- HTTP ๋ฉ์๋: DELETE
- ์๋ํฌ์ธํธ: /api/comment/delete/:comment_id
- ๋ก๊ทธ์ธํ์(Bearer Token)
์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{
"message": "21๋ฒ ๋๊ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์ญ์ ๋์์ต๋๋ค.",
"status": 200
}- HTTP ๋ฉ์๋: DELETER
- ์๋ํฌ์ธํธ: /post/DELETE
- ๋ก๊ทธ์ธํ์(Bearer Token)
์๋ต ๋ณธ๋ฌธ(JSON ํ์):
{
๊ฒ์๊ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์ญ์ ๋์์ต๋๋ค.
}
์๊ตฌ ์ฌํญ ๋ถ์ : 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
| ๋ก๊ทธ์ธ ํผ |
|---|
![]() |
| ๊ฒ์๊ธ ์ ์ฒด ๋ชฉ๋ก ํผ |
![]() |
| ๊ฒ์๊ธ ์์ฑ ํผ |
![]() |
| ๊ฒ์๊ธ ์์ธ ๋ด์ฉ ํผ |
![]() |
| ๋๊ธ ์์ฑ ํผ |
![]() |
| ๋๊ธ ๋ด์ฉ ํผ |
] |
์ฌ์ง ์๋ฃ๊ฐ ์๋ค?
- ์ฌ๊ธฐ์ ๊ฐ์ ๊ตฌํํ ๊ธฐ๋ฅ์ ์์ฑ
๋ก๊ทธ์ธ ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ์์ฒญ์ ํ๊ณ , ์น ์๋ฒ๊ฐ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์๊ตฌํ ํ, ์๋ฒ๊ฐ ํด๋น ์ ๋ณด๋ฅผ ๊ฒ์ฆํ์ฌ ์ฑ๊ณต ๋๋ ์คํจ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ ๊ณผ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐธ์กฐํ ๋ ์ปฌ๋ผ๋ช ์ ์ผ์น์์ผ์ผ ํ์ง๋ง, 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);- ๋ด๊ฐ ํผ์์ ๊ตฌํํ ๊ฒ ์๋๋ผ ํ์๋ค์ ๋์์ ๋ฐ์ ๊ตฌํ์ ํ ์ ์์๋ค. 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์ ๋ํ ์ดํด ๋ฐ ์ฌ์ฉ ์ด์ ๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค. ์ถ๊ฐ์ ์ธ ํ์ต์ด ํ์ํ๋ค.









