대머리개발자

JPA 더티체킹 본문

개발이야기/자봐

JPA 더티체킹

대머리개발자 2023. 3. 22. 17:05
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