목록전체 글 (531)
개발놀이터
이번 포스팅은 PostgreSQL을 공부하다가 나온 Streaming Replication이 흥미로워서 이참에 다른 RDBMS의 레플리케이션 전략에 대해서 공부해보고 정리해보려고합니다. 이 전략들을 공부하기 전엔 단순히 "RDBMS가 레플리케이션이라는 고가용성 전략이 있고 이걸 이용하면 데이터베이스 서버를 여러대 두면서 부하를 분산시킬 수 있다." 정도만 알고 있었습니다. 이번 기회에 RDBMS의 다양한 전략들을 보면서 조금 더 깊이있는 공부를 한 것 같아서 조금 뿌듯합니다. 한번 정리해보도록 하겠습니다. Replication이란?레플리케이션 (혹자는 리플리케이션이라고도 읽는 것 같습니다) 은 클러스터링에 비해 안정적으로 가용성을 높이면서 데이터베이스 한대로는 감당할 수 없었던 부하까지 분산시킬 수..
요즘 여러 회사들의 장애대응 회고를 보면서 드는 생각은 '요즘 PostgreSQL많이쓰네...' 였습니다. 어떤 회사들은 AWS RDS를 PostgreSQL로 한 회사도 있더라구요. 그걸 보면서 어떤 점이 다른 RDBMS를 대체할만큼 매력적이었을까 의문이 들어서 PostgreSQL에 대해서 간단한 개요수준으로 공부해봤습니다. 이번 포스팅에선 PostgreSQL이 다른 RDBMS와 차별점을 가지는 점에 대해서 포스팅을 할 생각입니다. PostgreSQL이 기존 RDBMS와 뭐가 다를까?제가 아는 PostgreSQL은 Postgres라는 프로젝트에서 시작해 QUEL ('큐엘'이라고 발음하는 것 같습니다) 이라는 언어를 지원한다는 의미에서 PostgreSQL이 되었다고 알고 있습니다. 때문에 발음이 포..
이번 포스팅은 가상 스레드에 대해서 알아보도록 하겠습니다. 공부 주제를 선정한 것은 우아한 기술블로그에서 가상 스레드에 대한 포스팅을 보고 나서 결정하게 되었습니다. 글을 되게 재밌게 잘 쓰셨더군요. 글을 보고 흥미가 생겨서 공식 문서를 정독하면서 공부해봤습니다. 거두절미하고 바로 시작해보죠! 가상 스레드기존 자바에서의 스레드는 OS에서 제공해주는 네이티브 스레드를 그대로 사용했습니다. OS와 JVM사이에 JNI라는 인터페이스를 통해 네이티브 스레드를 사용하였죠. 자바 진영에서 이 네이티브 스레드는 플랫폼 스레드라고 부릅니다. 가상 스레드는 가상 메모리와 닮아있는데요. 가상 메모리에선 프로세스가 일을 처리할 때 실제 메모리 주소를 바라보게 하지 않고 가상 주소를 바라보게 함으로써 프로세스 더 나아가..
제목이 꽤나 자극적이지만 아무리 생각해도 이거만큼 좋은 제목은 떠오르지 않았습니다. 제가 오늘 포스팅을 하게된 계기가 되는 포스팅도 저자분이 "@Transactional의 해로움" 이라고 할 정도이니 말 다한 것이죠. 우선 원래의 글을 올려드릴테니 자세한 내용은 아래의 링크를 참고해주세요! https://channel.io/ko/blog/bad-transactional?fbclid=IwZXh0bgNhZW0CMTEAAR0Atxir0WzSFcBMLmVjDXNLrUoiUl_qX93JPUPoo6EIRqP3irVoc22JEM4_aem_Gt65sDAFShcRmzIYKpla4w @Transactional의 해로움들어가며: 23.12.31 Database outage 새해를 하루 앞둔 12월 31일 자정을 얼마 지나지..
회사에서 리액트를 사용해서 어쩔 수 없이 리액트를 공부해야하는데 나름 재미는 있습니다. 근데 좀 그지같은 부분이 있더군요... 이번엔 포스팅에선 컴포넌트의 생명주기와 렌더링에 따른 useEffect의 호출 순서 그로인해 벌어지는 useEffect의 맹점에 대해서 알아보려고합니다. 그지같은 리액트...제가 원한건 useEffect에서 API를 호출하고 state에 저장한 뒤 state에 저장된 값을 HTML에 써먹고싶었습니다. 기대했던 순서는 다음과 같습니다. 리액트가 useEffect를 호출한다. API가 호출된다. 값이 가져와지고 그 값을 state에 저장한다. 렌더링이 될 때 state 값을 사용한다. 근데 이 그지같은 리액트는 제가 원하는대로 움직여주지 않더군요. 렌더링이 되고 state값..
이번 포스팅에선 리액트의 전역 상태 관리 라이브러리 redux와 recoil에 대해서 알아보도록 하겠습니다. 사용방법은 구글링하면 엄청많이 나오더라구요. 사용법은 이번 포스팅에선 다루지 않도록 하겠습니다. 이번 포스팅에선 hello world 수준으로 redux와 recoil을 써보고 느낀점 그리고 둘의 차이점에 대해서 다뤄보도록 하겠습니다. Redux첫인상redux는 리액트 훅중에 useReducer와 굉장히 유사하더군요. 아니 유사한게 아니고 완전 빼다박았습니다. redux를 조금 경량화한게 useReducer라는 느낌이 들었습니다. 접근성redux는 보일러플레이트가 굉장히 높았습니다. 설정해줘야하는게 굉장히 많았고 hello world 수준의 예제도 시작하는데 한참이 걸렸습니다. 특징하지만 ..
최근 회사에서 리액트를 사용하면서 공부를 해야겠다고 생각이 들었습니다. 리액트의 생명주기나 useState, useEffect, useRef 같은 기본적인 hook은 자세히 공부하지 않고 감으로도 충분히 알겠더라구요. 하지만 회사 서비스에서 사용중인 코드 중에 useReducer라는 hook이 있었는데 이놈을 공부해보았습니다. useReduceruseReducer는 useState를 대체하는 hook으로서 state, dispatch, reducer, initialize 이렇게 네가지로 이루어져있습니다. 기본적인 구조는 이렇게 생겼습니다. const [state, dispatch] = useReducer(reducer, initialize);ex)const [number, sendValue] = ..
넷플릭스나 유튜브를 보면 이런 경험 있으실겁니다. 이렇게 회색바가 앞으로 천천히 진행하는 것을말이죠. 이렇게 하는 이유는 영상의 크기가 어마어마하다보니 이걸 전부 랜더링하고 사용자에게 내려주면 사용자가 꽤나 오랜시간 기다려야하기 때문에 먼저 영상을 내려주고 조금씩 랜더링하는 방식을 사용합니다. 저도 이걸 구현하게 될 줄은 몰랐습니다. 하지만 많은 레퍼런스가 있어서 따라하기 편했고 의외로 쉽게 구현할 수 있었습니다. 이번 포스팅에선 스프링으로 영상 랜더링하고 리액트로 응용하는 것까지 한번 정리하고 공유해보도록 하겠습니다. 스프링으로 영상 랜더링하기@RestController@RequiredArgsConstructor@Slf4jpublic class CouponController { @Val..
JWT를 이용해서 인증을 한다면 중복 로그인에 대한 문제를 반드시 겪게 되는 것 같습니다. 로그인을 한 사용자가 다시 로그인을 한다면 이 로그인을 막아야할텐데 (구현은 stateful하게 하지만) stateless인 JWT 특성상 인증과 관련된 부분이 서버와 격리되어있어 서버에서 처리를 하지 못하는 상황이 발생합니다. 이미 발급된 access token (이하 AT) 를 어떻게 제어할 수 없다는 문제가 발생하죠. JWT 중복로그인 방지이를 해결하기위해 중간 단계를 거칠 수 밖에 없었습니다. 모든 코드를 다 보여드리기엔 양이 많아 개요만 포스팅하려고 합니다. 먼저 일반적인 JWT는 이렇게 인증을 거칩니다. 이건 JWT를 아시는 분들에겐 친숙한 흐름도일 것입니다. 하지만 로그인을 한 사용자가 또 ..
보통 많은 애플리케이션이 JWT를 이용해서 인증을 하고있다고합니다. JWT를 한글이던 영어던 구글링을 해보면 모두같이 JWT를 stateless라고 소개하고 있습니다. JWT를 쓰고 있던 와중 갑자기 문득 생각이 들었습니다. 이게 stateless야? JWT는 정말 stateless인가?왜 이런 의문이 들었냐면 access token (이하 AT)이 만료되는 순간 refresh token (이하 RT)를 확인해서 다시 AT를 재발급 하는 과정에서 의문이 들었습니다. RT를 확인할 때 우리는 이 사용자와 관련된 즉, 이 사용자가 로그인할 때 만들었던 RT를 찾기위해 결국 사용자의 정보를 가지고 RT를 검색합니다. 이 RT는 데이터베이스에 오랜시간 저장되어있으면서 사용자에게 계속 AT를 발급해주죠. ..