Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 개발 어렵당.ㅠ
- reids
- nGinder
- intellij
- pinpoint 2.5.3
- Ingress Controller Fake
- 플루터
- Armeria
- jsonMarshaller
- jar 배포
- OIDC
- 월급루팡 일지
- fake jwt
- hbase 저장공간 설정
- R2DBC Paging
- 애자일 싫타
- Loki 로그
- 7879
- pinpoint
- save/update
- 오블완
- UnsupportedOperationException
- 핀포인트
- RedirectService
- ㅉ때
- LPOS
- 노드간 통신
- 티스토리챌린지
- formik
- 논블록킹 성능
Archives
- Today
- Total
대머리개발자
JPA 더티체킹 본문
728x90
..하악하악
매번 모든 데이터를 업데이트 하는 것은 리소스의 낭비라고 생각한다.
변경된!! 데이터만 update 하는 것이 맞다.
해서 ibatis를 이용할 때는 아래와 같이 변경할 컬럼을 같이 던져 동적으로 쿼리를 만들었다.
<update id="update">
UPDATE ${DB}.adviser
SET
<foreach item="item" collection="columns" separator=",">
${item} = #{VO.${item}}
</foreach>
WHERE UID = #{VO.UID}
</update>
직관적인게 너무 좋은데. @.@
JPA는 내부에서 더티체킹으로 알아서 업데이트 해주고 좋으네......?
@트랜젝션( findById -> setProps ) 을 진행하면 굳이 SAVE를 다시 호출하지 않아도.. 굳굳!!
But R2dbcRepository 일단 더티체킹은 더티하다... 제길슨...
@Transactional
public Mono<ClientGrpc.Client> update_(Client client){
return clientRepository.findById(client.getId())
.map(fromClient->{
fromClient.setName( "더티체킹?");
return fromClient.toProto();
});
}
SAVE를 먹여 줘야 한다...
public Mono<ClientGrpc.Client> update_(Client client){
return clientRepository.findById(client.getId())
.flatMap( fromDB ->{
fromDB.setName("더티체킹?");
return clientRepository.save(fromDB);
})
.map(it -> it.toProto());
}
더군다나...모든 컬럼이 다 업데이트 된다잉....ㅋㅋㅋ
뭐 암튼 이래나 저래나....
isNew()를 통해서 어찌어찌찌 create 와 update를 구분한다고 해도... 컬럼 하나하나 정할 수 없으니 난해하다.
(그리고 JPA에서는 DynamicUpdate 를 통해서 변경되지 않는 컬럼을 제외 진행 할 수 있따..하지만 R2dbcRepository 는 다르다.... 다이나믹 업데이트 어노테이션이 읎다.!! )
아이스크림 코딩.... 고고!!!
public Mono<ClientGrpc.Client> update(Client client, String updateType){
return Mono.just(client)
.flatMap(param ->
ServiceUtil.getRedisService().delOpsForValue(Constants.REDIS_CLIENT + client.getId())
.flatMap(
ok -> {
if(updateType.equals( "secret")) {
client.setSecret(ObjectUtil.generatedUID());
clientRepository.updateSecret(param.getSecret(), param.getId()).subscribe();
}else{
clientRepository.updateAll(
param.getName()
,param.getAuthorizedGrantTypes()
,param.getRedirectUri()
,String.valueOf(param.getAccessTokenValidity())
,String.valueOf(param.getRefreshTokenValidity())
,param.getAllowedIps()
,param.getId()
).subscribe();
}
return clientRepository.findById(param.getId()).map(Client::toProto);
}
)
)
.onErrorMap(e -> new DefinedException(e.getMessage()));
}
백엔드도 못해먹겠다.!!
꼼수를 써보려고 했더니 인식못하네 ㅋㅋ 쥐쥐 하드코딩!!
정리하자면
스트림방식의 처리에서는 더티체켕 안 된다.... 안 되는게 맞다 싶다. ㅎ
728x90
'개발이야기 > 자봐' 카테고리의 다른 글
ThreadLocal (0) | 2023.04.07 |
---|---|
Oauth2 Provider(Naver/Kakao/Google) (0) | 2023.03.28 |
R2DBC Page 처리.. (0) | 2023.03.13 |
Armeria 프레임워크 - 리다이렉트 (1) | 2023.03.09 |
boot azure-key-vault (0) | 2023.02.21 |