· 오늘 공부한 것

게시판 서버 만들기 => 필수 구현 기능(CRUD) 작업

강의에서 배운 내용을 따라가면 구현

 

 

· 공부한 내용, 궁금한 내용, 부족한 내용

sprint 입문 2주 차까지 내용을 바탕으로 개인과제를 수행하였다. 강의에서 나온 memo프로젝트로 CRUD를 한 것과 유사해서 많은 부분을 복습하며 진행하였다. 필수로 구현해야 하는 부분은 5가지였다.

  1.  게시글 작성 기능 (create)
  2. 선택한 게시글 조회 기능 (read)
  3. 게시글 목록 조회 기능 (read)
  4. 선택한 게시글 수정 기능 (update)
  5. 선택한 게시글 삭제 기능 (delete)

3 Layer Architecture

전에 작성한 Use Case Diagram과 위의 그림의 흐름을 생각하며 진행을 하였다. 먼저 Client가 무언가를 요청을 했을 때 api 구분을 controller에서 진행을 해주었다. 어떤 메서드로 왔는지 무슨 데이터가 같이 왔는지를 보면서 구분을 해주었다. 그리고 여기서 중요한 점은 client관점에서 보면 controller -> service -> repository -> database 순으로 갔다가 오는 것으로 보이지만 작업을 할 때는 DI(의존성 주입)을 통해 IoC(제어의 역전)을 생각하며 진행을 했다. 이것에 대한 부분은 전에 정리한 부분이 있다. https://lsj135779.tistory.com/63

  @PutMapping("/post/{id}")
    public PostResponseDto updatePost(@PathVariable Long id, @RequestBody PostRequestDto requestDto) {
        return postService.updatePost(id, requestDto);
    }

5가지 중에 많은 내용을 포함하고 있는 update인 게시글 수정 요청이 들어왔을 때 controller에서 받는 부분이다. put메서드라고 매핑을 통해 api를 입력해 주고 필요한 게시글의 id는 Path Variable 방식으로 받았고, 나머지 변경가능한 내용(title, username, contents)과 확인을 위한 password는 body로 전달받았다. 그래서 @

PathVariable

과 @RequestBody를 사용했다. 그리고 코드에 나오지 않았지만 제어의 흐름이 역전되었기 때문에 위에서 postService 객체를 만들어서 사용하고 있다.

 

    @Transactional
    public PostResponseDto updatePost(Long id, PostRequestDto requestDto) {
        Post post = findMemo(id);
        // 요청할 때 비밀번호와 DB에 저장된 비밀번호가 일치한지 확인
        if (Objects.equals(post.getPassword(), requestDto.getPassword())) {
            post.update(requestDto);
            PostResponseDto responseDto = new PostResponseDto(post);
            return responseDto;
        } else {
            PostResponseDto responseDto = new PostResponseDto("해당 게시글의 비밀번호와 일치하지 않습니다.");
            return responseDto;
        }
    }
    
    private Post findMemo(Long id) {
    return postRepository.findById(id).orElseThrow(() ->
            new IllegalArgumentException("선택한 게시글은 존재하지 않습니다.")
    );

다음은 service에서 변경내용을 update 하는 로직을 구현한 것이다. 해당 id로 게시글을 찾고 요청을 통해 받아온 비밀 번호와 일치한 지 확인 후에 update를 진행한다. 여기서도 postRepository를 만들어서 사용하고 있다. 그리고 @Transactional 이 붙어 있는데 이것을 해야 변경을 감지해서 update가 가능하다. JPA를 사용하여 DB에 데이터를 수정하고 있기 때문이다.

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

마지막으로 repository의 모습인데 JPA를 사용하고 있는 것을 확인할 수 있다. JpaRepository<"@Entity 클래스", "@Id의 데이터 타입">을 상속받는 interface형태이다.

 

 

· 오늘 서칭 한 자료

https://github.com/lsj135779/sparta-post

 

GitHub - lsj135779/sparta-post: 내일배움캠프 개인과제 게시글 CRUD

내일배움캠프 개인과제 게시글 CRUD. Contribute to lsj135779/sparta-post development by creating an account on GitHub.

github.com

 

 

· 느낀 점

강의를 듣는 것도 중요하지만 스스로 해보면서 체득하는 것이 가장 중요하다. 그리고 나만의 언어로 설명할 수 있을 정도가 되어야 완전히 이해했다고 말할 수 있다. (나중에 면접 때 중요!)

입문단계의 과제이기에 강의를 따라가면 충분히 수행할 수 있었지만 처음부터 혼자 했다면 어려운 부분이 많았을 거 같다.

전체적인 흐름을 이해하고 작업을 하는 것이 중요하다. (사전작업이 있는 가장 큰 이유!)

반응형

'Today I Learned' 카테고리의 다른 글

2023-11-13 TIL  (0) 2023.11.13
2023-11-07 TIL  (0) 2023.11.07
2023-11-03 TIL  (0) 2023.11.03
2023-10-26 TIL  (0) 2023.10.26
2023-10-23 TIL  (0) 2023.10.23

+ Recent posts