(TIL) 20221006/ JPA의 update

2022. 10. 7. 00:52TIL(Today I learned)

반응형

🏴󠁩󠁤󠁪󠁷󠁿Facts(한 것) & Findings(배운 것)


구름 알고리즘 챌린지를 신청해서 문제를 풀었다.

 

1주 차 문제여서 문제들은 매우 쉬웠고, 대부분 구현 문제로 나왔던 거 같다.

 

다만 구름에서 제공하는 코드 작성 툴은 조금 불편했는데,

 

창 크기를 마음대로 조절하지 못하고, 코드 반응 속도도 늦고 하는 점이 마음에 걸렸다.

 


JPA 강의를 들으면서 궁금한 점이 다른 사람들은 어떤 방식으로 DB데이터를 수정하는가 였다.

 

 

"그냥 update 하면 되지" (JPA의 사상을 무시하는 발언)

 

 

JPA는 기본적으로 같은 트랜잭션 안에서 일어나는 수정에 대해서 감지하는 "변경 감지" 라는 것이 있다.

 

 

update를 하려면 DB에서 데이터를 읽어온 후 update를 진행할 것이다.

 

 

이때 JPA는 GET 한 최초 상태의 데이터를 영속성 컨텍스트에 보관해 두는데, 

 

 

마지막 flush 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 자동으로 감지한다.

 

 

(순서는 커밋 호출 -> flush -> 스냅샷 비교 -> 쿼리 to 쓰기 지연 SQL 저장소 -> SQL query -> 커밋)

 

 

결국 userRepository.save(user)를 호출할 필요가 없다는 말인데,

 

 

빌더 패턴이나 팩터리 메서드를 사용하면 새로운 객체가 생성되기 때문에

 

 

동일성 보장이 되지않아 변경 감지가 일어나지 않는다.(영속 상태가 아니기 때문에)

 

 

그럼 결국 같은 객체 내에서 정보를 변경할 수 있는 방법을 써야 JPA를 십분 활용할 수 있다는 말인데,

 

 

Entity class에 changeWith같은 메서드를 만들어 넣거나, setter를 사용하는 방법 외에는 떠오르지 않았다.

 

 

이 두 가지 방법외에 다른 방법을 찾으려는 이유는 아래 코드에 있다.

 

 

@Getter
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    private String email;
    
    public void changeWith(String name, String email) {
        this.name = name;
       	this.email = email;
    }
    
}

 

changeWith 메서드를 사용하면 편리성은 있지만,

 

 

Entity에 메서드를 선언하는 일이 발생한다.

 

 

물론 객체지향적인 관점에서는 전혀 이상할 것이 아니지만,

 

 

Entity를 데이터의 형식? 정의 상태?로 본다는 관점에서는 메서드가 들어있는 것이 썩 내키지 않는다.

 

 

두 번째로 Setter메서드를 사용하는 것은 데이터의 일관성을 보장하지 못한다.

 

 

물론 "코드를 그렇게 작성하지 않으면 되지" 라고 생각할 수 있다.

 

 

하지만 에러가 발생하는 원인을 제공하는 것은 대부분 사람이기 때문에, 이를 100% 차단할 수 없다.

 

 

 

 

이런 이유들로 인해서 다른 방법을 찾아보고 있는 중이다.

 

 

혹시나 이 글을 보시고, 좋은 방법이 있다면 댓글로 알려주시면 좋을 것 같다.

 

 

 

🏴󠁩󠁤󠁪󠁷󠁿Affirmation(자기 선언)


  • 코틀린 || 스프링 || 리액트 강의 듣기 -> 성공
  • Goole k8s 강의 듣기 -> 성공
  • 알고리즘 문제 풀기 -> 성공

🏴󠁩󠁤󠁪󠁷󠁿여담


 
 
반응형

'TIL(Today I learned)' 카테고리의 다른 글

(TIL) 20221011/Redis 데모 프로젝트  (0) 2022.10.13
(TIL) 20221010/구름 알고리즘 챌린지  (0) 2022.10.10
(TIL) 20221005  (0) 2022.10.06
(TIL) 20220928, 국가 도메인  (0) 2022.09.29
(TIL) 20220927  (0) 2022.09.29