Backend/SpringBoot

DTO (W. Data, Build 어노테이션)

Dean83 2024. 10. 24. 17:19
  • Data Transfer Object의 약자로서, 데이터만 전달 해준다.
  • 기본적으로 entity 항목은 DB 테이블과 매핑이 되므로 특정 항목을 제거하고 클라이언트에 전달 할 수 없다.
  • 따라서 entity를 DTO로 한번 더 감싼 후 원하는 항목들만 조합하여 클라이언트에 전달하기 위해 사용한다.
    • 혹은 다양한 entity 항목들을 하나의 DTO로 조합할 수도 있다.
  • 물론 관심도 분리등 다른이유도 있지만, 이 부분은 개발자 입장에서만 유효한 의미라 건너 뛴다.
  • 정의는 class 로 정의하고, controller 에서 DTO 생성 및 함수호출을 하여 동작한다.

 

 

  • 정의 
    • 간단하다. DTO로 사용할 클래스를 만들고, entity로 전환하는 함수, entity를 받아 DTO를 설정하는 함수를 만들면 된다. 
    • Data 어노테이션 활용
      • Data 어노테이션은 Getter, Setter, RequiredArgsConstructor 등을 한데 모은 어노테이션이다.
package com.example.test1.test1;

import groovyjarjarantlr4.v4.runtime.misc.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;

@Data
public class testclassDTO
{
    @NotNull
    public String value1;

    @Size(min=10, max=11)
    public String value2;

    public entity1 toEntity()
    {
        entity1 ent = new entity1();
        ent.setName(value1);
        ent.setAddress(value2);
        return ent;
    }

    public void fromEnt(entity1 ent)
    {
        value1 = ent.getName();
        value2 = ent.getAddress();
    }
}

 

 

  • 호출은 다음과 같다
package com.example.test1.test1;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;


@Controller
public class javacontroller {

    
    private final ServiceClass_Java serviceItem;
    public javacontroller(ServiceClass_Java sv)
    {
        serviceItem = sv;
    }

    @GetMapping("/java")
    public String controllerTest(@RequestAttribute("name") String name) {
               
        entity1 ent = serviceItem.GetEntity(name);
        testclassDTO dto = new testclassDTO();
        dto.fromEnt(ent);

        return dto.value1;
    }
    
}

 

 

  • Build 어노테이션
    • 클래스형 변수를 기존방식으로 생성하는게 아닌 롬복 build를 통해 체이닝 형식으로 생성한다.
    • DTO 클래스 (build 어노테이션 대상) 
    • import lombok.Builder; 추가
    • 클래스 앞에 @Build 어노테이션 추가
package com.example.test1.test1;

import groovyjarjarantlr4.v4.runtime.misc.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.Builder;

@Data
@Builder
public class testclass_java
{
    @NotNull
    public String value1;

    @Size(min=10, max=11)
    public String value2;

    public entity1 toEntity()
    {
        entity1 ent = new entity1();
        ent.setName(value1);
        ent.setAddress(value2);
        return ent;
    }

    public void fromEnt(entity1 ent)
    {
        value1 = ent.getName();
        value2 = ent.getAddress();
    }
}



////////컨트롤러
package com.example.test1.test1;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;



@Controller
public class javacontroller {

    
    private final ServiceClass_Java serviceItem;
    public javacontroller(ServiceClass_Java sv)
    {
        serviceItem = sv;
    }

    @GetMapping("/java")
    public String controllerTest(@RequestAttribute("name") String name) {
               
        entity1 ent = serviceItem.GetEntity(name);

        testclass_java dto = testclass_java.builder().value1("").value2("").build();
        dto.fromEnt(ent);

        return dto.value1;
    }
    
}