JSON 응답에 도메인 정보 포함시키기: Spring Boot 직렬화(@ JsonSerializer)

오늘도 열심히 일을 하다가.. image url 의 도메인을 서비스에서 받아서 Response 에서 처리해야하는게 소스 코드가 넘 더러워지고.. 비효율적이라고 생각이 들었다.

public static FileDto create(File entity, String domain) {
    return FileDto.builder()
            .fileExt(entity.getFileExt())
            .fileSize(entity.getFileSize())
            .fileUrl(makeUrl(domain, entity.getFilePath()))
            .fileType(entity.getFileType())
            .originFileName(entity.getOriginFileName())
            .seq(entity.getSeq())
            .build();

}
private static List<FileDto> convertFiles(List<File> files, String domain) {
        return files.stream().map(file -> FileDto.create(file, domain)).collect(Collectors.toList());
}

매번 이렇게 파라미터에 항상 domain 이라는 String 파라미터를 넣는게 불만이였는데 JSON 직렬화 사용하면 잘 해결될 수 있을 거 같아서 찾아서 적용한 방법 공유

커스텀 직렬화기 구현

도메인 정보 주입

@Component@Configuration 클래스에 도메인 정보를 @Value로 주입받음.

@Configuration
public class DomainConfig {
    @Value("${your.domain}")
    private String domain;

    // 도메인 정보 제공자 메서드
    public String getDomain() {
        return domain;
    }
}

Jackson 라이브러리의 JsonSerializer를 확장하여 커스텀 직렬화기를 구현

Custom JsonSerializer에서 도메인 정보를 사용하여 URL을 완성.

public class ImageUrlSerializer extends JsonSerializer<String> {

    @Autowired
    private DomainConfig domainConfig; // 도메인 설정 주입

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        String fullUrl = domainConfig.getDomain() + value; // 도메인과 값을 조합
        gen.writeString(fullUrl);
    }
}

적용

필드에 @JsonSerialize를 사용하여 커스텀 직렬화기를 적용.

public class ResponseDto {

    @JsonSerialize(using = ImageUrlSerializer.class)
    private String imageUrl;

}

그러면 이렇게 완성!

enum code 값에 대하여 @JsonSerialize 를 이미 사용하고 있었는데 이 생각을 왜 일찍 못했는지 아쉽다. 이제 깔끔하게 코드를 짤 수 있겠다 ^^..