[TIL] 5월 14일(Spring Data JDBC Id 생성 전략)

yeon·2021년 5월 16일
0

Spring Data JDBC id 생성 전략

직접 id 값을 지정해서 도메인 객체를 생성하고 DB에 저장하려고 할 때

org.springframework.dao.IncorrectUpdateSemanticsDataAccessException: Failed to update entity 라는 에러 메시지가 난다.

검색을 해보니 insert를 수행하지 않고, update를 수행하는데 DB에는 update하려는 id값이 없어서 이런 에러를 발생시킨다고 한다.

해결 방법 여러개 중 도메인 클래스가 Persistable인터페이스를 implements하는 방법을 선택했다.

그리고 isNew()라는 메소드를 오버라이드 한다.

엔티티가 Persistable의 구현체라면 Spring Data JDBC가 insert 또는 update 쿼리 중에서 선택하는데 이때 isNew라는 메서드를 호출한다. isNew의 리턴값이 true이면 insert를 수행하고, false면 update 쿼리를 수행한다. 그리고 스키마에서 auto_increment는 빼줘야한다.

참고 자료: https://skyblue300a.tistory.com/9

문제점 발생

"games": [
        {
            "id": 1,
            "homeTeamId": 1,
            "awayTeamId": 2,
            "new": true
        },
        {
            "id": 2,
            "homeTeamId": 3,
            "awayTeamId": 4,
            "new": true
        },

...

isNew라는 필드와 메서드를 추가하니 "new"라는 속성이 추가되었다.

isNew 필드와 isNew 메서드에 @JsonIgnore 어노테이션을 다니 사라졌다.


Dion PR 피드백

  • Record에서 average는 유도될 수 있다. 상태로 관리할 필요 없다.

    → average 필드를 갖고 있을 필요 없이, getAverage 메소드만을 갖고, 메소드 내부에서 바로 계산해서 반환하기

    public double getAverage() {
    		return (double) atBat / hit;
    } 
  • 스트림 더 잘 사용해보기

private List<RecordDTO> getRecordDTOList(Team team) {
    return team.getMembers().stream()
            .filter(Member::hasRecord)
            .map(member -> {
                Record record = member.getRecord();
                return RecordDTO.toRecordDTO(member, record);
            })
            .collect(Collectors.toList());
}

오늘 한일

  • 야구게임 프로젝트 마지막날
    • 스크립트 작성으로 배포 자동화, OAuth구현, 프론트 배포를 하지 못하여 아쉽다. 다음번엔 꼭
    • 이번 프로젝트는 혼자 진행해서 DB 설계, 테이블간 관계에 대한 이해도가 저번보다 올라갔다. (아직도 매우 미흡하지만 ㅜㅜ)
  • 게임을 종료할때 기존의 데이터를 삭제하는 기능을 구현했다. 게임을 다시 시작할 때 Game 인스턴스를 생성할 시 gameId가 6부터 생성되는 버그가 발생해서 이를 해결하다가 Spring Data JDBC의 id 삽입 전략에 관한 글을 보았다. 호눅스가 꼭 보라고 하셨던 이명현님 영상 을 참고해서 쓴 글이던데 보다 만 영상이라 이것도 얼른 봐야지
  • 그런 REST API로 괜찮은가 이것도 호눅스가 꼭 보라고 하셨는데 한번 보는걸로는 이해가 잘 안되는거 같다. 또 봐야겠다.
  • Dion에게 코드리뷰 받은 내용 수정

0개의 댓글