[UMC 9주차] 인스타그램 개발 실전! - POST, PATCH, DELETE

유보라·2022년 5월 17일
0

UMC 2기

목록 보기
12/14
post-thumbnail

안녕하세요! 9주차로 돌아온 보라입니다💜

  1. 실습 과정
  2. 트러블 슈팅
  3. 강의 후기

8주차에서 데이터 베이스 연결 오류가 뜨는데, 아직도 해결을 못했습니다😥 어디가 잘못된건지 계속 찾아보고는 있는데 뭔가 예감 상 오타일 것 같긴 합니다😭 그래도 진도는 나가야하니까, 9주차 워크북 시작하겠습니다!

실습 과정

1. POST - 게시물 생성 API

코드 작성

POST method를 이용하여 게시글을 생성하는 API를 만들어보자!

먼저 아래와 같이 PostPostsReqPostImgsUrlReq 모델을 만들어주었다!

@Getter
@Setter
@AllArgsConstructor
public class PostPostsReq {
    private int userIdx;
    private String content;
    private List<PostImgsUrlReq> postImgUrls;

}
@Getter
@Setter
@AllArgsConstructor
public class PostImgsUrlReq {
    private String imgUrl;
}

  • PostController
    PostController에서 게시글 생성 함수인 createPosts를 만들어보자.
    PostService의 createPosts함수를 사용할 것이다.
//PostController
	@ResponseBody
    @PostMapping("")
    public BaseResponse<PostPostsRes> createPosts(@RequestBody PostPostsReq postPostsReq) {
        try{
            //게시물 본문의 길이가 너무 길 때
            if(postPostsReq.getContent().length() > 450) {
                return new BaseResponse<>(BaseResponseStatus.POST_POSTS_INVALID_CONTENTS);
            }
            //사진이 선택되지 않았을 때
            if(postPostsReq.getPostImgUrls().size() < 1) {
                return new BaseResponse<>(BaseResponseStatus.POST_POSTS_EMPTY_IMGURL);
            }

            PostPostsRes postPostsRes = postService.createPosts(postPostsReq.getUserIdx(), postPostsReq);
            return new BaseResponse<>(postPostsRes);

        } catch(BaseException exception){
            return new BaseResponse<>((exception.getStatus()));
        }
    }

  • PostService
    PostService에도 createPost 함수를 만들어주자.
    PostService에서는 PostDao의 insertPost함수와 insertPostImgs함수를 사용할 것이다.
public PostPostsRes createPost(int userIdx, PostPostsReq postPostsReq) throws BaseException {
        try{
            int postIdx = postDao.insertPost(userIdx, postPostsReq.getContent());

            for (int i=0; i<postPostsReq.getPostImgUrls().size(); i++) {
                postDao.insertPostImgs(postIdx, postPostsReq.getPostImgUrls().get(i));
            }

            return new PostPostsRes(postIdx);
        }
        catch (Exception exception) {
            throw new BaseException(DATABASE_ERROR);
        }
    }

  • PostDao
    insertPost함수와 insertPostImgs 함수를 만들어주었다.
    PostDao에서 만드는 함수에는 쿼리문이 들어가있는 것을 볼 수 있다.
    즉, Dao는 직접적으로 DB를 건드리는 부분이다.
public int insertPost(int userIdx, String content){
        String insertPostQuery = "INSERT INTO Post(useridx, content) VALUES (?, ?)";
        Object []insertPostParams = new Object[] {userIdx, content};
        this.jdbcTemplate.update(insertPostQuery,
                insertPostParams);

        //자동으로 가장 마지막에 들어간 idx 값을 리턴해줌
        String lastInsertIdxQuery="SELECT last_insert_id()";
        return this.jdbcTemplate.queryForObject(lastInsertIdxQuery, int.class);

    }

    public int insertPostImgs(int postIdx, PostImgsUrlReq postImgsUrlReq){
        String insertPostImgsQuery = "INSERT INTO PostImgUrl(postidx, imgUrl) VALUES (?, ?)";
        Object []insertPostImgsParams = new Object[] {postIdx, postImgsUrlReq.getImgUrl()};
        this.jdbcTemplate.update(insertPostImgsQuery,
                insertPostImgsParams);

        //자동으로 가장 마지막에 들어간 idx 값을 리턴해줌
        String lastInsertIdxQuery="SELECT last_insert_id()";
        return this.jdbcTemplate.queryForObject(lastInsertIdxQuery, int.class);

    }

