Spring Boot와 MySQL을 연동하면서 자주 겪는 문제 중 하나는 데이터 타입 변환과 관련된 오류입니다. 데이터베이스에서 반환된 데이터와 Java 데이터 타입이 일치하지 않을 때 발생할 수 있는 문제를 이해하고, 이를 안전하게 처리하는 방법을 이 섹션에서 다룹니다.
6.1 SQL 데이터 타입과 Java 데이터 타입 매핑
MySQL과 Java는 각기 다른 데이터 타입 시스템을 사용합니다. JDBC는 이를 자동으로 매핑하지만, 일부 타입은 개발자가 직접 변환해야 할 수도 있습니다.
주요 데이터 타입 매핑
MySQL 데이터 타입Java 데이터 타입비고
INT, TINYINT, SMALLINT | Integer, int | 기본 정수 타입. JDBC가 자동 변환. |
BIGINT | Long, long | 정수 값이 int 범위를 초과할 때 사용. |
DECIMAL, NUMERIC | BigDecimal | 정확도가 필요한 숫자 계산에 사용. |
FLOAT, DOUBLE | Double, double | 부동소수점 숫자. |
CHAR, VARCHAR, TEXT | String | 문자열 타입. |
DATE | java.sql.Date | 날짜만 저장. |
DATETIME, TIMESTAMP | java.sql.Timestamp | 날짜와 시간을 포함. |
BOOLEAN | Boolean, boolean | MySQL의 TINYINT(1)로 매핑되는 경우도 있음. |
6.2 데이터 타입 변환 문제
문제 발생 예시

이 코드는 데이터베이스에서 반환된 값의 타입이 Integer가 아닌 Long, BigDecimal 또는 null일 경우 실행 중 오류를 발생시킬 수 있습니다.
대표적인 오류
- ClassCastException:
- 반환된 값의 타입이 Integer로 직접 변환되지 않을 때 발생.
- 예: BigDecimal을 Integer로 변환하려고 시도.
- NullPointerException:
- SQL 결과가 null일 경우 발생.
6.3 안전한 데이터 타입 변환
1. 타입 확인 후 변환
반환된 데이터의 타입을 확인하고 적절히 변환해야 합니다.
코드 예제

public Integer getInsertKeyNo() { String sql = "SELECT MAX(keyno) + 1 AS next_keyno FROM sam_table"; List<Map<String, Object>> result = jdbcTemplate.queryForList(sql); if (result.isEmpty() || result.get(0).get("next_keyno") == null) { return 1; // 기본값 설정 } Object nextKeyNo = result.get(0).get("next_keyno"); if (nextKeyNo instanceof Integer) { return (Integer) nextKeyNo; } else if (nextKeyNo instanceof Long) { return ((Long) nextKeyNo).intValue(); } else if (nextKeyNo instanceof BigDecimal) { return ((BigDecimal) nextKeyNo).intValue(); } else { throw new IllegalStateException("Unexpected type for next_keyno: " + nextKeyNo.getClass().getName()); } } |
2. Null 값 처리
SQL 결과가 null일 경우를 대비하여 기본값을 설정하거나 예외를 처리합니다.
코드 예제

6.4 BigDecimal과 Integer 변환
MySQL의 DECIMAL 또는 NUMERIC 타입은 Java의 BigDecimal로 반환되며, 이를 정수나 실수 타입으로 변환하려면 추가 작업이 필요합니다.
BigDecimal을 Integer로 변환

BigDecimal을 Double로 변환

6.5 전역 예외 처리
Spring Boot에서 전역적으로 데이터 타입 변환 오류를 처리하려면 @ControllerAdvice를 사용합니다.
전역 예외 처리 예제

import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.http.ResponseEntity; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ClassCastException.class) public ResponseEntity<String> handleClassCastException(ClassCastException ex) { return ResponseEntity.badRequest().body("데이터 타입 변환 오류: " + ex.getMessage()); } @ExceptionHandler(NullPointerException.class) public ResponseEntity<String> handleNullPointerException(NullPointerException ex) { return ResponseEntity.badRequest().body("Null 값 처리 오류: " + ex.getMessage()); } @ExceptionHandler(Exception.class) public ResponseEntity<String> handleGenericException(Exception ex) { return ResponseEntity.internalServerError().body("서버 오류: " + ex.getMessage()); } } |
결론
Spring Boot와 MySQL을 사용할 때 데이터 타입 변환 문제는 흔히 발생하는 오류 중 하나입니다. 이를 안전하게 처리하려면 다음 사항을 유념해야 합니다:
- 반환된 데이터 타입 확인: instanceof를 활용하여 타입을 확인하고 변환.
- Null 값 처리: SQL 결과가 없을 경우 기본값을 설정하거나 예외 처리.
- BigDecimal 변환: 숫자 계산이 필요한 경우 적절한 Java 타입으로 변환.
- 전역 예외 처리: 오류가 발생했을 때 클라이언트에 명확한 메시지를 반환.
다음 섹션에서는 전체 코드와 API 구현을 바탕으로 RESTful 애플리케이션의 완성된 형태를 소개하겠습니다.
'Spring Boot & MySQL' 카테고리의 다른 글
1.8. 전체 코드 예제 (0) | 2024.12.25 |
---|---|
1.7. 자주 발생하는 문제와 해결 방법 (0) | 2024.12.25 |
1.5. REST API와 연동 (1) | 2024.12.22 |
1.4. JDBC를 이용한 데이터 처리 (0) | 2024.12.22 |
1.3. MySQL 데이터베이스 설정 (0) | 2024.12.22 |