← 블로그로 돌아가기

Spring과 DB 사이의 타입 변환

ORM 프레임워크와 SQL Mapper의 자동 타입 변환은 편리하지만, 오류를 예방하려면 타입을 명시적으로 처리하는 편이 안전합니다.

DB 테이블에서 분명히 int 타입으로 설정한 컬럼인데, SQL 문의 Where 조건에 해당 컬럼 값을 String 타입으로 전달해도 조회가 정상적으로 이루어졌습니다.

예를 들어 IDX는 DB에서 분명히 int 타입으로 만든 컬럼이지만, 아래처럼 MyBatis에서 문자열로 조회해도 정상적으로 선택됩니다.

@Select(value = "SELECT name FROM testTBL WHERE IDX = #{idx}")
String test(@Param("idx") String idx);

정상적으로 조회된 이유는 데이터베이스 드라이버와 ORM 프레임워크, SQL Mapper가 제공하는 타입 변환 기능 덕분입니다.

대부분의 데이터베이스 드라이버와 ORM 프레임워크, SQL Mapper는 데이터를 가져올 때 기본적으로 타입 변환을 수행할 수 있습니다. 쿼리 결과의 데이터 타입과 메서드 반환 타입이 다르면 자동으로 타입을 변환해 줍니다.

매우 편리한 기능이지만 주의할 점도 있습니다. 쿼리 결과 타입과 애플리케이션 코드에서 사용하는 타입이 다르다면, 개발할 때 두 타입을 동일하게 맞추는 것이 가장 좋고 그렇지 못할 경우에는 타입 변환을 명시적으로 선언하는 편이 좋습니다.

코드의 동작을 자동 처리에만 맡기는 것은 언제나 위험할 수 있습니다.

변환 오류에도 주의해야 합니다. 예를 들어 자동 변환 과정에서 큰 숫자를 문자열로 바꿀 때 문자열 길이 제한 때문에 데이터가 잘려 전달될 수 있습니다.

결론적으로 ORM 프레임워크와 SQL Mapper 같은 데이터 접근 기술은 자동 타입 변환이라는 편의 기능을 제공하지만, 가능하면 타입을 명시적으로 관리하는 것을 권장합니다.