public static Long getCurrentMemberId(){
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(authentication == null) throw new NeedToLoginException();
if(authentication.getName() == null) throw new NotRightAuthenticationException();
return Long.parseLong(authentication.getName());
}
이전의 SecurityUtil에서 이렇게 만들어, 각 에러 상황에 대해 다른 결과로 예외를 만들기 위해 코드를 조금 다듬었다.
일단 우리가 프로젝트를 만들었을 때, 이에 대해 성공, 실패가 갈린다.
또한, 실패를 했을 때 예외처리를 던지게 해주어야 한다.
그렇다면, 일단 성공과 실패를 구분해 던질 줄 알아야 하며(이번에 할 것), 실패했을 때 어떻게 반응해야 할지(다음 단계)를 만들어야 한다.
이런식으로 최종적인 코드를 만들었으며,
설명을 하자면,
Response에는 참, 거짓으로 성공여부, 성공이건 실패건 존재하는 코드(404에러 같은 것), 결과 Result가 필요하다.
Result를 인터페이스로 해, Success와 Failure를 하나로 묶을 수 있었다.
@JsonInclude(JsonInclude.Include.NON_NULL)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class Response {
private boolean success;
private int code;
private Result result;
}
설명대로 3개의 인스턴스를 가지는 객체를 만들었다.
JsonInclude에는 실패할 땐 성공해 받아온 데이터가, 성공할 땐 실패 문구가 null값이므로 NON_NULL로 JsonInclude해주었다.
또한, 결국 반환될 Response는 성공여부, 응답 코드, Result객체가 전부 필요하기 때문에 AllArgsConstructor를 붙여주었다.
참고로 Result인터페이스에는 아무것도 만들어두지 않았다. 역할은 Success와 Failure를 묶는 것 뿐이니깐.
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@AllArgsConstructor
public class Success<T> implements Result {
private T data;
}
Success에는 성공시 받아갈 데이터가 존재하기 때문에, 이 데이터를 받는 클래스를 만들었으며, 여기에 인터페이스를 주입시켰다.
또한, 데이터가 넘어갈 것이기 때문에, NON_NULL를 넣어, 성공 데이터의 null값 자체도 삭제했다.
여기서 유의해야 할 것은, Response의 NON_NULL은 실패시에 T data자체가 null이므로 그것을 없애주는 것이며,
Success의 NON_NULL은 데이터의 내부에 null값들을 세부적으로 지워주는 것이다.
@Getter
@AllArgsConstructor
public class Failure implements Result{
private String failMessage;
}
Failure는 데이터가 그 때 마다 추가될 실패문구 뿐이므로, NON_NULL이 필요가 없다.
이렇게 Success, Failure, Result, Response를 다 만들었다.
public static Response success() { return new Response(true, 0, null);}
public static <T> Response success(T data){ return new Response(true, 0, new Success<>(data));}
public static Response failure(int code, String message){ return new Response(false, code, new Failure(message));}
Response로 돌아와, 이렇게 3개의 메서드를 만들었다.
순차적으로
- 요청 처리를 단순히 성공했음을 알릴 때 : 데이터를 반환할 필요가 없으며, 성공했을 경우에는 Result를 null로 만들어주며, 성공여부에 참을, 코드에 0을 넣었다.
- 요청 처리를 성공했고 이에 대한 반환 값이 존재할 때 : 데이터를 반환하기 위해 Response생성자의 Result를 new Success에 데이터를 넣어 반환시켰다.
- 요청 처리를 실패했을 때 : 에러 코드는 상황에 따라 다르다. 그리고, Failure에 실패 문구를 추가해 만들었다.
이런식으로 응답을 처리하는 방식을 만들었다. 다음엔 이를 이용해 예외처리를 커스텀해야겠다.
'스프링 공부 > 게시판 프로젝트 만들기' 카테고리의 다른 글
[스프링] 7. JWT를 구현하기. 1단계: 일단 JWT를 위한 토큰을 만들자. (1) (0) | 2023.01.06 |
---|---|
[스프링] 6. SecurityUtil 예외처리를 커스텀 해보자(부제: 2단계, 리스폰스를 이용해 예외처리하기) (0) | 2023.01.02 |
[스프링] 4. SecurityConfig에 대한 유틸 추가하기 (0) | 2023.01.01 |
[스프링] 3. swagger ui 적용시키기(2) (0) | 2022.12.31 |
[스프링] 2. swagger ui 설정하기(1) (0) | 2022.12.28 |