<단순한 error 코드 관련>
위와 같이 error message 와 errorCode를 전달하면 개발하는데도 편리했다.
<Controller>
if (currentUser == null) {
log.error("status = {}, message = {}", "401", "접근 권한이 없습니다.");
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new ErrorResponse("접근 권한이 없습니다.","401"));
}
new ErrorResponse 부분만 확인하면 된다.
@Getter @Setter
public class ErrorResponse extends BasicResponse{
private String errorMessage;
private String errorCode;
public ErrorResponse(String errorMessage) {
this.errorMessage = errorMessage;
this.errorCode = "404";
}
public ErrorResponse(String errorMessage, String errorCode) {
this.errorMessage = errorMessage;
this.errorCode = errorCode;
}
}
API상 간단한 에러처리하기에 단순하고 편한 방법이다.
<에러1>
주어진 아이덴티 보다 더 많이 발견했다??
해당 썸네일을 oneToOne으로 설정해두었다...
하나의 뉴스 게시판에 하나의 썸네일만 있다고 생각해서..
하지만 update를 진행하려면 하나의 게시판에 추가된 다름 썸네일이 필요하다.. 변경을 위해..
결국 oneToMany로 변경하였고 위의 에러는 해결되었다.
썸네일 값이 db에 들어있는 상태에서 추가로 수정할때 썸네일을 더 추가하여 위와 같은 에러가 발생.
기존에 등록된 썸내일 db 정보와 썸내일 이미지를 삭제하고 진행하는 것이 메모리 관리에 더 효율적이므로
OneToOne으로 그대로 진행하고 로직을 변경했다.
<에러2>
순환참조 에러가 발생하여....
toString(exclude) 를 했으나 계속 발생...
원인이 무엇일까?!
아래 참고 사이트에서 해당 문제의 원인을 알 수 있었고
toString exclude를 했으나 계속 스택 플로우 에러가 발생해서 jsonIgnore 사용으로 해결했다.
아래의 내용을 참고하자.
1. 객체 순환 참조Permalink
Jackson 라이브러리를 통해 직렬화(Serialize) 된 Json 응답을 받는 경우 종종 StackOverFlowError가 발생합니다. 이런 경우 대부분 객체 사이의 순환 참조가 문제 발생의 원인입니다.
1.1. 순환 참조 예시Permalink
- A 인스턴스가 B 인스턴스를 참조합니다.
- B 인스턴스가 A 인스턴스를 참조합니다.
- A 인스턴스를 직렬화하는 경우 참조하는 B 인스턴스가 함께 직렬화됩니다.
- B 인스턴스를 직렬화하는 경우 참조하는 A 인스턴스가 함게 직렬화됩니다.
- 이를 계속 반복 수행하다 StackOverFlow 에러가 발생합니다.
직렬화 시점에 둘 사이의 순환 참조를 끊어주기 위한 방법으로 @JsonIgnoreProperties 애너테이션을 사용합니다. @JsonIgnoreProperties 애너테이션을 살펴보면 다양한 위치에서 사용할 수 있음을 확인할 수 있습니다.
StackOverflowError 해결 (feat. @JsonIgnoreProperties 애너테이션)
3 분 소요
1. 객체 순환 참조Permalink
Jackson 라이브러리를 통해 직렬화(Serialize) 된 Json 응답을 받는 경우 종종 StackOverFlowError가 발생합니다. 이런 경우 대부분 객체 사이의 순환 참조가 문제 발생의 원인
1.1. 순환 참조 예시Permalink
- A 인스턴스가 B 인스턴스를 참조합니다.
- B 인스턴스가 A 인스턴스를 참조합니다.
- A 인스턴스를 직렬화하는 경우 참조하는 B 인스턴스가 함께 직렬화됩니다.
- B 인스턴스를 직렬화하는 경우 참조하는 A 인스턴스가 함게 직렬화됩니다.
- 이를 계속 반복 수행하다 StackOverFlow 에러가 발생합니다.
직렬화 시점에 둘 사이의 순환 참조를 끊어주기 위한 방법으로 @JsonIgnoreProperties 애너테이션을 사용합니다. @JsonIgnoreProperties 애너테이션을 살펴보면 다양한 위치에서 사용할 수 있음을 확인할 수 있습니다.
- ElementType.ANNOTATION_TYPE - 애너테이션
- ElementType.TYPE - 클래스, 인터페이스, enum
- ElementType.METHOD - 메소드
- ElementType.CONSTRUCTOR - 생성자
- ElementType.FIELD - 필드(멤버변수, enum 상수)
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonIgnoreProperties {
/**
* Names of properties to ignore.
*/
public String[] value() default { };
// ...
}
저의 경우 주로 필드에 사용하며 다음과 같은 동작이 수행되도록 클래스를 구성합니다.
1.2. 순환 참조 방지 예시Permalink
- A 인스턴스가 B 인스턴스를 참조합니다.
- B 인스턴스가 A 인스턴스를 참조합니다.
- A 인스턴스를 직렬화하는 경우 참조하는 B 인스턴스가 함께 직렬화됩니다.
- B 인스턴스를 직렬화하는 경우 @JsonIgnoreProperties 애너테이션을 통해 지정한 항목을 제외하고 직렬화를 수행합니다.
https://junhyunny.github.io/spring-boot/junit/json-ignore-properties/
StackOverflowError 해결 (feat. @JsonIgnoreProperties 애너테이션)
<br /><br />
junhyunny.github.io
'대성 API 개발' 카테고리의 다른 글
log 남기기( 일반 log 로그 / error 로그) (0) | 2022.12.26 |
---|