db설계 - DB와 1대1 매칭되는 객체 생성 - repository 인터페이스 - repository 구현체 (+구현체는 Impl을 붙이는 경우도 있음!) - controller
-> repository에서 기능을 구현할 때 마다 테스트 해도되고 자유~
@Override
public boolean save(Board board) {
String sql = "INSERT INTO tbl_board " +
"(title, content, writer) " +
"VALUES (?, ?, ?)";
return template.update(sql,
board.getTitle(), board.getContent(), board.getWriter()) == 1;
}
int boardNo = repository.findAll().get(0).getBoardNo();
@Test
@DisplayName("글번호가 1번인 게시물을 삭제할 수 있다.")
void deleteTest() {
//given
int boardNo = repository.findAll().get(0).getBoardNo();
//when
boolean flag = repository.delete(boardNo);
//then
assertTrue(flag);
assertEquals(2, repository.findAll().size());
}
DTO(Data Transfer Object)는 클라이언트와 서버 간의 데이터 교환을 위한 객체
// 서버에서 조회한 데이터 중 화면에 필요한 데이터만 모아놓은 클래스
@Getter
public class BoardListResponseDto {
private String shortTitle; // 5글자 이상 줄임 처리된 제목
private String shortContent; // 30자 이상 줄임 처리된 글 내용
private String date; // 포맷팅된 날짜문자열
private int view; // 조회 수
private int boardNo;
// 엔터티를 DTO로 변환하는 생성자
public BoardListResponseDto(Board b) {
this.shortTitle = makeShortTitle(b.getTitle());
this.shortContent = makeShortContent(b.getContent());
this.date = dateFormatting(b.getRegDateTime());
this.view = b.getViewCount();
this.boardNo = b.getBoardNo();
}
private String dateFormatting(LocalDateTime regDateTime) {
DateTimeFormatter pattern
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
return pattern.format(regDateTime);
}
private String makeShortContent(String content) {
return (content.length() > 30)
? content.substring(0, 30) + "..."
: content;
}
private String makeShortTitle(String title) {
return (title.length() > 5)
? title.substring(0, 5) + "..."
: title;
}
}
Dto에서 생성한 생성자에 포함된 내용이 모두 전달 (원하는 데이터만 전달)
-> mapping을 해도 OK, for문을 사용해도 OK
JSP 부분도 Dto에서 만든 객체와 같은 이름으로 변경
BoardDetailResponseDto
-> detail에 대한 dto도 위와 똑같이 Controller, JSP에 반영