티스토리 뷰
값의 변화점을 예측하기 힘들어지기에 무지성 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를 붙여 사용하거나 여러 개의 값을 한 번에 업데이트해야 한다면 해당 값만을 받는 메서드를 도메인 레벨에서 만들어 직접 주입하도록 하자.
'etc > TIL' 카테고리의 다른 글
authentication.getAuthorities()에서 권한 여부 확인하는 방법 (0) | 2022.05.19 |
---|---|
스프링 부트에서 예외 처리하는 방법 (0) | 2022.04.29 |
스프링부트에서 빈 배열만 출력될 때 해결 방법 (0) | 2022.04.28 |
@PreAuthorize()로 메서드를 실행하기 전에 권한 검사를 하자 (0) | 2022.04.26 |
@Embedded와 @Embeddable을 이용하여 Entity의 가독성을 높이자 (0) | 2022.04.26 |
- Total
- Today
- Yesterday
- RequestParam
- vim
- 루나빔
- 도커
- JavaScript
- RequestPart
- lunarvim
- 아키텍처
- IDE
- ModelAttribute
- 배포
- 레디스
- RequestBody
- Dap
- neovim
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |