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;
}
}