Ruby JSON gem API 개선 및 deprecated 안내

2025-08-09

이 글에서는 Ruby JSON gem 유지보수자가 gem API를 개선하고 deprecated 하는 이유와 세부 사항을 설명합니다. 주요 내용은 다음 세 가지입니다. 첫째, 안전하지 않은 `create_additions: true` 옵션이 deprecated되었으며, `JSON.unsafe_load` 또는 옵션을 명시적으로 전달하는 것이 권장됩니다. 둘째, 중복 키에 대한 기본적인 허용 동작이 deprecated되었으며, `allow_duplicate_key: true` 옵션을 사용하는 것이 제안됩니다. 셋째, `Object#to_json` 메서드는 deprecated되지 않지만, 더 안전하고 유연한 JSON 직렬화 방식을 제공하는 새로운 `JSON::Coder` API가 도입되어 전역 동작 및 구성 문제를 해결합니다. 저자는 API를 deprecated하는 결정에는 장단점을 신중하게 비교해야 함을 강조하고, 새로운 API는 보안을 향상시키고 오류 위험을 줄인다고 설명합니다.

더 보기
개발

Ruby Ractor 성능 향상: 클래스 변수 경합 해결

2025-05-28

이 글에서는 Ruby Ractor가 클래스 인스턴스 변수를 처리할 때 발생하는 성능 병목 현상을 자세히 살펴봅니다. 전역 인터프리터 잠금으로 인해 여러 Ractor가 동시에 이러한 변수에 접근하면 성능이 크게 저하됩니다. 저자는 클래스 인스턴스 변수의 내부 구현을 면밀히 분석하고 객체 위임을 사용하여 잠금 경합을 해결하는 방법을 제안합니다. 이를 통해 마이크로 벤치마크에서 약 3배의 성능 향상을 달성했습니다. 또한, 이 해결책은 새로운 네임스페이스 기능으로 인해 도입된 버그와 성능 저하 문제도 예기치 않게 수정합니다.

더 보기
개발

Ruby Ractor 성능 향상: `object_id` 병목 현상 해결

2025-04-27

Ruby의 Ractor 동시성 모델은 전역 잠금으로 인해 성능이 제한됩니다. 이 게시물은 과거 설계 결정 및 가비지 컬렉션 개선으로 인해 발생하는 `object_id` 메서드로 인한 성능 병목 현상을 자세히 살펴봅니다. `object_id` 구현을 최적화하여 전역 해시 테이블 조회 대신 객체 내에 직접 저장함으로써 저자는 Ractor 성능을 크게 향상시켜 JSON 벤치마크에서 속도가 두 배가 되었습니다. 특수 객체 유형 처리와 같은 과제가 남아 있지만 이 작업은 Ractor를 진정으로 병렬화하기 위한 중요한 단계입니다.

더 보기
개발

데이터베이스 프로토콜 개선: 개발자 경험 관점

2025-04-05

이 글에서는 SQL 데이터베이스 클라이언트 프로토콜, 특히 MySQL과 PostgreSQL의 결점을 논의합니다. 저자는 연결 관리, 오류 복구, 프리페어드 스테이트먼트에 문제가 있다고 지적하며, 개발의 복잡성을 증가시킨다고 주장합니다. 예를 들어, 가변적인 연결 상태는 오류 복구를 어렵게 하고, 프리페어드 스테이트먼트의 세션 범위 특성은 연결 풀에서의 사용을 제한합니다. 저자는 Redis 프로토콜에서 영감을 얻어 명시적인 설정 단계, 멱등성 키, 전역 범위의 프리페어드 스테이트먼트 식별자 등의 개선을 제안합니다. 이러한 변경으로 개발 워크플로가 간소화되고 데이터베이스 클라이언트의 안정성이 향상되어 더 나은 개발자 경험과 사용하기 쉬운 데이터베이스로 이어집니다.

더 보기
개발

HTTP/2: Ruby HTTP 서버에서 중요하지 않은 이유

