
개요실무에서 가끔 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..
실무에서 가끔 ThreadLocal 자료구조를 사용하였고, 위 자료구조에 대해서 자세하게 공부를 해보았다 1. 동작 구조ThreadLocal은 각 스레드마다 독립적인 변수 복사본을 제공하는 자료구조 이다 각 Thread 객체는 ThreadLocalMap 내부 Map 를 가지고 있다. 즉 ThreadLocal 객체가 키(key)가 되고, 저장하려는 값이 값(value)이 된다 실제 사용은 Thread.currentThread().threadId() 통해 현재 스레드의 맵에 접근한다 // ThreadLocal.get() 메서드의 동작public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (ma..

개발 환경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..
0. 환경필자는 mysql8.0 을 사용중 이며, RDBMS 기준으로 이야기를 해보겠다 1. 들어가며기본적으로 도메인에 대한 내용을 확실히 숙지했고, 비즈니스 흐름을 명확히 파악했을 때 DB 설계를 해야 큰 효율을 볼 수 있다고 생각한다 실무에서 가끔 테이블 설계를 하고, 필요한 컬럼들을 추가하는 작업을 진행할 때 가 있다 테이블 설계시 거시적인 관점이 아닌 당장 앞에 필요한 부분만 보고 설계하면 누구나 쉽게 설계 할 수 있다 하지만 확장성 및 유지보수성을 생각하는 미래지향적 설계라면 고려해야 할 부분이 여러가지가 있다.정규화키관리 전략외래키, 복합키 등등대표적으로 2가지가 있다 필자는 실무에서 JPA 를 사용중에 있고, JPA 연관관계 설정시 1:1, 1:N 관계을 테이블이 여러개있지만 새로운 설계에..

예외 처리는 어떻게 하는게 좋을까, 실무에서 많은 고민중에 있다 운영을 하다보니 효율적인 예외 로그가 정말정말 중요하게 느껴진다 어떻게 하면 좋을까 고민을 하던 중 기본적인 것 부터 시작을 해보자 해서 다시 공부해본 내용을 정리해 보았다 Java 에서의 예외 종류Error시스템이 비정상적인 상황 ex) OutOfMemoryError, ThreadDeathJVM 에서 발생한다.Exception(Checked)컴파일시 에러가 잡힌다.RuntimeException(Unchecked)컴파일시 에러가 안잡힌다 -> 실행 중에 기능이 동작할 때 잡힌다. 추가적으로 네트워크 장애, 서버 다운 같은 외부 요인들은 Error 라고 생각하기엔 애매해서 나는 그냥 장애 라고 정의하는게 좋을 것 같다는 생각이 든다 0. Th..

문득 궁금한게 생겼다. Redis 가 얼마나 빠르길래 사람들이 Redis 를 자주 사용하는걸까? 그래서 직접 RDB 와 InMemory DB 의 퍼포먼스를 비교해보려고 한다단순한 궁금증에서 출발한 실험이지만, 실제로도 Redis 캐시를 도입할 가치가 있는지 가늠할 수 있는 지표가 될 수 도 있다. 실험 조건rdb 는 mysql, inMemory 는 redis 를 사용한다Sample 은 40만건 기준이다.비교 정보는 단건 조회 및 전체 조회 이다.rdb 및 redis 는 조회할 컬럼에 인덱스가 걸려있다.동시성은 고려하지 않는다.Redis 는 Hash 자료구조를 사용한다. 단건 조회// MySQL 단건 조회public Pos getUuid(Long id) { Pos pos = posRepository...