이 경우에는 요청으로부터 필드 정보를 추출하여 해당 정보를 기반으로 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 클래스를 사용하여 해당 필드에 대한 추가 어