전체 글 60

JVM(3) - jstat으로 GC 동작 관찰하기

JVM(2)에서 G1GC의 동작에 대해 알아보았다. HotSpotVM에는 이러한 동작을 샘플링해서 조회할 수 있는 jstat이라는 내장 도구가 있다. HostSpotVM이 내부적으로 수집하는 GC 및 Heap 통계를 조회할 수 있다.실험적인 기능이고 GC 유형과 세부 단계는 알 수 없지만, 별도 설치없이 간편하게 GC 및 Heap 영역 상태를 모니터링할 수 있기에 가벼운 모니터링에 사용되고있다. 조회를 위해서는 jcm를 통해 process id를 먼저 찾고, 그후 pid를 기준으로 모니터링을 시작하면 된다.% jcmd -l 74208 jdk.jcmd/sun.tools.jcmd.JCmd -l73529 com.example.gc_test.GcTestApplication73484 com.intellij.ide..

JVM(2) - G1GC의 동작과정

Java는 C와 달리 개발자가 메모리를 직접 할당하고 해제하지 않는다. 대신 참조를 잃은 객체가 Garbage collector에 의해 주기적으로 삭제되는데, 이 과정에서 모든 어플리케이션 스레드를 멈추는 stop-the-world 방식을 사용하기에 GC가 일어나는 것은 API 응답 성능에 악영향을 미치게될 수 있다. 보통 모니터링을 수행한다고 할 때 CPU, Memory, 쿼리시간 정도를 지표로 두고 관찰해왔는데, 인스턴스 생성으로 인한 잦은 GC가 성능 저하를 일으킬 것이라고 예상되는 경우 추가로 관찰해도 좋겠다는 생각이 들었다. GC가 일어나는 시점, 방식 그리고 모니터링 방식까지 정리해보자. 1. JVM Heap의 기본구조자바에서 ArrayList, Integer와 같은 참조타입 객체를 생성하면,..

JVM(1) - JVM 작동 과정

Spring Boot로 서버를 운영하다가 배포과정에서 "Spring은 특성상 웜업이 오래걸린다" 하는 이야기를 들었다. Spring이 싱글톤 빈을 등록하여 사용한다는 것을 알고 있었기에 언어 문제라기보다는 프레임워크 특성이 크다고 생각했는데, 이번에 JVM 동작과정을 살펴보면서 JVM 특성도 이러한 성능 악영향에 영향을 미쳤겠다는 생각이 들어서 정리해보려고 한다. 1. .class 파일은 기계어가 아니다코딩테스트 등을 준비하면서 단일 자바파일을 커맨드로 처리하다보면, java는 .class 형태의 컴파일 결과물을 생성하고, 이를 실행하다는 것을 알게된다.$ javac Main.java$ ls >> Main.class$ java Main>> Hello World 여기서 .class 확장자는 Java By..

sqlite3 SQL Injection 방어 옵션

