본문 바로가기

Memo

(10)
웹은 고전적인 검은 백조였다. 실용주의 사고와 학습을 다시 읽으면서 좋아했던 부분이 기억이 나서 그 부분을 정리해 봤다. 5장의 1절 부분 인지적 편향 관련 글인데 평소에 관심이 있던 내용들이고 내가 좋아했던 나심 탈레브가 쓴 블랙스완을 인용해서 기억에 더 남았다. 어떻게 보면 내가 이렇게 이 부분만 쓰 고 정리하는 것도 확증 편향의 사례라고 볼 수 있지 않을까 먼저 표상적 축소 오류를 간단히 정리하면 책에서 계속 이야기한 L모드(언어, 분석, 상징, 추상, 추론, 논리, 선형)는 복잡한 물체나 시스템을 나타내는 간편한 표상을 좋아함. 그러면 어쩔 수 없이 미묘한 부분은 놓치게 되고 때떄로 문제의 본질을 놓칠 수 있음. 예측 실패 표상적 축소로 인해 생기는 유해한 문제가 있음. 원래 뇌가 현실의 복잡성을 이해할 수 있는 방법은 표상으..
선착순 처리 기능 구현에 대한 고민 '요청을 선착순으로 처리하는 기능을 설계한다면 어떻게 할 것인가' 최근에 면접을 보면서 받았던 질문 중 하나다. 그때 당시에는 바로 든 생각은 단순하게 '트랜잭션 처리해서 결과를 보장하도록 구현하면 되지 않나'라고 생각했던 거 같다. 이걸 어떤 식으로 접근해야 할지 감이 안 와서 제대로 답은 못했고 그냥 '락 걸어서 처리하면 되지 않을까'라는 식으로 대답했다. 면접을 봐주셨던 개발자분께서 설명해 주시면서 레디스 관련 이야기도 나왔는데, 뒤에서 이 방식에 대해 정리를 하려고 하고, 그전에 간단하게 생각했던 DB 트랜잭션을 사용해서 구현하는걸 좀 더 구체적으로 정리해보려고 한다. DB 트랜잭션 사용 처음 생각했을 때는 단순하게 요청 들어오는 대로 즉시 하나씩 처리하면 되지 않을까? 락걸면서?라고 생가했지만 ..
GKE 기반 쿠버네티스와 GitHub Actions으로 배포 자동화 언제 한번 프로젝트를 하게 된다면 쿠버네티스로 배포 한번 해야겠다고 생각하고 있었는데, 이번에 Meet-Up-Spot 개인프로젝트 하면서 경험 삼아해 봤다. 목표 자체가 쿠버네티스 개념적인 공부라기 보단 서비스 배포 자동화를 클라우드 환경을 사용해서 하는 것이었기 때문에 필요한 것들만 최소한으로 적용시켜 보았다. 아예 처음부터 CI/CD를 적용해 본 적이 없어서 배포도 좀 걸릴 거라 생각하긴 했는데, 생각보다 오래 걸렸다. 하면서 좀, 트러블 슈팅이라 할거 까진 없지만, 시간이 걸렸던 것들 위주로 정리해보려고 한다. 계획했던 구조는 다음과 같다.  사실 쿠버네티스 매니패스트 파일 작성하는 부분도 처음 하는 작업이여서 오래 걸리긴 했지만 워낙 찾아보면 자료들이 많아서 내가 계획했던 정도는 쉽게 작성한 거..
외부 API 결과에 캐싱 도입 Meet-Up-Spot이라는 프로젝트를 하면서 레디스로 캐싱 메커니즘을 도입한 과정을 기록하려고 한다. 우선 진행하는 프로젝트의 메인 기능이 여러 주소의 중간 지점을 계산해 여러 장소를 추천하는 것이다 보니. 중간 과정에서 몇 번 Google Maps API 요청을 보낸다. 그래서 왜 캐싱을 하려고 하냐면 그냥 생각해 봤을때는 일단 비용적인 문제도 있기 때문에 캐싱하면 좋을 거 같다고 생각함. 또한 api 요청을 줄이면 다른 로직들은 복잡하지 않아서 충분히 성능면에서 나아질거라 판단했다. 그리고 자주 사용될 엔드포인트가 장소 추천일 텐데 , 이게 중간에 좌표를 기준으로 Google Maps API 요청을 보냄, 사실 좌표라는 게 딱 맞기가 힘듦. 근데 그 주변 좌표들을 요청하면 어차피 거기서 거기엔 장소..
서비스 계층과 도메인 서비스 흔히 말하는 서비스 계층은 애플리케이션 서비스 계층인데 외부에서 오는 요청을 처리해 연산을 오케스트레이션한다. 즉 서비스 계층이 다음과 같은 간단한 단계를 수행하여 애플리케이션을 제어한다는 의미. 데이터베이스에서 데이터를 얻는다. 도메인 모델을 업데이트한다 변경된 내용을 영속화 한다. 비즈니스 로직과 분리하면 프로그램을 깔끔하게 유지하는 데 도움이 된다. 두번째는 도메인 서비스. 도메인 모델에 속하지만 근본적으로 상태가 있는 엔티티나 값 객체에 속하지 않는 로직을 부르는 이름임. 여기서 예를 들면 쇼핑카트 어플리케이션에서 세금 관련 규칙을 구현한다면. 이건 쇼핑 카트 업데이트 작업과는 별개다. 중요한 부분이지만 세금만을 위한 영속적인 엔티티를 사용하는 것은 바람직하지 않음. 대신 상태가 없는 TaxCal..
저장소 패턴 저장소 패턴은 데이터 저장소를 간단히 추상화한 것으로 이 패턴을 사용하면 모델 계층과 데이터 계층을 분리할 수 있다. 내가 기존에 알기로는 레포지토리 패턴은 데이터 액세스의 추상화를 제공하는 반면, ORM은 객체와 데이터베이스 테이블 간의 매핑을 담당한다고 알고 있는데, 이 둘의 구현 자체도 의존성을 역전시키는 형태로 구현하는 방식에 대해 알게 되었다. 예전에 저장소 패턴이랑 ORM에 대해서 알게되었을때는 어차피 ORM이 영속성을 추상화 하는데 뭐하러 저장소 패턴을 또 쓰지? 뭔가 캡슐화를 통해 유연하게 만들기 위해서 계층을 한번더 만드나 보다~ 라고만 생각하고 넘어 갔었다. 근데 이 책에서 구체적으로 왜 구현하는지 그리고 어떻게 구현하는지가 나와서 이해하는데 많은 도움이 되었다. 더군다나 저장소 패턴을..
React. UseMemo, useCallback, React.Memo 오랜만에 리액트 정리하다가 프로젝트를 보는데 급하게 썼던 Hook들이 있어서 간단하게 글로만 정리를 하려 한다. 예시는 및에 참고글을 보면 좋을 거 같다. 일단 3개다 최적화를 위해서 사용된다. useMemo같은 경우 값을 저장했다가 다시 연산하지 않고 저장한 값을 쓰는 건데, 흔히 자주 듣는 memoized 개념이랑 같다. useMemo의 첫번째 파라미터에는 기존에 연산할 함수를 넣어주면 되고 두 번째는 deps배열을 넣어주면 되는데, 여기 있는 값이 바뀌면 함수를 호출해서 값을 새로 계산하고 아니면 기존에 저장한 값을 쓰는 거다. useEffect랑 비슷한 거 같다. 보통 렌더링이 될때마다 상관없는 함수들이 굳이 계속 호출되는데 이럴 때 useMemo를 써서 값이 바뀌지 않으면 위에서 말한 거처럼 호..
TS. 덕타이핑 타입스크립트를 공부하면서 Duck typing 이라는 개념이 나와 정리해 보려한다. 간단히 덕 타이핑의 정의를 보자. 위키피디아에서 덕 타이핑을 다음과 같이 정의한다. 컴퓨터 프로그래밍 분야에서 덕 타이핑(duck typing)은 동적 타이핑의 한 종류로, 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다. 클래스 상속이나 인터페이스 구현으로 타입을 구분하는 대신, 덕 타이핑은 객체가 어떤 타입에 걸맞은 변수와 메소드를 지니면 객체를 해당 타입에 속하는 것으로 간주한다. “덕 타이핑”이라는 용어는 다음과 같이 표현될 수 있는 덕 테스트에서 유래했다. 만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다. 다음은 '오브젝트' 책에서 기능적..