POSTMAN 테스트

밑에 null이라고 뜨긴 하는데, DB에 들어가서 확인해보니 데이터가 잘 들어가있었다!

2. PATCH - 게시물 수정 API

코드 작성

이번에는 PATCH method를 이용하여 게시글을 수정하는 API를 만들어보자!

이번에도 아래와 같이 PatchPostsReq 모델을 만들어주었다!

@Getter
@Setter
@AllArgsConstructor
public class PatchPostsReq {
    private int userIdx;
    private String content;
    private List<PostImgsUrlReq> postImgUrls;

}

  • PostController
    PostController에는 게시글 생성 함수인 modifyPost를 만들어보자.
    PostService의 modifyPost함수를 사용할 것이다.
//PostController
	@ResponseBody
	@PatchMapping("/{postIdx}")
    public BaseResponse<String> modifyPost(@PathVariable ("postIdx") int postIdx, @RequestBody PatchPostsReq patchPostsReq) {
        try{
            //게시물 본문의 길이가 너무 길 때
            if(patchPostsReq.getContent().length() > 450) {
                return new BaseResponse<>(BaseResponseStatus.POST_POSTS_INVALID_CONTENTS);
            }

            postService.modifyPost(patchPostsReq.getUserIdx(), postIdx, patchPostsReq);
            String result = "게시물 정보 수정을 완료하였습니다.";

            return new BaseResponse<>(result);

        } catch(BaseException exception){
            return new BaseResponse<>((exception.getStatus()));
        }
    }

  • PostService
    PostService에도 modifyPost 함수를 만들어주었다.
    PostService에서는 PostDao의 updatePost함수를 사용할 것이다.
    public void modifyPost(int userIdx, int postIdx, PatchPostsReq patchPostsReq) throws BaseException {
        //존재하지 않는 유저일 경우
        if(postProvider.checkUserExist(userIdx) == 0) {
            throw new BaseException(USERS_EMPTY_USER_ID);
        }
        //존재하지 않는 게시물일 경우
        if(postProvider.checkPostExist(userIdx) == 0) {
            throw new BaseException(POSTS_EMPTY_POST_ID);
        }

        try {
            int result = postDao.updatePost(postIdx, patchPostsReq.getContent());
            
            //업데이트 과정 중 문제가 생겼을 경우
            if(result == 0) {
                throw new BaseException(MODIFY_FAIL_POST);
            }
        }
        catch (Exception exception) {
            throw new BaseException(DATABASE_ERROR);
        }
    }

위의 코드처럼 validation 처리를 해주기 위해 에러 코드를 추가해준 후, PostDao와 PostProvider에 각각 checkPostExist 함수를 추가해주었다.

//BaseResponseStatus
//에러 코드 추가
POSTS_EMPTY_POST_ID(false, 2020, "게시물 아이디 값을 확인해주세요."),

MODIFY_FAIL_POST(false, 3020, "게시물 수정을 실패했습니다."),
//PostDao
//Post가 존재하는지 확인하는 checkPostExist 함수
public int checkPostExist(int postIdx){
        String checkPostExistQuery = "select exists(select postIdx from Post where postIdx = ?)";
        int checkPostExistParams = postIdx;
        return this.jdbcTemplate.queryForObject(checkPostExistQuery,
                int.class,
                checkPostExistParams);

    }
