Back-End/Spring Boot
[Spring Boot] Spring Data R2DBC 정리
ch4njun
2021. 10. 18. 12:28
반응형
사실상 Spring Data 에서 제공해주는 Repository 를 이용하거나 R2dbcEntityTemplate 을 이용하는 방법중에 선택해서 사용하면 된다. Repository 를 이용하면 Spring Data 의 기술인 EntityCallback, CustomConverter 등의 이용이 가능하다는 장점이 있다.
ID 필드에 Auto Increment 옵션을 주지 않았을 때 Repository 방식에서 Insert 가 안되는 문제가 있다.
public Mono<ScheduleDto> saveSchedule(int year, int month, int body) {
return scheduleRepository.save(new Schedule(pk++, year, month, body))
.map(ScheduleDto::of);
}
이렇게 했을 때 "Row with Id[4] does not exists" 에러가 발생하는데 Insert 를 하는 로직으로 가야하는데 내부적으로 뭔가 문제가 있어 Update 로 진행되면서 문제가 발생하는 것 같다.
위 문제가 발생하는 이유는 Repository 의 save() 메소드의 동작방식 때문이다.
save() 메소드는 들어오는 엔티티의 기본키의 값이 null 일 경우에 새로운 엔티티로 판단해 Insert 쿼리를 실행하고, null 이 아닐 경우에 Update 쿼리를 실행한다. 하지만 위 코드와 같이 PK 를 지정하게 되면 Update 쿼리가 실행되는데 해당 PK 를 가지는 엔티티가 테이블에 존재하지 않기 때문에 위와같은 에러가 발생하는 것이다.
반응형