인프런 커뮤니티 질문&답변

narashine님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

벌크성 수정 쿼리

update 관련해서 질문 드립니다.

21.03.28 20:19 작성

·

545

1

안녕하세요. 김영한님:)

영한님의 JPA강의를 들으면서 실무에 바로바로 적용하는 중에 있는데요. 

1. 엔티티에 setter를 사용 하지 않고 수정 및 데이터 저장시 entity내에 메소드를 만들어서 사용하는걸 권장해주셨는데, 큰 덩어리(?)에 entity에서 하나의 컬럼만 수정이 될 때도 말씀주신 메소드를 만들어서 사용 하는게 좋을까요? 

2. prodQty = prodQty + 1 이렇게 바로 DB 컬럼만으로 update가 가능한것도 select한 것을 param으로 넘겨서 메소드로 만들어서 하는게 좋은걸까요?

개인적으로 repository내에 @Modifying을 이용해서 만드는게 더 가식적인고, 한개의 업데이트를 사용하기에도 더 편리해보인다는 라는 생각도 들어서요(물론 @Modifying은 벌크성 update에 주로 이용한다고 하셨지만...)

JPA에 익숙하지 않는 습성(?)때문에 그렇게 느껴지는 부분일까요? 더티체킹이라는 JPA는 장점을 살리지 못한 생각일까요?

강의 들을때 이해가 퐉퐉! 되었는데 막상 실무에선 작은것도 많은 고민을 하게 되네요 ㅠㅠ 

감사합니다.

답변 1

4

김영한님의 프로필 이미지
김영한
지식공유자

2021. 03. 28. 21:57

안녕하세요. narashine님^^

1. 엔티티에 setter를 사용 하지 않고 수정 및 데이터 저장시 entity내에 메소드를 만들어서 사용하는걸 권장해주셨는데, 큰 덩어리(?)에 entity에서 하나의 컬럼만 수정이 될 때도 말씀주신 메소드를 만들어서 사용 하는게 좋을까요? 

-> 이 경우는 그냥 setter를 사용하셔도 됩니다^^ setter를 과하게 사용하는 것이 문제이지, 실제 하나의 필드만 변경해야 한다면, 사용해도 됩니다. 다만 의미있는 이름을 부여할 수 있는 상황이라면 setter 보다는 의미 있는 이름을 부여하는 것을 추천드립니다.

2. prodQty = prodQty + 1 이렇게 바로 DB 컬럼만으로 update가 가능한것도 select한 것을 param으로 넘겨서 메소드로 만들어서 하는게 좋은걸까요?

-> 

사실 저도 iBatis로 개발을 오랜기간 해왔어서, 처음에 더티체킹 기반으로 애플리케이션을 개발하는 것에 부담이 있어서 충분히 이해가 됩니다^^

그런데 지금은 오히려 update를 위한 별도의 리포지토리 로직을 호출하는게 더 부담이더라구요.

JPA의 데이터 변경은 항상 더티체킹이 우선입니다.

만약 동시성 이슈가 걱정된다면 벌크 연산(jpql update set...)으로 처리하시는 것이 좋습니다.

더티체킹을 기반으로 코드를 작성해보면, 깔끔하게 유지보수 가능한 코드가 나오는지 알 수 있습니다.

그리고 수 많은 update 쿼리가 없어도 되지요.

엔티티를 항상 조회해야 하는 성능 부담도 사실 PK 기반의 데이터 단건 조회이기 때문에 전체 애플리케이션으로 보면 성능에 거의 영향을 미치지 않습니다.

감사합니다.