1. Spring boot에서의 날짜 필드 선언
@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdAt;
@CreationTimestamp 어노테이션은 Entity의 생성 시간을 자동으로 설정해 주는 어노테이션이다.
java.util.Date 타입이나 java.time.LocalDateTime 타입에 사용하는데 본문에서는 LocalDataTime 타입을 사용하였다.
Updatable = false 속성은 Column을 insert할 때만 값이 적용된다는 속성이다.
2. Builder
Builder 패턴을 사용하면 객체 생성 시 필드의 순서를 신경쓰지 않고 명시적으로 필드 값을 설정할 수 있으며 선택적인 필드 값을 설정하지 않을 경우 기본값을 지정할 수도 있다.
또한 객체 생성시 많은 파라미터를 가지고 있어도 가독성과 유지 보수성을 높일 수 있다.
public static BoardDTO toDTO(BoardEntity boardEntity) {
return BoardDTO.builder()
.id(boardEntity.getId())
.boardWriter(boardEntity.getBoardWriter())
.boardPass(boardEntity.getBoardPass())
.boardTitle(boardEntity.getBoardTitle())
.boardContents(boardEntity.getBoardContents())
.boardHits(boardEntity.getBoardHits())
.createdAt(boardEntity.getCreatedAt())
.build();
3. ForEach 화살표 함수
(parameters) => {function_body}
화살표 함수의 일반적인 구문
parameters에는 함수의 매개변수, 매개변수가 하나인 경우에는 괄호를 생략한다. 매개변수가 없다면 빈 괄호 ( {} )를 사용한다.
function_body에는 함수의 동작을 정의하는 코드 블록이다. 중괄호 {} 로 감싸며 함수의 동작을 구현하는 코드를 작성한다.
화살표 함수를 사용하면 함수 선언이 더 간결해지고 가독성이 좋아지기 때문에 사용한다.
public List<BoardDTO> findAll() {
List<BoardEntity> boardEntityList = boardRepository.findAll();
List<BoardDTO> boardDTOList = new ArrayList<>();
boardEntityList.forEach(boardEntity -> {
boardDTOList.add(BoardDTO.toDTO(boardEntity));
});
return boardDTOList;
}
- boardRepository.findAll() 함수를 호출하여 데이터베이스에서 모든 BoardEntity 객체를 담아 온다.
- boardEntityList에 가져온 boardEntity 객체들이 저장된다.
- 새로운 <BoardDTO> boardDTOList ( ArrayList )를 생성한다.
- boardEntityList의 각 BoardEntity 객체를 순회하면서 boardEntity -> boardDTOList.add(BoardDTO.toDTO(boardEntity)를 실행
( BoardEntity를 BoardDTO로 변환시키고 List에 저장 ) - boardDTOList를 리턴하면서 모든 게시글을 리스트로 가져온다.
4. Modifying
Modifying = 필요한 쿼리문을 직접 적용하고자 할 때 사용한다.
@Query 어노테이션 ( JPQL Query, Native Query )을 통해 작성된 insert , update , delete ( select 제외 ) 쿼리에서 사용되는 어노테이션이다.
기본적으로 JPARepository에서 제공하는 메서드 혹은 메소드 네이밍으로 만들어진 쿼리에는 적용되지 않는다.
update board_table set board_hits = board_hits+1 where id=?
이 쿼리문을 사용하려고 할 때
public interface BoardRepository extends JpaRepository<BoardEntity,Long> {
@Modifying
@Query(value = "update board_table set board_hits=board_hits+1 where id=:id", nativeQuery = true)
void updateHits(@Param("id") Long id);
nativeQuery를 사용하였다.
중요한 내용으로는
- 반드시 Entity 정의한 필명으로 써야 한다.
- 약어를 사용해야 한다.
런타임 에러 java.util.NoSuchElementException
NoSuchElementException (Java Platform SE 8 )
docs.oracle.com
는 존재하지 않는 것을 가져오려고 할 때 발생한다.
그럴 때 Try Catch 문을 사용하면 유용하다.
@GetMapping("/{id}")
public String findById(@PathVariable Long id , Model model ) {
boardService.updateHits(id);
BoardDTO boardDTO = null;
try {
boardDTO = boardService.findById(id);
} catch ( NoSuchElementException e) {
return "boardPages/boardNotFound";
}
model.addAttribute("board",boardDTO);
return "boardPages/boardDetail";'Spring > Spring boot icia 73일차' 카테고리의 다른 글
| Spring boot Pk,FK 참조관계 맺기 (0) | 2023.06.07 |
|---|---|
| Spring boot interceptor(인터셉터) (0) | 2023.06.07 |
| Spring boot 게시판 단일파일 , 다중파일 처리 (0) | 2023.06.07 |
| Spring boot 게시판 수정 , 삭제 (0) | 2023.06.07 |