본문으로 바로가기

[Java] DTO to DTO (Stream API)

category Backend/Java 2022. 1. 18. 22:00

1. 목적

  • DTO를 이용하여 DB를 조회해 가지고 온 컬럼명과 응답해야 할 API 스펙에 따른 Json 값이 다른 경우에 사용할 수 있습니다.
  • DTO, VO 또는 Domain 클래스를 이용하여 DB의 컬럼명과 매핑하여 데이터를 가지고 오는 경우가 많은데 이를 그대로 Response에 사용할 경우 컬럼명이 그대로 노출될 수 있어 좋지 않습니다.

2. DB 연동용 DTO(VO)

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class NetworkDB {
    private String device_name;
    private String setting_ip_addr;
    private String setting_ip_type;
    private String setting_subnet_ip_addr;
    private String setting_gw_ip_addr;
    private String setting_dns1;
}

3. Response용 DTO(VO)

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class NetworkResponse {
    private String name;
    private String ip;
    private String type;
}

4. DTO to DTO (Mapping)

  • Stream API의 map과 collect를 이용하여 쉽고 간단하게 다른 DTO로 변경 가능합니다. 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class test {

    public static void main(String[] args) throws JsonProcessingException {
        List<NetworkDB> networkDBList = selectDB();

        List<NetworkResponse> networkResponseList = networkDBList.stream()
                .map(networkDB -> new NetworkResponse(networkDB.getDevice_name(), networkDB.getSetting_ip_addr(), networkDB.getSetting_ip_type()))
                .collect(Collectors.toList());
    }

    // DB조회(테스트용으로 간단하게 작성)
    private static List<NetworkDB> selectDB() {
        List<NetworkDB> networkDBList = Arrays.asList(
                new NetworkDB("pc1","192.168.0.1","DHCP","255.255.255.0","192.168.0.1","8.8.8.8"),
                new NetworkDB("pc1","192.168.0.2","DHCP","255.255.255.0","192.168.0.1","8.8.8.8"),
                new NetworkDB("pc1","192.168.0.3","DHCP","255.255.255.0","192.168.0.1","8.8.8.8"),
                new NetworkDB("pc1","192.168.0.4","DHCP","255.255.255.0","192.168.0.1","8.8.8.8"),
                new NetworkDB("pc1","192.168.0.5","DHCP","255.255.255.0","192.168.0.1","8.8.8.8")
        );
        return networkDBList;
    }
}