티스토리 뷰
이번주에는 JWT 를 활용한 회원가입 및 게시글 구현을 하였다.
저번주에 구현한 게시글 프로젝트에 회원가입 및 JWT를 이용한 회원가입 및 로그인 연동을 추가하였다.
백엔드 로직만을 구현하였고 Postman을 이용하여 테스트 하였다.
#요구사항 및 해결 방법
1. 회원 가입 API
- username, password를 Client에서 전달받기
- username은 최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 한다.
- password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 한다.
- DB에 중복된 username이 없다면 회원을 저장하고 Client 로 성공했다는 메시지, 상태코드 반환하기
- 참고자료
더보기

작성한 BoardControll 형식

BoardService 에서 signup 로직


2. 로그인API
- username, password를 Client에서 전달받기
- DB에서 username을 사용하여 저장된 회원의 유무를 확인하고 있다면 password 비교하기
- 로그인 성공 시, 로그인에 성공한 유저의 정보와 JWT를 활용하여 토큰을 발급하고, 발급한 토큰을 Header에 추가하고 성공했다는 메시지, 상태코드 와 함께 Client에 반환하기
더보기

Login 로직

#추가적인 요구사항
- 전체 게시글 목록 조회 API
- 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
- 작성 날짜 기준 내림차순으로 정렬하기
더보기

BoardService 에서 전체 조회

BoardControll에서


//전체 게시글을 for문을 이용해서 뽑아내려 하였지만 지저분하다고 생각하고
구글링을 하던 도중 stream과 collect를 이용하여 뽑아내는 방법을 발견하였다.
- 게시글 작성 API
- 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
- 제목, 작성자명(username), 작성 내용을 저장하고
- 저장된 게시글을 Client 로 반환하기
더보기

BoardService의 게시글 생성 로직

BoardControll의 로직


- 선택한 게시글 조회 API
- 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
더보기

BoardService의 특정 게시글 조회

BoardController의 특정 게시글 조회


- 선택한 게시글 수정 API
- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
- 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
더보기

BoardService의 특정 게시글 수정

BoardController의 특정 게시글 수정


- 선택한 게시글 삭제 API
- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능
- 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기
더보기

BoardService의 특정 게시글 삭제

BoardController의 특정 게시글 삭제


# API 명세서
| Method | URL | Request | Response |
| Post | /api/user/signup |
{
"username":"username1",
"password":"password1"
}
|
{
"가입이 완료되었습니다."
}
|
| Post | /api/user/login |
{
"username":"username1",
"password":"password1"
}
|
{
"로그인이 완료되었습니다."
}
|
| Get | /api/posts | - |
{
"createdAt": "2022-12-09T14:45:34.5844743",
"modifiedAt": "2022-12-09T14:45:34.5844743",
"id": 1,
"username": "username1",
"text": "text1",
"title":"title2"
}
{
"createdAt": "2022-12-09T14:45:34.5844743",
"modifiedAt": "2022-12-09T14:45:34.5844743",
"id": 2,
"name": "username1",
"text": "text2",
"title":"title2"
}
|
| Get | /api/posts/{id} | - |
{
"createdAt": "2022-12-09T14:45:34.5844743",
"modifiedAt": "2022-12-09T14:45:34.5844743",
"id": 1,
"username": "username1",
"text": "text1",
"title":"title1"
}
|
| Post | /api/posts |
{
"text":"text1",
"title":"title1"
}
|
{
"createdAt": "2022-12-09T14:45:34.5844743",
"modifiedAt": "2022-12-09T14:45:34.5844743",
"id": 1,
"username": "username1",
"text": "text1",
"title":"title1"
}
|
| Put | /api/posts/{id} |
{
"text":"text2",
"title":"title1"
}
|
{
"createdAt": "2022-12-09T14:45:34.5844743",
"modifiedAt": "2022-12-09T14:45:34.5844743",
"id": 2,
"username": "username1",
"text": "text2",
"title":"title1"
}
|
| Delete | /api/posts/{id} | - | { "success":"true", } |
# ERD 설계

#어려웠던 점
-Board라는 Entity에서 User이라는 Entity의 username을 가져와서 게시글의 저장하고
게시글을 조회할 때는 가져온 User객체에서 username이라는 작성자 이름을 가져오는
특정 로직을 구현하는데 애를 먹었다.
-Entity와 Entity끼리의 one to many관계,
Board라는 객체에서 클라이언트에게 보여줄 ResponseDto의 관계를 이해할 수 있었다.


이번 과제에는 실행만 되길 바라는 마음으로 겨우 과제 시간에 맞춰 완성하였다.
어노테이션의 의미, Comment와 Board 의 관계를 잘 이해하지 못했고 주변 사람들에게 물어보며 겨우 구현하였다.
다음 과제까지 이번에 구현한 과제를 공부하며 이해하고 리펙토링 할 수 있는 실력을 키워야겠다.
Service에서 인증 인가를 하지 않고 Controller 부분에서 인증 인가를 다 끝낸 후 Service로 넘겨줄 수 있도록 연습하고,
객체의 책임과 역할에 대해 더 고민하고 작성 해야겠다.
'개발 > Weekly I Learned' 카테고리의 다른 글
| WIL(Weekly I Learned)/23.01.15 (2) | 2023.01.16 |
|---|---|
| WIL(Weekly I Learned)/22.12.25 (0) | 2022.12.25 |
| WIL(Weekly I Learned)/22.12.11/ # Spring 게시판구현 (0) | 2022.12.09 |
| WIL(Weekly I Learned)/22.12.04/ # OOP 개념 정리 (0) | 2022.12.02 |
| WIL(Weekly I Learned)/22.11.27 (0) | 2022.11.28 |
댓글