분류 전체보기

    HTTP/2에 대해

    HTTP/2에 대해

    Http2가 필요해진 배경HTTP/1.1에서 브라우저가 파이프라이닝을 잘 지원하지 않는다.HTTP/1.1은 파이프라이닝 중에 먼저 온 요청이 후속요청을 블로킹한다.(HOL Blocking)브라우저는 HOL Blocking을 해결하기 위해 하나의 도메인에 대해 최대 6개까지의 TCP 커넥션을 제공한다. 6개의 요청을 병렬로 처리할 수 있는 것이다.하지만 최근에 6개도 부족하여 하위 도메인에서 처리하도록 해서 추가적인 커넥션을 확보할 수 있도록 하는 방법(domain sharding) 으로 우회해서 사용된다.HTTP2의 특징Binary Framing Layer기존의 text 형식이 아닌 binary 형식으로 전송한다.하나의 메시지가 frame이라는 작은 단위로 쪼개져서 전송된다.Multiplexingbina..

    HTTP/1에 대해

    HTTP/1에 대해

    HTTP/0.9의 등장HTTP 프로토콜은 HTML이라는 문서를 통신하기 위한 프로토콜로 1966년에 도입되었다. 이가 HTTP/0.9 이다.이 버전은 GET 메소드만 지원하고 헤더나 상태 코드도 존재하지 않는 정말 프로토타입의 HTTP 프로토콜이었다.HTTP1의 도입HTTP/1.0은 POST나 HEAD 메서드가 추가된 형태이다.이러한 메서드의 도입으로 응용할 수 있는 부분이 늘어났지만, 여전히 많은 문제를 가지고 있었다.이러한 문제들을 해결하여 나온 HTTP 버전이 1.1이다.Persistent ConnectionsHTTP는 단일한 요청에 대해 단일한 응답을 주는 프로토콜로 설계되었다.하지만 요청이 빈번해져도 하나의 요청에 대해 하나의 응답만 해줄 수 있기 때문에 불필요한 3-way-handshake를 ..

    좀비 프로세스와 고아프로세스

    좀비 프로세스좀비 프로세스는 자식 프로세스가 먼저 종료되는 상황에서 wait을 호출하지 않았을 경우(SIGCHLD에 대한 시그널 핸들러도 등록되어 있지 않은 경우) 발생한다.좀비 프로세스는 이미 메모리를 반환한 상태이고, 시스템에서 프로세스 테이블 내의 레코드를 점유하고 있는 상태이다.wait좀비 프로세스의 메모리는 이미 반환되어 있어서 크게 문제되지 않지만 PID는 계속 점유하고 있는다. 이때 좀비 프로세스 관리가 되지 않을 경우 시스템에서 할당 가능한 모든 PID를 사용해버려서 더 이상 프로세스를 만들 수 없는 상태가 될 수 있기 때문에 wait을 통해 종료된 자식 프로세스의 PID를 회수한다.고아 프로세스부모 프로세스가 먼저 종료되었을 때 자식 프로세스는 고아 프로세스가 된다.고아 프로세스는 자동으..

    알림서버 개발기 V2

    알림서버 개발기 V2

    알림서버 V2는 예약알림 전송이 가능하도록 세팅했다.예약 알림 정보는 mysql에 영속화 함Spring의 scheduling을 이용해서 5분 마다 처리되지 않은 예약 전송 정보를 모아 브로커에 produce 해준다.HTTP API 처리하기Controller@RestController@RequestMapping("/alert")class PushRegistrationController( val pushRegisterService: PushRegisterService) { val log = LoggerFactory.getLogger(PushRegistrationController::class.java) // ... @PostMapping("/reserved") fun registe..

    알림서버 개발기 1주차

    알림서버 개발기 1주차

    일반적으로 푸시 알림이 필요할 땐 FCM을 사용했다.현업에서 일하시는 분들한테 여쭤봐도 푸시 알림 서버를 직접 만들기보다는 FCM을 만든다고 하셨다.그 이유는 알림 서버는 그때그때 필요한 성능이 다르기 때문에(특정 이벤트 기간에 알림 가용한 알림서버가 아주 많아야 한다.) 스케일 아웃이 편한 FCM을 사용하는게 더 좋기 때문이다.그래서 그런지 직접 푸시 알림서버를 만드는 레퍼런스도 많지 않았고, 때문에 어떻게 만들어야 할지 더 궁금했던 것같다.때문에 푸시 알림서버를 직접 구현해보기로 했다.요구사항요구사항을 정해놓고 이에 맞게 개발을 하려하는데 한 번에 구현하기보다 단계를 나눠서 개발하려한다.특정 인원에게 즉시/예약 발생ex) A가 B에게 즉시/예약 발송을 보낼 수 있어야 함API Request/Respo..

    코틀린으로 Spring Batch 도큐먼트 찍먹하기

    코틀린으로 Spring Batch 도큐먼트 찍먹하기

    예시CSV 스프레드시트에서 데이터를 가져오고 이를 사용자 정의 코드로 변환하고 최종 결과를 데이터베이스에 저장하는 서비스를 구축하기https://spring.io/guides/gs/batch-processing Getting Started | Creating a Batch ServiceA common paradigm in batch processing is to ingest data, transform it, and then pipe it out somewhere else. Here, you need to write a simple transformer that converts the names to uppercase. The following listing (from src/main/java/com/e..

    jest 테스트 도중 만난 트랜잭션 데드락

    jest 테스트 도중 만난 트랜잭션 데드락

    테스트 코드를 돌리던 중 데드락을 발견했다. 데드락 해결하기 결론적으로 큰 문제는 아니었다. jest 자체가 worker를 이용해서 테스트 코드를 병렬적으로 실행하기 때문에 unique key가 걸린 user 테이블에 레코드 락이 걸려서 데드락이 발생하는 것이었다. jest-config.json파일의 maxWorkers를 조정하여 병렬적으로 테스트 하지 않도록 일단 수정해놓았다. { "preset": "ts-jest", "testEnvironment": "node", "moduleFileExtensions": ["ts", "js"], "transform": { "^.+\\.(ts)$": ["ts-jest", { "babel": true, "tsconfig": "tsconfig.json" }] }, "te..

    [BOJ] 11049: 행렬 곱셈 순서

    문제 크기가 N×M인 행렬 A와 M×K인 B를 곱할 때 필요한 곱셈 연산의 수는 총 N×M×K번이다. 행렬 N개를 곱하는데 필요한 곱셈 연산의 수는 행렬을 곱하는 순서에 따라 달라지게 된다. 예를 들어, A의 크기가 5×3이고, B의 크기가 3×2, C의 크기가 2×6인 경우에 행렬의 곱 ABC를 구하는 경우를 생각해보자. AB를 먼저 곱하고 C를 곱하는 경우 (AB)C에 필요한 곱셈 연산의 수는 5×3×2 + 5×2×6 = 30 + 60 = 90번이다. BC를 먼저 곱하고 A를 곱하는 경우 A(BC)에 필요한 곱셈 연산의 수는 3×2×6 + 5×3×6 = 36 + 90 = 126번이다. 같은 곱셈이지만, 곱셈을 하는 순서에 따라서 곱셈 연산의 수가 달라진다. 행렬 N개의 크기가 주어졌을 때, 모든 행렬..