멤버를 생성하면 멤버의 ID와 닉네임이 반환된다.
DB에서는 아래와 같이 나타난다.
만약 이메일이 중복되거나, 형식에 맞지 않는 경우, 또 비밀번호가 존재하지 않는 경우에 대해서는 예외를 호출한다.
이메일과 비밀번호를 알맞게 입력할 경우 액세스토큰과 리프레시토큰을 반환한다.
반환된 액세스 토큰과 리프레시 토큰은 멤버의 토큰 필드에 저장되어 있다.
만약 이메일이 잘못되었거나, 비밀번호가 틀릴 경우 예외가 호출된다.
요청 헤더에 Authorization 필드에 액세스토큰을 넣으면 해당 사용자의 계정을 로그아웃시킨다.
로그아웃된 유저의 refresh token 필드는 비워진다.
로그아웃된 유저의 액세스토큰으로 API 요청을 보내면 어떻게 될까? 닉네임 변경 API를 실행해보자.
현재 액세스토큰은 Redis 데이터베이스에 블랙토큰으로 지정되어 있기 때문에 해당 액세스토큰으로 오는 요청은 거부된다. 실제로 Redis 데이터베이스에 존재하는 토큰과 유저의 액세스 토큰이 정확히 일치하는 것을 확인할 수 있다.
Params에 아무런 값도 입력하지 않을 경우 모든 유저에 대한 정보를 조회한다.
Params에 특정 유저의 닉네임을 입력할 경우 닉네임에 해당하는 유저에 대한 정보만 반환된다.
사실 굳이 password에 대한 정보까지 반환할 필요는 없다. 어떤 값을 반환할지에 대해서는 API의 사용목적에 맞게 변경하면 된다.
변경하고자 하는 닉네임을 Params에 담아 보내면 유저의 닉네임을 해당 닉네임으로 변경한다.
그 결과 chrome이라는 닉네임이 Hyunseop으로 변경되었다.
요청바디에 form-data 형식으로 image 필드에 프로필로 설정하고 싶은 사진을 넣어주면 된다. 참고로 Value에 이미지 파일을 넣으려면 Value의 타입을 Text(기본값)에서 File로 변경해주어야 한다.
DB의 프로필 테이블에서 프로필 이미지에 대한 정보를 확인할 수 있다.
또한 AWS S3에 이미지가 업로드되어 저장되어 있음을 확인할 수 있다.
만약 프로필 사진을 없애거나 다른 사진으로 변경하면 어떻게 될까? 먼저 다른 사진으로 변경하는 경우이다.
기존 프로필이미지에 대한 정보가 삭제되고 새로운 이미지에 대한 정보로 대체되었다.
S3에서도 기존 이미지에 대한 정보가 새로운 이미지에 대한 정보로 대체된 것을 확인할 수 있다.
그럼 이제 프로필 이미지를 없애보자.
DB에서 프로필 이미지에 대한 정보가 사라진다.
AWS S3에서도 프로필 이미지에 대한 정보가 사라진다.
요청헤더에 담긴 access token에서 멤버의 ID를 추출하여 해당하는 멤버를 삭제한다.
그 결과 kin이라는 멤버가 삭제되었다.
만약 해당 멤버가 작성한 게시글이 있는 경우 멤버를 삭제할 수 없다. 이는 데이터베이스의 유효성을 위한 것이다(게시글의 작성자가 유효하지 않게 되는 문제). 물론 개발자의 성향에 따라 멤버를 삭제할 때 게시글까지 다 삭제해버리는 식으로 처리할 수도 있을 것이다.
프로필 이미지와 동일한 방식으로 게시글에 사진을 포함시킬 수 있다.
작성한 게시글은 DB에 저장된다.
게시글 ID로 게시글을 조회하는 API로, 일반적으로 게시글을 클릭했을 때 실행된다.
사실, 이 API는 완성도가 매우 낮은 API이다. 그 이유는 게시글을 상세 조회할 때, 게시글의 내용 뿐 아니라, 게시글 작성시간, 게시글 작성자의 프로필 사진, 댓글에 대한 정보와 댓글 작성자의 프로필 사진 등이 다 반환되어야 하기 때문이다. 하지만, 아직 배우지 않은 내용이 많다보니 지금은 간단한 형식으로만 반환하였다. 완성된 API의 예시를 잠깐만 보여주면 아래와 같이 된다.
응답이 너무 길기 때문에 아래에 정리하도록 하겠다.
{
"isSuccess": true,
"code": 1000,
"message": "요청에 성공하였습니다.",
"result": {
"boardId": 1,
"boardType": "FREE_BOARD",
"createDate": "2023-07-21",
"createTime": "1분 전",
"nickName": "chrome",
"profile": {
"imgUrl": "https://chrome-bucket.s3.ap-northeast-2.amazonaws.com/8d967c2c-199d-49e5-a50a-d079656e225e.png",
"fileName": "8d967c2c-199d-49e5-a50a-d079656e225e.png"
},
"title": "Hello everyone!",
"content": "My name is Chrome",
"getS3Res": [
{
"imgUrl": "https://chrome-bucket.s3.ap-northeast-2.amazonaws.com/1fc43e8f-33b8-402a-a290-bb04f1bca6ce.png",
"fileName": "1fc43e8f-33b8-402a-a290-bb04f1bca6ce.png"
}
],
"getCommentRes": [
{
"commentId": 1,
"parentId": null,
"groupId": 1,
"content": "Hello Chrome. I am Bora!",
"nickName": "bora",
"getS3Res": null,
"likeCount": 0,
"likeStatus": false,
"createdDate": "2023-07-21 15:29",
"modifiedDate": "2023-07-21 15:29"
},
{
"commentId": 2,
"parentId": null,
"groupId": 2,
"content": "Long time no see Chrome!",
"nickName": "jack",
"getS3Res": {
"imgUrl": "https://chrome-bucket.s3.ap-northeast-2.amazonaws.com/46dc4345-d24a-4c81-b882-dd153df801e0.png",
"fileName": "46dc4345-d24a-4c81-b882-dd153df801e0.png"
},
"likeCount": 0,
"likeStatus": false,
"createdDate": "2023-07-21 15:30",
"modifiedDate": "2023-07-21 15:30"
}
]
}
}
이것은 실제 프로젝트에서 사용한 게시글 조회 API이다. 여기에는 대댓글 기능과 댓글 좋아요 기능이 포함되어 있으며, 게시글 조회 API에서 게시글에 달린 댓글을 조회하는 API를 한번에 실행하고 있다.
기초적인 CRUD API에 대한 설명은 이 정도만 해도 충분할 것 같다. 설명을 생략한 나머지 API들도 지금까지 설명한 내용과 크게 다르지 않기 때문에 테스트해보는 데에 무리가 없을 것이다.
API 테스트에 대한 상세한 설명 감사합니다. 이메일, 비밀번호 검증을 통한 멤버 생성부터 로그인, 로그아웃, 정보 조회 및 수정, 삭제까지 실제 서비스에서 필요한 기능들에 대해 잘 이해할 수 있었습니다. 특히 이미지 업로드와 관련된 내용은 참고가 많이 되었습니다. 좋은 글 공유해주셔서 감사합니다.