@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의 닉네임으로 설정할 수 있다.
포스트맨 테스트 응답 결과
이제 작성순이랑 조회수 순으로 정렬하는 걸 해볼 예정이고 리액트로 간단하게 파싱까지 해서 클라이언트 단에서 띄워볼 생각이다.
'JAVA' 카테고리의 다른 글
SpringBoot thymeleaf Ajax 비통기 통신 parsererror 이슈 해결 (0) | 2022.09.08 |
---|---|
Spring Boot 게시판 및 댓글 출력 (thymeleaf, ajax) JPA 양방향 매핑 (0) | 2022.09.06 |
Spring Boot, thymeleaf ajax로그인 요청 (javascript) (0) | 2022.09.03 |
Spring Boot 게시판 상세내용 조회 구현 (0) | 2022.08.31 |
Spring Boot 전체 게시판 정렬 및 Pageable (paging) (0) | 2022.08.31 |
댓글