무지를 아는 것이 곧 앎의 시작

전체 글 41

[욕망의 인프라 : 도커 & 쿠버네티스] 쿠버네티스의 등장배경(MSA)

본 스터디(이하 욕망의 인프라)는 열음(https://github.com/Juhyung990122)과 함께합니다. 컨테이너를 오케스트레이션 하는 도구. 쿠버네티스는 여러 컨테이너 런타임들을 운영하기 편하게 도와주는 도구이다. 이건 왜 등장하게 되었을까? 모놀리틱 아키텍쳐 전통적인 “모놀리틱 아키텍쳐”는 여러 서비스가 하나의 애플리케이션으로 뭉쳐있는 형태이다. 이 경우, 초기 개발 속도를 올려주지만, 장기적으론 개발, 운영, 유지보수 측면에서 다음과 같은 문제들이 있었다. 스케일 아웃시 불필요한 리소스 복제 위에 그림에서의 어플리케이션에서 채팅 서비스의 기능의 트래픽이 많아 스케일 아웃이 필요한 상황이 됐다고 가정해보자. 트래픽이 많아서 문제가 됐던 건 유저 서비스 뿐인데 불필요한 다른 서비스들도 복제가 ..

Serializable로 동시성을 잡으려 하면 데드락을 만납니다

최근 우연찮은 기회로 현업 개발자와 동시성 이슈에 대한 얘기를 할 기회를 얻었다. 동시성 이슈에 대해서 고민해보고 어떤 상황에 어떤 방식으로 해결하는 결론을 내렸는 지 정리된 걸 얘기해 보았는데, 결론은 Serializable을 쓸 일은 없었지만 내가 고민한 과정중에 있었고 지식 교정이 필요한 걸 알게 되었다. 이번 포스팅에선 그 점을 다뤄볼까 한다. DB에 데이터가 공유자원이다. 동시성을 어떻게 해결할거냐? RDBMS라면 일단 낙관락, 비관락 이런걸 해결책으로 떠올릴 수 있고, 여러 저장소와 글로벌 트랜잭션이 필요하다면 Redis로 공유 락을 잡는 방법도 있다. 이건 모범 답안이고, 이런 방법들을 알기 전에 나는 격리 레벨을 Serializable로 설정하면 데이터에 락이 걸려서 트랜잭션간 동시성이 잡..

DB 2022.12.05

얘는 대체 왜 이럴까? (모르면 죽을 수 있음)

0.1 + 1.1은 1.2가 아니란다. 컴퓨터 이녀석 정확한 놈인 줄 알았는데 마냥 그렇지도 않은가보다. 메모리 저 값들은 메모리에 쓰여지는 값들이다. 메모리가 어떻게 생겼는 지 이해할 필요가 있다. 메모리는 0과 1을 저장할 수 있는 bit라고 부르는 칸이 무수히 많이 뭉쳐진 구조이다. 여기엔 0과 1만 저장할 수 있기 때문에 컴퓨터가 데이터를 저장하는 방법에 따라서 공간을 잡고 데이터를 저장한다. ex) 정수 5 → 00000101 정수 10 → 00001010 더 큰 수를 저장하고 싶으면 칸을 늘려서 저장 16칸은 -32768 ~ 32767까지 저장 가능 실수형은 어떻게 저장할까? (float 자료형 기준) 5.125라는 숫자를 저장하려면 어떻게 할까? 5.125 → 101.001(2진법) 컴퓨터는..

CS 2022.11.22

[욕망의 인프라 : 도커 & 쿠버네티스] - 컨테이너와 배포

