Language/Java

[Java] 리플렉션 (reflection) 에 대해 알아보자!

hoonylab 2025. 4. 23. 15:13
728x90
반응형

Java 리플렉션(Reflection)이란?

Java의 리플렉션은 런타임에 객체의 클래스 정보에 접근하거나 메서드를 호출하고, 필드를 읽거나 쓸 수 있게 해주는 기능입니다. 보통은 컴파일 타임에 클래스 정보를 사용하지만, 리플렉션을 사용하면 프로그램 실행 중에 유연하게 객체를 다룰 수 있습니다.

ObjectMapper, ModelMapper, MapStruct와 리플렉션

1. ObjectMapper (Jackson)

ObjectMapper는 JSON과 Java 객체 간의 직렬화/역직렬화를 담당하는 Jackson 라이브러리의 핵심 클래스입니다. 내부적으로 리플렉션을 사용하여 객체의 필드를 분석하고 값을 읽거나 씁니다.


ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonString, User.class); // JSON -> Java 객체

이때 User.class의 필드를 리플렉션으로 분석하여 값을 자동으로 매핑합니다.

2. ModelMapper

ModelMapper는 DTO와 Entity 간의 변환을 자동화해주는 라이브러리입니다. 내부적으로 리플렉션을 사용하여 두 객체의 필드 이름과 타입을 비교하고 값을 복사합니다.


ModelMapper modelMapper = new ModelMapper();
UserDto userDto = modelMapper.map(user, UserDto.class);

User 객체의 필드 정보를 리플렉션으로 읽고, UserDto에 맞게 자동 매핑합니다.

3. MapStruct

MapStruct컴파일 타임에 매핑 코드를 생성하는 라이브러리입니다. 즉, 리플렉션을 사용하지 않고 성능을 최적화합니다.


@Mapper
public interface UserMapper {
    UserDto toDto(User user);
}

MapStruct는 어노테이션 기반으로 코드를 분석하고, 직접 매핑 코드를 생성하기 때문에 리플렉션을 사용하지 않습니다. 이는 런타임 성능이 중요한 상황에서 유리합니다.

정리

  • ObjectMapper: 런타임 리플렉션 사용 (유연하지만 성능은 다소 낮을 수 있음)
  • ModelMapper: 리플렉션 사용 (간편하지만 대규모 변환에는 부적합할 수 있음)
  • MapStruct: 컴파일 타임 코드 생성 (성능 우수, 명시적인 매핑 필요)
728x90
반응형