본문 바로가기
JAVA

Spring Boot 기본적인 전체 게시판 게시판 응답

by fouink 2022. 8. 31.
@Entity
@RequiredArgsConstructor
@Data
public class BoardEntity extends BaseTimeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String title;

    @ManyToOne(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
    @JoinColumn(foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
    private UserInfoEntity userInfoEntity;

    @Column(nullable = false)
    private String content;

    @Column(nullable = false)
    private int viewCnt;

    @Builder
    public BoardEntity(Long id, String title, UserInfoEntity userInfoEntity, String content, int viewCnt) {
        this.id = id;
        this.title = title;
        this.userInfoEntity = userInfoEntity;
        this.content = content;
        this.viewCnt = viewCnt;
    }
}

 

위 코드는 기본적인 게시판을 구현하기 위한 BoardEntity이다.

작성자를 저장하기 위해 UserInfoEntity 테이블을 ManyToOne으로 참조하고 있다

 

@Getter
@MappedSuperclass//jpa가 클래스를 상속할 경우 필드들도 칼럼으로 인식
@EntityListeners(AuditingEntityListener.class)//클래스에 Auditing 기능(jpa에서 시간테이블 자동으로 넣음) 포함
public class BaseTimeEntity {
    @CreatedDate//엔티티저장될 때 자동으로 시간도 저장
    private LocalDateTime createdDate;

    @LastModifiedDate//엔티티 변경될 때 자동으로 시간도 저장
    private LocalDateTime modifiedDate;
}

BoardEntity는 위 코드인 BaseTimeEntity를 상속하고 있다.

 

@SpringBootApplication
@EnableJpaAuditing//Jpa 활성화
public class PersonalProjectApplication {

   public static void main(String[] args) {
      SpringApplication.run(PersonalProjectApplication.class, args);
   }

}

 

해당 코드를 복사하여 사용할 의도가 있다면 메인 클래스에 // Jpa 활성화 주석 부분을 달아주면 된다.

 

기본적인 테이블 세팅이 완료 되고 게시판을 생성 했다면(게시판 생성은 생략) 게시판에 대한 정보를 어떤 것을 응답해줄 지 결정 해야 한다

 

필자는 전체 게시판을 쫘르륵 출력 할 것 이기 때문에 게시판 상세내용인 content와 수정 시간은 제외하고 응답 객체를 만들어 주었다.

 

@Data
@RequiredArgsConstructor
public class AllBoradResponseDTO {

    private Long board_id;

    private String title;

    private int viewCnt;

    private String writer;

    private LocalDateTime createdDate;

    @Builder
    public AllBoradResponseDTO(Long board_id, String title, int viewCnt, String writer, LocalDateTime createdDate) {
        this.board_id = board_id;
        this.title = title;
        this.viewCnt = viewCnt;
        this.writer = writer;
        this.createdDate = createdDate;
    }
}

 

 

@GetMapping("/api/board")
public ResponseEntity<?> getAllBoard() {

    List<AllBoradResponseDTO> allBoradResponseDTOList = boardService.allBoard();

    return ResponseEntity.ok(allBoradResponseDTOList);

}

 

GET Method로 응답 매핑을 걸어주고 BoardsService에서 원하는 값만 추출 해주는 작업을 해준다.

 

/**
 * 전체 게시판 응답 함수
 * @return
 */
@Override
public List<AllBoradResponseDTO> allBoard() {

    List<BoardEntity> boardEntity = boardRepository.findAll();
    List<AllBoradResponseDTO> allBoradResponseDTO = new ArrayList<>();

    for (BoardEntity entity : boardEntity) {

        AllBoradResponseDTO individualAllBoradResponseDTO = AllBoradResponseDTO.builder()
                .board_id(entity.getId())
                .title(entity.getTitle())
                .viewCnt(entity.getViewCnt())
                .writer(entity.getUserInfoEntity().getNickname())
                .createdDate(entity.getCreatedDate())
                .build();

        allBoradResponseDTO.add(individualAllBoradResponseDTO);
    }

    return allBoradResponseDTO;
}

 

우선 전체 게시판이므로 List로 전체 게시판 내용을 받아온다

 

Jpa특성상 엔티티에 참조 관계가 있는 상태에서 select를 걸게 되면 N+1으로 연관관계의 테이블까지 조회하게 된다.

 

따라서 writer를 UserInfoEntity의 닉네임으로 설정할 수 있다.

 

 


포스트맨 테스트 응답 결과 

 

이제 작성순이랑 조회수 순으로 정렬하는 걸 해볼 예정이고 리액트로 간단하게 파싱까지 해서 클라이언트 단에서 띄워볼 생각이다.

 

댓글