수행 사항
필수과제
•
댓글
•
좋아요
•
마이피드
•
알림
•
Swagger에 ApiOperation을 써서 Controller 설명 보이게 할 것
도전과제
•
댓글, 좋아요, 알림 UI구현
•
Admin기능
Architecture(아키텍처)
▲ 위 Layered Architecture 구조에 맞게 작성 해주세요.
•
각 단에 데이터를 전달 받을시 DTO 형태로 전달한다.
ERD
주의
AWS EC2에 배포되지 않은 기능은 점수로 들어가지 않습니다. 배포가 아무것도 되지 않았다면 0점 입니다.
미션 개요 - 요구사항 정의
댓글
•
댓글 목록 조회
◦
댓글 조회는 모든 접근이 권한을 가진다.(Token없이 가능)
◦
제목, 글쓴이, 작성날짜가 표시된다.
◦
목록 기능은 페이징 기능이 포함된다.
▪
한 페이지당 default 피드 갯수는 10개이다.
▪
총 페이지 갯수가 표시된다.
▪
작성날짜 기준으로 최신순으로 sort한다.
•
댓글 작성
◦
댓글 작성은 로그인 한 사람만 쓸 수 있습니다.
•
댓글 수정 / 삭제
◦
댓글 수정은 댓글을 작성한 회원만이 권한을 가집니다.
좋아요
•
좋아요 누르기
•
‘좋아요’는 한번만 누를 수 있습니다. 중복으로 누르는 경우는 에러 처리.
•
좋아요 조회는 모든 접근이 권한을 가진다.(Token없이 가능)
마이피드
•
조회
◦
내가 작성한 글만 보이는 기능
◦
제목, 글쓴이, 내용, 작성날짜가 표시된다.
◦
목록 기능은 페이징 기능이 포함된다. (Pageable 사용)
▪
한 페이지당 default 피드 갯수는 20개이다.
▪
총 페이지 갯수가 표시된다.
▪
작성날짜 기준으로 최신순으로 sort한다.
알람
•
알람 리스트 조회
◦
알람 조회는 모든 회원이 권한을 가집니다.
◦
특정 User의 알람 목록을 받아옵니다.
◦
특정 포스트에 새 댓글이 달리고, 좋아요가 눌리면 알람이 등록됩니다.
◦
알람 목록은 Pagination으로 받아옵니다. (Pageable 사용)
▪
한 페이지당 default 피드 갯수는 20개
▪
총 페이지 갯수가 표시
▪
작성날짜 기준으로 최신순으로 sort
Post가 삭제 되었을 때 처리
•
Post와 Comment, Like가 관계를 맺고 있어서 댓글이 나 Like가 있는 글을 지울 때 문제가 생길 수 있습니다.
•
처리 방법은 Soft Delete방법과 orphanremoval = true 두 가지가 있습니다.
•
Soft Delete방법 추천
◦
Foreign key빼는 것
◦
Post는 delete쿼리를 날리지 않고 deleted_at이라는 컬럼에 now로 설정
◦
조회 할 때 deleted_at컬럼이 null인 것만 가져오게 설정
주요 엔드 포인트
기본 url : /api/v1
댓글
댓글 조회
GET /posts/{postId}/comments[?page=0]
•
Pageable을 사용하여 10개씩 최신순으로 페이징한다.
•
리턴 (JSON 형식)
{
"resultCode": "SUCCESS",
"result":{
"content":[
{
"id": 3,
"comment": "comment test3",
"userName": "test",
"postId": 2,
"createdAt": "2022-12-20T16:07:25.699346"
},
{
"id": 2,
"comment": "comment test2",
"userName": "test",
"postId": 2,
"createdAt": "2022-12-20T16:03:30.670768"
}
],
"pageable":{"sort":{"empty": false, "sorted": true, "unsorted": false },
"offset": 0,…},
"last": true,
"totalPages": 1,
"totalElements": 2,
"size": 10,
"number": 0,
"sort":{
"empty": false,
"sorted": true,
"unsorted": false
},
"numberOfElements": 2,
"first": true,
"empty": false
}
}
JSON
복사
댓글 작성
POST /posts/{postsId}/comments
•
입력폼 (JSON 형식)
{
"comment" : "comment test4"
}
JSON
복사
•
리턴 (JSON 형식)
{
"resultCode": "SUCCESS",
"result":{
"id": 4,
"comment": "comment test4",
"userName": "test",
"postId": 2,
"createdAt": "2022-12-20T16:15:04.270741"
}
}
JSON
복사
댓글 수정
PUT /posts/{postId}/comments/{id}
•
입력폼 (JSON 형식)
{
"comment" : "modify comment"
}
JSON
복사
•
리턴 (JSON 형식)
{
"resultCode": "SUCCESS",
"result":{
"id": 4,
"comment": "modify comment",
"userName": "test",
"postId": 2,
"createdAt": "2022-12-20T16:15:04.270741",
"lastModifiedAt": "2022-12-23T16:15:04.270741"
}
}
JSON
복사
댓글 삭제
DELETE /posts/{postsId}/comments/{id}
•
리턴 (JSON 형식)
{
"resultCode": "SUCCESS",
"result":{
"message": "댓글 삭제 완료",
"id": 4
}
}
JSON
복사
좋아요
좋아요 누르기
POST /posts/{postId}/likes
•
like를 한번 누를 때 마다 row가 1개씩 추가되는 방식으로 구현
•
리턴 (JSON 형식)
{
"resultCode":"SUCCESS",
"result": "좋아요를 눌렀습니다."
}
JSON
복사
좋아요 개수
GET /posts/{postsId}/likes
•
리턴 (JSON 형식)
{
"resultCode":"SUCCESS",
"result": 0
}
JSON
복사
마이 피드 기능
조회 기능
GET /posts/my
•
로그인된 유저만의 피드목록을 필터링 하는 기능 (Pageable 사용)
•
리턴 (JSON 형식)
{
"resultCode": "SUCCESS",
"result":{
"content":[
{
"id": 4,
"title": "test",
"body": "body",
"userName": "test",
"createdAt": "2022-12-16T16:50:37.515952"
}
],
"pageable":{
"sort":{"empty": true, "sorted": false, "unsorted": true }, "offset": 0,…},
"last": true,
"totalPages": 1,
"totalElements": 1,
"size": 20,
"number": 0,
"sort":{
"empty": true,
"sorted": false,
"unsorted": true
},
"numberOfElements": 1,
"first": true,
"empty": false
}
JSON
복사
알람
알람 url : /alarms
특정 사용자의 글에 대한 알림 조회
알람 리스트
GET /alarms
•
최신 순으로 20개씩 표시 (Pageable 사용)
•
알람 리스트 조회 시 응답 필드
◦
id : 알람 ID
◦
alarmType :알람 타입 (NEW_COMMENT_ON_POST, NEW_LIKE_ON_POST)
◦
fromUserId: fromUserId(알림을 발생시킨 user id)
◦
targetId : targetId(알림이 발생된 post id)
◦
text : alarmType 따라 string 필드에 담아 줄 수 있도록 필드를 선언합니다.
▪
NEW_COMMENT_ON_POST 일 때는 alarmText → new comment!
▪
NEW_LIKE_ON_POST 일 때는 alarmText → "new like!"
◦
createdAt : 등록일시
•
리턴 (JSON 형식)
{
"resultCode":"SUCCESS",
"result": {
"content":
[
{
"id": 1,
"alarmType": "NEW_LIKE_ON_POST",
"fromUserId": 1,
"targetId": 1,
"text": "new like!",
"createdAt": "2022-12-25T14:53:28.209+00:00",
}
]
}
}
JSON
복사
테스트 코드 작성
마이피드 기능
Controller
마이피드 조회 성공
마이피드 조회 실패(1) - 로그인 하지 않은 경우
Service
없음
댓글 등록
Controller
댓글 작성 성공
댓글 작성 실패(1) - 로그인 하지 않은 경우
댓글 작성 실패(2) - 게시물이 존재하지 않는 경우
Service
없음.
댓글 수정
Controller
댓글 수정 성공
댓글 수정 실패(1) : 인증 실패
댓글 수정 실패(2) : Post 없는 경우
댓글 수정 실패(3) : 작성자 불일치
댓글 수정 실패(4) : 데이터베이스 에러
Service
없음
댓글 삭제
Controller
댓글 삭제 성공
댓글 삭제 실패(1) : 인증 실패
댓글 삭제 실패(2) : Post없는 경우
댓글 삭제 실패(3) : 작성자 불일치
댓글 삭제 실패(4) : 데이터베이스 에러
Service
없음
댓글 리스트
Controller
댓글 목록 조회 성공
Service
없음
좋아요 기능
Controller
좋아요 누르기 성공
좋아요 누르기 실패(1) - 로그인 하지 않은 경우
좋아요 누르기 실패(2) - 해당 Post가 없는 경우
Service
없음
알람기능
Controller
알람 목록 조회 성공
알람 목록 조회 실패 - 로그인하지 않은 경우
Service
없음
[참고자료]