전체 글(329)
-
프로메테우스 설치 삽질
ssh 서버에서 도커로 프로메테우스를 실행하는 과정에서 지속적으로 에러가 발생했다. 아래 명령어로 프로메테우스 컨테이너를 실행(시도)했다. docker run -d -p 9090:9090 -v /etc/prometheus:/etc/prometheus prom/prometheus 도커 컨테이너가 제대로 실행되지 않은 걸 보고 docker logs {container name} 명령어로 로그를 확인함 ts=2023-05-21T06:48:25.063Z caller=main.go:479 level=error msg="Error loading config (--config.file=/etc/prometheus/prometheus.yml)" file=/etc/prometheus/prometheus.yml err="..
2023.05.21 -
Refresh Token Rotation 과 Redis로 토큰 탈취 시나리오 대응
I. 서론 JWT와 Session 비교 및 JWT의 장점 소개 II. 본론 Access Token과 Refresh Token의 도입 이유 Refresh Token 은 어떻게 Access Token의 재발급을 도와주는 걸까? Refresh Token Rotation Redis 저장 방식 변경 III. 결론 정리 생각해 볼 수 있는 문제 해결하고자 한 문제 JWT로 인증을 구현한 개발자라면 아래의 문제를 생각해 볼 수 있다. 1. 유효기간이 긴 Refresh Token이 탈취된 경우. -> 이 경우는 간단히 refresh token rotation 을 떠올릴 수 있다. 하지만 아래의 문제까지 커버할 수 있을진 의문이다. 2. 탈취한 Refresh Token으로 정상 유저보다 먼저 Access Token을 재..
2023.04.21 -
도커에서 Redis 사용할 때 시행착오 3가지
목차 - 개요 : 사용한 명령어 - 1. `-v /path/on/host:/data` 옵션 누락 - 2. 포트 포워딩 옵션 누락 - 3. 키가 사라진 이유 (feat. 해킹?) - 결론 환경 ubuntu version: 18.04 docker version: 23.0.1 redis image version: latest 개요 도커에서 레디스를 사용할 때 겪은 에러 사항을 기록했습니다. 1. 레디스에 저장된 데이터가 유실되거나 2. 스프링부트 서버에서 레디스로 접속을 못했고 3. 저장한 키가 사라지고, "backup1" 이란 의문의 키가 나타남. 결론부터 말씀드리면, 도커에서 레디스를 실행할 때 명령어만 제대로 쳤으면 해결될 문제였습니다. 아래는 처음 레디스를 실행할 때 사용한 (잘못된) 명령어로, 어떤 ..
2023.04.02 -
2023-1분기 회고
목차 1분기의 책 1분기의 스터디 1분기의 프로젝트 1분기의 키워드 1분기의 커피챗 1분기의 아쉬운 점 1분기의 습관 2분기는? 조금 일찍 작성해 보는 23년의 1분기 회고. 크리티컬 한 일이 있었지만 공개적인 곳에선 드러내기 힘들어 배제했다. 그럼에도 꽤 알찬 회고 글이 완성됐다. 심각하다고 느낀 일이 사실은 그리 큰일이 아닐 수도 있다. 1분기의 책 일반 서적 천개의 파랑 (천선란 作) 뼈의 기록 (천선란 作) 천문학자는 별을 보지 않는다. (심채경 作) 읽은 책 모두 좋았다. 위 3권의 책 말고 자기 계발서도 기웃거렸는데 끝내 완독은 못했다. 나는 자기 계발서와 맞지 않는 사람인가 봄,, "천 개의 파랑"은 진짜 최고 최고 최고. 요즘은 책 추천 부탁받으면 무조건 천 개의 파랑이다. 성장, 드라마,..
2023.03.26 -
@Transactional 썼지만 Dirty Checking 이 안된 이유
목차 0. Dirty Checking 이 동작하지 않은 내 코드 1. Dirty Checking 은 어떤 조건에서 실행되는가? 2. @Transactional 은 어떤 원리로 Dirty Checking 을 진행하는가? 3. 그럼 어떻게 수정해야하나? 4. 결론 Dirty Checking 과 @Transactional 의 원리를 잘 아시는 분이라면 이 글에서 얻어가시는게 많이 없을 수 있습니다. 이 글은 무지성으로 @Transactional 을 사용한 지난 날을 반성하고 더 공부하기 위해 작성했습니다. 0. Dirty Checking 이 동작하지 않은 내 코드 너무 부끄럽지만 처음엔 이렇게 코드를 짜놓고 왜 Dirty Checking 이 되지 않는지 의아했다. @Transactional 어노테이션이 있는 ..
2023.03.12 -
Optional, ifPresentOrElse 로 간단한 리팩토링
ifPresentOrElse 를 이용한 (초)간단 리팩토링 프로세스 1. userEmail 로 회원이 존재하는지 확인 2. Optional 타입의 findUser 반환 3. Optional 값이 비어있으면 userEmail 을 가지는 회원이 없다는 뜻이므로, newUser 엔티티를 저장 (repository.save()) . 4. Optional 값이 존재 시, findUser 의 토큰값 갱신 5. @Transactional 어노테이션으로 인해, 더티체킹 후 영속화 진행 기존.java @Transactional private void createUser(String userEmail, Token token) { Optional findUser = userRepository.findUserByEmail(u..
2023.03.09 -
[딥 다이부] 이진트리, 이진탐색트리, B-Tree, B+Tree 개념과 꼬리질문
Q. 트리란 무엇인가? A. 정의 : 부모 자식 관계로 이루어진 계층적 구조의 자료구조 Q. 이진 트리란 무엇인가? A. 자식노드가 최대 2개로 이루어진 트리 형태의 자료구조를 의미한다. Q. 이진 탐색 트리는 무엇인가? A. 마찬가지로 자식노드가 최대 2개로 이루어진 트리 자료구조. 트리의 모든 노드는 정렬된 상태를 유지하는데, 특정 노드의 왼쪽 서브트리는 해당 노드보다 작은 값을 가지며, 오른쪽 서브트리는 해당 노드보다 모두 큰 값을 가진다. Q. 이진 트리와 이진 탐색 트리의 차이는 무엇인가? A. 정렬 상태라 할 수 있다. 이진 탐색 트리는 정렬된 이진 트리로 볼 수 있는데, 노드의 왼쪽 하위 트리에는 해당 노드보다 작은 키가 있는 노드, 오른쪽 하위 트리에는 큰 키가 있는 노드만 포함된다. Q...
2023.03.08 -
책 좋은코드 나쁜코드 후기
좋은 코드, 나쁜 코드(이하 좋코나코)를 읽었다. 작년에 제이펍 출판사 인스타그램 이벤트로 책을 받게 됐는데, 이제야 집어 들었다. 짧은 후기 좋코나코의 특징은 풍부한 예시 코드 덕분에 이해가 수월하다. 예시 코드는 수도 코드로 작성됐지만, 자바와 비슷한 스타일이라 더 읽기 편했다. 개선해야 할 코드를 우선 보여주고, 어떤 문제가 있는지 도식과 화살표를 이용해 설명하고 어떤 식으로 변경하면 좋은지 설명을 곁들여 개선된 코드를 제시한다. 개선된 코드로 도달하는 이유를 이론에 입각해 설명하기 때문에 그 과정에서 배울 수 있는 이론적인 내용도 유용하다. 추상화 계층을 만드는 이유, checked exception과 unchecked exception, 의존성 주입 등 자주 헷갈렸던 개념을 다루는데, 덕분에 읽..
2023.03.05 -
백준 1662 압축 파이썬
1662번: 압축 압축되지 않은 문자열 S가 주어졌을 때, 이 문자열중 어떤 부분 문자열은 K(Q)와 같이 압축 할 수 있다. K는 한자리 정수이고, Q는 0자리 이상의 문자열이다. 이 Q라는 문자열이 K번 반복된다는 뜻이 www.acmicpc.net 내가 짠 코드 (메모리 초과) string = list(input()) input_stack = [] output_stack = [] for s in string: if s == ")": iter_num = -1 while 1: input_top = input_stack.pop() if input_top != "(": output_stack.append(input_top) else: iter_num = input_stack.pop() break input_..
2023.03.01