Spring PATCH 라이브러리 만들었는데 피드백 부탁드려요
Spring으로 백엔드 개발하면서 PATCH endpoint 만들 때마다 같은 패턴의 분기 코드를 쓰는 게 너무 거슬렸습니다.
```java
member.updateMember(
request.name() != null ? request.name() : member.getName(),
request.email() != null ? request.email() : member.getEmail(),
request.bio() != null ? request.bio() : member.getBio(),
// 필드마다 반복
);
```
?: 분기가 필드마다 반복되고, 새 필드 추가할 때마다 DTO와 도메인 메서드, 서비스 세 군데를 동기화해야
했습니다. 솔직히 짜증나서 어느 순간부터 PATCH endpoint를 PUT으로 바꿔서 "전체 교체" 형태로 우회하기
시작했습니다.
근데 PUT으로 바꿔도 안에서 결국 PATCH 시맨틱을 손으로 짜고 있더라고요. boolean deleteImage 플래그를
따로 두거나, if (imageUrl != null) 분기를 도메인 메서드 안에 그대로 넣거나. PUT으로 도망갔는데 결국
PATCH를 손으로 다시 구현하는 모양이었습니다.
기존 해법들도 다 만져봤습니다:
- Jackson readerForUpdating: 엔티티 직접 노출, record 비호환
- JsonNullable<T>: 3상태 표현은 되는데 보일러플레이트 그대로
- JSON Patch (RFC 6902): 클라이언트가 명령 배열 작성 부담
- Spring BeanUtils.copyProperties: setter 강제
- MapStruct + IGNORE: setter 강제 + 매퍼 인터페이스 별도
다 한 가지씩 양보를 요구해서 결국 직접 만들었습니다. 도메인 메서드를 보존하면서 PATCH
보일러플레이트를 없애는 것이 목표였습니다.
```java
@PatchOf(value = Member.class, method = "updateMember")
public record MemberProfilePatch(
String name, // null이면 skip
String email,
PatchField<String> bio // 3상태: Unset(skip) / Value(update) / Delete(delete)
) {}
```
컴파일 타임에 patcher가 자동 생성되고, 서비스에선 patcher.apply(member, request) 한 줄로 끝납니다.
도메인 메서드updateMember)를 그대로 호출하기 때문에 도메인 안의 검증/비즈니스 규칙도 PATCH에서
그대로 동작합니다.
관심 있는 Spring 개발자 분들의 의견이 궁금합니다.
댓글을 남기려면 로그인이 필요합니다.
로그인 후 이 페이지로 돌아와 바로 댓글을 남길 수 있습니다.