피드로 돌아가기
강남언니 공식 블로그Backend
원문 읽기
Spring Annotation 과 Reflection 을 활용해서 Entity의 여러 필드 한번에 수정하기
강남언니가 Spring Annotation과 Reflection을 조합해 Entity 필드 수정 로직을 자동화하며 merge 메서드 반복 코드 제거
AI 요약
Context
Legacy 도메인에서 Entity 자체를 RequestDTO로 사용하고 있었고, 필드별 수정 가능 여부를 코드로만 판단할 수 있었습니다. 새 필드 추가/수정/삭제 시마다 merge 메서드를 직접 수정해야 했으며, 누락 시 클라이언트 요청이 반영되지 않는 버그가 발생했습니다.
Technical Solution
- Custom Annotation @Merge 제작:
@Target(ElementType.FIELD),@Retention(RetentionPolicy.RUNTIME)으로 정의하고ignoreNull속성으로 null 처리 전략 지정 - Reflection을 통한 필드 자동 수집:
Class.getDeclaredFields()로 모든 필드를 동적으로 수집하고field.setAccessible(true)로 private 필드 접근 활성화 - Annotation 기반 필드 필터링:
field.getAnnotation(Merge.class)로 @Merge가 붙은 필드만 선별해 merge 대상 결정 - 상속 계층 전체 지원: 부모 클래스의 필드도 포함하여 merge 처리,
getDeclaringClass()활용 - 조건부 null 처리:
ignoreNull=true일 때는 null 값 무시,ignoreNull=false일 때는 null로 업데이트 적용 - 통합 Util.merge() 메서드: 모든 Entity 클래스에서 공통으로 사용 가능한 단일 merge 로직 구현
Key Takeaway
Legacy 코드 마이그레이션이 어려운 상황에서 Annotation과 Reflection의 조합으로 반복적인 필드 수정 코드를 제거하고, 새 필드 추가 시 단순히 @Merge 어노테이션만 붙이면 자동으로 동작하는 선언적 구조를 만들 수 있습니다.
실천 포인트
RESTful API에서 부분 업데이트(PATCH/PUT)를 처리하는 Spring 애플리케이션에서 Entity를 직접 DTO로 사용해야 할 때, 수정 가능 필드에 @Merge 어노테이션을 붙이고 Reflection 기반의 공용 merge 유틸을 호출하면 필드별 조건 체크 코드를 최소화하고 새 필드 추가 시 별도의 merge 로직 수정을 생략할 수 있습니다.