기록은 기억을 이기고 시간보다 오래 남는다.

에러일지

org.springframework.core.io.Resource vs. jakarta.annotation.Resource: 타입 불일치 문제 해결

준_준 2025. 1. 16. 11:23

Spring 프로젝트를 진행하다 보면 동일한 이름을 가진 클래스 때문에 타입 불일치 에러가 발생.

특히 Resource라는 이름의 클래스가 대표적인 예. 이 글에서는 이 문제의 원인과 해결 방법을 기술.

문제의 원인

  1. 패키지 차이
    • org.springframework.core.io.Resource: 파일이나 스트림 같은 I/O 리소스를 다루는 인터페이스.
    • jakarta.annotation.Resource: 의존성 주입(Injection)을 위한 애노테이션.
  2. 자동 임포트 오류
    • IDE 자동 완성 기능에서 잘못된 Resource 클래스를 선택해 발생하는 경우가 많음.
  3. 혼동하기 쉬운 이름
    • 두 클래스가 동일한 이름을 사용하기 때문에 초보 개발자는 물론, 경험 많은 개발자도 혼동하기 쉬움.

발생 가능한 결과

  • 컴파일 에러
    • "Type mismatch" 또는 "cannot be converted to" 에러 메시지 출력.
  • 런타임 에러
    • Spring 프로젝트 실행 중 NoSuchMethodError가 발생하거나 배포 오류가 날 수 있음.

해결 방법

1. 패키지 확인

사용하려는 목적에 맞는 Resource 패키지를 정확히 import해야 해. 아래 예시를 참고.

I/O 리소스를 사용하는 경우:

import org.springframework.core.io.Resource;

의존성 주입을 사용하는 경우:

import jakarta.annotation.Resource;

2. IDE 자동 임포트 설정

  • IntelliJ IDEA:
    • 설정 경로: Settings > Editor > General > Auto Import
    • "Add unambiguous imports on the fly" 옵션을 활성화하고, 불필요한 자동 임포트를 방지하도록 조정.
  • Eclipse:
    • 설정 경로: Preferences > Java > Editor > Content Assist > Favorites
    • 자주 사용하는 패키지를 등록해 자동 완성 우선순위를 관리.

3. 의미 있는 변수명 사용

의미를 명확히 하기 위해 변수명이나 애노테이션 사용을 구분.

예제 1: 파일 처리용 Resource:

import org.springframework.core.io.Resource;

public void loadFile(Resource fileResource) {
    // 파일 로드 처리
}

예제 2: 의존성 주입용 @Resource:

import jakarta.annotation.Resource;

public class MyService {

    @Resource
    private MyRepository myRepository;
}

4. @Autowired로 대체

@Resource 대신 @Autowired를 사용하는 것도 방법. Spring에서 기본적으로 지원하고, 패키지 혼동 가능성이 줄어듦.

import org.springframework.beans.factory.annotation.Autowired;

public class MyService {

    @Autowired
    private MyRepository myRepository;
}

주의사항

  1. Resource 타입이 동시에 필요한 경우, 사용하는 패키지를 항상 명시적으로 확인하고 관리하자.
  2. 자동 임포트 설정을 조정해 잘못된 클래스가 임포트되는 실수를 방지하자.
  3. 팀원들과의 협업 시 변수명과 애노테이션 사용 규칙을 명확히 정해 혼란을 줄이자.
반응형