전체 글 (55) 썸네일형 리스트형 [Docker] Docker Compose로 Grafana / Prometheus / Loki 로컬 테스트 환경 구성하기 애플리케이션 개발과 운영에서 모니터링은 필수적인 요소이다. 하지만 Grafana, Prometheus, Loki와 같은 강력한 모니터링 도구들을 처음부터 완벽하게 구축하는 것은 결코 쉬운 일이 아니다. 특히 로컬 개발 환경이나 소규모 테스트 환경에서는 복잡한 설정보다는 빠르고 쉽게 동작하는 모니터링 스택이 필요하다.위 환경을 AWS EC2 (Amazon Linux) 환경에서 Docker Compose를 활용하여 Grafana, Prometheus, Loki 스택을 구축하고, 나아가 Spring Boot 애플리케이션의 메트릭과 로그를 연동하는 방법을 알아보자.목표AWS EC2 (Amazon Linux 2023) 인스턴스 위에서Docker Compose를 사용하여Grafana, Prometheus, Loki.. [Spring Boot] Multi-DataSource Routing 구현 삽질기 동일한 스키마, 동일한 데이터, 동일한 API에 대해 MySQL과 PostgreSQL의 성능 차이를 비교하기 위한 플랫폼을 구상하여 만들던 중 DataSource Routing에 관련한 문제를 겪어 해결하기 위해 삽질한 기록을 공유하고자 한다. 이 프로젝트에서는 구체적으로는 다음을 목표로 했다.LIKE '%keyword%' 같은 Full Scan 쿼리의 실행 속도 비교인덱스 종류(B-Tree, GIN, Full-Text 등)별 성능 차이 분석EXPLAIN / EXPLAIN ANALYZE 실행 계획의 상세 비교동일 조건에서 두 DB 엔진의 옵티마이저 동작 차이 관찰이를 위해 하나의 Spring Boot 애플리케이션에서 요청 헤더(X-Database-Type)로 MySQL/PostgreSQL을 런타임에 전환.. [Spring Boot] ApplicationEventPublisher를 활용한 도메인 간 역할 분리 OOP 기반으로 애플리케이션을 설계하다 보면 자연스럽게 도메인 간의 영역, 역할, 책임에 대해 고민하게 된다.처음에는 기능이 정상 동작하는 것에 집중하지만, 시간이 지날수록 이런 질문이 반복된다."이 로직이 정말 이 도메인에 속하는 게 맞는가?" 예를 들어 주문이 생성되면 다음과 같은 작업이 연쇄적으로 발생할 수 있다.포인트 적립알림 발송감사 로그 기록외부 시스템 연동통계 집계이때 주문 서비스에서 관련 서비스들을 직접 호출하기 시작하면,주문 도메인이 여러 도메인에 강하게 결합된 중앙 허브가 되어버린다.이 방식은 초기 개발 속도는 빠르지만, 코드가 커질수록 다음과 같은 문제가발생한다.도메인 간 결합도 증가테스트 복잡도 상승변경 영향 범위 확대책임 집중사이드 이펙트 증가기능 확장 시 기존 코드 수정 필요이 .. Docker Docker는 전통적인 하이퍼바이저 기반 가상머신(VM)과 달리, 리눅스 커널이 제공하는 다양한 기능을 조합해 호스트 커널을 공유하면서도 독립된 프로세스 환경을 제공하는 경량 컨테이너 플랫폼이다. OS 수준의 가상화(OS-level virtualization)라고 부르며, 프로세스 격리와 자원 제어만으로 빠르고 효율적인 애플리케이션 배포·운영을 가능케 한다.컨테이너 vs VM 가상머신 (VM) 컨테이너(Docker) 커널각 VM마다 별도 커널과 OS호스트 커널을 공유가동 시간수십 초 이상 (부팅 필요)수 밀리초~수 초 (프로세스로 실행)오버헤드메모리·디스크·CPU 오버헤드 큼최소한의 사용자 공간 레이어만 추가격리 수준꽉 막힌 격리네임스페이스·Cgroups 기반 격리컨테이너는 결국 “독립된 프로세스”이.. [Spring Boot] refreshVersions로 gradle 설정하기 멀티 모듈 프로젝트를 생성할 때, buildSrc를 활용한 Gradle 파일 모듈화는 거의 필수적이다.이 과정에서 더욱 편리한 관리가 가능하도록 refreshVersions을 활용한 Gradle 파일 모듈화 및 버전 관리를 적용해보자. plugins { // See https://jmfayard.github.io/refreshVersions id 'de.fayard.refreshVersions' version '0.60.5'}먼저 settings.gradle에서 rootProject.name 위에 refreshVersions 사용을 위한 plugins를 추가하자.더 자세한 내용을 보고 싶으면 해당 링크를 참조하면 된다. 추가를 하고 gradle 새로고침을 한 후 조금만 기다려보면version.. [Java] Collection 과 Collections Java에서 Collection과 Collections는 매우 유사한 이름을 가지고 있어 헷갈리기 쉽다. 하지만 두 개념은 서로 다른 역할을 하며, 이를 정확히 이해하는 것이 중요하다. 이번 글에서 Collection과 Collections의 차이를 살펴보자.Collection이란?Collection은 Java 컬렉션 프레임워크의 최상위 인터페이스로, 여러 개의 객체를 담을 수 있는 컨테이너 역할을 한다. Collection 인터페이스를 직접 구현하는 경우는 거의 없으며, 주로 이를 상속한 하위 인터페이스(List, Set, Queue 등)를 사용한다.Collection 인터페이스의 주요 메서드public interface Collection extends Iterable { int size(); .. Spring Boot - ResponseBodyAdvice를 활용한 공통 응답 처리 Spring Boot에서 API의 응답을 표준화하거나, 공통 데이터를 추가하고 싶을 때는 @ControllerAdvice를 사용하여 응답을 가로채 변형할 수 있다.이때 핵심적인 역할을 하는 것이 바로 ResponseBodyAdvice 인터페이스이다.1. ResponseBodyAdvice란?Spring 공식 문서를 보면 ResponseBodyAdvice는 다음과 같이 설명되어 있다.@ResponseBody 또는 ResponseEntity를 사용하는 컨트롤러 메서드가 실행된 후, 응답 본문이 HttpMessageConverter를 통해 작성되기 전에 이를 수정할 수 있도록 해줍니다.해당 인터페이스의 구현체는 RequestMappingHandlerAdapter 및 ExceptionHandlerException.. Spring Boot - @RestController의 동작 과정과 MessageConverter Spring Boot에서 @RestController를 사용하면 일반적인 @Controller와 달리 ViewResolver가 관여하지 않고, MessageConverter가 실행된다. 이를 통해 API의 응답이 클라이언트가 원하는 형태(JSON, XML 등)로 변환된다. @RestController와 MessageCoverter의 동작 과정1. 핸들러 메서드 실행클라이언트가 요청을 보내면, Spring MVC는 적절한 @RestController의 핸들러 메서드를 실행한다.@RestControllerpublic class ExampleController { @GetMapping("/hello") public String hello() { return "Hello, World!";.. 이전 1 2 3 4 5 6 7 다음