//PostPovider
//Post가 존재하는지 확인하는 checkPostExist 함수
public int checkPostExist(int postIdx) throws BaseException{
        try{
            return postDao.checkPostExist(postIdx);
        } catch (Exception exception){
            throw new BaseException(DATABASE_ERROR);
        }
    }

  • PostDao
    updatePost함수를 만들어주었다.
    public int updatePost(int postIdx, String content){
        String updatePostQuery = "UPDATE Post SET content=? WHERE postIdx=?";
        Object [] updatePostParams = new Object[] {content, postIdx};
        return this.jdbcTemplate.update(updatePostQuery, updatePostParams);

    }

POSTMAN 테스트

3. PATCH - 게시글 삭제 API

코드 작성

이번에는 PATCH를 이용해서 게시글을 삭제하는 API를 만들어보겠다.

게시글 삭제인데 PATCH method를 이용하는 이유는, 게시글이 삭제된다는 것이 DB에서 완전히 사라지는 것을 의미하는 것이 아닌, status가 'ACTIVE'에서 'INACTIVE'로 변화하는 것을 의미하기 때문이다.

삭제는 전달 받을 것이 없으므로 model은 따로 만들어주지 않아도 된다!

  • PostController
    PostController에는 게시글 생성 함수인 deletePost를 만들어보자.
    PostService의 deletePost함수를 사용할 것이다.
//PostController
	@ResponseBody
    @PatchMapping("/{postIdx}/status")
    public BaseResponse<String> deletePost(@PathVariable ("postIdx") int postIdx) {
        try{
            postService.deletePost(postIdx);
            String result = "삭제를 성공했습니다.";

            return new BaseResponse<>(result);

        } catch(BaseException exception){
            return new BaseResponse<>((exception.getStatus()));
        }
    }

  • PostService
    PostService에도 deletePost 함수를 만들어주었다.
    PostService에서는 PostDao의 deletePost함수를 사용할 것이다.
//PostService
    public void deletePost(int postIdx) throws BaseException {
        try {
            int result = postDao.deletePost(postIdx);

            //삭제 과정 중 문제가 생겼을 경우
            if(result == 0) {
                throw new BaseException(DELETE_FAIL_POST);
            }
        }
        catch (Exception exception) {
            throw new BaseException(DATABASE_ERROR);
        }
    }

위의 코드처럼 validation 처리를 해주기 위해 에러 코드를 추가해주었다.

//BaseResponseStatus
//에러 코드 추가
DELETE_FAIL_POST(false,3021,"게시물 삭제를 실패했습니다."),

  • PostDao
    deletePost함수를 만들어주었다.
//PostDao
    public int deletePost(int postIdx){
        String deletePostQuery = "UPDATE Post SET status='INACTIVE' WHERE postIdx=?";
        Object [] deletePostParams = new Object[] {postIdx};
        return this.jdbcTemplate.update(deletePostQuery, deletePostParams);

    }

POSTMAN 테스트

트러블 슈팅

POSTMAN 테스트 오류 1

문제 원인

게시물 생성 API를 테스트하는데 에러가 떴다.

Request method 'POST' not supported 라고 하는데!

해결 방안

바보같이 빌드를 안 해서 오류가 떴었답니다..허허

POSTMAN 테스트 오류 2

문제 원인

게시물 수정, 삭제 API를 테스트하는데 에러가 떴다.

해결 방안

여기도 빌드 안 해서..ㅎ

강의 후기

포스트맨 테스트를 다 실패해서 실습을 하긴 했지만 한 것 같지가 않다... 허허
그리고 에러 로그로 뜨다 보니까 어디에서 틀렸는지 정확히 알려주지를 않아서 화가 난다!!

코드 이해도 제대로 해보고 싶은데, 진도도 나가야하고 할 일도 있다 보니 아직 깊이 이해하지는 못했다 ㅠㅠ 하지만 시간이 생기면 꼭 해볼 것이다.

그리고 혼자서 이정도 수준의 개발을 할 수 있을까 생각을 해봤는데 무리일 것 같다.. 더 깊이 공부해보려는 자세가 필요할 것 같다.

profile
인하대학교 컴퓨터공학과 학생입니다😀

0개의 댓글