Spring 프로젝트를 진행하다 보면 동일한 이름을 가진 클래스 때문에 타입 불일치 에러가 발생.
특히 Resource라는 이름의 클래스가 대표적인 예. 이 글에서는 이 문제의 원인과 해결 방법을 기술.
문제의 원인
- 패키지 차이
- org.springframework.core.io.Resource: 파일이나 스트림 같은 I/O 리소스를 다루는 인터페이스.
- jakarta.annotation.Resource: 의존성 주입(Injection)을 위한 애노테이션.
- 자동 임포트 오류
- IDE 자동 완성 기능에서 잘못된 Resource 클래스를 선택해 발생하는 경우가 많음.
- 혼동하기 쉬운 이름
- 두 클래스가 동일한 이름을 사용하기 때문에 초보 개발자는 물론, 경험 많은 개발자도 혼동하기 쉬움.
발생 가능한 결과
- 컴파일 에러
- "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;
}
주의사항
- 두 Resource 타입이 동시에 필요한 경우, 사용하는 패키지를 항상 명시적으로 확인하고 관리하자.
- 자동 임포트 설정을 조정해 잘못된 클래스가 임포트되는 실수를 방지하자.
- 팀원들과의 협업 시 변수명과 애노테이션 사용 규칙을 명확히 정해 혼란을 줄이자.
반응형
'에러일지' 카테고리의 다른 글
MaxUploadSizeExceededException: 원인과 해결 방법 (0) | 2025.01.16 |
---|---|
[Vue/Spring boot]CORS 에러: 원인과 해결 방법 (1) | 2025.01.16 |
[Vue.js] Vu ESLint 에러 'multi-word-component-names' 해결 방법 총정리 (3) | 2024.11.22 |