본문 바로가기

Programming

(110)
Graceful Shutdown (with nginx & spring boot) Graceful Shutdown ? 정확한 개념에 대해서는 말들이 많지만, 간단히 말해서 현재 들어온 요청을 모두 수행하고 우아하게(?) 종료된다는 개념이다. 예를 들어, 내가 어떠한 상품을 구매하기 위해 결제 요청을 했고, 서버가 결제를 처리하고 있는데, 뭔지 모르는 이유로 서버가 종료될 때 이미 처리하고 있는 결제 요청은 모두 처리하고 종료된다는 것을 의미한다. Graceful Shutdown을 이해하기 위해서는 SIGTERM, SIGKILL에 대한 이해도 필요하다. SIGTERM과 SIGKILL의 이해를 돕기 위한 유명한 그림이 있다. SIGTERM은 위 그림처럼 자식에게 가기 전에 인사할 시간을 준다. 쉽게 말해, 서버에게 종료될 시간을 주는 것이다. SIGKILL은 위 그림처럼 인사할 시간도 안..
Rust Ownership (Rust만의 특별한 메모리 관리법) Ownership은 Rust만의 특별한 메모리 관리법이다. 모든 프로그램은 실행중인 동안에 어떤 방법으로든 컴퓨터의 메모리를 관리해야한다. 어떤 언어는 GC를 이용해서 사용하지 않는 메모리를 찾아 지속적으로 해제해준다. 또 다른 언어는 프로그래머가 직접 메모리를 할당하고 해제하며 관리한다. Rust는 Ownership이라는 Rust만의 특별한 메모리 관리법을 사용한다. 쉽게 말해서 개발자 입장에서는 GC보다 복잡하지만 더 성능이 뛰어난 GC(?)라고 보면 된다. (C, C++로 주로 개발하던 개발자는 Rust Ownership에 혁신을 느낄 것이며... GC로 동작하는 언어에 익숙하던 개발자는 오히려 개발할 땐 불편함을 느낄 수 있다) 하지만 중요한 포인트는 GC의 런타임 도중 발생하는 오버헤드의 리스크..
Rust란 ? (Rust 기본 개념) Rust? Rust는 모질라 리서치에서 개발한 범용 프로그래밍 언어이다. 안전하고, 병렬적이며, 실용적인 언어로 디자인되었다. Rust는 2020 stack overflow에서 가장 인기있는 언어로 꼽혔다. https://insights.stackoverflow.com/survey/2020#most-loved-dreaded-and-wanted Rust가 인기있는 이유가 무엇일까? 1. 성능: Rust만의 효율적인 메모리 관리법으로 성능이 뛰어나다. 저수준 시스템 레벨 언어 C/C++를 대체할 수 있다. 2. 신뢰 3. 생산성 Rust로 웹 개발? Rust 기반 웹프레임워크로 Actix Web, Rocket 등이 존재한다. https://www.techempower.com/benchmarks/ 해당 사이트..
[Mysql] IN쿼리가 인덱스를 타지 않는 현상 실 운영 환경을 Mysql5.6 -> 5.7로 업그레이드 했을 때 발생하던 현상이였다. 분명히 같은 IN쿼리지만, 5.6에서는 인덱스를 타던 것이 5.7로 넘어오면서 인덱스를 타지 않게 된 것이다. 정확히 말하자면, 아예 안타는 것은 아니고 id IN (대략 만개이상) 의 경우에 인덱스를 타지 않았다. 즉, 특정 개수 이상의 ID를 IN쿼리 안에 넣으면 인덱스를 타지 않았다. 결론부터 말하면 쿼리 자체를 메모리에 올리는 것 또한 메모리 제한이 있었다. 그 제한은 range_optimizer_max_mem_size 옵션을 통해 확인할 수 있다. > 참고링크 : https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#range-optimization..
Kafka Streams(카프카 스트림즈) 란? Kafka는 본래 메시지를 다른 프로세스나 애플리케이션에 전달하기 위해 사용되었지만, 카프카의 강력한 성능으로 인해 연속된 메세지인 스트림을 처리하는데도 점차 사용되기 시작했다. Stream vs Batch 스트림 프로세싱은 데이터들이 지속적으로 유입되고 나가는 과정에서 데이터에 대한 분석이나 질의를 수행하는 것을 의미한다. 데이터가 프로그램에 도달하자마자 처리를 하기 때문에 스트림 프로세싱은 실시간 분석이라고 불리기도 한다. 기존에 대규모 데이터를 처리하기 위해 배치를 사용하는 경우가 많다. 배치 처리는 이미 저장된 데이터를 기반으로 분석이나 질의를 수행하고 특정 시간에 처리하는 특징을 가지고 있다. 빅데이터나 머신러닝이 붐이 일기 전, 대부분 기업에서 수행되는 데이터 분석은 배치 처리 형태였다. 하지..
[Spring] REQUIRES_NEW과 Exception (REQUIRES_NEW는 정말 독립적인가?) 흔히들 많이 사용하고 기본적으로 작동하는 것이 Propagation.REQUIRED 전파 레벨을 사용한다. 그 다음은 여러 이유로 REQUIRES_NEW 전파 레벨이 사용되는 편인데, 이 둘의 개념을 먼저 간단히 살펴보자. Propagation.REQUIRED 트랜잭션이 존재하면 기존의 트랜잭션이 전파된다. 만약 존재하지 않는다면 트랜잭션을 새로 시작한다. Propagtion.REQUIRES_NEW 매번 새로운 트랜잭션을 생성한다. 그렇다면 REQUIRES_NEW는 부모 트랜잭션에서 완전 독립적인 트랜잭션을 생성하는가 ? 꽤나 많은 곳에서 REQUIRES_NEW는 부모와는 아예 독립된 공간을 생성하는 것으로 표현되고 있고 나 역시 그렇게 알고 있었다. 독립된 공간은 부모 트랜잭션과 새롭게 생긴 자식 트랜..
로컬에서 Docker를 이용하여 Kafka 서버 환경 구축하기 Kafka 환경을 구축하기 위해 Kafka 서버를 Docker를 이용해 띄어보자 사실 상 Kafka를 다운로드 받아 그냥 로컬에 바로 띄우는게 가장 간단한 방법이겠지만, Docker를 한번 사용해봐야겠다 라는 마음으로 Docker에 설치하도록 했다. 개발 환경등 신경쓸 필요도 없고, 로컬 환경을 깔끔하게 유지한다는 장점이 있을 수 있겠다. 아래 절차는 Mac OS 환경 기준이다. Docker 설치 Mac OS의 경우에는 Docker 설치는 무척 간단하다. (링크 : https://www.docker.com/get-started) Get Started with Docker | Docker Learn about the complete container solution provided by Docker. Fi..
나만의 코딩컨벤션 작성하기(Spring, Java, Naming, 구조, 코드 작성법 등) 현재(2020. 04) 나만의 코딩 컨벤션을 기록으로 남겨 계속해서 보완해나갈 생각이다. 물론 회사에서 하는 작업물은 나의 스타일과 안맞더라도 회사의 코딩컨벤션을 따르는 것이 맞다. 하지만, 회사의 컨벤션을 그냥 무심코만 따라하기만 하면 잘못된 스타일이 몸에 밸수도 있고 나의 스타일이 그냥 회사에 맞춰지게 된다. 나만의 코딩 컨벤션을 기록으로 남기고 꾸준히 보완해나갈 생각이다. 코딩컨벤션이란 어느 블로그에서 본 글인데, 가장 코딩컨벤션을 쉽게 표현한 것 같아 인용해서 설명하면 다음과 같다. 프로그래밍 언어는 한글, 영어, 일본어 등과 흡사하다. 한글에도 지역마다 사투리가 존재하고 그 지역에서 원활한 소통을 하려면 그 지역의 사투리를 잘 배우고 사용해야 한다. 이는 프로그래밍 세계에서도 마찬가지이다. 코딩..