Generic을 사용하는 ResponseDto

박우현 (Joshua)·2023년 4월 21일

항해99_TIL

목록 보기
15/20

서론

스프링 웹 개발을 하다가 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);
}

이 방법을 통해 제네릭에 관해 조금 더 알 수 있었다. 제네릭은 스프링 부트에서 많이 사용되니, 더 자주 사용해보고 깊이 알아두면 좋겠다.


출처 :
출처

profile
매일 매일 성장하자

0개의 댓글