
개요실무에서 가끔 java.io.IOException: Connection reset by peer 메시지를 본적이 있다 위 메시지를 조사해보다가 결국 나온 답은 애플리케이션 커넥션 풀 점검 이였다 커넥션 풀에서 오래된 연결을 재사용하지 않도록 설정했는지HikariCP, Tomcat pool의 타임아웃 설정 확인위 2가지 위주를 보기 위해서 내용들을 찾아보았고, 찾아보면서 공부해본 내용을 공유해보려고 한다본론개발환경: SpringBoot3.3, Jdk17, MySQL, JPA 를 실무에서 사용하고 있다 0. 기본 세팅첫번째로 찾아본 내용은 springboot 자체에서 DataSource 를 찾아서 모니터링을 하는 것이다 Springboot 는 내장 톰캣을 이용하고 커넥션 풀을 사용하여 데이터베이스 커넥션..

개발 환경springboot3.5, jdk21, mysql8.0, Docker 1. 들어가며 보통 개발자들은 서비스 운영을 위해서 필수적으로 어플리케이션에 메시지(기록)을 남겨야 한다.그 메시지는 개발 용어에서는 로그 라고 부른다 결국 로그는 어플리케이션이 동작한 흔적들이고, 나중에 이슈 발생시 흔적들을 찾아가며 트래킹을 할 수 있어야 한다. Java/Springboot 환경에서는 안정적인 로그 시스템을 사용하기 위해서는 보통 Lombok 을 @Slf4j 를 사용할 것이라고 생각한다 위 어노테이션을 클래스 상단에 선언하면 그 클래스에서는 로그를 자유롭게 사용할 수 있다Lombok 을 사용하지 않는다면 아래와 같은 방법으로 사용할 수 있다.private static final Logger log = Log..
1. 들어가며회사에서 비용 절감 차원에서 가끔 테스트 쪽 서버 몇가지를 시간을 정해서 운영한 적이 있었다 19:00 ~ 09:00 까지는 테스트 서버 몇개는는 운영하지 않았고, 서버가 다운됨에 따라, 다운된 서버에 의존하는 스프링 어플리케이션은 java.net.SocketException 을 30초 주기로 계속 발생했다org.springframework.data.redis.RedisConnectionFailureException:Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379Caused by: java.net.ConnectExce..
개요실무에서 비즈니스 로직을 작성하며 코드 의존성을 줄일 수 있는 방법을 계속 고민해보았다.위에 대한 방안을 찾던 중 이벤트 기반 아키텍쳐 라는 개념을 알게되었다 이벤트 라는 단어는 생소하였지만 궁금해져서 공부한 내용을 적어보려고 한다 Event 란?이벤트라 함은 어플리케이션 내에서 발생한 요청 및 상태 변화를 의미하며 이를 다른 컴포넌트에 알리는 것을 이벤트라 정의한다. ex)1. 주문 취소 요청이 오면 -> 주문 취소 이벤트 발생2. 음식 주문 후 배달 받을 장소를 변경한다 -> 배달지 변경 이벤트 발생 이벤트 기반 아키텍처에는 이벤트를 중심으로 시스템이 동작하며, 이벤트를 발생시키는 발행자(publisher) , 이를 처리하는 구독자(subscriber) 가 존재한다 위 역할을 적절히 비즈니스 로직..

📌 Java & SpringBoot & JPA 환경에서 개발중임. 서론Java/SpringBoot 를 사용하여 실무를 하고있다.개발을 하다보면 예외처리를 해야할일이 상당히 많이 생길 것이다 대표적으로 Java 하면 NullPointException 이 있을 것이다 적절한 예외처리를 하지 않고, Runtime 에러가 생길 경우 어플리케이션에 장애가 생길 것이다 심하면 서비스가 중단이 되는 상황도 발생할 수 있다 그만큼 예외처리는 귀찮지만 중요한 일이다. 소홀히 해서는 안된다 위 상황을 방지하기 위해서 코드를 작성할 때 적절한 예외처리가 항상 필요하다 아래 예시 코드를 보며 한번 예외 처리를 점진적으로 발전시켜보자. 예시는 DB 와 통신하는 상황에서의 예외 처리이다 일단 try ~ catch 에 대한 방..
실무를 하다가 한가지 작업에 여러개의 트랜잭션이 필요한 상황이 있다.예를 들어보겠다. 현재 배치 파일을 만드는 상황이다. 배치 파일을 만들기 위해서는 파일 내부도 만들어야하고, 파일 서버에 업로드도 해야하고, 배치 파일이 insert 되었다는 기록도 해야한다.큰 틀에서 보면 3가지 작업이 있다. 한번의 작업을 하는데 적어도 3개의 메소드가 필요하다. 그렇다면 @Transactional 어노테이션은 어디에 걸어두는게 적절할까? 라는 고민을 하였다. 아래 코드는 최상위의 코드이다. @Slf4j@Servicepublic class DailyTransactionService { private final TransactionBatchService transactionBatchService; public..

Spring 프레임워크를 사용하면 대부분의 클래스들에 어노테이션을 선언하고는 한다 대표적으로 많이 사용하는 어노테이션이 Lombok, Spring Context 에 Bean 으로 등록하기 위한 어노테이션이 있다@Getter, @Setter, @Service, @Component, @RestController 등... 개발을 하며 여러가지 어노테이션을 사용하고 있을 것이라고 생각한다 그리고 위 어노테이션을 선언함으로써 어떠한 동작을 할수있게 된다. 나는 문득 궁금해졌다.내가 이 어노테이션이 어떻게 동작하는지 알고 쓰는걸까?어노테이션을 내가 만들어서 사용할 수 있을까?라는 생각을 하였다. 위 생각을 행동으로 옮기기 위해 생각이 났을 때 공부를 해보고 기록을 해보았다 1) 어노테이션 동작 원리 및 예시어노..

들어가며나는 jsch 라이브러리를 사용하여 파일을 SFTP 를 통하여 다른 서버로 전송을 해야했다.ex) prod-server -> file-server 필자는 gradle 을 사용하여 아래 의존성을 추가하여 라이브러리를 사용하였다.implementation group: 'com.jcraft', name: 'jsch', version: '0.1.55' 간단하게 내 상황에 대하여 설명을 해보자면프론트에서 User 가 파일 업로드를 여러개 하였고 그 파일들을 서버로 전송 받아서위 파일들을 SFTP 세션을 생성해 파일 서버로 보내는 작업을 하고 있었다. 위 상황에서 추가적인 요구사항이 들어왔다.User 가 파일업로드 후 서버로 파일들을 전송할 때, User 가 업로드 한 파일이 아닌다른 서버에 존재하는 파일..