오랜만에 혼자 갖고 놀던 토이 프로젝트를 실행시켜봤다. 로그인을 하려고 아이디와 비밀번호를 입력했더니 못보던 에러가 발생했다. 오랫동안 실행안하고 오랜만에 켜고 그러면 에러가 가끔 발생하기도 했어서 별로 대수롭지 않게 여겼고, 다시 껐다 켰는데도 똑같은 에러가 발생했다.

그래서 무슨 에러인가 찾아보니 클라이언트에서 서버로 데이터를 넘길 때 @RequestParam 어노테이션을 사용했는데 여기서 데이터를 넘길 때 에러가 발생하는 것이었다.
@GetMapping("서블릿명")
public String doLogin(@RequestParam String id, @RequestParam String pwd)
대충 이런 형태인데 여기서 @RequestParam 뒤에 매개변수의 이름을 인식하지 못하는 문제라고 한다.
@RequestParam과 같은 어노테이션 뒤에 파라미터의 이름을 표시해주면 해결되는 문제였다.
@GetMapping("서블릿명")
public String doLogin(@RequestParam("id") String id, @RequestParam("pwd") String pwd)
그래도 해결은 해야지! 원인을 찾아보니 MySQL과 Spring Boot를 연동시켜 데이터를 조회하는데에 사용했던 Mybatis에서 문제가 발생한 것으로 보인다.
Member doLogin(String id, String password){
...
}
Mapper에 있는 위 함수에서 파라미터가 2개 이상인 함수에서 발생하는 에러이다.
@Param 어노테이션을 사용해서 파라미터명을 명시해준다.
//Mapper 파일
Member doLogin(@Param("id") String id, @Param("password") String password){
...
}
//Mybatis xml 파일
<select id="doLogin" resultType="Entity파일 경로">
SELECT mem_id,nickname FROM members WHERE mem_id=#{id} AND password=#{password}
</select>
파라미터명을 따로 명시해주지 않고 arg1, arg2 .. 형태로 사용한다
//Mapper 파일
Member doLogin(String arg1, String arg2){
...
}
//Mybatis xml 파일
<select id="doLogin" resultType="Entity파일 경로">
SELECT mem_id,nickname FROM members WHERE mem_id=#{arg1} AND password=#{arg2}
</select>
arg1, arg2 처럼 param1, param2 ... 형태로 사용한다.
//Mapper 파일
Member doLogin(String param1, String param2){
...
}
//Mybatis xml 파일
<select id="doLogin" resultType="Entity파일 경로">
SELECT mem_id,nickname FROM members WHERE mem_id=#{param1} AND password=#{param2}
</select>
본인이 함수에서 파라미터로 가져오는 데이터의 순서를 기억하고만 있는다면 param1, param2나 arg1, arg2를 쓰는 것도 굉장히 편할 것 같긴 한데 나중에 코드를 다시 볼 때 헷갈릴 수도 있으니 귀찮더라도 @Param으로 파라미터명을 명시해주는 것이 좀 더 보기엔 좋을 수도 있을 것 같다.
그나저나 그 동안 이런 에러 한 번도 안뜨고 잘 실행됐으면서,,, 배신감이 드네,,
나머지 함수들도 저런식으로 다 바꿔야한다는 생각에 조금 아찔한 순간이다.