본문 바로가기
PROJECT/J-PLAN

제네릭 관련 코드 수정 피드백

by wooksss 2025. 1. 18.

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();
    }
}