전체 글 40

배포 1시간 뒤에야 알게 된 장애 — 로그가 로그를 못 남기면

이번에 스프링 배치 관련 컴포넌트를 배포하면서 있었던 이슈들에 대해 회고를 하고자 한다. 상황: 알림이 오지 않았다스프링 배치 컴포넌트를 배포한 뒤 약 한 시간 동안, 나는 아무 일도 없다고 생각했다. 모니터링 시스템은 조용했고, 알림도 없었다. 문제를 알게 된 건 "특정 시간 이후로 데이터가 들어오지 않는다"는 사용자 메일을 받고 나서였다.서버에 접속해 로그를 확인하니, 배포 직후부터 배치 잡이 실행될 때마다 ClassNotFoundException이 발생하고 있었다. 문제는 예외가 발생한 지점이 하필 로그를 출력하는 시점이었다는 것이다.원인: 로그 전송 경로 자체가 무너져 있었다사내 로그는 Logback appender를 통해 모니터링 시스템으로 전송되는 구조였다. 그런데 이번 배포에서 Logback..

Spring 2026.04.20

백준 32346 - 시큼한 표정

https://www.acmicpc.net/problem/32346풀이>> 문자열이 있을 때 시큼한 문자열은 >>>>> 이렇게 두 구간으로 나눌 수 있다.빨간색 구간으로 만드는 경우 앞에 2개의 문자, 뒤에 5개의 문자를 제거해야 한다.노란색 구간으로 만드는 경우 앞에 6개의 문자, 뒤에 1개의 문자를 제거해야 한다.그러면 이제 앞에 A개의 문자, 뒤에 B개의 문자가 있을 때 순열을 사용해서 경우의 수를 뽑을 수 있는데, 위 같은 경우에는 중복되는 경우가 있어 중복 원소를 포함한 순열을 적용해야 한다. (중복 원소가 있는 A + B개를 순서있게 뽑는 경우의 수)더보기1. 순열서로 다른 원소들을 순서 있게 뽑는 경우의 수P(n,r)= n! / (n - r)! ex)A, B, C -> 3개 중 2개 뽑기 P..

problem solving 2025.05.10

Spring Boot 3.2에서 달라진 예외 처리 방식 - NoHandlerFoundException도 @ControllerAdvice로 처리된다.

Spring Boot 2에서 3으로 마이그레이션 하면서 작지만 중요한 변화 하나를 발견했다. 바로 요청 URL에 해당하는 핸들러(Controller)가 존재하지 않을 때의 예외 처리 방식이 변경된 것이다.기존(Spring Boot 2.x ~ Spring Boot 3.1)의 동작 방식Spring Boot 2.x 버전에서는 존재하지 않는 경로로 요청할 경우, @ControllerAdvice에 선언된 @ExceptionHandler(Exception.class)가 동작하지 않았다. 대신 Spring 자체의 오류 처리 페이지(resources/templates/error/4xx.html)가 렌더링 되었다. 변경 사항(Spring Boot 3.2부터)Spring Boot 3.2부터는 NoHandlerFoundEx..

Spring 2025.05.08

백준 29756 - DDR 체력 관리

https://www.acmicpc.net/problem/29756풀이각 구간을 플레이할지, 포기할지 선택해야 하는데, 그리디를 사용하기에는 최적의 방법이 없기에 결국 한 구간마다 플레이 또는 포기할지를 다 알아야 한다. 따라서 DP를 활용해 점화식을 세워 반복되는 구간을 제거할 수 있다.dp [x][y] = x번째 구간에 왔을 때 현재 체력이 y인 경우 최대 점수위 점화식을 가지고 Top-Down을 활용해 플레이 또는 포기할지를 다 진행하면 된다.1. 해당 구간을 포기한다. dp[x][y] = answer(x + 1, min(100, y + k))2. 해당 구간을 플레이할 수 있다면 플레이한다. dp[x][y] = answer(x + 1, min(100, y - hits[x] + k)) + scores..

problem solving 2025.05.06

DB 테이블 파티셔닝

DB 파티셔닝 DB에서 테이블 파티셔닝은 대량의 데이터를 나누어 저장하고 관리해 쿼리 성능을 향상시키는 기술 중 하나이다. 파티션은 큰 테이블을 관리 가능한 작은 부분(파티션)으로 나누고, 각 파티션은 하나의 독립적인 테이블처럼 동작한다. 하지만 사용자의 관점에서는 하나의 테이블로 보여 쉽게 사용할 수 있게 해준다. 테이블 파티셔닝의 장점은 다음과 같다. 1. 데이터 관리 용이성 : 특정 파티션만 백업하거나 복구하는 것이 가능하고, 자주 사용하지 않는 데이터를 다른 파티션으로 이동하거나 삭제할 수 있다. 2. 성능 향상 : SQL 쿼리가 파티션의 일부만 스캔하면 될 경우, 파티션 프루닝을 실행하여 불필요한 파티션을 제거해 성능을 향상시킬 수 있다. 3. 데이터 접근 시간 단축 : 파티션을 통해 필요한 데..

