이 경우에는 요청으로부터 필드 정보를 추출하여 해당 정보를 기반으로 DTO 클래스를 동적으로 생성해야 합니다. 이를 위해 JavaPoet과 같은 코드 생성 라이브러리를 사용하여 동적으로 클래스 코드를 생성할 수 있습니다.
아래는 예시 코드입니다.
javaCopy code
import javax.lang.model.element.Modifier;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.TypeSpec;
@RestController
public class DTOGeneratorController {
@PostMapping("/generateDTO")
public ResponseEntity<String> generateDTO(@RequestBody DTORequestDTO dtoRequestDTO) {
String className = dtoRequestDTO.getClassName();
List<FieldDTO> fieldList = dtoRequestDTO.getFields();
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className)
.addModifiers(Modifier.PUBLIC);
for (FieldDTO fieldDTO : fieldList) {
FieldSpec.Builder fieldBuilder = FieldSpec.builder(
ClassName.bestGuess(fieldDTO.getType()),
fieldDTO.getName())
.addModifiers(Modifier.PRIVATE);
AnnotationSpec.Builder annotationBuilder = AnnotationSpec.builder(NotNull.class);
if (fieldDTO.isNotNull()) {
fieldBuilder.addAnnotation(annotationBuilder.build());
}
if (fieldDTO.getLength() != null) {
annotationBuilder = AnnotationSpec.builder(Size.class)
.addMember("min", "$L", 1)
.addMember("max", "$L", fieldDTO.getLength());
fieldBuilder.addAnnotation(annotationBuilder.build());
}
if (fieldDTO.getPattern() != null) {
annotationBuilder = AnnotationSpec.builder(Pattern.class)
.addMember("regexp", "$S", fieldDTO.getPattern());
fieldBuilder.addAnnotation(annotationBuilder.build());
}
classBuilder.addField(fieldBuilder.build());
}
TypeSpec dtoClass = classBuilder.build();
JavaFile javaFile = JavaFile.builder("com.example.dto", dtoClass)
.build();
try {
javaFile.writeTo(System.out);
// return ResponseEntity.ok(javaFile.toString());
return ResponseEntity.ok("DTO generated successfully");
} catch (IOException e) {
e.printStackTrace();
return ResponseEntity.status(500).body("DTO generation failed");
}
}
}
위 코드에서는 DTORequestDTO 클래스에서 요청으로부터 필드 정보를 받아와서 동적으로 DTO 클래스 코드를 생성합니다. 이 코드에서는 JavaPoet
라이브러리를 사용하여 코드를 동적으로 생성합니다. 이를 위해 TypeSpec
클래스를 사용하여 클래스, 필드, 메소드, 생성자 및 내부 클래스 등을 생성할 수 있습니다.
요청으로부터 받은 필드 정보를 바탕으로 DTO 클래스 코드를 생성하기 위해 반복문을 사용하여 각 필드에 대한 FieldSpec
객체를 만듭니다. 필드에 대한 추가적인 제약 조건이 필요한 경우 AnnotationSpec
클래스를 사용하여 해당 필드에 대한 추가 어