2025-02-25

이 글에서는 Puma와 같은 Ruby HTTP 서버에서 HTTP/2 지원의 중요성에 대해 논의합니다. 저자는 HTTP/2의 주요 장점인 페이지 로딩 속도 향상을 위한 다중화는 인터넷에서는 중요하지만, LAN에서는 거의 이점이 없다고 주장합니다. LAN 내의 지연 시간이 낮고 연결이 오랫동안 유지되므로 TCP 슬로우 스타트의 영향이 미미합니다. 또한 HTTP/2의 서버 푸시 기능은 해롭다는 것이 밝혀졌으며, 더욱 세련된 103 Early Hints로 대체되었습니다. 저자는 HTTP/2 처리를 로드 밸런서 또는 리버스 프록시에 맡김으로써 애플리케이션 서버의 배포 및 유지 관리를 간소화하는 것을 제안합니다.

더 보기
개발

IO 바운드 Rails 애플리케이션의 신화

2025-01-25

Rails 애플리케이션은 본질적으로 IO 바운드이며 데이터베이스가 주요 성능 병목 현상이므로 Ruby 성능은 그다지 중요하지 않다는 일반적인 생각이 있습니다. 이 글은 이러한 생각에 이의를 제기합니다. 데이터베이스는 확실히 확장의 병목 현상이지만 애플리케이션이 대부분의 시간을 IO 대기 시간에 소비하는 것은 아니라고 저자는 주장합니다. YJIT 성능 개선 및 데이터베이스 인덱스 누락과 같은 일반적인 성능 문제에 대한 분석을 통해 많은 Rails 애플리케이션이 실제로 CPU 바운드임을 시사합니다. 이 글에서는 CPU 스타베이션과 IO 대기 시간의 혼동을 강조하고 적절한 실행 모델(비동기, 스레드화, 프로세스 기반)의 선택이 애플리케이션의 IO/CPU 비율에 따라 달라짐을 강조합니다. 저자는 Ruby 성능에 대한 주의를 촉구하고 Rails 자체의 최적화 가능성을 지적합니다.

더 보기
개발

Ruby JSON 최적화: 스택 할당과 인라이닝의 이야기

2025-01-02

이 블로그 게시물은 Ruby의 JSON 성능 최적화에 대한 시리즈의 네 번째 부분으로, Ruby의 JSON 직렬화 속도를 개선하기 위한 저자의 노력을 자세히 설명합니다. 세심한 마이크로 벤치마킹과 프로파일링을 통해 저자는 스택 할당 및 인라이닝 기법을 탐구합니다. 버퍼 할당을 힙에서 스택으로 변경하고 전략적으로 인라이닝을 사용함으로써 상당한 성능 향상을 얻습니다. 그러나 이 기사에서는 마이크로 벤치마크 개선과 실제 애플리케이션 성능의 균형을 맞추는 중요성을 강조하고, 최적화가 더 큰 데이터 세트에 부정적인 영향을 미친 사례를 보여줍니다.

더 보기
개발

Ruby의 JSON 최적화: 1부

2024-12-18

이 블로그 게시물에서는 저자가 Ruby의 `json` gem을 최적화하여 가장 빠른 JSON 파서 및 생성기로 만든 방법을 자세히 설명합니다. 복잡한 기술 대신 프로파일링을 기반으로 한 간단한 최적화, 즉 중복 확인 방지, 더 저렴한 조건 우선순위 지정, 설정 비용 절감, 조회 테이블 사용 등이 적용되었습니다. 이러한 개선 사항은 C 코드와 Ruby 코드 모두에 적용됩니다. 이러한 최적화를 통해 `json` gem의 성능이 크게 향상되어 `oj`와 같은 대안과 경쟁력을 갖게 되었고, Monkey Patching의 필요성이 줄어들었으며 `oj`와 관련된 안정성 및 호환성 문제가 해결되었습니다.

더 보기
개발