κ²μκΈ μ
λ°μ΄νΈ κΈ°λ₯μ ꡬννλ μ€ μμ² λ°μ νλλ§ μ λ³μ μΌλ‘ λ³κ²½λλλ‘ μ²λ¦¬νκ³ μΆμλ€.
μλ₯Ό λ€μ΄ μ¬μ©μκ° title λ§ μμ νκ³ content λ κ·Έλλ‘ λκ³ μΆμ μ μκΈ° λλ¬Έμ μμ² κ°μ²΄μ ν¬ν¨λ νλλ€ μ€ null μ΄ μλ κ²λ§ 골λΌμ μ μ©λλλ‘ κ΅¬ννλ€.
μ΄λ₯Ό μν΄ μν°ν° λ΄λΆμ μλμ κ°μ λ©μλλ₯Ό λ§λ€μλ€.
public void patchCheck(UpdatePostRequestDto uDto) {
if(uDto.getTitle() != null) {
this.title = uDto.getTitle();
}
if(uDto.getContent() != null) {
this.content = uDto.getContent();
}
}
ν΄λΉ λ©μλλ setter μ μ μ¬νμ§λ§ νΉμ ν μλ―Έλ₯Ό κ°μ§λ μ μ© λ©μλλ‘ λ°λ‘ λΆλ¦¬νλ€.
null μ΄ μλ νλλ§ μν°ν° κ°μ λ°μ νλ μ
λ°μ΄νΈμ© μμ λ©μλλ‘ μ΄λ¦μ λͺ
ννκ² ννν¨μΌλ‘μ¨ μλλ₯Ό λλ¬λλ€.
μμ²μ μ¬μ©λλ DTO λ λ€μκ³Ό κ°λ€.
@Getter
public class UpdatePostRequestDto {
@Size(max = 20, message = "μ λͺ©μ 20μ μ΄λ΄λ‘ μμ±κ°λ₯ν©λλ€.")
private String title;
@Size(min = 5, max = 200, message = "μμ±κΈμ 5~200μ μ΄λ΄λ‘ μμ±κ°λ₯ν©λλ€.")
private String content;
}
νλλ€μ null μ νμ©νλ©° κ²μ¦ λ‘μ§μ μ‘΄μ¬νμ§λ§ κ° μ체λ optional νλ€.
μ€μ λ‘ μ΄λ€ νλκ° μμ λ μ§λ μμ²μ λ°λΌ λ¬λΌμ§ μ μλ€.
@Transactional
public PostResponseDto update(Long id, UserDetails userDetails, UpdatePostRequestDto uDto) {
Post foundPost = validateUserAccessToPost(id, userDetails);
//μμ λ©μλ( == setter) -> λν°μ²΄νΉμΌλ‘ save() κΉμ§ μ§ν
foundPost.patchCheck(uDto);
return PostResponseDto.from(foundPost);
}
@Transactional μμμ μν°ν°μ νλλ₯Ό λ³κ²½νκ³ save() κ°μ λͺ
μμ μΈ λ©μλ νΈμΆ μμ΄λ
JPA μ λν° μ²΄νΉ(Dirty Checking) κΈ°λ₯μ μν΄ μλμΌλ‘ μ
λ°μ΄νΈ μΏΌλ¦¬κ° μ€νλλ€.
JPA λ νΈλμμ
λ΄μμ κ΄λ¦¬λκ³ μλ μμ μνμ μν°ν°μ λν΄ λ³κ²½ μ¬νμ΄ λ°μνλ©΄ μλμΌλ‘ κ°μ§(dirty check) ν΄μ SQL update 쿼리λ₯Ό μμ±ν΄μ€λ€.
μ¦ νΈλμμ
μ΄ μ’
λ£λ λ μμμ± μ»¨ν
μ€νΈμ μ μ₯λ μ΄κΈ° μνμ νμ¬ μν°ν° μνλ₯Ό λΉκ΅ν΄μ λ°λ λΆλΆλ§ DBμ λ°μνλ€.
μ΄λ₯Ό ν΅ν΄ save() κ°μ λͺ
μμ νΈμΆ μμ΄λ μλ λ°μμ΄ κ°λ₯ν΄μ§λ€.
μ΄ μ½λμμ
UpdatePostRequestDtoλ₯Ό μν°ν°κ° μκ³ μμ΄λ λλκ°? λ‘ νν°λμ λ°©λ¬Έν΄λ³΄μ λ μ’μ κ² κ°μ΅λλ€.κ·ΈμΈμ λ³μλͺ μ΄
patchCheckμΈλ°,setFieldsIfNotNullκ°μ νμμΌλ‘ λ©μλλͺ μμ μλ―Έκ° μ’ λ λͺ νν λλ¬λλ©΄ μ’μ κ² κ°λ€λ μκ°μ΄ λλλ€.