티스토리 뷰

게시글 전체목록 조회는 구현했으니 이제 특정 글의 상세정보를 조회하는 기능을 구현해봅니다!

특정 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를 넣어 해당 글이 상태에 설정되도록 해주면 됩니다.

 

결과

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함