분류 전체보기 14

모니터링 기술 활용 경험기(Sentry, Prometheus & Grafana)

1. 서론이번에는 예외 모니터링 기술을 활용하여 운영 과정에서 발생한 문제를 빠르게 해결한 경험과 서버 리소스 및 성능 모니터링 기술을 활용하여 개선점을 찾아낸 경험을 공유하고자 한다! 2. 서버 장애에 신속히 대응하기 위해: Sentry작년 10월, 서비스 배포 직후 Sentry로부터 서버에서 500 에러가 발생했다는 알림을 받았다. API End-point 및 사용자의 위치정보는 일부 가렸습니다!개발 과정에서 충분히 케이스를 세분화하여 테스트를 했다고 생각했는데,, 정말 예상치 못한 케이스가 있었다! 사진에서 표시된 위도와 경도 값을 보면, ‘해외에서 전달된’ 요청을 처리하는 과정에서 문제가 발생했음을 알 수 있다. 한류에 관심있는 외국인들이 많은 것 같아서 감사하다. 🫡 에러의 가장 근본적인 원인..

Backend/Kori 2025.02.18

도커 악성 코드가 차단됨: com.docker.vmnetd에 악성코드가 포함되어 있어서 열리지 않았습니다.

1. 문제상황  새해가 된 후 오랜만에 도커를 실행했는데, 이런 오류가 날 반겨줬다. 찾아보니, 서명을 담당하는 인증서가 만료되어 발생한 오류라고 한다. 사실 원인은 크게 궁금하지 않아서 대충 찾아봤기 때문에 정확하지 않을 수도 있다 . . . 얼른 다시 개발하러 가야하기 때문에 바로 해결방안을 알아보도록 하자! 아래 링크를 참고해 문제를 해결할 수 있었다 👍 https://github.com/docker/for-mac/issues/7527 Malware detection prevents Docker Desktop to start · Issue #7527 · docker/for-macDescription Some versions of Docker Desktop might fail to start or ..

트러블슈팅 2025.02.03

@Modifying 알아보기

1. 서론SpringDataJpa를 사용할때 JPQL을 @Query 와 함께 사용한다. @Query 어노테이션은 기본적으로 읽기 전용으로 간주되는데, UPDATE, DELETE 쿼리를 작성할 경우 @Modifying 어노테이션을 함께 붙여줘야한다. 이번 포스트에서는 @Modifying 에 대해서 간단히 알아보고자 한다.2. 적용하며 이해하기@Query("delete from Member m where m.id =:id")void deleteById(Long id); 위 코드에 @Modifying을 붙이지 않고 실행시 아래와 같은 에러가 발생한다 org.springframework.dao.InvalidDataAccessApiUsageException: Query executed via 'getResultL..

Backend/JPA 2025.02.03

Batch Insert 를 통해 JPA의 한계를 극복하다 (Spring JDBC )

개인 프로젝트를 개선하는 과정을 기록한 글입니다! 1. 서론Kori에는 주기적으로 새로운 축제 정보를 확인하여 데이터베이스에 저장하는 작업이 있다.그런데, MariaDB에 PK 생성을 위임하는 환경에서 JPA를 사용하다보니 삽입 쿼리가 아래와 같이 나타났다.INSERT INTO table (col1, col2) VALUES (val1, val1);INSERT INTO table (col1, col2) VALUES (val2, val2);INSERT INTO table (col1, col2) VALUES (val3, val3);... 이처럼 레코드 수만큼 데이터베이스에 INSERT 쿼리를 전송하면 비효율적인데, 대표적인 원인은 아래와 같다.네트워크 오버헤드 증가각 INSERT 문이 실행될 때마다 데이터베이..

Backend/Kori 2025.01.31

CompletableFuture 자세히 들여다보기

서론자바에서 멀티 스레드 및 비동기 프로그래밍을 처리하기에 가장 현대적인 방식은 CompletableFuture이다.이번 포스트에서는 CompletableFuture 이 내부적으로 어떻게 동작하는지 정리해보자 한다.1. 비동기 방식으로 동작for (Job job : jobList)) //각 루프의 작업은 서로 기다리지 않고 독립적으로 실행 CompletableFuture.runAsync(() -> doJob(job));doOtherJob();CompletableFuture는 비동기 방식으로 작업을 실행한다.즉, 메인 스레드는 for-each 루프의 작업을 기다리지 않는다.그러므로 모든 작업이 마무리 되기전에 doOtherJob() 메소드를 호출할 수 있다.2. supplyAsync() 동작원리C..

Backend/Java 2025.01.27

멀티스레드와 스레드 풀을 활용한 축제 업데이트 성능 개선

