[웹 개발 프로젝트] 5. 모집글 수정/삭제/ 목록 조회 구현

adorableco·2024년 1월 14일
0

수정과 삭제는 예상대로 쉬웠다! 새로운 클래스 생성이 없으므로 패키지 계층 구조는 그대로니 스킵!

1. 모집글 삭제

public String deleteById(Long id){
        try{
            postRepository.deleteById(id);
            return "모집글 삭제 완료";
        }catch (Exception e){
            return "모집글 삭제 실패 " + e;
        }
    }

Jpa라는거.. 정말 달다
모집글 id를 전달 인자로 받아 JpaRepository 를 상속받는 PostRepository의 deleteById 메서드를 이용하여 해당 모집글을 삭제한다.


@DeleteMapping("/api/post/{id}")
    public ResponseEntity<String> deletePostById(@PathVariable Long id) {
        return ResponseEntity.ok().body(postService.deleteById(id));
    }

삭제 완료 시, 메서드에서 반환되는 결과 String을 response body에 담아 보낸다.


모집글 수정

@Transactional
    public String updatePost(Long id, AddPostRequest dto){
        Post post = postRepository.findById(id).get();
        Match match = matchRepository.findById(post.getMatch().getMatchId()).get();
        Tag tag = tagRepository.findById(post.getTag().getTagId()).get();

        post.setTitle(dto.getTitle());
        post.setContent(dto.getContent());
        match.setMatchDate(dto.getMatch().getMatchDate());
        match.setPlace(dto.getMatch().getPlace());
        match.setHeadCnt(dto.getMatch().getHeadCnt());
        tag.setAgeType(dto.getTag().getAgeType());
        tag.setGenderType(dto.getTag().getGenderType());
        tag.setLevelType(dto.getTag().getLevelType());

        return "모집글 수정 완료";

    }

@Transactional 의 편리함을 처음 알게 되었다. 이 어노테이션이 붙어있는 메서드 내에서 엔티티 칼럼에 업데이트가 발생하면 자동으로 데이터베이스에 반영이 된다고 한다. 위 코드 같은 경우에는 업데이트가 발생하지 않은 칼럼들도 모두 업데이트가 되지만 @DynamicUpdate 어노테이션을 사용하면 실제 업데이트가 일어난 칼럼만 데이터베이스에 반영된다고하니 추후에 변경을 고려해봐야겠다. 사실 코드에 사용은 했지만 Jpa 의 여러 기능들에 대해 잘 모르는 것 같아서 따로 공부를 해야겠다는 생각을 했다.


    @PutMapping("/api/post/{id}")
    public ResponseEntity<String> modifyPostById(@PathVariable Long id, @RequestBody AddPostRequest dto) {
        return ResponseEntity.ok().body(postService.updatePost(id,dto));
    }

참고로 수정 api 요청 시 request dto는 모집글 등록 request dto를 그대로 사용하였다. 메서드의 String을 반환받아서 요청 결과를 response body에 담아 보낸다.


그리고 개발 중에 일어난 한가지 이슈..

당장 백엔드 서버를 파기보다는 바로 테스트를 해봐야 할 상황이라 프론트 쪽에서 mariadb를 켜고 스프링 어플리케이션을 바로 실행해보려고 하는데 아래와 같은 이슈가 발생했다.

ERROR 12568 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=74) Incorrect string value: '\xEC\xB4\x88\xEB\x93\xB1...' for column `springdb`.`matches`.`place` at row 1

역시 내 PC에서 잘되던게 다른 PC에서는 작동이 안될 수 있구나.. 생각하고 문제를 파악해보니 MySql에 한글 데이터를 입력하려면 오류가 나는 경우가 있다고 한다.
문제 파악 전에 혹시나해서 request body의 필드명을 name에서 Name (대문자 변경)으로 바꾸니 정상적으로 실행은 됐다. 그래도 이렇게 된다고 해도 말이 안되기 때문에.... 해결 방법을 찾아보니 인코딩 설정 사항을 변경해주면 된다고 한다.

ALTER TABLE (테이블명) convert to charset utf8;

맥에서 개발하던걸 윈도우에서 열어서 그런건가? 모르겠다

모집글 목록 조회

미리 간략하게 만들어둬서, 거기서 필터링을 할 수 있도록 쿼리 스트링을 받는 것만 더 추가하였다.

public interface PostRepository extends JpaRepository<Post, Long> {
    List<Post> findByCategory(String category);
}

PostRepository 에 카테고리로 post를 찾을 수 있도록 메서드를 하나 추가해준다. 이전과 마찬가지로 PostService 에도 findByCategory 메서드를 생성하고 postRepository의 메서드를 반환하도록 해두면 된다!


    @GetMapping("/api/posts")
    public ResponseEntity<List<PostResponse>> findPosts(@RequestParam("category") String category) {
        List<PostResponse> posts;
        if (category == null) {
            posts = postService.findAll()
                    .stream()
                    .map((Post post) -> new PostResponse(post))
                    .toList();
        } else {
            posts = postService.findByCategory(category)
                    .stream()
                    .map((Post post) -> new PostResponse(post))
                    .toList();
        }

        return ResponseEntity.ok()
                .body(posts);
    }

태그의 나이대, 성별, 수준 별로도 필터링을 해야하지만 일단은 카테고리만 구현해본다. requestParam 으로 category 가 들어오면 findByCategory() 메서드로 해당 카테고리의 모집글만 리스트로 만들 수 있도록 하고, 아무 것도 들어오지 않아 category가 null 이라면 전체 모집글 리스트를 만들 수 있도록 findAll() 메서드를 이용한다.


다음 할 일

  • 경기 참가 신청 기능 구현

아좌좌

profile
👩🏻‍💻

0개의 댓글