전체 글

앞으로 넘어지기
· Spring
요청에 대한 파라미터 혹은 데이터로 Enum 타입을 직접 사용하는 경우가 있습니다. public record SearchLibraryBookCond( int page, int size, BookCategory bookCategory ) { } //--- @GetMapping("/books") public ApiResponse searchLibraryBooks( final SearchLibraryBookCond searchCond ) { final SearchLibraryBookResult result = libraryService.getLibraryBook(searchCond); return ApiResponse.from(result); } 위 핸들러는 아래와 같은 http 요청을 처리할 수 있는데요. ..
· Redis
Redis programming patterns Redis 개발 패턴 Bulk Loading Redis 프로토콜을 이용하여 대량으로 쓰기 작업을 하는 패턴 하나의 명령을 차례로 전송하여 연산을 하는 경우, 모든 명령의 RTT가 포함되어 있기 때문에 속도가 느리기 때문에 일반적인 Redis Client를 통해 대량으로 쓰기 작업(load)을 하는 것을 권장하지 않는다. Pipelining을 통해 다량의 명령을 빠르게 수행할 수 있지만 대량의 데이터 쓰기 작업과 응답을 읽는 작업이 동시에 진행되어야 한다. 또, 적은 비율의 클라이언트에서만 non-blocking I/O를 지원하기 때문에 모든 클라이언트에서 bulk쓰기 처리량을 최대화 하기 위해선 Redis 프로토콜이 포함된 text 파일을 생성 후 전송하는..
· 인프라
모니터링 시스템 구축기(3) 이전 글들을 통해 모니터링을 적절히 구성하였는데요. 이번엔 보안적인 부분에 대해 신경쓰며 개선해보도록 하겠습니다. 메트릭은 어플리케이션에 대한 다양한 지표들을 나타내고 있기 때문에, 관리자입장에서는 유용한 정보이면서도 노출되면 위험할 수 있는 지표입니다. 현재 Spring Actuator, Prometheus 는 외부에서 누구든지 접속 할 수 있습니다. Granfana도 접근할 수 있지만, 자체적으로 제공하는 ID/PW 인증이 존재합니다. Spring Actuator 같은 경우에는 Spring application 단에서 해당 경로 (/actuator) 자체에 대한 보안을 추가할 수 있습니다. Intercetpor나 Filter에서 해당 url에 대한 인가 정보를 검증하는 식..
· 인프라
모니터링 시스템 구축기(2) 이전 글에 이어서 메트릭 지표 뿐만 아니라 logback으로 남기는 로그 파일을 모니터링 할 수 있도록 구성해보겠습니다. 우선, 셀럽잇에서는 log level에 나누어 다음과 같이 파일을 정리하고 있습니다. INFO -> logs/backend/info WARN -> logs/backend/warn ERROR -> logs/backend/error 레벨에 따라 각각 다른 폴더에 날짜별, 사이즈별로 분리되어 저장되고 있습니다. # info.log 01:09:19.973 [http-nio-8080-exec-2] INFO c.c.c.l.r.RequestLogInterceptor - [Web Request START] : [ # ... [Method] = [GET] [URL] = [..
· 인프라
모니터링 시스템 구축기(1) 셀럽잇 프로젝트에 적용한 모니터링 시스템 구축기에 대해 소개하겠습니다. 우선 서비스 모니터링이 필요한 이유에 대해 간단하게 짚고 넘어가겠습니다. 운영상 발생한 버그나 오류에 대해 빠른 확인 문제에 대한 원인에 대한 빠른 분석 시스템의 상태를 확인하여 개선점 발견 가능 (성능, 메모리 등) 사용자의 액세스와 활동 분석 -> 취약점, 어뷰징 등의 행위 발견 가능 로깅과 메트릭 모니터링가 필요한 이유는 이러한 이유 뿐만 아니라 다양합니다. 그래서 저희 셀럽잇도 운영중인 서비스에도 모니터링 시스템을 구축하고자 합니다. Spring actuator 우선, 셀럽잇에서는 logback를 사용하여 운영중에 발생한 로그를 모으고 있습니다. 로그 이외의 지표들은 어떤걸 모니터링 하고, 어떻게 ..
· Java
디버깅 로컬에서 예상치 못한 오류가 발생하면, 디버깅 모드를 활용하여 해당 오류를 해결합니다. 플로우를 순차적으로 따라가면서 각각의 상태와 상황들을 쉽게 파악할 수 있기 때문이죠. 클라이언트 개발자와 협업을 하기 위해선, 작성한 어플리케이션을 배포하여야 합니다. 배포된 어플리케이션에서 발생한 오류는 어떻게 파악하면 좋을까요? 물론, 로그를 꼼꼼하게 기록한다면 파악하기 쉬울 것 같습니다. 하지만 한계는 있죠. 배포되어있는 어플리케이션을 대상으로 원하는 지점에서 디버깅을 한다면, 좀 더 쉽게 파악할 수 있을 것 같습니다. Debugger, Debuggee Intellij나 Ecplise와 같은 IDE(Integrated development environment, 통합 개발 환경)에서 제공해주는 디버깅 기능..
· Java
Buffered Reader와 Scanner Java를 처음 시작하면서 입력을 받을 땐 항상 Scanner를 사용했다. 만약 정수를 하나 입력받는 다고 하면 다음과 같이 작성할 수 있다. Scanner sc = new Scanner(System.in); int i = sc.nextInt(); Scanner 클래스가 제공하는 여러 메서드들을 통해 정수 입력, 줄 단위 입력, 문자열 입력 등등 원하는 동작을 수행할 수 있다. 의문점 사실, Scanner만 사용했다면 궁금해하지도 않았을 의문점이 있다. Java로 알고리즘 문제를 풀 때, 평소처럼 Scanner를 통해 입력을 받으면 시간초과가 나는 Case를 자주 격어보았다. 메인 로직은 모두 동일하고, 입출력의 방식만 달랐을 뿐인데.. 졸지에 틀린 풀이가 되..
RoyceWon
생각 저장소