728x90
프로젝트 중 수강 년도에 따라 로그인한 학생의 수강 교과목을 출력하는 과정에서 발생한 문제이다.
나의 작업 환경에서는 정상적으로 동작했지만
깃을 통해 pull을 받은 팀원의 환경에서는 아래와 같은 오류가 발생했다.
Parameter 'studentId' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException:
해결방법
기존 코드
package com.lms.user.classinfo.mapper;
import com.lms.user.classinfo.dto.StuClassInfoDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface StuClassInfoMapper {
List<StuClassInfoDto> lectureYearAll(int studentId);
List<StuClassInfoDto> lectureSubjectAll(int studentId);
StuClassInfoDto getSyllabusInfo(String lectureYear, String lectureName, int studentId);
List<StuClassInfoDto> getLectureSchedule(String lectureYear, String lectureName, int studentId);
}
수정 코드 - @Param을 통해 해결
package com.lms.user.classinfo.mapper;
import com.lms.user.classinfo.dto.StuClassInfoDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface StuClassInfoMapper {
List<StuClassInfoDto> lectureYearAll(@Param("studentId") int studentId);
List<StuClassInfoDto> lectureSubjectAll(@Param("studentId") int studentId);
StuClassInfoDto getSyllabusInfo(@Param("lectureYear") String lectureYear, @Param("lectureName") String lectureName, @Param("studentId") int studentId);
List<StuClassInfoDto> getLectureSchedule(@Param("lectureYear") String lectureYear, @Param("lectureName") String lectureName, @Param("studentId") int studentId);
}
자바 코드가 컴파일(코드를 컴퓨터가 이해할 수 있는 형태로 변환하는 과정)될 때,
파라미터 이름(studentId)은 보통 사라진다.
즉, 컴파일된 코드에서는 파라미터가 단순히 순서에 따라 arg0, arg1 등으로 표시되는데
이때 MyBatis와 같은 프레임워크가 데이터베이스 쿼리와 코드 사이에서 매핑 역할을 해준다.
파라미터 이름이 사라지면 어떤 파라미터가 무엇인지 알기 어렵기 때문에
@Param 어노테이션을 사용하여 각 파라미터에 명확한 이름을 지정하여
이 이름을 SQL 쿼리 내에서 직접 참조할 수 있게 된다.
짧게 정리하자면, @Param 어노테이션을 통해 자바 코드에서 사용한 파라미터의 이름이
데이터베이스 쿼리에서도 똑같이 사용할 수 있도록 해준다.
728x90