개발일지 - generic, responseEntity

아침7시개발·2022년 1월 18일
0

개발일지

목록 보기
6/19

개발을 하면서 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>로 변경 가능하다.

약간 두서 없고 정리가 잘 안되어 있지만 추후에 정리할 예정이다.

profile
쉬엄쉬엄하는 개발자

0개의 댓글