JPA로 게시판 수정하기

세피·2022년 1월 25일
0

스프링

목록 보기
9/11

JPA로 수정하기

무슨 문제점이 있었나요?

UDPATE 쿼리가 날아갈때 생성일이 Null로 들어가는 문제,

요청을 받지 않는 값들이 디폴트로 들어가는 현상

그래서 어떻게 해결해야 했나요?

Entity 자체를 가지고 핸들링 하다 보니 전체 값들이 바뀌는 것이었다.

jpa 패키지 구조 공부를 하며 알게 된 건, 엔티티 자체를 가지고 응답/요청을 하지 말라는 것이었다.

그렇게 하니 저런 문제점이 발생한 것.

findById로 정보를 빼와서 수정처리 하는데까지는 접근함, 근데 Optional에서 데이터 추출하는 법을 몰랐다.

추출법 : ifPresent

https://wikidocs.net/154752

데이터 수정은 데이터 불러오기 > 데이터가 존재한다면 > 값을 변경하고 저장하기 가 가장 기본적인 프로세스입니다.

BoardUpdatDto

// id열이 필요없고 엔티티가 함께 변경되지 않게 dto 따로 생성
@Data
public class BoardUpdateDTO {
    private Long idx;
    private int hit_cnt;
    private String title;
    private String content;
    private LocalDateTime create_date;
    private LocalDateTime update_date;
}

Controller

 // 게시판 수정처리
    @PutMapping(value = "/update/{idx}")
    public ResponseEntity<BoardEntity> boardUpdate(@RequestBody BoardUpdateDTO boardUpdateDTO, @PathVariable Long idx) {
        //GET 통신에서는 @RequestParam을 사용하지만, POST 통신에서는 @RequestBody를 사용한다.
        // boardto = boardService.findById(idx);
        log.info("========= 수정하기 ======="+boardUpdateDTO+"====idx==="+idx);
        Optional<BoardEntity> boardto = this.boardService.Update(idx, boardUpdateDTO);
        //return null;
        return new ResponseEntity(boardto, HttpStatus.OK);
        // return ResponseEntity.badRequest().build();
    }

BoardUpdatDto 로 요청값을 받아서 엔티티에 넣어줌

Service.interface

@Service
public interface BoardService {
    Optional<BoardEntity> Update(Long idx, BoardUpdateDTO boardUpdateDTO);
}

ServiceImpl.java

@Service
@Slf4j
public class BoardServiceImpl implements BoardService {

    @Autowired
    private BoardRepository boardRepository;
// 수정하기
    @Override
    public Optional<BoardEntity> Update(Long idx, BoardUpdateDTO boardUpdateDTO) {
        // 일단 idx에 맞는 값들을 찾아와
        Optional<BoardEntity> entity = this.boardRepository.findById(idx);
        // ifPresent는 컨슈머를 매개변수로 입력받아서 객체가 존재할 때만 실행하는 Optional의 메소드입니다. 
        entity.ifPresent(t ->{
            // 내용이 널이 아니라면 엔티티의 객체를 바꿔준다.
            if(boardUpdateDTO.getContent() != null) {
                t.setContent(boardUpdateDTO.getContent());
            }
            if(boardUpdateDTO.getTitle() != null) {
                t.setTitle(boardUpdateDTO.getTitle());
            }
            // 이걸 실행하면 idx 때문에 update가 실행됩니다.
            this.boardRepository.save(t);
        });
        log.info("=========t======"+entity);
        return entity;
    }
}

레포지토리에서 기본 제공하는 save 메서드에 대해 알아야 한다. save는 저장/수정을 도와주는 기본 메서드이며 이 둘을 save 메서드가 엔티티의 @Id 값 유무로 확인해서 insert를 할지 update를 할지 구분해서 넣어준다.

profile
세피의 블로그입니다

0개의 댓글