TIL 썸네일형 리스트형 Prometheus + Grafana 모니터링 스택 구축 1. Prometheus vs Grafana 역할 PrometheusGrafana역할메트릭 수집 + 저장시각화 대시보드기능각 서비스에서 주기적으로 메트릭 scrape, 시계열 DB에 저장Prometheus 데이터를 쿼리해서 그래프/차트로 표시, 알림 설정\데이터 흐름:[모니터링 대상 서비스] → (메트릭 노출 /metrics) → [Prometheus 수집/저장] → [Grafana 시각화]모니터링 대상 서비스는 /metrics 엔드포인트를 열어줘야 Prometheus가 긁어갈 수 있다.- Spring Boot: spring-boot-starter-actuator + micrometer-registry-prometheus- Node.js: prom-client2. Docker Compose 기본 구성se.. 더보기 트랜잭션 경계 설정중 외부 트랜잭션 객체 Lazy 로딩 안됨. 이전 팀프로젝트 중 발생 했던 이슈에 대해서 다뤄 보고자한다.어찌 보면 간단한 이슈인데 꽤나 중요하다고 생각해서 작성한다. 근데 지금 쓰는거면 너무 늦은거 아니냐 할 수 있는데.알아.문제 상황좌석 예약 시 주문정보를 생성하는 메서드를 제작중인데. 아래와 같은 에러가 발생했습니다.Could not initialize proxy [com.tixy.api.event.entity.Event#251] - no session 해당 이슈는 트랜잭션경계 밖에서 event를 lazy로딩 하려고해서 발생한 이슈근데 코드를 보면 최상단에 Transactional 을 넣어서 하나의 트랜잭션 경계인데 왜 이런 이슈가 발생했을까?@Transactionalpublic CreateOrderResponse order(Long even.. 더보기 분산lock AOP구현중 원자성 보장을 위한 lua 작성 그리고 그 단점 문제 상황기존에 좌석1개씩 예약(점유) 하던 코드를 2개이상 씩 점유 할 수 있도록 작성하고,서비스에서 구현된 락을 AOP로 변경 하면서 발생한 원자성 보장 및 Lua스크립트의 단점원인 분석AOP로 변경하면서 기존에 사용중인 setIfAbsent 를 그대로 사용중이었는데 반복문으로 원자성이 보장되지 않아데드락, 의도치않은 모두실패 등 다양한 에러 케이스가 발생 할 수 있었습니다.처음 작성한 로직은 아래와같습니다.예약할 좌석을 리스트로 받아 하나하나 예약을 걸고을 획득락 획득에 성공한 키와 벨류는 따로저장.만약 한개라도 실패 시 획득한 락 모두 반납.private void holdSeat(List list, String keyPreFix, long timeout) { // 락 획득 실패 시 관리 하기.. 더보기 네트워크란 무엇인가 ( 네트워크는 마법이 아니다. ) Visual Summary - 학습 이미지네트워크 너 뭐야네트워크란 말 개발공부하면서 진짜 많이 들어봤는데, 네트워크 그래 컴퓨터끼리 서로 통신할 수 있는 연결된 망인건 알겠어.근데 그래서 이게 뭐 어떻게 생겨먹은거고, 어디에 있고, 어떤식으로 동작하는지 이걸 진짜 생각해본적이 없던거같다.VPC? 가상 네트워크? 이 네트워크가 뭔지 알지 못하면 절대 이해할 수 없을 것이다.네트워크를 이해하기 전에 내가 이런 고민을 왜 했냐면. aws 를 공부하는데 VPC는 AWS의 물리 네트워크에서 사용자에게 독립된 가상 네트워크를 하나 만들어 제공해 준다고 한다. ????? 아니 네트워크는 네트워크인데 AWS 의 네트워크는 뭔데;;; 그것도 물리??? 네트워크는 그냥 그런 연결된 망들을 네트워크라 불리는거 아니었나??.. 더보기 ArgumentResolver Visual Summary - 학습 이미지ArgumentResolver 가 무엇인가우선 코드를 한번 보니 HandlerMethodArgumentResolver 라는 인터페이스를 상속받고있고,그안에 supportsParameter , resolveArgument를 구현하고있다. 알게된 사실 spring framework 에서 제공하는 인터페이스이다.HTTP 요청 즉 request 안에있는 데이터들을 꺼내서 컨트롤러에 정의한 파라미터 값으로 만들어 주는 역할그래서 종류별로 RequestParamResolver , PathVariableResolver , RequestBodyResolver 이런 것들이있고 HandlerMethodArgumentResolver 를 상속 받아서 커스텀 하게 내가 원하는 Resol.. 더보기 유닛테스트와 통합테스트 Visual Summary - 학습 이미지테스트 커버리지 100프로 달성 목표를 위한 테스트 코드 작성어제 내가 공부하고 작성한 부분은 유닛단위 테스트를 작성 하는 방법이었다.그렇게 도메인에있는 서비스를 하나하나 유닛 테스트를 모두 작성을 완료 하였다.@ExtendWith(MockitoExtension.class)public class TodoServiceTest { @Mock private TodoRepository todoRepository; @Mock private WeatherClient weatherClient; @InjectMocks private TodoService todoService; @Test public void Todo를_성공적으로_생성한.. 더보기 테스트코드 🔖 핵심 주제Interceptor vs security Filter / 테스트코드작성 💡 배운 내용1. Interceptor vs security Filter과제 진행 중 Todo가 본인이 수정한게 맞는지 검증하는 로직이 service에 작성됨직전 프로젝트에서는 spring security를 도입해서 filter 에서 처리하도록 작성, 그러나 지금 과제에선 interceptor에서 이미 admin을 검증하는 로직이 존재2가지 검증 로직을 filter로 수정할지 interceptor를 추가할지 고민.interceptor는 Spring 컨텍스트 내부에서 동작filter 는 디스패처 서블릿(Dispatcher Servlet) 전/후 URL 패턴에 맞는 모든 요청에 대한 부가 작업 기능 제공처음엔 두 가지 .. 더보기 AOP 🔖 핵심 주제Interceptor / AOP의 구조이해와 활용.💡 배운 내용1. 요청 처리 흐름 이해 (Filter → Interceptor → Controller → AOP)Filter는 인증(JWT 파싱)Interceptor는 인가(admin 권한 체크)AOP는 메서드 실행 전후 로깅, 트랜잭션, 예외 처리 등에 활용 될 수 있다추가적으로 Interceptor 에서 발생한 예외가 Filter의 catch에서 잡히는 이유는 chain.doFilter() 내부에서 발생했기 때문이라는 점을 이해했다.예를들어 jwt Filter 에서 이런 에러 처리가 있을때, Interceptor 에서 에러가 발생하면 해당 에러가 반환된다.} catch (Exception e) { log.error(.. 더보기 이전 1 2 3 4 5 다음