
1. 개요스프링부트 서버가 기동 될 때 Spring Context(Bean) 이 초기화 되는 순서 관련 문제가 발생해서 위 문제를 해결하기 위해서 해답을 찾던 중 스프링 생명주기 이벤트에 대한 내용을 알게되서 알게된 내용을 정리해보았다. 2. 본론스프링 생명주기 이벤트란 무엇일까?Springboot 서버가 기동되는 종료되는 과정에서 발생하는 이벤트를 스프링 생명주기 이벤트 라고 한다 스프링 생명주기 사이클 및 동작 순서를 알고 있으면 더욱 더 스프링 프레임워크를 잘 활용해서 사용할 수 있을 것이라고 생각한다 왜 사용할까?위 생명주기 이벤트를 잘 활용해서 이점을 보기 좋은 부분은 요구사항에 의해 특정 시점에 비즈니스 로직에 변동을 줘야할 때 때 라고 생각한다Example초기 데이터 insertCache특정..

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

1. 개요spring 에서는 쉽게 카프카를 사용하기 위해서 kafka 인터페이스를 제공한다그리고 우리는 위 kafka 를 springboot 에서 원활하게 사용하기 위해서 producer, consumer 설정을 잡아줘야 한다 위 설정에서 가장 중요한 message 발행 및 소비시에 필요한 key,value 직렬화 & 역직렬화설정에 대하여 알아보려고 한다 일반적인 카프카 사용시 데이터 흐름을 서버 아키텍쳐로 보면 아래와 같다(간단하게만 그려본 것이다)User --> LB --> WAS --> Kafka --> ConsumerUser 가 서버에 데이터를 보낼 때 보통은 Http Body 에 값을 넣어서 보내고는 한다 kafka 가 아니더라도 일반적인 Http 프로토콜을 사용하여 통신을 할 때 또한 Htt..

개발 환경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..