서론
스프링 웹 개발을 하다가 API에 상황에 맞게 구조는 비슷하지만 다른 Json을 반환 해주어야하는데, 그럴 때 마다, 다른 DTO를 만들어서 사용하는 것은 너무 비효율적으로 생각이 되어서, 상황에 맞게 다른 DTO를 반환하는 법을 찾아보았다.
📋 Generic이란?
제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이스를 말한다.
제네릭 타입은 클래스 또는 인터페이스 이름 뒤에 "<>" 부호가 붙고, 사이에 타입 파라미터가 위치한다.
제네릭을 통해 타입을 지정하게 됨으로써 타입 변환을 줄이게 되어 프로그램 성능에 유리해진다. 또한, 특정 클래스나 인터페이스에 다양한 타입으로 사용 및 저장할 때 유용하게 사용 할 수 있다.
예시 :public class Generic<T> { private T t; public T get() { return this.t; } public void set(T t) { this.t = t; } public static void main(String[] args) { // String 타입, 다른 타입도 가능 하다. Generic<String> stringGeneric = new Generic<>(); stringGeneric.set("Hello World"); String tValueTurnOutWithString = stringGeneric.get(); System.out.println(tValueTurnOutWithString); } } //출력 Hello World
📍 Generic을 이용한 ResponseDto 만들기
예로, Jsond의 구조가 HTTP 상태코드, 상태 메세지, 및 상황에 마다 구조가 달라지는 데이터를 반환 해야한다고 가정을 한다면 이렇게 구현 할 수 있다.
//==Response DTO==// @Data @AllArgsConstructor static class Response<T> { private Integer code; private String msg; private T data; } //==Response DTO==// @Data @AllArgsConstructor static class ResponseStockInfo { private String companyName; private String ticker; private String market; private Double price; } //==Response DTO==// @Data @AllArgsConstructor static class ResponseStockList { private String companyName; private String ticker; }위 처럼 맨위의 제네릭을 사용한 DTO는 공통적으로 반환 되는 상태메세지와 상태코드를 가지고 있으며 상황에 따라 구조가 바뀔 수 있는 데이터로 구성되어있다. 그럼 이 DTO를 Controller에 반영하는 것은 밑에 있다.
@GetMapping(value = "/stock/info") public Response info() { return new Response(200, "OK", new ResponseStockInfo("Apple Inc","AAPL","NASDAQ", 167.30)); } @GetMapping(value = "/stock/list") public Response list() { List<ResponseStockList> stockLists = new ArrayList<>(); stockLists.add(new ResponseStockList("Apple Inc", "AAPL")); stockLists.add(new ResponseStockList("Microsoft Corporation", "MSFT")); return new Response(200, "OK", stockLists); }
이 방법을 통해 제네릭에 관해 조금 더 알 수 있었다. 제네릭은 스프링 부트에서 많이 사용되니, 더 자주 사용해보고 깊이 알아두면 좋겠다.
출처 :
출처