목록전체 글 (68)
코딩하는 오징어
대략 2년 만에 글을 쓰기 위해 키보드를 타이핑해 본다. 그동안 주로 연말에 작성하는 회고록이나 지식을 전달하기 위한 정보성 및 트러블 슈팅 경험을 위해 글을 작성해 왔다. 하지만, LLM(이하 AI로 명칭 하겠다.)의 발전으로 인해 지식 전달을 위한 글은 stack overflow의 감소된 트래픽처럼 사람들이 많이 찾지 않고 있기에 TIL Repository에 정제되지 않은 상태로 업데이트하거나, 개인 Notion에만 정리를 하게 된 것 같다. 글을 쓰는 것도 운동처럼 관성인 것 같다. 한 번 놓게 되면, 글을 쓰기 위해 다시 시간을 내어 자세를 잡기까지 꽤나 큰 준비가 필요하다. 필자도 이 글을 쓰기 위해 손가락 스트레칭을 2년 정도 했다 ㅋ. 요즘 너무 많은 사람들이 AI가 주는 환상으로 인해 잘못..
Netty는 ByteBuf를 data structure로 이용하고 있으며 ByteBuf는 RefereneCount (ReferenceCounted interface를 상속하고 있다.)를 통해 memory를 release할 지 결정한다. 여기서 memory를 release를 한다는 건 어떤 의미일까? java는 garbage collector가 메모리를 알아서 관리해줄텐데 잘못된 reference count 관리에 의해서 memory leak이 발생한다는 건 어떤 의미일까? 그러기 위해서는 먼저 Java NIO ByteBuffer에서 생성된 buffer가 더 이상 참조되지 않을 때 어떤 방식으로 메모리가 수집 되는 지 살펴보아야한다. ByteBuffer.allocate() 를 이용하여 heap buffer..
Asynchronous - Non Blocking framework가 화두가 된지 꽤 오랜 시간이 흘렀다. WebFlux, Akka, Node.js, Vert.X 같은 다양한 Asynchronous - Non Blocking 모델을 제공하는 Web Framework가 등장하였고, Spring 을 사용하는 다수의 팀들은 WebFlux를 선택하여 Blocking 모델인 WebMvc로 부터 벗어나 Asynchronous - Non Blocking을 지향하고 있다고 이야기하고 있다. 하지만 우리는 정말 Thread를 block 시키지 않도록 코드를 작성하고 있을까?? Asynchronous와 Non Blocking에 대한 이야기 부터 간단하게 소개하고 현재 우리는 어떤 방식으로 Asynchronous - Non..
리소스 할당 (Cpu & Memory) Pod안에서 실행되는 컨테이너가 사용하는 리소스를 제한하지 않으면 Node의 리소스가 무분별하게 사용될 수 있다. 여러 Pod이 존재한다면 Qos 클래스(BestEffort, Burstable, Guaranteed)에 따라 필요한 만큼의 리소스를 얻지 못할 수도 있다. requests, limits를 모두 설정하지 않았다면 리소스 할당 순위에서 뒤로 밀려 실행중인 Pod이 kill 당할 수도 있다. Pod에 리소스 설정을 하는 방법은 간단하다. 다음과 같이 template에 requests와 limits를 설정하면 된다. apiVersion: v1 kind: Pod metadata: name: play-k8s-app spec: containers: - name: p..
환경정보 OS: macOS Big Sur 11.5.2 VirtualBox: 6.1.26 Ubuntu: 20.04.3 LTS Desktop VirtualBox에 Ubuntu 올리기 가상머신을 새로 만든 후 적절한 spec을 선택 후 다운로드 한 ubuntu 이미지를 설정한다. memory: 2GB, 디스크: 20GB, cpu: 2개 네트워크를 어댑터 브리지로 설정한 후 가상 머신을 실행시킨다. ubuntu를 설치했다면 필요한 tool들을 설치한다. sudo apt-get update sudo apt-get install net-tools sudo apt-get install vim 가상머신과 host 사이에 clipboard를 공유하기 위해 다음과 같은 설정을 해준다. VirtualBox에서 가상머신 설정..
컴파일 언어를 이용하는 개발자들은 코드를 작성하고 해당 코드를 컴퓨터에서 실행시키기 위해 빌드라는 작업을 한다. 빌드라는 작업은 소스 코드를 컴파일 할 뿐만아니라 dependency를 추가해주고 실행가능한 bundle(묶음 파일)을 생성한다. java에서는 jar파일 또는 war파일이 될 수 있다. 이러한 결과물을 우리는 Artifact(인공물)라고 부른다. 개발자가 필요한 라이브러리와 소스 코드의 classpath를 직접 명시해주고 Artifact를 생성할 수 있지만, 대개의 경우 Maven이나 Gradle 같은 빌드 툴을 이용하여 해당 작업을 자동화한다. Maven은 pom.xml에 Gradle은 build.gradle 파일에 빌드 작업을 각 빌드 툴에서 제공하는 명세 혹은 DSL로 작성한다. 그러면..
spring web mvc를 이용하여 서버 어플리케이션을 개발한다면 @Transactional을 이용하여 트랜잭션을 적용할 것이다. @Transactional이 적용된 메서드는 다음과 같은 flow로 메서드가 실행된다. (PlatformTransactionManager, DataSource 인터페이스에 대한 자세한 설명은 이 글에서 다루지 않는다.) 1. CglibAopProxy.DynamicAdvisedInterceptor.intercept(...) 2. TransactionInterceptor.invoke(...) 3. TransactionAspectSupport.invokeWithinTransaction(...) 4. TransactionAspectSupport.createTransactionIfN..
개발자는 어플리케이션을 개발 할 때 많은 것들을 고려한다. 코드를 작성하고 나서는 비즈니스 로직이 정확한 결과를 산출해내는지 검증하기 위해 테스트 코드를 작성하기도 하며, 성능 테스트를 통해 시스템에 병목 지점은 없는지 등을 확인한다. 어플리케이션이 정상적으로 시작되고 실행이 지속되는지는 매우 중요하다. 하지만 어플리케이션이 정상적으로 종료되는지도 굉장히 중요하다. 이번 글을 통해서 JVM 플랫폼 위에서 실행되는 어플리케이션이 정상적으로 종료되기 위한 여러 내용들을 소개하려고한다. 프로세스 종료 먼저, 프로세스를 종료시키기 위해 프로세스로 전달하는 시그널에 대해서 살펴보자. 시그널이 전달되면 시스템은 다음과 같이 동작한다. 시그널에대한 핸들러는 커널에 프로그래밍 되어 있으며 프로세스가 시그널을 받게 되면..
