- 과제 1. 사용자 회원가입 엔드포인트
- 이메일과 비밀번호로 회원가입할 수 있는 엔드포인트를 구현해 주세요.
- 이메일과 비밀번호에 대한 유효성 검사를 구현해 주세요.
- 이메일 조건: @ 포함
- 비밀번호 조건: 8자 이상
- 비밀번호는 반드시 암호화하여 저장해 주세요.
- 이메일과 비밀번호의 유효성 검사는 위의 조건만으로 진행해 주세요. 추가적인 유효성 검사 조건은 포함하지 마세요.
- 과제 2. 사용자 로그인 엔드포인트
- 사용자가 올바른 이메일과 비밀번호를 제공하면, 사용자 인증을 거친 후에 JWT(JSON Web Token)를 생성하여 사용자에게 반환하도록 해주세요.
- 과제 1과 마찬가지로 회원가입 엔드포인트에 이메일과 비밀번호의 유효성 검사기능을 구현해주세요.
- 과제 3. 새로운 게시글을 생성하는 엔드포인트
- 과제 4. 게시글 목록을 조회하는 엔드포인트
- 반드시 Pagination 기능을 구현해 주세요.
- 과제 5. 특정 게시글을 조회하는 엔드포인트
- 게시글의 ID를 받아 해당 게시글을 조회하는 엔드포인트를 구현해 주세요.
- 과제 6. 특정 게시글을 수정하는 엔드포인트
- 게시글의 ID와 수정 내용을 받아 해당 게시글을 수정하는 엔드포인트를 구현해 주세요.
- 게시글을 수정할 수 있는 사용자는 게시글 작성자만이어야 합니다.
- 과제 7. 특정 게시글을 삭제하는 엔드포인트
- 게시글의 ID를 받아 해당 게시글을 삭제하는 엔드포인트를 구현해 주세요.
- 게시글을 삭제할 수 있는 사용자는 게시글 작성자만이어야 합니다.
박정현
- 해당 repository clone
- PreAssignmentApplication 실행
- http://localhost:8080 으로 접근
https://supark0206.notion.site/b8b64bb504564283a76c3216efbd74ea?pvs=4
-
모델링
- Board(게시판)와 User(사용자) 테이블을 만들었습니다.
- @ManyToOne 관계이기 때문에 성능(이후 기능 추가가 되도 성능 리팩토링이 더 쉽다.)과 sql 추적을 위해 지연로딩을 사용하였습니다.
-
과제 1. 사용자 회원가입 [POST]/api/join
- Srping Security를 사용하여 PasswordEncorder를 통해 암호화 처리하였습니다.
- DTO에서 @Email 과 @Pattern 을 통해서 유효성 조건을 달아두고 Controller 에서 @Valid를 통해서 유효성 검사를 진행하였습니다.
- 오류 발생시 GlobalExceptionHandler를 통해서 message와 에러코드를 출력하였습니다.
-
과제 2. 사용자 로그인 [POST]/api/login
- PasswordEncorder를 사용해서 비교한이후 로그인 진행하였습니다.
- 올바른 로그인 진행시 사용자 인증이후 JWT 토큰을 발급합니다 .
- 로그인된 사용자는 @AuthenticationPrincipal 를 통해서 사용 할 수 있고 @LoginUser 어노테이션을 만들어 직관성 올렸습니다.
-
과제 3. 새로운 게시글을 생성 [POST]/api/board
- 로그인된 사용자를 확인하여 게시글 제목, 내용, 카테고리를 지정하여 게시글을 등록합니다.
-
과제 4. 게시글 목록을 조회 [GET]/api/board?page=1&size=10
- jpa Pageable 인스턴스를 활용하여 페이징 처리를 진행하였습니다.
- @RequestParam 파라미터로 page,size를 받습니다.
- page,size 파라미터를 받아서 PageRequest를 통해 원하는 페이지, 한 페이지 나오는 게시글을 반환합니다.
-
과제 5. 특정 게시글을 조회 [GET]/api/board/{boardId}
- @PathVariable을 이용하여 url {boardId}에 원하는 게시글 아이디를 입력하여 조회 할 수있습니다.
-
과제 6. 특정 게시글을 수정 [PUT]/api/board/{boardId}
- @PathVariable을 이용하여 url {boardId}에 원하는 게시글 아이디를 입력하여 수정 할 수있습니다.
-
과제 7. 특정 게시글을 삭제 [DELETE]/api/board/{boardId}
- @PathVariable을 이용하여 url {boardId}에 원하는 게시글 아이디를 입력하여 삭제 할 수있습니다.
-
과제 1. 사용자 회원가입 [POST]/api/join
- request
{ "email":"testnaver.com", "password":"123456", "name":"이름" }
- response
{ //성공 "id": 2, "message": "회원가입에 성공하였습니다." }
{ //이메일 중복 "status": 409, "error": "CONFLICT", "code": "EXIST_USER_EMAIL", "message": "중복된 이메일이 존재합니다." }
{ //비밀번호 입력 오류 "status": 400, "error": "joinUserRequest", "code": "BAD_REQUEST_JOIN_PATTERN", "message": "비밀번호는 8글자 이상이어야합니다." }
{ //이메일 입력 오류 "status": 400, "error": "joinUserRequest", "code": "BAD_REQUEST_JOIN_EMAIL", "message": "이메일 형식에 맞지 않습니다" }
-
과제 2. 사용자 로그인 [POST]/api/login
- request
{ "email":"[email protected]", "password":"12345678" }
- response
{ "grantType": "Bearer", "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QG5hdmVyLmNvbSIsImF1dGgiOiJST0xFX1VTRVIiLCJleHAiOjE2OTIyNzIxMTJ9.HdOdzlVf_1yco1KV-Z_tudK4DtcoAfrULg2wQBUcb3U", "refreshToken": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2OTIyNzIxMTJ9.4g2TSU2jmwkZ2Sm-1sZsdFNMr8FH97b1EUn73jS95fQ" }
-
과제 3. 새로운 게시글을 생성 [POST]/api/board
- request
{ "title":"test11", "content":"ffzz", "boardCategory":"FREE" }
- response
{ "id": 10, "message": "게시글을 등록하였습니다." }
-
과제 4. 게시글 목록을 조회 [GET]/api/board?page=1&size=10
- request
- request parameter : (Integer)page, (Integer)size
- response
{ "boardList": [ { "id": 4, "title": "test2", "createBy": "이름", "createDate": "2023-08-16T21:53:41.93374" }, { "id": 5, "title": "test3", "createBy": "이름", "createDate": "2023-08-16T21:53:44.651862" }, { "id": 6, "title": "test3", "createBy": "이름", "createDate": "2023-08-16T21:53:48.569843" } ], "totalPages": 3 }
- request
-
과제 5. 특정 게시글을 조회 [GET]/api/board/{boardId}
- request
- request path : type : Long, {boardId} : 게시글 아이디
- response
{ "id": 1, "title": "제목", "content": "내용", "boardCategory": "QNA", "createBy": "이름", "createDate": "2023-08-16T20:35:15.018386", "updateDate": "2023-08-16T20:37:29.50288" }
- request
-
과제 6. 특정 게시글을 수정 [PUT]/api/board/{boardId}
- request
- request path : type : Long, {boardId} : 게시글 아이디
- response
{ "id": 10, "message": "게시글을 수정하였습니다." }
- request
-
과제 7. 특정 게시글을 삭제 [DELETE]/api/board/{boardId}
- request
- request path : type : Long, {boardId} : 게시글 아이디
- response
{ "id": 1, "message": "게시글을 삭제하였습니다." }
- request