본문 바로가기
Programming/Java_Spring

Java에서 generic 클래스 사용하기.

by 곰네Zip 2023. 9. 27.

개발하다보면.. 유사한 결과를 반환하는 클래스가 필요한 경우가 있다.

예를들어 API에서 호출에 따른 결과를 반환하는 경우.

결과 Status와 결과 data들을 반환하면 된다.

그래서 다음과 같이 응답의 기본을 생성했다고 가정하자.

@Setter
public class MyResponseMessage{
	private int responseCode;
    private String responseMessage;
}

이렇게 하면  API의 호출에 따른 결과를 반환해줄 수 있다.

근데.. 여기서 하나만 더 생각해보자. 내가 TableA 쿼리 결과와 TableB쿼리결과를 반환하는 API가 각각 하나씩 있다고 해보자. (둘 다 List)

그럼.. 응답 Object를 어떻게 해줄 수 있을까?

@Setter
public class ResponseMessageTableA{
	private int responseCode;
    private String responseMessage;
    private List<TableADto> resultItems;
}

@Setter
public class ResponseMessageTableB{
	private int responseCode;
    private String responseMessage;
    private List<TableBDto> resultItems;
}

이런식으로 쭉 만들을까?

(물론 이 예제는 제가 지금 단순히 생각나는 경우로 작성한거라서 더 좋은 예제가 있을 거라고 생각합니다. 그냥 단순히 예를 든거니까 이렇게 하면 안되지! 싶으시면 댓글로 태클 걸어주세요 :) )

 

이럴때 <T>를 써서 generic으로 만들자. 아래처럼

@Setter
public class ResponseMessage<T>{
	private int responseCode;
    private String responseMessage;
    private List<T> resultList;
    private T resultItem;
}

위와 같이 선언해주면

ResponseMessage<TableADto> respA = new ReponseMessage...;
ResponseMessage<TableBDto> respB = new ReponseMessage...;

respA.getResultList().add( new TableADto());
respA.getResultList().add( new TableADto());
respA.getResultList().add( new TableADto());
...

respB.getResultList().add( new TableBDto());
....

위와 같이 사용을 할 수 있다.

이런식으로 T에 적절한 클래스를 전달만 해주면 범용적으로 사용이 가능하다.

적어도 클래스별로 ResponseMessage를 만들 필요가 전혀 없으니 노가다가 줄어든다. :)

Generic은 이런 용도 말고도 사용할 용도는 무궁무진하니까. 잘 사용해보아요.

반응형

댓글