Error Document/Spring

[Spring Boot] JPA No constructor taking 에러 해결 방법 (MySql/ MariaDB)

JeongKyun 2022. 8. 2.
반응형

서론

JPA의 native query를 사용하던 중 다음과 같은 에러가 발생했다. 해당 에러에 투자한 시간에 비례해 너무 쉬운 에러였다. 우선 필자의 에러의 내용을 좀 더 상세하게 한번 보자.

 

에러 상세 보기

더보기

java.lang.RuntimeException: No constructor taking:
java.lang.String
java.lang.String
java.lang.String
java.lang.String
java.lang.String
java.lang.String
java.sql.Timestamp
java.sql.Timestamp

at org.qlrm.mapper.JpaResultMapper.findConstructor(JpaResultMapper.java:131)
at org.qlrm.mapper.JpaResultMapper.list(JpaResultMapper.java:42)
at com.daon.host.web.service.NoticeService.getList(NoticeService.java:58)
at com.daon.host.web.service.NoticeService$$FastClassBySpringCGLIB$$e9099469.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
...

에러 내용 중 빨간색으로 작성한 부분을 보면 뭔가 database의 type인것을 알 수 있다. 그래서 당연히 혹시 타입이 안맞나 DB 조회 퀴리와 DTO의 변수 타입을 비교해보았는데 이상이 없었다.

 

그런데 실제 해결 방법은 위에서 말했듯 타입 문제가 맞다. 문제는 저 빨간줄 맨 아래있는 Timestamp가 문제였다. 필자는 databse에서 시간을 받는 필드의 타입을 Datetime (Maria DB 사용)을 해놨고 물론 DTO도 Datetime으로 선언해놨었다.

 

근데 알고보니 MariaDB에서 Datetime으로 해놓아도 JPA로 값을 가져올 땐 Timestamp로 인식이 되어 타입이 맞지않아 생성자를 사용할 수 없다고 뜨는 것이다.

 

따라서 MariaDB에 Datetime으로 해놓아도 DTO에서는 Timestamp로 지정을 해주어야한다.

    private Timestamp insDate;
    private Timestamp updDate;

 

따라서 정리하면 해당 에러가 발생했을 때 query를 조회 하여 나온 필드에 맞는 생성자를 매칭하여 만들어준 후 dto, database의 타입도 잘 맞는지 확인해봐야한다.

댓글

💲 많이 본 글