개발을 하면서 generic type <T>
에 관해서 궁금했는데 개발하면서 공부해봤다.
일단 타입종류로는 아래와 같다.
타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number
restController 개발 도중에 responseEntity를 공통화 하면 좋겠다는 생각에 만들었다.
lombok으로 builder와 생성자에 관한 AllArgsConstructor,NoArgsConstructor 그리고 데이터 이동을 위한 data까지 추가했다.
generic을 하기 위해 클래스 명 옆에 <T>
를 추가하고 요소에도 추가해주었다.
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDTO<T> {
private String error;
private List<T> data;
}
사용은 간단하다.
@GetMapping("/one/{seq}")
public ResponseEntity<?> findByEltSeq(@PathVariable("seq")Long seq){
ResponseDTO<EbLvlTest> dto = null;
List<EbLvlTest> byEltSeq = null;
try {
byEltSeq = service.findByEltSeq(seq);
List<ResultDto>result = byEltSeq.stream().map(ResultDto::new).collect(Collectors.toList());
System.out.println("result = " + result);
dto = ResponseDTO.<EbLvlTest>builder().data(byEltSeq).build();
} catch (Exception e) {
logger.error(e);
}
if(byEltSeq != null && byEltSeq.size() > 0)
return ResponseEntity.ok(dto);
else
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(dto);
}
아래와 같이 generic 타입만 지정해주고 빌더로 만들어 주기만 하면 된다.
dto = ResponseDTO.<EbLvlTest>builder().data(byEltSeq).build();
이왕 공부 하는 김에 responseEntity도 공부해보자.
//정상
ResponseEntity.ok(dto);
//에러 코드 400 둘 중에 하나 사용하면 된다.
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(dto);
ResponseEntity.badRequest().body(dto);
ResponseEntity로 httpstatus와 body를 control 할 수 있다.
.ok는 기본적으로 httpstatus code 200과 같다.
그 외에는 .status로 해당하는 에러코드를 만들어 주고 그 뒤에 body에 넣어주거나 body가 필요 없다면 바로 build()를 해주면 된다.
추가로
List<ResultDto>result = byEltSeq.stream().map(ResultDto::new).collect(Collectors.toList());
이 코드는 ResultDto 클래스에서 사용하기 위해 만들었다.
@Data
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ResultDto {
private EbLvlTest test;
private EbLvlTestQ testQ;
private EbLvlTestTmpl tmpl;
private EbLvlTestManage manage;
public ResultDto(EbLvlTest test){
this.test =test;
this.testQ = test.getTestQ();
this.tmpl = test.getTmpl();
this.manage = test.getManage();
}
}
java의 stream 기능을 이용해서 바로 list<EbLvlTest>
에서 list<ResultDto>
로 변경 가능하다.
약간 두서 없고 정리가 잘 안되어 있지만 추후에 정리할 예정이다.