· 오늘 공부한 것
게시판 서버 만들기 => 필수 구현 기능(CRUD) 작업
강의에서 배운 내용을 따라가면 구현
· 공부한 내용, 궁금한 내용, 부족한 내용
sprint 입문 2주 차까지 내용을 바탕으로 개인과제를 수행하였다. 강의에서 나온 memo프로젝트로 CRUD를 한 것과 유사해서 많은 부분을 복습하며 진행하였다. 필수로 구현해야 하는 부분은 5가지였다.
- 게시글 작성 기능 (create)
- 선택한 게시글 조회 기능 (read)
- 게시글 목록 조회 기능 (read)
- 선택한 게시글 수정 기능 (update)
- 선택한 게시글 삭제 기능 (delete)

전에 작성한 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 |