avatar
띵로그

스프링부트에서 ObjectMapper를 빈으로 등록해서 사용하자 !

가끔 ObjectMapper를 직접 객체 생성해서 사용하시는 분들이 계시더라고요. 안 되는 건 아닌데, 그러지 마세요... 그냥 사과해요 나한테!!
스프링JSONMapperJava
2 months ago
·
8 min read

1991

스프링부트(Spring Boot)는 자바 애플리케이션 개발을 단순화하고 생산성을 높이기 위해 다양한 자동 설정과 기능을 제공합니다. 그 중에서도 ObjectMapper는 JSON과 자바 객체 간의 변환을 담당하는 핵심 컴포넌트로, 스프링부트 애플리케이션에서 중요한 역할을 합니다.

1. ObjectMapper란?

ObjectMapper는 Jackson 라이브러리의 핵심 클래스 중 하나로, 자바 객체를 JSON으로 변환(직렬화)하거나 JSON을 자바 객체로 변환(역직렬화)하는 기능을 제공합니다.

쉽게 말해 ObjectMapper는 자바 객체와 JSON 사이를 오가는 번역가입니다. 스프링 부트는 기본적으로 Jackson을 JSON 처리 라이브러리로 사용하며, ObjectMapper는 스프링의 HTTP 메시지 변환기(Message Converter)로 통합되어 있습니다.

2. ObjectMapper를 빈으로 등록하는 이유

스프링 부트 애플리케이션에서 ObjectMapper를 빈으로 등록하여 사용하는 것은 여러 가지 이점을 제공합니다. 아래에서는 그 주요 이유들을 자세히 살펴봅니다.

집.중.!

1993

2.1. 중앙 집중식 설정 관리

ObjectMapper를 빈으로 등록하면 애플리케이션 전반에서 일관된 설정을 유지할 수 있습니다. 예를 들어, 날짜 형식, 필드 이름 전략, 직렬화 옵션 등을 중앙에서 관리할 수 있어, 여러 곳에서 동일한 설정을 반복할 필요가 없습니다.

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    return mapper;
}

2.2. 일관된 직렬화/역직렬화 동작

빈으로 등록된 ObjectMapper는 스프링의 HTTP 메시지 변환기와 통합되어, 컨트롤러에서 반환되는 객체나 요청으로 들어오는 JSON 데이터에 대해 일관된 직렬화 및 역직렬화 동작을 보장합니다.
이는 애플리케이션의 일관성을 높이고 예측 가능한 동작을 유지하는 데 기여합니다.

2.3. 커스터마이징 및 확장성

ObjectMapper는 다양한 설정과 모듈을 통해 커스터마이징이 가능합니다. 빈으로 등록하면 애플리케이션의 요구사항에 맞게 ObjectMapper를 손쉽게 확장하거나 수정할 수 있습니다.

예를 들어, 커스텀 직렬화기나 역직렬화기를 추가하거나, 특정 프로퍼티를 무시하는 설정 등을 적용할 수 있습니다.

@Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    // 추가 설정
    return mapper;
}

2.4. 스프링의 의존성 주입과의 통합

스프링의 의존성 주입(Dependency Injection) 메커니즘을 활용하여 ObjectMapper를 필요한 곳에 주입할 수 있습니다.

이를 통해 각 컴포넌트에서 일관된 ObjectMapper 인스턴스를 재사용할 수 있으며, 코드의 결합도를 낮추고 유지보수성을 높일 수 있습니다.

@Service
public class MyService {

    private final ObjectMapper objectMapper;

    @Autowired
    public MyService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    // 서비스 로직
}

2.5. 테스트 용이성

빈으로 등록된 ObjectMapper는 테스트 환경에서도 쉽게 주입하여 사용할 수 있습니다. 이를 통해 단위 테스트나 통합 테스트 시 일관된 설정을 유지하며, 모킹(Mock)을 통해 특정 동작을 검증할 수 있습니다.

@SpringBootTest
public class MyServiceTest {

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    public void testSerialization() throws JsonProcessingException {
        MyObject obj = new MyObject();
        String json = objectMapper.writeValueAsString(obj);
        // 검증 로직
    }
}

3. 빈으로 등록하는 방법

스프링 부트에서 ObjectMapper를 빈으로 등록하는 방법에는 기본 설정을 그대로 사용하는 방법과, 커스터마이징된 설정을 적용하는 방법이 있습니다.

3.1. 기본 설정 사용

스프링 부트는 기본적으로 ObjectMapper를 빈으로 등록합니다. 별도의 설정 없이도 애플리케이션 전반에서 이를 사용할 수 있습니다.

@Configuration
public class JacksonConfig {
    // 기본 설정을 그대로 사용
}

3.2. 커스터마이징된 ObjectMapper 빈 등록

기본 설정을 확장하거나 변경하려면 커스터마이징된 ObjectMapper 빈을 직접 등록할 수 있습니다.

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 커스터마이징 설정 적용
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.registerModule(new JavaTimeModule());
        return mapper;
    }
}

또는 기존의 ObjectMapper를 수정하는 방법도 있습니다.

@Configuration
public class JacksonConfig {

    @Autowired
    public void customizeObjectMapper(ObjectMapper mapper) {
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.registerModule(new JavaTimeModule());
    }
}

결론 !

스프링 부트에서 ObjectMapper를 빈으로 등록하여 사용하는 것은 애플리케이션의 일관된 JSON 처리, 중앙 집중식 설정 관리, 커스터마이징 용이성, 스프링의 의존성 주입과의 통합, 테스트 용이성 등 다양한 이점을 제공합니다. 이를 통해 개발자는 보다 효율적이고 유지보수하기 쉬운 애플리케이션을 개발할 수 있습니다.

따라서, ObjectMapper를 빈으로 등록하여 사용하는 것은 스프링 부트 애플리케이션의 모범 사례 중 하나로 권장하는 방법입니다.

꼭 스프링 빈으로 사용합시다!!! 직접 new ObjectMapper() 하는 일은 없기를!!!!!!!!!!!!!

1994


[참고]

https://wildeveloperetrain.tistory.com/352

https://velog.io/@kny8092/ObjectMapper-%EC%A7%9A%EA%B3%A0-%EB%84%98%EC%96%B4%EA%B0%80%EA%B8%B0

https://velog.io/@beomsuyoo/Spring-Boot-%EC%BB%A4%EC%8A%A4%ED%85%80-ObjectMapper-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0

https://memo-the-day.tistory.com/208

https://jsonobject.tistory.com/432


- 컬렉션 아티클






주니어 백엔드 개발자입니다 :)