특정게시글 조회
앞서 게시글 목록 조회 기능을 완성시켰고 이번에 이어서 추가할 기능한 특정 게시글을 조회하는 기능이다.
게시글이 생성될 때 입력되는 내용은
- 유저이름
- 패스워드
- 제목
- 내용
- 작성시간
총 5개지만, 특정게시글 조회 GET API를 사용하면 패스워드를 제외하고 나머지 4개 내용만을 가져와야한다.
이를 위해서 우선 Controller 단에서 고민을 해보았다.
Controller(1차작성)
@GetMapping("/api/posts/{id}")
public Optional<Post> readPostById(@PathVariable Long id){
return postRepository.findById(id);
}
처음 작성한 코드는 위와 같았다.
POST 1차
GET 1차
위 코드로 특정 게시글의 내용을 가져올 수는 있었지만, 패스워드를 숨기지는 못하였다.(당연한 결과지만)
새로운 코드 작성이 필요하다 판단이 되었고, 처음으로 든 생각은 특정 게시글 조회하기 기능 구현만을 위한
Dto생성이었다. 이를 통해서도 만족할만한 결과를 얻지 못했기에 다른 방법을 찾기 위해 구글링을 시작했다.
그러다 한 게시글에서 Interface를 생성하면 특정값만 출력되도록 추릴 수 있다는걸 알게되었다.
앞서하려던 Dto를 추가하는 방법과 유사해보였지만 이것이 조금 더 깔끔한 방법이란 생각이 들어 진행하였다.
PostRead(Interface)
package com.sparta.week03.domain;
import java.time.LocalDateTime;
public interface PostRead {
String getTitle();
String getUsername();
LocalDateTime getCreatedDate();
String getContents();
}
패스워드를 제외한 값들을 받아오는 Interface Class를 작성하였다.
이제 이 값을 GET API에서 받아오게끔해야하느데 첫 번째로 작성했던 코드는 다음과 같았다.
Controller(1차수정)
@GetMapping("/api/posts/{id}")
public Optional<PostRead> readPostById(@PathVariable Long id) {
return postRepository.findById(id);
}
위와 같이 작성하였지만, return 줄의 내용이 빨간색으로 오류가 나오면서 실행자체가 되지 않았다.
원인이 뭔가하니 findById라는 Jpa 메소드는 'Optional<Entity Class>'와 같은 형식으로만 사용이 가능한데
내가 입력한 PostRead는 Entity Class가 아니었기에, Post로 바꿔주던가, 다른 방법을 찾던가 선택해야했다.
Optional<Post>로 수정하게 될 경우, 앞서 작성했던 코드와 같이 출력은 되지만 패스워드까지 포함시켜
가져오기 때문에 다른 방법을 모색할 필요가 있었다.
그러던 중 또 배우게 된 부분이 바로 Repostiory 단에 새로운 메소드를 추가하는 방법이었다.
내가 작성하려는 코드는 PostRead라는 Interface를 바탕으로 Repostiory.findById(id);와 같은 메소드를
사용을 해야하는데, 기존의 findById는 정해진 규칙이 있으니, 유사한 기능을 가진 메소드를 추가로
만들어주기만 하면 되었다.
Repository(추가)
Optional<PostRead> findByIdOrderById(Long id);
Controller(2차수정)
@GetMapping("/api/posts/{id}")
public Optional<PostRead> readPostById(@PathVariable Long id) {
return postRepository.findByIdOrderById(id);
}
GET 2차
원했던 내용 출력이 가능했다!
하지만 Jpa Method 생성에 있어서 왜 findByIdOrderById로 작성했을 때만 구현이 되었는지, findByIdNotPassword 등
내가 커스텀한 메소드 명으로 메소드 선언은 불가한지 알아보았는데, 기존 Jpa에서 제공하는 값들만 이용하여
메소드를 설정해주어야 한다고 한다.
OrderById는 Id를 기준으로 정렬시키라는 내용이기에 이런 이름을 덧붙여서 메소드를 만들어도 구현이 됐던 것이다.
기능 구현은 되었지만, 후에 해당 코드를 바탕으로 Spring 기술 튜터님께 관련 질문을 드리니, Interface를 만들어
패스워드 값을 떨어내는 것보다 Dto를 만들어 진행하는 것이 더 보안적인 부분에서 좋다고한다.
이 부분은 후에 추가로 수정해야겠다.
참고 / 출처
[JPA] 원하는 내용만 가져오기
JPA로 조회를 하다보면 연관관계에 데이터를 모두 가져오다 보니 때때로 노출하고 싶지 않은 데이터도 가져오게 된다. 그럴때 쓰는 방법 소스는 이전글을 참조 2019/03/20 - [JPA] - [JPA] manytoone n+1 문
cpdev.tistory.com
JPA 사용법 (JpaRepository)
JPA에 대한 개념은 이해가 갔지만 처음 코드를 접했을 땐 이해 안가는 부분이 많았다. 그래서 잘 정리된 블로그를 참고해 다시 한번 사용법을 알기 쉽게 정리해보고자 한다. Entity 먼저 데이터베
jobc.tistory.com
'✍️개발로그' 카테고리의 다른 글
220830_실전프로젝트 8일차(feat.Item 수정부분 트러블슈팅🚀) (0) | 2022.09.03 |
---|---|
220829_실전프로젝트 4일차 (0) | 2022.08.29 |
20220823_클론코딩(항해인사이드) 5일차 (0) | 2022.08.23 |
20220820_클론코딩(항해인사이드) 2일차 (0) | 2022.08.20 |
20220726_개발로그_ResponseDto 활용하여 특정 값만 조회하기 (0) | 2022.07.26 |