dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 네이버 부스트캠프
  • BFS
  • 백준 DP
  • 부스트캠프
  • 회고
  • HackerRank mysql
  • 기록
  • 백준
  • 반성
  • Baekjoon
  • 스프링
  • 그래프탐색
  • Hackerrank
  • dp
  • c++
  • 서블릿
  • AI Tech
  • 일기
  • 프로그래머스 SQL
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

개발 공부/스프링

[SpringBoot] Error - java.net.SocketTimeoutException at PlainSocketImpl

2022. 3. 12. 00:43
728x90

상황

- CI 작업을 위해서 프로젝트에 github action을 연동하던 중 마주친 에러.

- build 중 테스트가 돌아가면서 에러가 나버린다.

- 프로젝트의 datasource는 RDS mysql database를 연결해둔 상태였다.

 

발생한 에러

ApplicationTests > contextLoads() FAILED
java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1804
Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421
Caused by: org.hibernate.exception.JDBCConnectionException at SQLStateConversionDelegate.java:112
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:174
Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2
Caused by: java.net.SocketTimeoutException at PlainSocketImpl.java:-2

- github action log 전체

더보기
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :compileJava
> Task :processResources
> Task :classes
> Task :bootJarMainClassName
> Task :bootJar
> Task :jar
> Task :assemble
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
 
ApplicationTests > contextLoads() FAILED
 java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132
 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1804
 Caused by: javax.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421
 Caused by: org.hibernate.exception.JDBCConnectionException at SQLStateConversionDelegate.java:112
 Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException at SQLError.java:174
 Caused by: com.mysql.cj.exceptions.CJCommunicationsException at NativeConstructorAccessorImpl.java:-2
 Caused by: java.net.SocketTimeoutException at PlainSocketImpl.java:-2
 
> Task :test FAILED
 
1 test completed, 1 failed

에러 코드를 읽어보니, 결국 MySQL 데이터베이스와 연결이 되지 않아서 SocketTimeOut이 발생했다는 것이다.

 

왜 그럴까.. 하면서 많은 시도를 해봤다.

1. 로컬에서 빌드 => 성공

2. 데이터베이스 연결 확인 => intellj에서 database로 해당 MySQL server 접속 확인

3. ec2에서 RDS 원격 접속 => 접속 성공 확인

4. application.yml의 datasource를 RDS에서 localhost로 변경 => 동일하게 MySQL 문제 발생

5. ec2에서 빌드 => 실패

6. datasource를 h2로 변경 => 빌드 테스트까지 통과!

 

따라서 로컬에서는 빌드되고, 해당 디비 서버 접속 잘 되는데 왜 github action CI 환경이나 ec2에서만 connectionTimeOut이 날까?? 였다.

그리고 h2로 바꾸니 성공하는 것으로 봐서 무조건 MySQL 문제라고 생각했다.

 

결론

결론을 말하자면, MySQL Server가 running 상태여야 한다.

하필, 정말 운이 없게도 ec2에서 mysql server error가 나던 상태였고, (그래서 동일한 에러 로그가 떴다)

CI Test 환경에서도 빌드 스크립트에 디비 서버 관련 코드는 없었다. (MySQL setup이 없었다)

따라서 해당 테스트 서버 환경에서 connection error가 난 것이다.

 

   - name: Setup MySQL
      uses: samin/mysql-action@v1
      with:
        character set server: 'utf8'
        mysql database: 데이터베이스 이름
        mysql user: 자신 id
        mysql password: ${{ secrets.MYSQL_PASSWORD }} // github에 secret key 등록

github action 스크립트에 Set Up JDK와 Build with Gradle 사이에 추가시켜줬더니 정상 동작했다.

(빌드되기 전에만 세팅해주면 된다.)

나는 어차피 RDS 서버를 이용하니까 잘 접속만 되면 되지!라고 생각했는데, 테스트할 때 MySQL 서버가 켜져 있어야 테스트가 정상적으로 돌아가는 것 같다.

 

교훈

- 테스트 시 그냥 h2 데이터베이스 쓰자..

728x90
저작자표시 비영리 변경금지 (새창열림)

'개발 공부 > 스프링' 카테고리의 다른 글

[SpringBoot] Custom Exception 에러 처리 및 리팩토링 (Custom Exception)  (0) 2022.06.27
[SpringBoot] Error - Parameter 0 of constructor in ~ required a bean of type 'java.lang.String' that could not be found.  (3) 2022.06.26
[SpringBoot] Error - Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.  (0) 2022.02.04
스프링 - 의존 관계 주입 방법 4가지  (0) 2021.09.17
스프링 - @Component와 컴포넌트 스캔  (0) 2021.09.17
    '개발 공부/스프링' 카테고리의 다른 글
    • [SpringBoot] Custom Exception 에러 처리 및 리팩토링 (Custom Exception)
    • [SpringBoot] Error - Parameter 0 of constructor in ~ required a bean of type 'java.lang.String' that could not be found.
    • [SpringBoot] Error - Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    • 스프링 - 의존 관계 주입 방법 4가지
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바