Spring 과제 Level 3
신규 서비스 요구사항
- 회원 가입 API
- password는 최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9), 특수문자로 구성되어야 한다.
- 회원 권한 부여하기 (ADMIN, USER) - ADMIN 회원은 모든 게시글, 댓글 수정 / 삭제 가능
- 댓글 작성 API
- 토큰을 검사하여, 유효한 토큰일 경우에만 댓글 작성 가능
- 선택한 게시글의 DB 저장 유무를 확인하기
- 선택한 게시글이 있다면 댓글을 등록하고 등록된 댓글 반환하기
- 댓글 수정 API
- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 댓글만 수정 가능
- 선택한 댓글의 DB 저장 유무를 확인하기
- 선택한 댓글이 있다면 댓글 수정하고 수정된 댓글 반환하기
- 댓글 삭제 API
- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 댓글만 삭제 가능
- 선택한 댓글의 DB 저장 유무를 확인하기
- 선택한 댓글이 있다면 댓글 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기
- 예외 처리
- 토큰이 필요한 API 요청에서 토큰을 전달하지 않았거나 정상 토큰이 아닐 때는 "토큰이 유효하지 않습니다." 라는 에러메시지와 statusCode: 400을 Client에 반환하기
- 토큰이 있고, 유효한 토큰이지만 해당 사용자가 작성한 게시글/댓글이 아닌 경우에는 “작성자만 삭제/수정할 수 있습니다.”라는 에러메시지와 statusCode: 400을 Client에 반환하기
- DB에 이미 존재하는 username으로 회원가입을 요청한 경우 "중복된 username 입니다." 라는 에러메시지와 statusCode: 400을 Client에 반환하기
- 로그인 시, 전달된 username과 password 중 맞지 않는 정보가 있다면 "회원을 찾을 수 없습니다."라는 에러메시지와 statusCode: 400을 Client에 반환하기
서비스 요구사항 수정
- 전체 게시글 목록 조회 API
- 각각의 게시글에 등록된 모든 댓글을 게시글과 같이 Client에 반환하기
- 댓글은 작성 날짜 기준 내림차순으로 정렬하기
- 선택한 게시글 조회 API
- 선택한 게시글에 등록된 모든 댓글을 선택한 게시글과 같이 Client에 반환하기
- 댓글은 작성 날짜 기준 내림차순으로 정렬하기
API 명세서 및 테스트
노션 - https://brash-scissor-ee5.notion.site/Lv3-df3cd931ba124c2fa92217e77cc72269?pvs=4
비밀번호 검증 시 특수문자를 추가하는 부분에서 \\W를 사용하면 공백이 추가가 가능해 \\S를 이용해서 공백을 제거했는데, 공백을 제외한 문자열 전부가 가능이라 한글과 이상한 특수문자들도 포함되어 따로 가능한 특수문자를 정규식에 직접 포함시켜 처리했다.
유저 roleEnum을 추가해서 유저에 칼럼을 추가해서 권한 검증을 구현했다.
엔티티 구성을 나는 ManyToOne을 이용한 N 대 1 단방향을 해서 user에서 board와 comment를 가지고 있고 유저에서 참조가 가능하도록 되어 board와 comment에 유저정보를 따로 안 넣고 사용을 하였는데, 댓글을 게시물에 양방향으로 연결하고 조회할 경우 중복 참조를 인해 스택오버 오류가 발생해 따로 댓글 정보를 가져와서 리스트로 만들어서 board에 넣어주는 방식으로 해결방법을 찾았다.
그에 반면에 페어분은 OneToMany를 이용해 1 대 N 단방향으로 1에서 정보를 관리해서 따로 board와 comment에 유저구분 데이터를 넣어야 하지만 조회 부분에서 따로 다른 처리 없이 바로 comment정보를 넣어서 조회가 가능해 이 방법으로 구현을 하였다. 똑같은 단방향이지만 누가 참조의 주체인가. 어떤 식으로 구현을 할 것인가에 따라서 엔티티 구성을 완전히 달리하는 걸 알 수 있는 좋은 경험이었다.
'생각정리 > 항해99' 카테고리의 다른 글
[주특기 3주차] Spring 1일차 (0) | 2023.09.08 |
---|---|
[주특기 2주차] Spring 6일차 (1) | 2023.09.07 |
[주특기 2주차] Spring 4일차 (0) | 2023.09.05 |
[주특기 2주차] Spring 3일차 (0) | 2023.09.04 |
[Weekly I Learned]9월 1주차 (0) | 2023.09.04 |