SQLite 사용시 ORM 활용 없이 네이티브 쿼리를 작성하기 위해 sqlite3 모듈을 사용할 때가 있다.이런 결정에 가장 크게 영향을 받는 커넥션 관리, object mapping에 대한 고려는 충분히 했겠지만, SQL Injection은 트래픽과 상관없이 문제가 되므로 이 모듈에서 어떤 기능이 지원되는지 알아야할 필요가 있다. 따라서 sqlite3 모듈에서 제공하는 플레이스 홀더 기능과 해당 기능이 SQL Injection을 어떻게 방어하는지에 대해 알아보자. 1. SQL Injection 공격법사용자에게서 input을 받아서 검색 결과를 반환하는 아래와 같은 함수를 예시로 들어보자.def find_by_id(input) -> dict: conn = sqlite3.connect('my_sqli..

[MCP] JSON-RPC란

예전부터 gRPC를 두고 혁신이다, 아주 유용하다 라는 이야기는 많이 들어왔지만 뭘 위한 프로토콜인지 이해하기는 어려웠다.이번에 MCP 프로토콜에 좀 더 단순한 형식의 JSON-RPC가 포함되면서 RPC의 유용함을 깨닫고 있다. 어떤 강점이 있는지, 어떤 스키마를 사용해야하는지 정리해보려고 한다. 1. RPC와 HTTP는 상반되는 개념이 아니다JSON-RPC, gRPC는 모두 HTTP를 기반으로 동작할 수 있다.HTTP POST를 사용해서 통신을 하며, body에 동작을 정의하는 식으로 활용한다. 그렇다고 HTTP 외의 통신방식을 사용할 수 없는 것은 아니다. 표준 입출력(stdio), WebSocket, raw TCP 스트림 등으로 JSON-RPC 메세지를 주고받을 수 있다. RPC 프로토콜은 메세지를..

표준 2025.07.29

MySQL 파티셔닝이란

* 모든 설명은 InnoDB 스토리지 엔진 기준으로 작성했습니다. 프로젝트에 스토리지 엔진이라는걸 설정한 적이 없다면, InnoDB가 기본값으로 적용되어있을 것입니다. 파티셔닝이란? 데이터의 특정 칼럼값을 기준으로 데이터를 분류하고, 분류한 데이터들을 서로 다른 물리적 파티션에 할당하는 것을 말한다.샤딩과 달리 나눠진 데이터가 동일한 데이터베이스 내부에 존재하므로 아래와 같은 편리함이 있다.- MySQL 서버 라우팅을 위한 추가 로직이 필요없다.- 파티션이 다른 데이터간에도 조인이 가능하다. (그렇다고 효율적이진 않다)똑같이 인덱스를 통해 쿼리를 처리하더라도, 데이터를 여러 파티션으로 분리하므로 인덱스 트리의 크기도 함께 작아지고 I/O의 범위가 작아지는 효과가 있다.다만 이러한 Partition pru..

Database/MySQL 2025.05.11

B tree 삽입, 삭제 알고리즘과 DB 인덱스

문제상황DB 칼럼에 시간 칼럼을 넣는것을 잊어서 뒤늦게 createdAt 필드를 추가하고, 기존 필드는 null로 채웠다.createdAt을 통한 쿼리가 빈번하므로 아래처럼 신규 인덱스를 함께 만들어서 쿼리 효율을 높이기로 했다.ALTER TABLE mytableADD COLUMN createdAt DATE NULL;CREATE INDEX idx_createdAt ON mytable (createdAt);근데 B tree와 비슷한 BST 트리를 생각하면, 시간순으로 데이터가 들어오는 경우에는 트리가 점점 한쪽으로 치우치게 되어 O(n)에 가까운 끔찍한 효율성을 가지게되는거 아닌가 하는 생각을 했다.B tree에서 삽입 삭제는 어떻게 관리되고, 시간 칼럼에 대해 인덱스를 만들때 골고루 들어올 때 보다 불리..

AWS EC2에 MySQL 배포하기

도커 컴포즈로 서버랑 같은 컴퓨터에 DB를 띄우려고 씨름하다가, 내가 왜 확장성도 없이 이런짓을 하나 싶어서 DB를 별도 인스턴스로 분리하기로 결정했다. 그리고 DB 설정 오류 잡는데에 3일이 걸렸다.한번 설정 꼬이면 에러가 산으로 가서 인스턴스를 몇번을 지웠다 만들었는지 모르겠다.삽질을 하며 알아낸 것은 아래 스텝을 무조건 지켜야한다는 것이다. 1. EC2 인스턴스 생성Amazon Linux 쓰면 괜히 꼬이는 것같아서 ubuntu 이미지를 사용하였다.그리고 도커를 사용할 계획이라면, t2.small 이상을 선택해야 시스템 오버헤드를 감당하는 것 같다. 좀 내리면 네트워크 설정이 나오는데, 우측 상단의 편집을 눌러서 인바운드 / 아웃바운드 모두 IP, 주요포트를 열어주자. 인바운드 주요포트- 22 : 우..

프레임워크/AWS 2025.03.27

[카카오 2024] 산 모양 타일링 python

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/258707공식 해설 : https://tech.kakao.com/posts/610 문제 설명세모를 쌓아 만든 산모양 타일이 있다.각 산에는 머리(△)가 있을 수도 있고 없을 수도 있다.tops[i] = 0 이면 i번째 산은 머리(△)가 없고, tops[i] = 1 이면 i번째 산에 머리(△)가 있는 것이다.위 그림같은 경우 n = 3, tops = [1, 1, 0, 1] 로 입력값이 주어진다.  이 타일을 마름모 모양 타일과 정삼각모양 타일 두가지로 덮는 경우의 수를 구하면 된다. 각 타일은 회전할 수 있다. 해법처음엔 재귀로 완전탐색을 해볼까 했는데, 각 방법이 유일하다는걸 증명하려면 지도..

Context 없이 테스트 하기 : mockito 사용 예시

테스트가 어려웠던 이유 - 종속성 관리별로 어렵지 않은 경우 바로 아래로 가시면 됩니다.더보기더보기나의 경우 테스트를 선뜻 시작하기 어려웠던게 mocking이 가능하다는걸 몰랐기 때문이었다. 아래처럼 HiService라는 복잡한 클래스가 있다고 해보자.유저 이름을 넣으면 그 이름을 넣은 인사카드 gif 이미지를 반환하는 그런 서비스다.class HiService( // 특징 : DB에서 UserEntity를 불러온다. private val userRepository: UserRepository, // 특징 : UtilBean에 method가 백개쯤 있음 곧 분리될 예정 private val utilBean: UtilBean, // 특징 : API 호출 건수대로 돈받는 유료 ..