이번주 수행 사항
필수과제
•
JWT 로그인 구현(POST /api/v1/member/login)
•
내 도서 리스트 구현(GET /api/v1/myBooks)
•
내 도서 상세정보 구현(GET /api/v1/myBooks/{id})
•
로그인 한 회원의 정보 구현(GET /api/v1/member/me)
•
Spring Doc 으로 API 문서화(크롬 /swagger-ui/index.html )
추가과제
•
엑세스 토큰 화이트리스트 구현(Member 엔티티에 accessToken 필드 추가)
•
리액트에서 작동되도록
◦
아래 API 명세에 맞게 구현하시면 강사가 제공해 드린 리액트 코드가 작동합니다.
미션 개요 - 요구사항 정의
•
4주차에서는 REST API를 구현해야 합니다.
◦
새 스프링부트 프로젝트에서 구현해도 되고, 기존 스프링부트 프로젝트에서 구현해도 됩니다.
•
3주차 프로젝트의 DB를 공유합니다.
•
강사가 구현한 프론트엔드 소스코드가 제공됩니다.
◦
클라이언트는 리액트로 구현되었습니다.
◦
여러분은 REST API 서버만 구현해주세요.
REST API
GET /api/v1/myBooks
•
로그인 필요
•
현재 로그인한 회원이 소유한 책정보들을 리스팅
•
현재 1번 회원이 로그인 되었다고 가정
◦
로그인 방식은 JWT 엑세스 토큰
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"myBooks": [
{
"id": 4,
"createDate": [
2022,
11,
3,
17,
3,
22,
162538000
],
"modifyDate": [
2022,
11,
3,
17,
3,
22,
162538000
],
"ownerId": 2,
"product": {
"id": 3,
"createDate": [
2022,
11,
3,
17,
3,
22,
62061000
],
"modifyDate": [
2022,
11,
3,
17,
3,
22,
62061000
],
"authorId": 1,
"authorName": "user1",
"subject": "상품명3"
}
},
{
"id": 5,
"createDate": [
2022,
11,
3,
17,
3,
22,
162538000
],
"modifyDate": [
2022,
11,
3,
17,
3,
22,
162538000
],
"ownerId": 2,
"product": {
"id": 4,
"createDate": [
2022,
11,
3,
17,
3,
22,
66057000
],
"modifyDate": [
2022,
11,
3,
17,
3,
22,
66057000
],
"authorId": 2,
"authorName": "홍길순",
"subject": "상품명4"
}
}
]
},
"fail": false,
"success": true
}
JavaScript
복사
GET /api/v1/myBooks/{myBookId}
•
로그인 필요
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"myBook": {
"id": 3,
"createDate": [
2022,
11,
3,
17,
21,
5,
730612000
],
"modifyDate": [
2022,
11,
3,
17,
21,
5,
730612000
],
"ownerId": 1,
"product": {
"id": 5,
"createDate": [
2022,
11,
3,
17,
21,
5,
625079000
],
"modifyDate": [
2022,
11,
3,
17,
21,
5,
625079000
],
"authorId": 1,
"authorName": "user1",
"subject": "상품명5",
"bookChapters": [
{
"id": 6,
"subject": "제목 6",
"content": "내용 6",
"contentHtml": "내용 6"
},
{
"id": 5,
"subject": "제목 5",
"content": "내용 5",
"contentHtml": "내용 5"
},
{
"id": 2,
"subject": "자바스크립트를 우아하게 사용하는 방법",
"content": "# 자바스크립트는 이렇게 쓰세요.\n\n```js\nconst a = 10;\nconsole.log(a);\n```\n",
"contentHtml": "<h1>자바스크립트는 이렇게 쓰세요.</h1><div data-language=\"js\" class=\"toastui-editor-ww-code-block-highlighting\"><pre class=\"language-js\"><code data-language=\"js\" class=\"language-js\"><span class=\"token keyword\">const</span> a <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n<span class=\"token console class-name\">console</span><span class=\"token punctuation\">.</span><span class=\"token method function property-access\">log</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n"
},
{
"id": 1,
"subject": "자바를 우아하게 사용하는 방법",
"content": "# 내용 1",
"contentHtml": "<h1>내용 1</h1>"
}
]
}
}
},
"fail": false,
"success": true
}
JavaScript
복사
POST /api/v1/member/login
•
username과 password 를 입력하면 그에 해당하는 accessToken 을 생성
{
"resultCode": "S-1",
"msg": "로그인 성공, Access Token을 발급합니다.",
"data": {
"accessToken": "eyJhbGciOiJIUzUxMiJ9.eyJib2R5Ijoie1wiaWRcIjoyLFwiY3JlYXRlRGF0ZVwiOlsyMDIyLDExLDMsMTcsMywyMSw5NTk0MzAwMDBdLFwibW9kaWZ5RGF0ZVwiOlsyMDIyLDExLDMsMTcsMywyMiwxNjI1MzgwMDBdLFwidXNlcm5hbWVcIjpcInVzZXIyXCIsXCJlbWFpbFwiOlwidXNlcjJAdGVzdC5jb21cIixcImVtYWlsVmVyaWZpZWRcIjpmYWxzZSxcIm5pY2tuYW1lXCI6XCLtmY3quLjsiJxcIixcImF1dGhMZXZlbFwiOlwiTk9STUFMXCIsXCJhdXRob3JpdGllc1wiOlt7XCJhdXRob3JpdHlcIjpcIk1FTUJFUlwifSx7XCJhdXRob3JpdHlcIjpcIkFVVEhPUlwifV19IiwiZXhwIjo0ODIxMDYyNzcxfQ.LinAN3u8IrXSzJejLCYKMQE84LMWOOzbfi0giVoN647ciodIXMT1TvLq0oxIPs-fD0ZdBRUikt_jq193bgyFeg"
},
"fail": false,
"success": true
}
JavaScript
복사
GET /api/v1/member/me
•
로그인 필요
•
현재 로그인된 회원의 정보를 출력
{
"resultCode": "S-1",
"msg": "성공",
"data": {
"member": {
"id": 2,
"createDate": [
2022,
11,
3,
17,
3,
21,
959430000
],
"modifyDate": [
2022,
11,
3,
17,
6,
11,
429765000
],
"username": "user2",
"email": "user2@test.com",
"emailVerified": false,
"nickname": "홍길순"
}
},
"fail": false,
"success": true
}
JavaScript
복사
ERD
•
3주차 프로젝트의 DB를 공유합니다.