기존 코드

public <T> Map<String, String> convertToMap(T object) {
    Map<String, String> map = new HashMap<>();
    try {
        Class<?> clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            String fieldName = field.getName();
            Object value = field.get(object);
            if (value != null) {
                map.put(fieldName, value.toString());
            }
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return map;
}

위 코드는 Reflection을 사용하여 객체의 모든 필드에 접근하는 방식.

  • **getDeclaredXXX() → 상속받은 클래스와 인터페이스를 제외하고 해당 클래스에 직접 정의된 내용만 가져옴. **접근 제어자와 상관없이 요소에 접근할 수 있다. 예를 들어 getDeclaredMethods() 는 해당 클래스에만 직접 정의된 private, protected, public 메소드를 전부 가져온다.

  • 모든 필드에 대해 접근 권한을 설정하고(setAccessible(true)), 그 값을 읽어와서 Map에 저장.

  • **IllegalAccessException: **필드 접근 중 IllegalAccessException이 발생할 수 있는데, 이는 일반적으로 필드가 접근 불가 상태일 때 발생한다. 일반적으로 필드가 접근 불가 상태일 때 필드 접근시 IllegalAccessException이 발생할 수 있다.

리팩토링

Jackson 라이브러리의 ObjectMapper를 사용하여 객체를 Map으로 변환

  • ObjectMapper** 라이브러리 활용**: 는 JSON 처리를 위해 널리 사용되는 강력한 도구. 이를 사용하여 복잡한 설정 없이도 객체를 다양한 형태로 쉽게 변환 가능하다. 또한 내부적으로 최적화된 처리와 캐싱 메커니즘을 사용하기 때문에. Reflection에 비해 ObjectMapper를 사용하는 것이 일반적으로 성능이 더 우수하다.

  • 타입 안정성: TypeReference를 사용하여 명시적으로 결과의 타입을 지정할 수 있다. 타입 안전성을 보장하고, Runtime 타입 오류 발생 가능성을 줄일 수 있다.

public <T> Map<String, String> convertToMap(T object) {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.convertValue(object, new TypeReference<Map<String, String>>() {});
}