DB 2023.06.07

리눅스 명령어 with chatGPT

npm build 에서 오류가 발생했는데 npm에서 제공하는 로그를 확인해봐도 뭐가 문제인지 정확하게 확인할 수 없었다.. 그러다가 리눅스에서 제공하는 명령어 dmesg를 통해 OOM이 난 것을 추후에 알게되었고, 뭔가 유용한 명령어가 더 있는지 chatGPT를 통해 알아보았다. 1. dmesg 시스템의 커널 메시지를 표시하는 데 사용한다. 시스템 부팅 이후에 커널이 출력한 모든 메시지를 확인할 수 있으며, 하드웨어 문제, 드라이버 문제, 시스템 충돌, 메모리 문제 등에 대한 정보를 제공한다. 전체 커널 메시지 확인하기: dmesg 명령어를 그냥 실행하면 부팅 이후의 모든 커널 메시지를 볼 수 있습니다. 이 메시지는 시스템의 하드웨어와 드라이버, 그리고 커널의 작동 상태에 관한 정보를 포함합니다. 시간 ..

Oracle RAC (Real Application Clusters)

DB 이중화 데이터베이스 이중화는 두 개 이상의 데이터베이스 시스템을 동일한 데이터로 유지하는 프로세스를 의미한다. 따라서 데이터의 신뢰성과 가용성을 보장할 수 있다. 일반적으로 DB 이중화 기술로는 HA(High Availability)가 있다. HA 구성은 기본적으로 하나 이상의 백업 시스템을 도입하여 주 서버가 다운되더라도 데이터베이스 서비스를 지속적으로 유지하는 방법이다. 즉, 한 대의 Active 서버와 한 대 이상의 Standby 서버를 두는 방식으로, 주 서버가 장애로 동작하지 않을 경우, 대기 서버가 주 서버의 역할을 수행한다. 대기 서버는 주 서버의 데이터를 지속적으로 복사하여 최신 상태를 유지하도록 한다. 고가용성을 제공하는 또 다른 방식으로는 여러 서버가 하나의 데이터베이스를 공유하게..

DB 2023.05.24

DBCP (Database Connection Pool)

DBCP는 데이터베이스 연결 객체를 효율적으로 관리하기 위한 기술이다. 데이터베이스 연결은 생성하고 종료하는데 상당한 시간과 리소스가 필요하다. 따라서 웹이나 애플리케이션 서버에서 많은 수의 동시 사용자 요청을 처리해야 하는 경우, 각 요청마다 새로운 데이터베이스 연결을 생성하고 종료하는 것은 매우 비효율적이므로 해당 문제를 해결하기 위해 DBCP가 만들어졌다. DBCP는 미리 정해진 수의 데이터베이스 연결 객체를 생성해두고 관리하며, 요청이 들어올 때마다 이미 생성되어 있는 데이터베이스 연결 객체를 제공하고, 요청 처리가 완료되면 연결은 종료되지 않고 다시 반환되어 재사용되는 방식이다. 일반적으로 자바에서 DBCP를 사용하지 않고 직접 데이터베이스 연결을 생성하고 사용하는 과정은 아래와 같다. 1. 드..

DB 2023.05.17

@Transactonal

스프링의 트랜잭션 관리 스프링의 트랜잭션 관리는 선언적 트랜잭션과 프로그래밍 트랜잭션 두 가지 방법을 제공한다. 선언적 트랜잭션은 트랜잭션 관리를 "선언적"으로 처리하는 방법으로, 주로 애노테이션 또는 XML 설정을 이용해 트랜잭션의 범위, 롤백 규칙 등을 정의하는 방식을 말한다. "선언적"이라는 말은 트랜잭션 관리를 비즈니스 로직에서 분리하고, 트랜잭션 관련 설정을 외부에서 선언하게 함으로써 코드의 가독성과 재사용성을 높이는 장점이 있다. 프로그래밍 트랜잭션은 코드 상에서 트랜잭션을 명시적으로 시작, 커밋, 롤백하는 방식을 말하며, 주로 더 세밀한 제어가 필요한 경우에 사용하지만 일반적으로 사용하는 경우는 드물다. 관점 지향 프로그래밍 (AOP, Aspect-Oriented Programming) 애플..

Spring 2023.05.11