본문 바로가기

전체 글

(63)
#065. spring boot 에서 redis를 사용한 방법(Session, template, repository) 보호되어 있는 글입니다.
#064. DB 스키마 작성 기본 개념 1. ID 컬럼 - bigint 를 쓰는 것이 좋다. - postgresql에서는 bigserial을 사용한다(bigint + auto increment) - tinyint 는 1byte 로 2^8을 나타낸다. Boolean 타입과 동일하다. 하지만 DB에서는 Boolean 타입이 다시 1 또는 0으로 사용되므로 컬럼은 tinyint로 정의하고 1 또는 0을 사용하는 것이 더 좋다. 뿐만 아니라 boolean 타입 컬럼은 가능하면 사용하지 않은 것이 좋다. - 이외에 smallint(2 byte), int(4 byte), bigint(8byte)이다. int는 4 byte 이니 2^(8*4) 약 21억까지 표현할 수 있다. ID를 표현하는 것이니 unsigned로 42억까지 표현하는 것도 가능하다. 하지..
#063. 단건 쿼리를 복수형 쿼리로 바꾸기 + map 생성방법 보호되어 있는 글입니다.
#062. 확장함수 + reified 적용하기 보호되어 있는 글입니다.
#061. firebase CM 도입하기 보호되어 있는 글입니다.
#058. 인프라: cloudflare WAF 설정하기 설정이유 sentry로 에러를 로깅하다보면 아래와 같이 악의적인 요청들을 확인할 수 있다. 이전에 1시간 동안 1.1k 가 넘은 악의적인 요청을 처리한 경험도 있었고, 현재는 자비로 서버 비용을 처리하고 있기 때문에 이러한 악의적인 요청들을 프록시 레벨에서 처리하는 것이 중요했다. DNS를 위해 서버 앞단에 cloudflare를 사용하고 있기 때문에 cloudflare의 WAF(Web Application Firewall)를 적용시키기로 결정했다. WAF는 사용자의 웹 브라우저와 웹 서버 사이에서, 들어오는 트래픽을 검사하고 필터링하여 악성 요청과 활동을 탐지하고 차단한다. 설정 방법 크게 ​​Custom rules 와 Rate limiting rules를 설정하기로 했다. Custom rules(사용자..
#057. 쿼리개선: 피드 페이지 로직 개선 문제상황 커뮤니티 피드가 느려서 호출하는 로직에 개선이 필요했다. 문제와 해결 (1) 피드에 필요한 레시피, 베이커리 정보 조회 수정 피드는 여러 종류의 글들이 한 번에 보인다. 이 중에서 일반 글(질문글, 잡담글)과 다르게 베이커리 리뷰, 레시피 리뷰는 베이커리과 레시피 데이터를 불러와야한다. 기존에는 피드를 쭉 보면서 매번 데이터를 불러왔다. 그러다보니 매번 베이커리와 레시피를 조회하기 위해 DB와 커넥션을 맺고 통신 하는 과정이 필요했고 특히 DB 섭이 미국에 있다보니 이 과정의 비용이 컸다. AS_IS val post: Page = postRepository.findAll( pageData.before, pageRequest, ) // post를 순회하며 type이 bakeryReview 이거나 ..
#056. 리팩터링: 멀티스레드 환경에서 null 제거 이해하기 (Smart cast to 'xx' is impossible, because 'xxx' is a mutable property that could have been changed by this time) 문제 일반적으로 node 개발을 할 때는 어떤 값이 있는 지 확인하기 위해서 일반적으로 아래와 같이 if 문으로 분기를 나눈다. file이 없다는 것을 확인하고 나면 그 아래에는 file 값이 존재하는 경우에 대해서만 처리한다. 이게 가능한 이유는 node가 싱글스레드를 지원하기 때문이다. 하나의 스레드가 작업하기 때문에 위에서 아래의 흐름으로 위에서 null을 제거하면 아래에서는 이를 반영해 타입추론을 할 수 있다. async function doSomethingWithFile(fileId: number) { const file = await this.fileQueryRepository.findOne(fileId); if (!file) { throw Error({ message: '존재하지 않는 파일입..
#055. 리팩터링: Promise 객체 다루기 Node가 싱글 스레드로 비동기 처리하는 방법 libuv(리버브)는 이벤트 루프를 기반으로 비동기 I/O를 지원하는 다중 플랫폼 C 라이브러리이다. nodeJS의 비동기 논블로킹인데, 이러한 비동기 논블로킹 작업을 위해 libuv를 사용한다. 리버브는 I/O 관련 블로킹 작업을 처리하여 이벤트 루프(싱글 스레드)가 blocking되지 않게 한다. I/O 관련된 작업(http, Database CRUD, filesystem) 등 블로킹 되는 작업들을 백그라운드(OS 커널 혹은 libuv의 thread pool)에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달한다. 이렇게 블로킹 되는 작업을 넘기는 것을 'offloading(오프로딩)' 이라고 한다 이벤트 루프는 싱글 스레드이고, 블로킹 I/O 관..
#054. 코프링: spring-event 로 pub-sub 알림 시스템 만들기 신규 유저 또는 유저가 작성한 컨텐츠가 있으면 이를 디스코드 알림으로 받고 싶어 자동화 시스템을 구성했다. 이전 에러 알림 자동화 작업(링크)을 하면서 클라우드 플레어 워커가 디스코드 웹훅을 관리하도록 설정했기 때문에 스프링이 클라우드 플레어를 보고 워커가 이를 디스코드 웹훅 모양으로 만들어주도록 했다. 이벤트를 어떻게 발생시킬 지 고민을 했는데, - 어드민 성격이어서 알림은 핵심적인 로직 또는 실행이 보장 할 필요는 없다. - 회원가입 로직은 알림을 publish만 하고 이벤트를 받고, 처리하는 로직은 이벤트와 관련된 모듈이 처리한다. (pub-sub구조) - 알림 보내기를 동기적으로 처리할 필요는 없다. 이 조건들을 만족시키는 적정 기술로 sprinb event가 있어 사용했다. spring-even..