nativeQuery로 만든 스프링 익명 블로그 기능을 JPA(Java Persistence API)로 변경한 코드
왜 JPA?
주요 키워드
- JPQL 객체 지향 쿼리
- 영속성persist 컨텍트
활용 및 배운 것
코드
Board
어노테이션 추가
- @AllArgsConstructor: 클래스의 모든 필드 값을 파라미터로 받는 생성자 자동 생성
- @CreationTimestamp: INSERT 쿼리 발생 시, 현재 시간을 값으로 채워 쿼리 생성
- update 메서드 추가: 매개 변수로 전달 받은 title, content을 필드의 title, content 값으로 변경
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Table(name = "board_tb")
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
@CreationTimestamp
private Timestamp createdAt;
// 업데이트 메서드
public void update(String title, String content) {
this.title = title;
this.content = content;
}
}
BoardController
- 게시글쓰기
@GetMapping("/board/save-form")
public String saveForm() {
return "save-form";
}
@PostMapping("/board/save")
public String saveV2(BorderRequest.SaveDTO saveDTO) {
boardService.게시글쓰기(saveDTO);
return "redirect:/";
}
BoardService
- 게시글수정하기: JPA의 더티 체킹에 의한 자동 상태 변경 방식 적용
@Transactional
public void 게시글수정하기(int id, BorderRequest.UpdateDTO updateDTO) {
Board board = boardRepository.findById(id)
.orElseThrow(() -> new RuntimeException("해당 id의 게시글이 없습니다 : " + id));
board.update(updateDTO.getTitle(), updateDTO.getContent());
} // 영속화된 객체상태변경 - update + commit => 더티체킹
게시글수정화면보기 findById()
에서 Optional을 이용한 처리 로직 추가orElseThrow()
으로 해당 게시글이 존재하지 않을 경우 예외를 던짐
public BoardResponse.UpdateFormDTO 게시글수정화면보기(int id) {
Board board = boardRepository.findById(id)
.orElseThrow(() -> new RuntimeException("해당 id의 게시글이 없습니다 : " + id));
return new BoardResponse.UpdateFormDTO(board);
}
Share article