diff --git a/src/main/java/egovframework/exception/DtoConvertException.java b/src/main/java/egovframework/exception/DtoConvertException.java new file mode 100644 index 0000000..9d7a682 --- /dev/null +++ b/src/main/java/egovframework/exception/DtoConvertException.java @@ -0,0 +1,7 @@ +package egovframework.exception; + +public class DtoConvertException extends RuntimeException { + public DtoConvertException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/egovframework/util/DtoConverter.java b/src/main/java/egovframework/util/DtoConverter.java new file mode 100644 index 0000000..56fbb88 --- /dev/null +++ b/src/main/java/egovframework/util/DtoConverter.java @@ -0,0 +1,53 @@ +package egovframework.util; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import egovframework.exception.DtoConvertException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.Map; + +@Component +@RequiredArgsConstructor +public class DtoConverter { + + private final ObjectMapper objectMapper; + + /** + * Map → DTO 변환 + * unknown 필드 허용 + */ + public T toDto(Map body, Class clazz) { + return toDto(body, clazz, false); + } + + + + + /** + * strict모드 가독 헬퍼 + * */ + public T toStrictDto(Map body, Class clazz) { + return toDto(body, clazz, true); + } + + /** + * Map → DTO 변환 + * @param strict true > unknown 필드에 대한 예외 발생 + */ + public T toDto(Map body, Class clazz, boolean strict) { + try { + ObjectReader reader = objectMapper.readerFor(clazz); + if (strict) { + reader = reader.with(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + } + return reader.readValue(objectMapper.writeValueAsBytes(body)); + } catch (IOException e) { + throw new DtoConvertException("DTO 변환 실패: " + clazz.getSimpleName(), e); + } + } + +}