///
Search
🍎

4주차

상태
미션 공개 완료

이번주 수행 사항

필수과제

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를 공유합니다.