본 스터디(이하 욕망의 인프라)는 열음(https://github.com/Juhyung990122)과 함께합니다. 용어 정리 컨테이너가 뭐야 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술임 PC에 프로그램을 설치할 때 특정 경로에 맞춰서 설치를 해야 하거나, 그 PC에 맞는 옵션을 맞춰야 하거나 하는 번거로운 작업들이 필요할 때가 있는데, 컨테이너는 이런 환경까지 모두 포함하여 독립적으로 프로그램을 실행할 수 있도록 도와주는 기술. 컨테이너 환경을 묶어서 배포한 컨테이너 이미지라는 프로그램을 내려받아 구동하면 된다. 컨테이너 런타임 컨테이너를 다루는 도구이다. 대표적으로 가장 유명한게 도커 컨테이너를 쉽게 내려받거나 공유하고 구동할 수 있도록 해준다. 도커가 사용하는 컨테이너 규격은 표..

리프레시 토큰 탈취 대응 전략을 고민하다 도달한 세션쿠키 vs 토큰에 대한 고민

세션 쿠키 방식과 토큰 방식 간단정리 웹 어플리케이션을 구현하는 데에 대표적인 인증방식 중에 세션과 쿠키를 이용한 인증방식과 토큰 기반의 인증 방식이 있다. 각 방식마다 특징이 다르다. 세션 쿠키 방식 세션과 쿠키를 이용한 로그인 방식의 경우 서버에서 사용자의 로그인 정보를 세션으로 저장하고 있게 된다. 그리고 짧은 유효기간을 둔 세션ID를 클라이언트의 쿠키에 저장하여 해당 쿠키를 서버에서 까보고 세션 유효기간을 늘려주는 방식으로 동작한다. 토큰 방식 토큰방식의 경우 토큰 자체에 정보를 저장하기 때문에 서버에 따로 자원을 저장하지 않고 로그인을 구현할 수 있다. 서버는 토큰의 유효성을 검증하는 수단만 가지고 따로 토큰을 추적하지 않기 때문에 서버의 부담을 줄일 수 있다. 장단점 정리 세션 쿠키를 이용한 ..

Web 2022.11.09

OAuth, OpenID

인증과 인가 인증: 사용자의 신원을 확인 인가: 사용자가 자원에 접근할 수 있는지 권한을 확인 OAuth는 인가를 위한 프로토콜이다. 자원의 소유자가 클라이언트에게 자원에 접근할 수 있는 엑세스 토큰을 발급 해당 엑세스 토큰을 통해 자원에 접근이 가능 OAuth 1.0과 vs OAuth 2.0 차이 OAuth 2.0은 기존의 OAuth 1.0과 호환되지 않는 새로운 프로토콜. 기존의 OAuth 1.0은 데스크톱이나 휴대폰 애플리케이션에서 사용자가 원하는 서비스로 브라우저를 연 뒤 서비스를 인증하고, 서비스에서 애플리케이션으로 토큰을 복사하여 사용하는 방식. 브라우저를 왔다갔다하는 과정때문에 사용자 경험 측면에서 좋지 않음. OAuth 2.0이 나타나며 이러한 인증 절차가 간소화 되었으며 몇가지 용어가 변..

Web 2022.11.08

Redis 입문용 기본지식 채워봅시다

우아한테크세미나 191121 우아한레디스 by 강대명님 영상 토대로 작성한 내용입니다. Cache 레디스를 알기 전에 Cache에 대해 먼저 알 필요가 있다. 캐시는 나중에 요청올 결과를 미리 저장해두었다가 빠르게 서비스를 해주는 것을 의미한다. ex) Factorial같은 경우 10!을 계산한다면 1부터 10까지 다 곱하는게 아니라, 이전 값 즉 9!을 어딘가에 저장해두었다가 10만 곱해서 반환하면 된다. 즉 접근 속도에 이점이 있다. CPU Cache 메모리는 디스크보다 용량은 훨씬 적지만, 접근 속도는 디스크보다 훨씬 빠르다. 레디스는 이 메모리에 데이터를 저장한다. Cache 사용 패턴 Look Aside Server는 데이터가 존재하는지 Cache를 먼저 확인 Cache에 데이터가 있으면 Cac..

Redis 2022.10.26

Docker로 레디스 로컬 환경 간편하게 세팅하기

docker image 다운로드 docker pull redis:alpine pull 명령어로 이미지를 다운받는다. alpine은 태그를 의미하고 redis 버전 등의 값을 줄 수 있다.(생략시 latest가 붙음) alpine이 붙으면 이미지를 경량화시켜서 용량이 적다. docker로 실행 docker run --name redis-server -d -p 6379:6379 redis:alpine run 명령어로 docker container를 띄움. --name: container명을 지정. -d : 백그라운드로 실행 -p : host의 port와 container의 port를 매핑 맨 마지막에 이미지명:태그명 붙이면 됨 매번 위 과정이 귀찮을 것이다 docker-compose로 컨테이너를 띄우자 re..

Redis 2022.10.26

내편 로깅 정책 정리

요청정보 로깅에 대한 변천사 아 인터셉터에서 Request Body 로그 찍고싶다.. 요청 정보는 서비스 로직 시작 전에 찍어야지..? 요청로깅 AOP로 해야겠다 로깅 성능에 대한 고민 로깅 성능에 대한 고민 작업 트레이스 로깅 로그 잘 남기면 디버깅이 수월해짐 위 과정들을 통해 로깅 정책을 픽스한다. 로그 레벨 프로덕션 서버: 루트레벨 info, 어플리케이션 패키지 info 개발 서버: 루트레벨 info, 어플리케이션 패키지 debug 로컬: 루트레벨 info, 어플리케이션 패키지 debug 로그 관리 프로덕션 서버: 롤링 파일 어펜더를 사용해서 1일마다 최대 10mb 단위로 잘라서 압축 관리, 최대 14일치 보관 개발 서버: 파일 어펜더를 사용해서 파일을 남김. 서버 재실행마다 초기화 로컬: 콘솔창에..

Spring 2022.10.24

로깅 성능에 대한 고민

로깅을 할 때 원하는 형태로 출력하기 위해 필요한 계산 로직들이 있을 수 있다. 출력을 꼭 해야하는 경우라면 필요한 로직이기 때문에 당연시 하겠지만, 로그 레벨에 의해 출력되지 않을 로그에도 해당 계산 로직들이 호출되곤 한다. 이 비용은 정당한 비용일까? 이번 포스팅에선 로그를 위해 호출되는 로직들에 의한 비용과 개선방안에 대해 고민한 내용을 정리해볼까 한다. 일단 Slf4j 의 Logger 인터페이스에선 파라미터 바인딩 방식을 제공한다. 이 방식을 사용하면 문자열을 더하는 간단한 연산같은 경우는 피할 수 있다. 문자열 더하기 log.info("안녕하세요, " + name + "님!"); 파라미터 바인딩 log.info("안녕하세요, {}님!", name); 파라미터 바인딩 방식은 무적일까? 만약 여러 ..

Spring 2022.10.24