게시글 전체목록 조회는 구현했으니 이제 특정 글의 상세정보를 조회하는 기능을 구현해봅니다!
특정 ID의 글을 못 찾아오는 사소한 이슈가 있었어서 그것도 함께 기록해볼 생각입니다.
[ 서버 ]
먼저, BoardEntity 입니다.
package com.example.demo.entity;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDate;
import java.util.List;
@Entity(name = "board")
@Getter@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BoardEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "content", nullable = false)
private String content;
@Column(name = "board_date")
private LocalDate boardDate;
@Column(name = "views")
private int views;
@Column(name = "user_like")
private int userLike;
// UserEntity와 다대일 관계 & 조인
@ManyToOne
@JoinColumn(name = "user_id", insertable = false, updatable = false)
private UserEntity user;
// StoreEntity와 다대일 관계
@ManyToOne
@JoinColumn(name = "store_id", insertable = false, updatable = false)
private StoreEntity store;
// CommentEntity와 일대다 관계
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "comment_id")
private List<CommentEntity> commentEntityList;
// LikeListEntity와 일대다 관계
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "likeList_id")
private List<LikeListEntity> likeListEntityList;
}
BoardDTO 입니다.
package com.example.demo.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import java.time.LocalDate;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BoardDTO {
private Long id;
@JsonProperty("user_id")
private Long userId;
@JsonProperty("title")
private String title;
@JsonProperty("content")
private String content;
@JsonProperty("board_date")
private LocalDate boardDate;
@JsonProperty("views")
private int views;
@JsonProperty("user_like")
private int userLike;
}
BoardRepository.java
package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.entity.BoardEntity;
@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
}
BoardController.java
/**
기능 : 게시글 목록 및 상세보기
url : /board
request data : id (optional)
response data : 게시글 목록 또는 특정 게시글 상세정보
*/
@GetMapping("/board")
public Object board(@RequestParam(name = "id", required = false) Long id) {
if (id == null) {
// 게시글 목록 반환
return boardService.board();
} else {
// 특정 게시글 상세 정보 반환
return boardService.boardDetail(id);
}
}
원래는 게시글 목록과 상세보기의 컨트롤러를 각각 작성했는데
if문을 사용해 합쳤습니다.
- /board URL로 들어오는 GET 요청을 처리하는데
- @RequestParam 애노테이션을 사용해 id 라는 이름의 요청 매개변수를 받아옵니다. 이 매개변수는 옵션이라 존재하지 않을 수도 있습니다.
- if (id == null) 으로 id가 null인 경우 즉, 요청 매개변수 id가 제공되지 않으면 boardService.board() 메서드를 호출하여 게시글 목록을 반환합니다.
- else인 경우 즉, id가 null이 아니고 제공된 경우엔 boardService.boardDetail(id) 메서드를 호출하여 해당 게시글의 상세 정보를 반환합니다.
BoardService.java
// 게시글 상세 조회
public BoardDTO boardDetail(Long id) {
return boardRepository.findById(id)
.map(boardMapper::boardToDTO)
.orElseThrow(() -> new RuntimeException("게시글을 찾을 수 없습니다."));
}
- id를 배개변수로 받아서 BoardDTO 타입의 객체를 반환하는 메서드 입니다.
- boardRepository를 이용해 주어진 id에 해당하는 게시글을 데이터베이스에서 찾습니다.
- 게시글이 존재하면 boardMapper를 사용하여 Board 객체를 BoardDTO 객체로 변환합니다.
- 게시글이 존재하지 않으면 RuntimeException을 발생시킵니다.
BoardMapper.java
package com.example.demo.mapper;
import com.example.demo.dto.BoardDTO;
import com.example.demo.entity.BoardEntity;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = "spring")
public interface BoardMapper {
BoardMapper instance = Mappers.getMapper(BoardMapper.class);
// Entity에서 DTO로 매핑
BoardEntity boardToEntity(BoardDTO boardDTO);
// DTO에서 Entity로 매핑
BoardDTO boardToDTO(BoardEntity boardEntity);
}
💣 [ 트러블 슈팅 ]
문제
특정 글을 조회해보면
글의 번호에 따라 쿼리 파라미터를 잘 타고 들어가지는 것과 콘솔에 게시글 상세 조회가 성공했다는 것을 확인해볼 수 있습니다.
하지만, 안에 데이터는 아무것도 나오지않고 있었습니다.
원인
API 요청을 통해 받은 응답 데이터인 res.data는 전체 글 목록을 담고 있습니다. 하지만 상세보기 기능은 특정 ID에 해당하는 글만 찾아야 합니다. 바로, 해당 ID에 맞는 데이터를 찾는 코드가 없어서 였습니다.
해결
res.data.find(item => item.id == id);
res.data 배열에서 주어진 id와 일치하는 item을 찾기 위한 함수를 추가해줘서 해결했습니다!
item은 res.data 배열의 각 요소를 나타내고
item.id == id는 item의 id 속성이 주어진 id와 같은지 비교합니다.
그리고나서 setBoard에 selectedBoard를 넣어 해당 글이 상태에 설정되도록 해주면 됩니다.
결과
'Project 댕린이집' 카테고리의 다른 글
[게시판] 게시글 수정(2) (0) | 2024.06.24 |
---|---|
[게시판] 게시글 수정(1) - 사용자 판별하여 수정/삭제 버튼 렌더링 (0) | 2024.06.22 |
[게시판] 게시글 전체 목록 조회 (0) | 2024.06.19 |
[게시판] 게시글 작성 (0) | 2024.06.18 |
[사진첩] 사진첩 상세보기 (이미지 렌더링) (0) | 2024.06.12 |