개인 프로젝트를 개선하는 과정을 기록한 글입니다!1. 서론Kori 에 추가할 기능을 위해, 외부에서 제공하는 API를 바탕으로 데이터를 주기적으로 업데이트하는 기능을 개발하고 있다. 그런데, I/O가 많은 작업을 싱글스레드에서 동기방식으로 처리하는 것이 비효율적이라고 느꼈다. 이번 포스트에서는 스레드 풀을 활용한 멀티 스레드를 도입하여 작업 처리 속도를 개선한 과정을 정리하고자 한다. 1.1 Non-blocking I/O VS Multi-threading싱글스레드에서 동기방식으로 I/O 작업을 처리하면, 해당 작업이 완료될 때까지 실행중인 스레드는 대기 상태가 된다.즉, CPU는 아무런 연산을 하지 못한채 I/O가 마무리될때까지 기다리게 되므로 CPU를 낭비하는 문제가 발생한다.이를 개선하기 위해 대표적..

Backend/Kori 2025.01.13

공공API: SERVICE KEY IS NOT REGISTERED ERROR 에러 자바로 해결하기

1. 문제상황공공데이터 포탈 API를 사용하는 과정에서 약간의 어려움을 겪었다. 포스트맨을 이용하여 호출시 정상 응답을 받았지만, 자바 애플리케이션에서 호출하니 'SERVICE_KEY_IS_NOT_REGISTERED_ERROR' 라는 응답을 받았다. 보통 API 키를 헤더에 넣어서 전송하지만 공공데이터 포탈 API를 사용할때는 쿼리 파라미터로 전송해야한다. 이 때문에 발생한 인코딩 문제의 원인을 파악하는 과정과 해결하는 방법을 이번 포스트에서 다뤄보고자 한다.2. 문제 원인 분석 내가 겪은 문제는 인코딩된 API 키로 요청했음에도 'SERVICE_KEY_IS_NOT_REGISTERED_ERROR' 응답을 받는 것이었다. 공공데이터 포탈에 올라와있는 Q&A에서도 API Key 값을 쿼리 파라미터로 전송시 ..

트러블슈팅 2025.01.06

OS 파일 시스템: 파일 테이블과 I/O 성능 개선 기법

1. 서론시스템 프로그래밍 시간에 학습한 내용을 바탕으로 OS가 파일을 관리하는 방법에 대해서 정리하고자 한다. 응용프로그래밍에서 파일을 열면 운영체제가 이를 어떻게 관리하는지 간단하게 살펴보도록 하자. 또한, 운영체제가 어떻게 디스크와 같은 저장장치를 추상화 하는지, inode를 활용하여 파일의 데이터 블럭을 찾는 과정 등의 내용은 다음 포스트에서 살펴보겠다.2. OS가 파일을 관리하는 방법2.1 File TableFile Table은 각 프로세스가 오픈한 파일의 정보를 저장하고 있는 리스트이다. 프로세스는 파일에 대해서 읽기 쓰기 작업을 진행하기 전에 파일을 open한 후 이 프로세스가 그 파일에 대해 해당 작업을 할 수 있는 권한을 인증한 후에 작업을 수행한다. 이 리스트의 각 Entry의 인덱스는..

CS 2024.12.30

스레드 기본 개념

1. 서론스프링부트의 WAS는 각 요청을 스레드를 할당해서 처리한다. 이때 일반적으로 스레드 풀 방식을 사용한다. 그리고 각각의 스레드는 스택에 할당된다. 그렇기 때문에 스레드에서 함수호출이 가능하다. 한편, JPA의 영속성 컨텍스트는 스레드 단위로 할당된다. 그렇기에 Lost update 문제가 발생할 수 있으며, 이는 비관적, 낙관적 락 등으로 해결할 수 있다. 이처럼 스레드는 백엔드 개발에 아주 기본적인 개념이라고 할 수 있다. 이번 글에서는 시스템 프로그래밍 시간에 배운 스레드 내용 중 중요하다고 생각한 부분을 정리해보려고 한다.2. 스레드 (Threads)2.1 스레드 기본 개념 및 특징스레드는 프로세스에 포함된 실행단위이다.이 실행 단위는 독립적으로 CPU 자원을 할당받고 실행되는 별도의 컨텍..

CS 2024.12.23

OS가 관리하는 Clock & Hardware Clock

1. 서론프로세스는 클락(Clock)을 통해서 시간을 알 수 있다. 이는 상대시간일 수 도 있고 절대시간 일 수 도있다. 운영체제는 상대시간은 주로 Monotonic Counter, 절대 시간은 Wall Clock을 활용하여 관리한다. 이번 글에서는 운영체제가 관리하는 시간의 종류와 관리 방법에 대해서 간단히 정리하고자 한다.2. OS가 관리하는 시간의 종류운영체제가 관리하는 시간은 일반적으로 다음 세 가지로 구분된다.2.1 Wall time (Real time)실제 세계의 시간과 일치하며, 사용자가 변경이 가능하다.사용자에게 시간을 제공하거나 사용자의 행동을 시스템 내부에서 기록할때 적합하다.절대 시간을 측정할때 적합하다캘린더에 활용하는 시간백엔드 서버의 로그에 표함된 시간2.2 Monotonic ti..

CS 2024.12.15