배경SpringBatch를 구현하면서, 아래와 같은 에러를 마주쳤다. WARN 87663 --- [] [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 25S03ERROR 87663 --- [] [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn=3681042) Communications link failure with primary host XXX. unexpected end of stream, read 0 bytes from 4 (socket was closed by server)ERROR 87663 --- [] [ ..
FRAMEWORK
배경신규 프로젝트에 배치를 구성하고 젠킨스를 통해 실행 시, 에러가 던져져서 실패로 배치가 끝났음에도 마치 성공인 것처럼 보여졌습니다.원인Spring Batch에서 BATCH_JOB_EXECUTION 테이블에는 EXIT_CODE가 FAILED인데, 배치 애플리케이션 실행 후에 exit code 0으로 남는다면 이는 프레임워크가 인지하는 '시스템 상태'와 개발자가 정의한 '종료 코드'간 불일치가 발생한 것입니다. Spring Boot는 기본적으로 애플리케이션 실행 중 예외가 발생해 터지지 않는 한, 프로세스가 정상 종료되었다고 판단하여 Exit Code를 0으로 반환합니다.Spring Batch 작업이 내부적으로 FAILED 되더라도, Spring Boot 입장에서는 "배치 작업은 내부에서 에러가 났지만 ..
Blocking I/O + 멀티스레딩과 Non-Blocking I/O와 겉보기에 비슷하게 동작할 뿐, 내부 메커니즘과 효율성 측면에서는 완전히 다릅니다.Blocking I/O + 멀티스레딩 VS Non-Blocking I/OBlocking I/O + 멀티스레딩 (병렬처리)이 방식은 식당에서 손님이 올 때마다 전담 직원을 한 명씩 새로 고용하는 것과 같습니다.작동 방식:하나의 스레드가 I/O(데이터 읽기/쓰기)를 요청하면, 그 데이터가 올 때까지 그 스레드는 아무것도 하지 못하고 멈춰(Blocking)있습니다.대신 다른 스레드를 새로 만들어서 다른 일을 처리하므로 전체적으로는 여러 일을 동시에 하는 것처럼 보입니다.단점:손님(요청)이 1,000명이면 직원(스레드)도 1,000명이 필요합니다.스레드는 생성될..
Spring WebFluxSpring WebFlux 탄생 배경Spring WebFlux는 리액티브 웹 어플리케이션을 위해 Spring 5.0부터 지원하는 리액티브 웹 프레임워크입니다. 기존에 사용하던 Spring MVC 모델은 서블릿 기반의 Blocking I/O 방식이라 하나의 요청을 처리하기 위해 하나의 스레드를 사용하고 해당 스레드의 작업이 끝나기 전까지 스레드가 차단됩니다.기술이 발전함에 따라 대량의 요청 트래픽을 Spring MVC 방식이 처리하지 못하는 상황이 생김에 따라 적은 수의 스레드로 많은 요청을 처리할 수 있는 비동기 Non-Blocking I/O 방식의 Spring WebFlux가 등장했습니다.Spring WebFlux 프로그래밍 모델WebFlux는 기존 Spring MVC와 유사한..
POJO(Plain Old Java Object)POJO는 200년대 초반, 마틴 파울러 등이 만든 용어로, 당시 복잡한 기술 표준에 종속되어 코드가 지저분해지는 것에 반발하여 특정 기술에 얽매이지 않는 단순한 자바 객체로 돌아가자는 취지에서 만들어졌습니다.특징POJO라고 불리기 위해서는 크게 두 가지 조건을 충족해야 합니다.특정 라이브러리나 프레임워크를 상속 받지 않음: 예를 들어, 웹 서버 기능을 쓰기 위해 HttpServlet을 상속받아야 하는 클래스는 POJO가 아님특정 인터페이스를 구현하지 않음: 프레임워크가 강제하는 특정 인터페이스를 구현해도 안됨따라서, 자바 언어 사양 외 다른 기술에 종속되지 않는 순수한 자바 클래스 그 자체를 의미합니다.// Non-POJO (프레임워크 종속적)public..
들어가기 전에이 포스팅은 application.yml 설정을 하면서 알게된 내용을 정리하며, 필요할 때마다 업데이트가 이루어집니다.spring.main.web-application-type (애플리케이션 실행 시 어떤 환경으로 구동할지 지정)일반적으로 springboot는 classpath에 포함된 라이브러리를 보고 자동으로 판단하여 구동하지만, 상황에 따라 수동 제어가 필요할 수 있습니다.설정 가능 타입SERVLET: Spring MVC 기반 전통적인 Servlet 웹 애플리케이션 실행REACTIVE: Spring WebFlux 기반의 Non-blocking 리액티브 웹 애플리케이션으로 실행NONE: 웹 서버를 구동하지 않음. 단순히 자바 프로세스만 실행하고 종료되거나 백그라운드 작업만 수행설정 필요 ..
들어가기 전에 @Controller는 전통적인 Spring controller로써 오래 사용되어졌습니다. Spring 4.0에서는 @RestController라는 좀 더 RESTful한 웹서비스를 간단히 만들 수 있는 어노테이션이 소개되었습니다. 이번 포스팅을 통해 간단히 두 가지 어노테이션의 차이를 살펴보겠습니다. Spring MVC @Controller @Controller 어노테이션은 @Component 어노테이션을 가지고 있어 classpath 스캔을 통해 자동으로 구현체를 감지할 수 있습니다. 일반적으로 @Controller는 @RequestMapping 어노테이션과 함께 많이 쓰입니다. @Controller @RequestMapping("books") public class SimpleBoo..
들어가기 전에 하기 포스팅은 일반적으로 많이 사용하는 Google SMTP나 Naver SMTP 서버가 아닌 따로 구성된 SMTP 서버를 통해 email을 전송하는 법에 대해 다룹니다. 사내 SMTP 서버의 경우 relay server이기 때문에, postfix의 mynetworks 변수로 관리되는 IP를 통해 email이 전송된다면 따로 username/password가 필요하지 않습니다. 이로 인해, Google SMTP 또는 Naver SMTP를 통해 email을 전송하기 위해서는 application.yml과 같은 설정 파일 내 추가 설정이 필요할 수 있습니다. 이 점 고려하시고 봐주시길 바랍니다. SpringBoot를 이용한 Email 전송하기 Dependencies 추가하기 먼저, Spring..