본문 바로가기

분류 전체보기

(291)
Spring Boot 서버 모니터링(Actuator + Prometheus + Grafana) 서버의 성능과 장애 모니터링을 위해 모니터링 시스템을 붙이기로 함Actuator일단 Actuator를 설정 해야 모니터링에서 사용할 정보들을 얻을 수 있다.circuit breaker를 적용하면서 의존성을 추가했기 때문에 yml에 설정하고 접속이 되는지 확인 필요. application.ymlmanagement: endpoints: jmx: exposure: exclude: '*' web: exposure: include: health,circuitbreakers,prometheus,metrics,loggers base-path: /secret endpoint: health: show-details: always healt..
[아키텍처] 그럼 서버 아키텍처를 어떻게 구성하시겠어요? 운영한던 서비스의 아키텍처를 횡설수설 설명하고 나면 위 질문이 올 때가 있었다. 만약 비용이 문제가 없고 서버를 마음대로 구성해봐라! 했으면 나는 어떻게 했었을까? 사실 진지하게 생각해본적은 없었다. 그래서 이제 생각해보려고 한다. 들어가기 전에 내가 그냥 혼자 생각했던 구조는 뭐... 대충- 프론트 web 서버 1대- API 서버 2대 이상?- 로드밸런서 1대?- DB 서버 2대(이중화 또는 백업용),- 캐시, 메지징 큐 등 뭐 이것저것 서버 1대- CI/CD 구축할 서버도 1대..? 이정도..? 라고 했는데... 그냥 내 뇌피셜이었다. 그러니 이제 그 근거를 찾아가보자.정말 이거면 될까요? 1. 단일 서버인 경우일단, 각 서버별 환경에서 이야기해보자.내가 회사에서 사용하던 단일 서버 환경에서 여러 개..
[아키텍처] 운영하던 서비스의 서버 아키텍처를 설명해주세요 이직을 위해 면접을 다니면서 들었던 공통적인 질문은 서버 아키텍처에 관한 것이었다. 나는 서버 아키텍처 질문을 했을 때 그냥 저희는 단일 서버를 사용하고 있었어요. 라고 대답했는데, 이게 옳은 대답이었을까? 그래서 서버 아키텍처에 대해 파헤쳐보기로 했다. 내가 의도를 잘 파악을 못했을 수도 있지만, 도대체 정확히 무엇을 말하는 것이었을까? 한번 정리를 해봐야겠다. 서버 아키텍처란?서버 기반 시스템의 구조, 구성 요소, 그리고 구성 요소 간의 관계를 정의하는 설계.즉, 서버가 어떻게 구성되고, 어떤 역할을 하며, 다른 요소들과 어떻게 상호작용하는지를 보여주는 청사진 제미나이가 말해주는 아키텍처의 정의이다. 일단 내가 단일 서버를 사용하고 있어요. 라고 말한 것은 하드웨어 설계에 속할 것이다. 그럼 나는 모..
Spring 프로젝트 아키텍처 정하기 새로운 프로젝트를 또 혼자 개발해야하니 아키텍처를 정해야겠다. 기존 프로젝트들은 모두 모놀리식 아키텍처로 계층형도 있고 도메인 중심 패키지 구조로 되어있는 것도 있다. 이번 프로젝트에서는 멀티 모듈도 고려해볼 참이라 또 아키텍처에 대해 찾아보고 정리를 해보았다. 늘 고민이 되는 부분이다. 클로드를 사수 삼아 함께 논의했다. 1. 계층형 아키텍처계층형 아키텍처는 레이어 별로 패키지 관리한다.com.example├── ExampleApplication.java├── config/ # 스프링 설정 클래스├── domain/ # 도메인 엔티티├── repository/ # JPA 레포지토리├── service/ # 비즈니스 로직├── controll..
리팩토링 - 패키지를 넘나드는 캐시 현재 프로젝트는 기능 기반 패키지 구조로 되어있다. service 레이어에 @Cacheable을 추가하고 해당 캐시 데이터를 수정하는 메서드에 @CacheEvict 설정을 했다. 메서드를 찾아 설정을 하다보니 패키지를 넘나들면서 캐시를 생성/제거하고 있었다. 같은 캐시는 같은 패키지 안에서 핸들링 할 수 있어야 하지 않을까? 라는 의문이 들었다.서로 다른 패키지의 서비스에서 캐시 저장과 제거를 한다면 어디서 해당 캐시를 저장/제거하는지 일일이 찾아야 하기 때문에 유지보수가 어렵다. 같은 캐시는 같은 패키지에서 핸들링 할 수 있도록 리팩토링을 하려고 한다.  예시 상황여러 서비스에서 사용 가능한 포인트를 관리하는 포인트 지갑이 있다.회원 포인트 잔고 조회 → 포인트 지갑 서버로 현재 잔고 요청포인트 지갑 ..
[Spring] Caffeine Cache 적용 의존성 추가implementation 'com.github.ben-manes.caffeine:caffeine' caffeine 적용 후 확인System.out.println("cacheManager bean = " + cacheManager.getClass().getName());// org.springframework.cache.caffeine.CaffeineCacheManager  간단하게 읽고 쓰고, 변경되면 제거하는 설정도 해주어서 따로 스케줄러로 관리는 하지 않으려고 한다. 최대 크기는 설정하고 싶어서 config를 추가했다.@Configuration@EnableCachingpublic class CacheConfig { @Bean public CaffeineCacheManager c..
스프링 내장 캐시 사용하기 캐시 Cache데이터나 값을 미리 복사해 놓은 임시 장소를 가리킨다. 캐시를 사용하면 DB나 서버에서 반복적으로 동일한 데이터를 가져오거나 연산이 필요해 시간이 오래 걸리는 경우 사용할 수 있다. 캐시를 사용하면 서버의 부하를 줄이고 응답 속도와 성능을 높일 수 있다. Local Cache vs Global Cache예전에 면접에서 ‘로컬 캐시를 사용하지 않고 굳이 redis 같은 캐시를 따로 사용하는 이유가 뭐냐’ 라는 질문을 받았었다. 답변을 제대로 못했었는데, 이에 질문자가 ‘여러 대의 서버를 사용하는 경우 서버마다 따로 로컬 캐시를 관리하면 데이터가 일치하지 않을 수 있다. 캐시 서버를 따로 구축해서 모든 서버가 하나의 캐시 서버를 사용하여 동일한 데이터 사용할 수 있도록 해야한다.’고 알려주었다..
Spring 서버 로깅 1 - 로그 레벨 테스트를 시작하면서 로그를 확인하면 지저분하게 여러 정보를 출력하긴 하는데, 정작 필요한 정보는 없는 경우가 많았다. 그래서 로깅을 적용하고, 필요한 정보만 출력할 수 있도록 정리하려고 한다. 외부 api 호출할 때 파라미터와, 요청 url, 응답에러 발생 시 요청 api url, 데이터어떤 요청에 대한 에러인지 파악하여 시점과 위치를 알기 쉽게 하기예외 전환 시 root cause 정보 추가나중에 확인이 필요한 내용에 대한 정보 운영, 테스트 환경에서 테스트를 하면서 필요했던 내용을 정리하여 먼저 적용해보려고 한다. 로그 레벨로그 레벨은 로그 메시지의 중요도를 알려준다. 바로 대처가 필요한 장애 상황인지, 인지하고 주의해야 할 상황인지 등을 구별할 수 있다. DEBUG개발 혹은 테스트 단계에서 해당 기..