꿈이 있다면,
그 꿈을 잡고 절대 놓아주지마라.
-Carol Burnett 캐럴 버넷-
문제 발생
Error attempting to get column 'xxx' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 'XXX';
Cannot determine value type from string ' XXX '; nested exception is java.sql.SQLDataException: Cannot determine value type from string ' XXX '] with root cause
com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string ' XXX '
문제 원인
DB의 필드도 VARCHAR(50)으로 String 타입이 맞았지만, Cannot determine value type from string String의 값 유형이 맞지 않는다는 이야기를 합니다(?!) dto를 살펴보니 @Builder 패턴에 @AllArgsConstructor과 @NoArgsConstructor을 사용하지 않아서 생긴 문제입니다.
저는 @AllArgsConstructor과 @NoArgsConstructor를 남발하면 보안에 좋지 않다는 이야기를 봐서 @Builder만 사용하기로 결정했었습니다.
예시 코드
@Getter
@Builder
public class User {
private int userSeq;
private String userId;
private String userName;
private String userPw;
.
.
.
}
<select>
SELECT userId, userPw, userName
FROM user
</select>
SQL 쿼리의 필드 순서와 데이터 모델의 필드 순서가 달라서 생긴 문제입니다. 여태 오류가 발생하지 않은 이유는 데이터 모델의 필드 순서가 같았기 때문이었네요.
해결법
@Builder사용 시,@NoArgsConstructor,@AllArgsConstructor같이 사용합니다.- SQL 쿼리의 필드 순서와 데이터 모델의 필드 순서를 맞추면 됩니다. 하지만, 반환해야 하는 필드가 많아질수록, 맞추기는 어려워지니 1번째 방법을 사용하는 것이 좋아 보입니다.
마치며
Builder 패턴을 사용하고 있지만, 그에 관련된 어노테이션에 대해서는 아직 잘 모르는 부분이 많은 것 같습니다. 처음 개발할 때는' Builder와 @NoArgsConstructor, @AllArgsConstructor는 한 세트구나' 라며 생각했는 데, 다음에는 무분별한 사용이 보안에 취약해진다는 것을 알고 Builder 독단적으로 사용하기 시작했습니다. 많은 시행착오 끝에 @NoArgsConstructor, @AllArgsConstructor이 둘을 깊게 공부해 보자는 결론에 이르렀습니다.
처음부터 제대로 알고 이 단계에 이르렀으면, 시간 소비가 덜 했을 텐데 아쉽기도 하고, 이제라도 이런 생각이 드는 것이 다행이라고 생각이 드네요 :-)
💡 더 성장하는 개발자가 될 수 있도록, 틀린 부분을 알려주신다면 감사하겠습니다.
'코딩 > Spring' 카테고리의 다른 글
| JPA 쿼리 성능 향상 ( 퀴리 튜닝, 정규화 및 비정규화 ) (0) | 2024.05.17 |
|---|---|
| [Spring Security] UserDetails, UserDetailsService (0) | 2024.04.16 |