Projects/[Final] Shopping Mall Project

[트러블슈팅] CD환경에서만 ObjectMapper 빈 등록이 실패하는 이유

montmer27 2026. 4. 27. 15:51

[관련 커밋]

https://github.com/all-in-market/mvp-api-server/commit/91ba7e2599fb64e2452e518b2c3aa0f91d0a129b

 

Merge pull request #144 from all-in-market/fix/login-control · all-in-market/mvp-api-server@91ba7e2

feat: 구매자 로그인 실패 사유 비노출, 로깅

github.com

[관련 게시물]

https://montmer27.tistory.com/243

 

[트러블슈팅] 무차별 대입 공격으로부터 로그인 방어하기

[상황]현재 구조에서는 로그인 실패 사유를 자세히 알려주고 있다. 이 구조는 일반 사용자에겐 편리함을 제공하지만 악의적인 사용자에게는 계정 정보를 유추할 수 있는 단서를 제공한다.[목표]

montmer27.tistory.com

[상황]

위 커밋 머지 후 CD 환경에서 아래와 같은 에러 발생

Parameter 1 of constructor in com.example.allinmarket.common.security.LoginRateLimitFilter required a bean of type 'com.fasterxml.jackson.databind.ObjectMapper' that could not be found.

[원인]

LoginRateLimitFilter에 ObjectMapper가 생성자 주입으로 연결되어 있는데, Spring Boot 자동 설정이 모든 배포 환경에서 항상 ObjectMapper 빈을 등록해주지는 않는다.

Spring Boot의 JacksonAutoConfiguration은 자동으로 ObjectMapper 빈을 등록하지만, 이는 조건부 자동 설정(@ConditionalOnMissingBean)이라 특정 배포 환경, Docker 이미지 빌드 방식, 또는 Spring Boot 버전에 따라 실행 순서 문제로 빈이 누락될 수 있다고 한다.

[해결]

/common/config/JacksonConfig.java에 @Bean ObjectMapper를 명시적으로 등록했다. 자동 설정에 의존하지 않으므로 CD 환경에서도 항상 안정적으로 빈이 등록된다. JavaTimeModule도 함께 등록해 LocalDate 등 Java 8 날짜 타입 직렬화도 올바르게 처리된다.

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper()
                .registerModule(new JavaTimeModule())
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }
}