반응형

상황

spring으로 만든 서비스가 정상적으로 동작하다가,
작업이 안 되는 경우가 발생해서 로그를 찾아보니, 아래의 내용이 남아있음

 

에러내용

Cause: java.sql.SQLTransientConnectionException:  Lost connection to backend server: network error (server1: Connection reset by peer)

Lost connection to backend server: network error (server1: Connection reset by peer); nested exception is java.sql.SQLTransientConnectionException: Lost connection to backend server: network error (server1: Connection reset by peer)

 

예상 원인

  • 원격 서버에서 Connection을 reset 처리하거나
  • 종료된 커넥션을 재사용하려고 할때
  • 클라이언트(브라우저)에서 정지버튼을 누르거나, 브라우저를 종료하거나, 다른 화면으로 이동하는 등의 이유로 서버 측에서 작업 결과를 전달할 곳이 없어졌을 때
  • Connection에서 Timeout 발생
  • 메모리부족
  • 소켓 고갈 등등…

 

원인

근본적인 원인 

위의 예상원인 모두 실제 원인의 보기이고,
회사에서 해당 이슈가 종종 발생하는 원인은 DB서버의 작업이 있는 경우에 많이 발생

 

DB 서버의 특정 작업(백업, 데이터 이동 등등 IO나 리소스를 많이 잡아먹는 작업)이 진행중

=> DB의 성능저하

=> 평소에 문제없던 쿼리가 실행되지 못하고 타임아웃

조치

근본적인 조치

근본적인 원인을 해결해야 함

DB 서버의 작업 종료 or 해결 : 리소스가 많이 필요한 해당 작업을 빨리 종료 시키면 정상적으로 동작함

하지만 주기적으로 해야하는 작업이라면

쿼리나 서비스 성능 개선을 통해 어느정도 커버할 수 있음

 

쿼리 튜닝으로 해결

타임 아웃 (시간제한) 을 길게 설정하는 방법도 있지만, 근본적으로 쿼리 실행시간이 너무 오래 걸림

평소에는 0.5초도 걸리지 않았지만, 특정상황에서 계속 타임아웃이 나서 튜닝 필요성이 없었음

=> 주기적으로 발생할 것으로 추측돼서, 쿼리 튜닝실행

=> 평소에는 크게 차이 나지 않지만, (최악의 경우에서) 더 효율적인 인덱스를 타면서 쿼리가 개선

=> 같은 상황에서는 더이상 발생하지 않음

반응형
반응형

에러 내용

Exception Type - I/O error on POST request for "주소": 주소; nested exception is java.net.UnknownHostException: 주소

=> 해당 호스트 정보 / DNS 등을 찾지 못해 발생

 

상세 내용

몇달동안 실제 운영서버에서 정상적으로 해당 api를 호출되다가, 간헐적으로 해당 에러가 나면서 요청 실패가 나는 상황
(
이틀간 수치가 급증하여, 조치 필요)

로컬에서도 같은 현상 발생 (간헐적으로 실패)

 

 

예상 원인

Java 애플리케이션에서 유효한 DNS정보를 응답받지 못하는 경우

=> Google DNS 서버가 해당 도메인을 제대로 인식하지 못 하거나, 문제가 잠시 생긴것으로 추측

 

해결 ( 1)

1. Hosts 파일 변경

DNS 되는것으로, Hosts에서 ip-DNS 등록해서 사용
=> 로컬에서도 손쉽게 적용가능하고, 재시작(리부팅)이 필요 없음. 단, 상대의 IP가 바뀌면 수동으로 다시 맵핑 시켜줘야 함

방법
vi /etc/hosts
내용 입력(ip,DNS) 127.0.0.1       localhost
(참고 :  ping 도메인 => 실제 ip 조회 가능)

 

2. DNS 설정 변경

주/보조가 모두 구글 서버라 하나를 다른 DNS Server를 바라보도록 변경해서 테스트해본 결과, 정상적으로 요청
=>  vi /etc/resolv.conf (운영체제 / 버전에 따라 다를수 있지만, IP or DNS Server 설정 부분을 찾아서 수정)

DNS1 - 8.8.8.8(Google) -> 1.1.1.1(Cloudflare)
DNS2 - 8.8.4.4(Google) -> 8.8.8.8 (Google)

반응형
반응형

현상

ChargeUtil chargeUtil = new ChargeUtil();

이런식으로 chargeUtil 의 내부 메소드로 application.properties에 정의되어 있는 값을 @value 가져오는데

모든 값이 null 나오는 상황

 

원인

new 이용해 클래스를 인스턴스화 하면 스프링이 관여하지 않아 어노테이션(@value)이 무시

참고 : https://stackoverflow.com/questions/4130486/spring-value-annotation-always-evaluating-as-null

반응형

해결

new ChargeUtil() 를 제거하고, 스프링이 관여할 수 있도록 @Autowired를 쓰도록 코드 수정

  • ChargeUtil.java 를 bean으로 등록 (ex. @Component, @Service 등등)
  • @Autowired를 사용해 ChargeUtil를 사용하면, 스프링이 관여하기 때문에 정상적으로 값을 불러온다

 

반응형
반응형

상황

로컬(IDE) 환경에서 잘 실행되던 로직인데,
Jar
파일로 실행할때 에러 발생 (FileNotFoundException)

Log

 java.io.FileNotFoundException: src/main/resources/keystore/server.truststore (그런 파일이나 디렉터리가 없습니다)

 

원인

에러가 생기는 부분은 아래와 같다.

 File trustStoreFile = new File(trustStoreFilePath);
  • jar로 실행시에는, IDE에서의 file 시스템과 경로가 다름
  • 로컬 IDE 환경에서 File을 사용하려 하면 file:// 로 시작되는 url (실제 파일 시스템으로 접근)
    Jar 실행 환경에서 File을 사용하려 하면 jar://로 시작되는 url

 

반응형

해결 방법

inputStream을 이용

// 수정전
File file = new ClassPathResource(filePath).getFile();


// 수정후
InputStream instream = new ClassPathResource(filePath).getInputStream();

// InputStream 을 이용해 File 생성 후 사용하는 방법
File somethingFile = File.createTempFile("test", ".txt");
try {
    FileUtils.copyInputStreamToFile(inputStream, somethingFile);
} finally {
    IOUtils.closeQuietly(inputStream);
}

 

주의!

  • File Path 변경
    기본
    classpath: src/main/resource
    filePath=
    src/main/resource/keystore/test.jks
    => (아래로 수정)
    filePath=keystore/test.jks

  • ClassPathResource(filePath).getFile();에서 에러 발생
    java.io.FileNotFoundException: class path resource [파일] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/....

 

 

자세히 알고 싶다면 아래에서 확인

참고 - https://sonegy.wordpress.com/2015/07/23/spring-boot-executable-jar%EC%97%90%EC%84%9C-file-resource-%EC%B2%98%EB%A6%AC/

반응형

+ Recent posts