Spring Boot & MySQL

1.7. 자주 발생하는 문제와 해결 방법

backend 따라쟁이 2024. 12. 25. 17:39

Spring Boot와 MySQL을 연동하면서 발생할 수 있는 문제들을 해결하는 방법을 다룹니다. 초보자에게 자주 발생하는 문제를 위주로 원인을 분석하고, 이를 해결하기 위한 방법을 단계별로 설명하겠습니다.


7.1 한글 깨짐 문제

문제 상황

애플리케이션에서 한글 데이터를 저장하거나 조회할 때, 데이터가 깨져서 보이는 경우가 발생합니다.

원인

  • MySQL의 기본 문자셋이 latin1로 설정되어 있어, UTF-8 데이터를 제대로 처리하지 못함.
  • JDBC 커넥션에 UTF-8 설정이 누락된 경우.

해결 방법

  1. MySQL 문자셋 확인 및 변경:
    • MySQL의 기본 문자셋을 utf8mb4로 설정합니다.
      SHOW VARIABLES LIKE'character_set%';
          
    • character_set_server가 latin1이면, 설정 파일을 수정합니다:
      [mysqld]
      character-set-server=utf8mb4
      collation-server=utf8mb4_general_ci

      [client]
      default-character-set=utf8mb4
       
    • MySQL을 재시작:
      sudo service mysql restart
  2. Spring Boot 설정:
    • application.properties 파일에 UTF-8 설정 추가:
      spring.datasource.hikari.connection-init-sql=SET NAMES utf8mb4

7.2 데이터 타입 변환 오류

문제 상황

ClassCastException 또는 NullPointerException이 발생하며 데이터 변환에 실패.

원인

  • MySQL에서 반환된 데이터 타입이 Java의 기대 타입과 다름.
  • SQL 결과가 null인 경우 이를 처리하지 않아 발생.

해결 방법

  1. 타입 변환:
  • 반환된 데이터의 타입을 확인하고 적절히 변환합니다: 
  1. Null 값 처리:
  • 결과가 null일 경우 기본값을 설정하거나 예외를 처리합니다:

 


7.3 데이터베이스 연결 오류

문제 상황

Spring Boot 애플리케이션이 MySQL에 연결할 수 없다는 오류가 발생.

원인

  • MySQL이 실행 중이지 않거나 네트워크 문제.
  • application.properties에 잘못된 설정이 포함됨.
  • MySQL 사용자 권한 부족.

해결 방법

  1. MySQL 실행 상태 확인:
     
    sudo service mysql start
    MySQL이 실행 중이 아니면 시작합니다:
     
    sudo service mysql status
  2. Spring Boot 설정 확인:
    • application.properties 파일의 URL, 사용자 이름, 비밀번호를 확인:
       
      spring.datasource.url=jdbc:mysql://localhost:3306/my_database spring.datasource.username=app_user spring.datasource.password=your_password
  3. 사용자 권한 확인:
    • MySQL에서 사용자 권한을 확인하고, 필요한 경우 수정:
       
      GRANT ALL PRIVILEGES ON my_database.* TO 'app_user'@'localhost'; FLUSH PRIVILEGES;

7.4 SQL Injection 문제

문제 상황

사용자 입력을 직접 SQL 쿼리에 삽입할 경우 보안 취약점 발생.

원인

  • SQL 쿼리를 생성할 때 사용자 입력값을 그대로 사용.

해결 방법

  1. PreparedStatement 사용:
    • JdbcTemplate에서 ?를 사용하여 안전한 쿼리 실행:
  1. 입력값 검증:
    • 사용자 입력값을 검증하여 악의적인 값을 차단:
       

 


7.5 LazyInitializationException 문제

문제 상황

Hibernate를 사용할 때, 엔티티의 연관 필드에 접근할 때 LazyInitializationException 발생.

원인

  • 연관 필드가 Lazy Loading으로 설정되어 있고, 데이터베이스 세션이 이미 종료된 상태에서 접근하려고 할 때 발생.

해결 방법

  1. 즉시 로딩(Eager Loading) 사용:
    • 연관 필드를 즉시 로딩으로 설정:

  1. Hibernate 초기화:
    • 연관 데이터를 명시적으로 초기화:

 

  1. DTO(Data Transfer Object) 사용:
    • 필요한 데이터만 DTO에 담아 반환: 


7.6 java.sql.SQLException: No suitable driver 오류

문제 상황

Spring Boot 애플리케이션 실행 시, MySQL 드라이버를 찾을 수 없다는 오류 발생.

원인

  • MySQL Connector 의존성이 누락됨.

해결 방법

  1. 의존성 추가 확인:
    • pom.xml 또는 build.gradle 파일에 MySQL Connector 의존성을 추가:

  1. Maven 업데이트:
    • Eclipse: Right-click on project > Maven > Update Project
    • IntelliJ: File > Sync

7.7 데이터베이스 쿼리 성능 문제

문제 상황

대량의 데이터를 처리하거나 비효율적인 쿼리로 인해 성능이 저하.

원인

  • 잘못된 인덱스 설정.
  • 대량의 데이터를 한 번에 처리.

해결 방법

  1. 인덱스 추가:
    • 자주 조회되는 컬럼에 인덱스를 추가:
       
      CREATE INDEX idx_email ON user(email);
  2. 페이징 처리:
    • 데이터를 페이징 처리하여 필요한 데이터만 가져옴:
       
       


결론

Spring Boot와 MySQL을 연동하면서 발생할 수 있는 문제를 해결하는 방법을 정리했습니다:

  1. 한글 깨짐 문제 해결을 위해 UTF-8 설정.
  2. 데이터 타입 변환 오류를 안전하게 처리.
  3. 데이터베이스 연결 오류를 디버깅.
  4. SQL Injection과 보안 문제 방지.
  5. Hibernate와 관련된 Lazy Loading 문제 해결.

이 가이드는 자주 발생하는 문제를 해결하며 Spring Boot 애플리케이션의 안정성과 성능을 높이는 데 도움을 줄 것입니다. 다음 섹션에서는 완성된 애플리케이션의 전체 코드와 구조를 정리하겠습니다.