Note: C:\Users\user\Desktop\Project\TravelTogether\src\main\java\me\jeongwook\jplan\dto\Header.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
위와 같은 경고가 나타나서 찾아봤다. 안전하지 않은 작업이 포함된 코드가 발견되면 나타나는데 아래 같은 문제가 원인이 될 수 있다.
1. 제네릭 타입 정보를 명시하지 않거나, 컴파일러가 타입 안정성을 보장할 수 없는 경우 발생한다.
2. 타입 캐스팅이 명확하지 않거나 제네릭을 사용하지 않을 때 발생할 수 있다.
3. 제네릭을 지원하지 않는 경우 발생할 수 있다.
package me.jeongwook.jplan.dto;
import lombok.*;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Header<T> {
// api 통신 시간
private LocalDateTime transactionTime;
// api 응답 코드
private String resultCode;
// api 부가 설명
private String description;
private T data;
private Pagination pagination;
// status : OK
public static <T> Header<T> OK(){
return (Header<T>) Header.OK().builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.build();
}
// data : OK
public static <T> Header<T> OK(T data){
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.data(data)
.build();
}
// data : OK with Pagination
public static <T> Header<T> OK(T data, Pagination pagination){
return (Header <T>)Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.data(data)
.pagination(pagination)
.build();
}
public static <T> Header<T> ERROR(String description) {
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("ERROR")
.description(description)
.build();
}
}
위 Header.class 파일에서 나타난 문제인데 아래 파일에서 캐스팅 때문에 원인이 되어 보인다.
각 응답 형식에서 Header<T>로 강제 타입 캐스팅을 하였는데
T에 들어갈 타입이 명확하지 않아 생기는 문제인 것 같다.
아래는 강제 타입 캐스팅을 하지 않고 제네릭 타입을 명시적으로 지정하여
Builder()를 호출하는 방식으로 수정한 소스코드이다.
package me.jeongwook.jplan.dto;
import lombok.*;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Header<T> {
// api 통신 시간
private LocalDateTime transactionTime;
// api 응답 코드
private String resultCode;
// api 부가 설명
private String description;
private T data;
private Pagination pagination;
// status : OK
public static <T> Header<T> OK(){
return Header.<T>builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.build();
}
// data : OK
public static <T> Header<T> OK(T data){
return Header.<T>builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.data(data)
.build();
}
// data : OK with Pagination
public static <T> Header<T> OK(T data, Pagination pagination){
return Header.<T>builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.data(data)
.pagination(pagination)
.build();
}
// ERROR
public static <T> Header<T> ERROR(String description) {
return Header.<T>builder()
.transactionTime(LocalDateTime.now())
.resultCode("ERROR")
.description(description)
.build();
}
}
'PROJECT > J-PLAN' 카테고리의 다른 글
데이터베이스 생성, 수정 자동 매핑 (0) | 2025.01.14 |
---|---|
ResponseEntity와 Header (공통 응답 방식)의 차이 (0) | 2025.01.10 |
[데이터베이스 설계] (0) | 2025.01.08 |