오늘도 열심히 일을 하다가.. 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
를 이미 사용하고 있었는데 이 생각을 왜 일찍 못했는지 아쉽다. 이제 깔끔하게 코드를 짤 수 있겠다 ^^..