티스토리 뷰

etc/TIL

@Setter없이 Entity를 update하는 방법

기억용블로그 2022. 4. 28. 18:46
728x90

값의 변화점을 예측하기 힘들어지기에 무지성 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를 무지성으로 생성하여 객체의 엔드포인트를 만들어두지말자. 열어두어서 크게 문제될건 없지만 열어두어서 좋을 것 또한 전혀 없다.

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

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 29 30 31
글 보관함