WEB/JAVA

제네릭 DTO

jwt 토큰 을 추가하는 도중 

이미 사용중인 서비스가 사용하고 있는걸 추상화하는 작업중에 제네릭을 사용한 후기이다.

 

 

서비스 마다 다른 토큰유지 시간, 페이로드를 갖고 있는데

오버라이딩을 사용하였는데 코드리뷰 때 같은 기능을 하면서 약간의 필드추가만 되는것이라서 제네릭을 사용해보는게 어떻냐는 피드백을 받았다. 물론 처음 써보는거라서 시간이 오래 걸렸다. 재미있었고 신세계였다 (제대로 쓴것도 아니지만)

 

아래와 같이 제네릭 클래스를 생성하고 issue (토큰발행) 을 실행했을 때 제네릭 타입으로 생성 하였다

@Data
@AllArgsConstructor
public class TokenPayload<T> {

  private T tokenPayload;

  public T getTokenPayload() {
    return tokenPayload;
  }
}
  @Transactional
  @Override
  public JsonWebTokenDto issue(IssueReqeust request) {
    User user = findByIdAndPwd(request.getId(),request.getPwd());
    TokenPayloadDto payload = getTokenPayloadDto(user);
    return jwtTokenService.generateTokens(new TokenPayload<>(payload));
  }

 

 

전달받은 payload 를 claim 에 저장하려면 payload.getTokenPayload() 로 갖고 오면 된다.

그러면 Token 을 생성하면서 아래와 같이 이쁘게 나온다.

public <T> GeneratedTokenDto createAccessToken(@NotNull TokenPayload<T> payload) {
    // ...
    JwtBuilder jwtBuilder = Jwts.builder()
        .setSubject(subject)
        .claim(Constants.JWT_PRIVATE_CLAIMS_MEMBER_KEY, payload.getTokenPayload())
        .setIssuedAt(issuedAt)
        .setExpiration(expiration).setHeaderParam(Header.TYPE, Header.JWT_TYPE)
        .signWith(SignatureAlgorithm.HS256, accessSecretKeyByte);
    
    // ...
    return GeneratedTokenDto.builder().tokenType(tokenType).subject(subject)
        .issueAt(issuedAt).expiration(expiration).token(jwtBuilder.compact()).build();
  }
{
  "sub": "1",
  "companyMember": {
    "id": 1,
    "branchId": 123,
    "serviceId": 4567
  },
  "iat": 1678784812,
  "exp": 1678785412,
  "role": [
    "ADMIN"
  ]
}
반응형