ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [내일배움캠프] 1월 3주차 WIL 회고록
    카테고리 없음 2023. 1. 22. 14:02

    이번주는 팀프로젝트를 만들었다.

     

    팀 프로젝트 소개 : 

    "간단한 도움이 필요할 때, 심부름 서비스 루비네 집사"

    학습 기간 동안 갈고 닦아온 여러 기술들을 활용하여 팀원들과 함께 간단한 심부름을 시킬 수 있는 심부름 서비스를 만들어 보았습니다.

    간단한 도움이 필요한 구매자가 도움 글을 게시하면 도움을 줄 헬퍼가 이를 확인한 후 매칭 신청을 합니다.

    구매자가 매칭 신청을 확인한 후 이를 수락,거절하여 매칭 결과를 표시합니다.

    매칭이 수락된 경우, 도움 글의 상태는 심부름 중으로 변하고 심부름이 마친 후 심부름 끝으로 변합니다.

    관리자는 구매자와 헬퍼의 프로필을 관리 할 수 있으며, 구매자가 심부름 요청을 하면 관리자는 승인 및 거절을 할 수 있고, 헬퍼와 구매자가 부적절한 행동을 할 경우 구매자 및 헬퍼 권한을 해제할 수 있습니다.

     

    나는 여기서 매칭 기능을 구현했다.

    매칭 게시글을 만들고, 구매자가 수락 및 거절을 할 수 있는 기능,  매칭 게시글 전체 조회, 선택 조회, 수정 및 삭제 기능을 만들었다.


     

    어려웠던 점은

    1 . 주소를 만들때 board id와 matchboard id 두개를 받아와야 했는데, id를 두개 받는건 처음이라 처음에 어떻게 해야할지 고민했다. 생각보다 엄청 간단했는데, Controller 에서 id를 받아올때 @PathVariable 로 id를 받아오는데 그냥 이 어노테이션을 두개써서

    board id와 matchboard id를 받아오면 되는 문제였다.  


    2. 수락 / 거절 기능을 만들기가 너무 어려웠었다.

    처음에는 저번 프로젝트에서 필수 구현이었던 좋아요 기능을 따라 구현하려고 저번 프로젝트에서 좋아요 기능을 구현한 팀원분에 깃허브를 참고해서 수락 / 거절 기능을 만들었는데, 따로 Entity를 만들고 FK도 새로 만들고 해야하니 너무 과하다고 해야하나 너무 복잡하게 기능을 구현 한 것 같다는 팀원분의 말을 듣고 팀원분이 어떻게 해야할지 조언을 해주셔서 그 조언을 따라 만들었다.

     

    MatchBoard Entity

    기본값이 "모집중" 인 status를 선언했다.

    @Column(nullable = false)
        public String status = "모집중";

     

    그리고 upStatus() 메소드를 만들었다.

     public void upStatus() {
            this.status = "수락된 게시물";
        }

    똑같이 downStatus() 메소드를 만들었다.

    public void downStatus() {
            this.status = "거절된 게시물";
        }

    MatchBoardController

    컨트롤러 부분은 수정을 별로 안했다. board_id와 matchboard_id 값을 매개변수로 받는 upStatus, downStatus 메서드 를 만들었다.

     // 심부름 신청글 수럭
        @PostMapping("/api/board/{board_id}/matchboard/{matchboard_id}/up")
        public ResponseEntity upStatus(@PathVariable Long board_id, @PathVariable Long matchboard_id) {
            return matchBoardService.upStatus(board_id,matchboard_id);
        }
    
        // 심부름 신청글 거절
        @PostMapping("/api/board/{board_id}/matchboard/{matchboard_id}/down")
        public ResponseEntity downStatus(@PathVariable Long board_id, @PathVariable Long matchboard_id) {
            return matchBoardService.downStatus(board_id,matchboard_id);
        }

    MatchBoardServiceImpl

    먼저 수락 기능부터 만들었다.

    if문을 사용하여 matchBoard,status의 값이 "모집중" 이면 matchBoard.upStatus 메소드를 실행해 "수락 완료" 상태로 바꾸고,

    addhelpCount 메소드도 같이 실행해 도움횟수도 1 올렸다.

    그 후 else if 문을 사용해 matchBoard,status의 값이 "수락된 게시물" 이면 익셉션을 출력하게 만들었고,

    다시 else if 문을 사용해 matchBoard,status의 값이 "거절된 게시물" 이면 익셉션을 출력하게 만들었다.

     // status가 모집중이면 수락된 게시물로 변경 및 help_cnt 1 증가
            if (matchBoard.status.equals("모집중")) {
                matchBoard.upStatus();
                matchBoard.addhelpCount();
    
                // 이미 status가 수락된 게시물이면 익셉션 출력
            } else if (matchBoard.status.equals("수락된 게시물")) {
                throw new MatchException.AlreadyApplyMatchException();
    
                // 이미 status가 거질 된 게시물이면 익셉션 출력
            } else if(matchBoard.status.equals("거절된 게시물")) {
                throw new MatchException();

    거절기능도 수락기능과 거의 비슷하게 만들었다.

    matchBoard.status가 "모집중" 이면 matchBoard.downStatus() 메소드를 사용해서 "거절 완료"로 바뀌도록 만들었고,

    else if 문을 사용해 만약 matchBoard.status가 "거절 완료" 이면 익셉션을 출력하게 만들었고,

    다시 else if 문을 사용해 matchBoard.status가 "수락된 게시물" 이면 익셉션을 출력하게 만들었다.

    // 심부름 거절 기능 추가
        // 거절 기능
        @Override
        public ResponseEntity downStatus(Long boardId, Long matchboardId) {
            Board board = boardRepository.findById(boardId).orElseThrow(
                    BoardException.BoardNotFoundException::new
            );
    
            MatchBoard matchBoard = matchBoardRepository.findById(matchboardId).orElseThrow(
                    MatchException.MatchNotFoundException::new
            );
    
            // status가 모집중이면 거절된 게시물로 변경
            if (matchBoard.status.equals("모집중")) {
                matchBoard.downStatus();
    
                // status가 거절 완료인 상태면 익셉션 출력
            } else if (matchBoard.status.equals("거절 완료")) {
               throw new MatchException();
    
               // status가 수락된 게시물 상태이면 익셉션 출력
            } else if (matchBoard.status.equals("수락된 게시물")) {
                throw new MatchException.AlreadyApplyMatchException();
            }

    3. 매칭 게시글을 전체 조회할때 페이징 기능이 구현되게 만들어야 했는데 이것도 처음에는 할 줄 몰라서 구글링을 해봤는데 프론트쪽으로 많이 나와서.. 팀원분이 구현하신 페이징 기능을 따라 구현했다. 


    4  MatchBoard에서 게시글을 생성할때 유저별로 한 번만 쓸수 있어야 하지만 한명이 여러번 게시글을 만들 수 있었다.

    시도 해 봤다:  

    이렇게 User를 받는 Optional을 만들어서 유저를 찾은 다음에, if문을 사용해 isPresent()나 isEmpty를 사용해서 중복을 제거 하려 했지만 안됬다. 

    Optional<User> user1 = userRepository.findByUsername(userDetails.getUsername());

    또, MatchBoardRepository에 findMatchBoardBy() 메서드를 만들고,

    Optional<MatchBoard> findMatchBoardBy();

    Service 에서 위에 User와 마찬가지로 여러가지 구현을 해봤는데 전부 안됐다..

    해결했다 : 팀원분들한테 도움을 받아 해결했다. 먼저 MatchBoardRepository에서 메서드를 만들었다,

    Optional<MatchBoard> findByUsername(String username);

    그 후 Service에서 기능 구현을 했다.

    먼저 user에 getRole이 CUSTOMER 이면 권한이 없다는 익셉션을 출력하게 만들었다.

    MatchBoard는 권한이 helper이거나 admin만 작성이 가능하다.

    if (user.getRole().equals(UserRoleEnum.CUSTOMER)) {
        throw new UserException.AuthorityException();

    그 후 matchBoardRepository에서 findByUsername으로 user,getUsername().isPresent()를 받아와서 

    matchBoardRepository에 해당 유저가 이미 들어 가 있다면 이미 게시글을 작성했다는 익셉션을 출력하게 만들었다.

    } else if (matchBoardRepository.findByUsername(user.getUsername()).isPresent()) {
        throw new MatchException.AlreadyMatchBoardFoundExcption();

    if문 두개를 통과하면 헬퍼 및 어드민 권한이고, 게시글을 아직 작성하지 않았다는 뜻이므로 게시물을 생성한다.

    } else {
        MatchBoard matchBoard = new MatchBoard(user,requestDto);
        matchBoardRepository.save(matchBoard);
        return new MatchBoardResponseDto(matchBoard,board);
    }

    아직 수정 해야 할 부분이 더 있으나 어려워서 아직 수정은 하지 못했다.

    이번 팀 프로젝트를 하면서 많은 부분을 배웠고, 내가 아직 실력이 많이 부족하다는 것을 느꼈다.

    다음주 목표: 공부하기!

Designed by Tistory.