본문 바로가기
🔗 JPA

Setter없이 Entity update

by 비타민찌 2022. 10. 9.
728x90

값의 변화점을 예측하기 힘들어지게하는 Setter는 지양해야 한다.

이후 Setter에 의한 문제가 발생할 여지를 남겨두는 것은 좋지 않기 때문이다.

물론 '무조건' 쓰지 말아야 하는 것은 아니다. 단순히 필드 하나만 변경하는 경우라면 setter를 써도 된다.

 

그럼 Setter없이 어떻게 Entity를 update 할 수 있을까?

update가 필요한 값만을 받는 메서드를 따로 생성해 그것을 명시적으로 사용하면 된다.

 

@RestController
...
@PostMapping("/update/{id}")
public void updateCategory(@PathVariable("id") Long id,
                             @RequestBody CategoryDto categoryDto) {
    categoryService.updateById(id, categoryDto);
}

id와 dto를 따로 받아서 변수에 저장 후 바로 service에 넘겨준다.

@Entity
...
public void updateCategory (String categoryName, String description, String imageUrl) {
    this.categoryName = categoryName;
    this.description = description;
    this.imageUrl = imageUrl;
}

그전에 Entity에서 변화가 필요한 값만을 받는 메서드를 이름까지 확실히 의도를 알 수 있게 드러내며 생성자를 생성해준다.

@Service
...
@Transactional
public void updateById(Long id, CategoryDto categoryDto) {

    Category category = categoryRepository.findById(id).orElseThrow(
            ()-> new NoSuchElementException());

    category.updateCategory(categoryDto.getCategoryName(), categoryDto.getDescription(), categoryDto.getImageUrl());

 

이렇게 Dto의 값과 명시적으로 만든 메서드만을 이용하여 해당 Entity를 업데이트 했다.

 

이때 findById로 객체를 가져오고 readonly 속성이 true가 아니기 때문에 JPA의 영속성 관리 대상에 들어간다.

영속성 관리에 들어간다는 뜻은 JPA 영속성 매니저가 가져온 기존의 값을 스냅샷으로 보관하고, 커밋이 이루어질 때 기존의 스냅샷과 커밋될 때의 값을 비교하고 이때 값이 변경되었으면 JPA가 값이 변경되었음을 감지하고 데이터에 대한 UPDATE를 직접 해준다는 것을 의미한다. 이를 더티 채킹 이라 한다.

 

꼭 필요한 값에만 @Setter를 붙여 사용하거나 여러 개의 값을 한 번에 업데이트해야 한다면 해당 값만을 받는 메서드를 도메인 레벨에서 만들어 직접 주입하도록 하자.

 

참고:https://middleearth.tistory.com/11

 

 

 

 

728x90

댓글