캐싱이란 무엇인가? 캐싱을 일반적으로 정의하면 데이터를 미리 저장해 두었다가 나중에 빠르게 꺼내 쓰는 것입니다. 여기에는 두 가지 의미가 있습니다. 한 번 계산한 결과를 다시 계산하지 않도록 저장하는 경우와, 데이터를 로컬에 보관해 다시 가져오지 않아도 되게 하는 경우입니다. 사실 우리 컴퓨터는 항상 이런 작업을 하고 있습니다. 운영체제는 자주 접근하는 데이터를 RAM에 유지해서 하드디스크나 SSD에서 다시 읽어올 필요가 없도록 하기 때문입니다. 브라우저도 마찬가지로 이미 내려받은 리소스를 재사용하려고 합니다. 새로운 웹사이트를 처
Rails는 방대한 프레임워크이며 매년 그 규모가 커지고 있습니다. 그렇다 보니 유용한 기능들이 눈에 띄지 않고 지나가기 쉽습니다. 이 시리즈에서는 특정 작업을 위해 Rails에 내장된 잘 알려지지 않은 기능들을 살펴보겠습니다. 시리즈의 첫 번째 글에서는 Rails.env.test? 호출이 내부적으로 어떻게 동작하는지 알아봅니다. 핵심에는 ActiveSupport의 잘 알려지지 않은 StringInquirer 클래스가 있습니다. 한 걸음 더 나아가 StringInquirer의 소스 코드를 직접 살펴보며 동작 원리를 파헤쳐 볼 것입니
참고: 이 글은 루비(Ruby)로 다양한 정렬 알고리즘을 구현해 보는 시리즈의 네 번째 편입니다. 1편에서는 버블 정렬을, 2편에서는 선택 정렬을, 3편에서는 병합 정렬을 다루었습니다. 데이터를 정렬하는 여러 방법론을 계속 탐색해 오던 중, 이번에는 삽입 정렬(Insertion Sort)을 살펴보겠습니다. 삽입 정렬에는 좋아할 만한 이유가 세 가지나 있습니다! 첫째, 삽입 정렬은 안정 정렬(stable sort)입니다. 즉, 키 값이 같은 요소들의 상대적인 순서가 유지됩니다. 둘째, 제자리(in-place) 알고리즘이기 때문에 정
메서드를 호출하는 순간, 실제로 어떤 일이 벌어질까요? 같은 이름의 메서드가 여러 곳에 존재한다면 Ruby는 어떤 기준으로 호출할 메서드를 결정할까요? 그리고 그 메서드는 대체 어디에 정의되어 있는 걸까요? Ruby는 올바른 메서드를 호출하고, 끝내 찾지 못했을 때 적절한 시점에 NoMethodError를 반환하기 위해 정해진 규칙, 즉 하나의 패턴을 따릅니다. 이 규칙을 바로 루비 메서드 조회 경로(Ruby Method Lookup Path)라고 부릅니다. 이 튜토리얼에서는 Ruby의 메서드 조회 방식을 깊이 있게 다룹니다.
RBS는 Ruby를 위한 새로운 타입 정의 문법 형식 언어입니다. RBS를 사용하면 .rbs라는 새로운 확장자를 가진 파일에 Ruby 코드의 타입 주석을 추가할 수 있습니다. 다음과 같은 형태입니다: class MyClass def my_method : (my_param: String) -> String end RBS로 타입 주석을 제공하면 다음과 같은 이점을 얻을 수 있습니다: 코드베이스의 구조를 깔끔하고 간결하게 정의할 수 있습니다. 클래스를 직접 수정하는 대신 별도의 파일을 통해 레거시 코드에 안전하게 타입을 추가
전체 소스 코드는 GitHub에서 확인하세요 Stoffle 프로그래밍 언어의 완전한 구현체는 GitHub에 공개되어 있습니다. 버그를 발견하거나 궁금한 점이 있다면 이슈를 등록해 주세요. 이번 글에서는 Ruby만으로 만든 장난감 프로그래밍 언어인 Stoffle의 인터프리터 구현을 시작해 보겠습니다. 프로젝트에 대한 자세한 배경은 시리즈의 첫 번째 글에서 확인할 수 있습니다. 우리가 만들 인터프리터는 흔히 트리 워킹(tree-walk) 인터프리터라고 불립니다. 지난 글에서는 파서를 구현해 평평한 토큰 시퀀스를 트리 데이터 구조,
Ruby 프로젝트의 의존성 관리는 일반적으로 프로젝트가 사용하는 Ruby 버전과 gem 버전을 지정하는 것에서 시작합니다. Ruby로 개발해 온 경험상, 의존성 문제를 디버깅하는 일은 가장 큰 어려움 중 하나였습니다. 대부분의 기능이 그냥 잘 작동하기 때문에 오류 자체는 흔치 않지만, 한번 문제가 발생하면 원인 파악과 수정이 불필요하게 어렵곤 합니다. 이 글에서는 Ruby 의존성 관리에 관여하는 각 구성 요소를 하나씩 살펴보고, 예기치 않은 문제가 생겼을 때 빠르게 해결할 수 있도록 돕고자 합니다. Ruby 코드 로딩 방식
Honeybadger의 분기별 브리핑은 프로그래밍 커뮤니티에서 가장 중요한 변화를 놓치지 않도록 도와드립니다. 저희가 뉴스를 큐레이션하니, 여러분은 정말 중요한 일에 더 많은 시간을 쏟을 수 있습니다. 이벤트: 컨퍼런스와 밋업. 다가오는 일정과 최근 종료된 행사. 보안: 최근 취약점 보고 프로젝트: 주요 커뮤니티 프로젝트 관련 소식 핫 이슈: 모두가 입에 담는 큰 화제의 요약 주목할 만한 콘텐츠: 다른 섹션에는 어울리지 않지만 빼놓기엔 아까운 콘텐츠. 이벤트 RailsConf 2021, 4월 12일~15일 개최 Rails
서버리스 컴퓨팅은 서버 관리와 프로비저닝 작업을 클라우드 제공업체에 위임할 수 있게 해주는 기술로, 최근 대부분의 개발 팀에서 빠르게 표준으로 자리 잡고 있습니다. AWS Lambda는 많은 기술 팀이 사용하는 대표적인 서버리스 기술이며, Node.js, Java, Python, Ruby 등 주요 프로그래밍 언어를 폭넓게 지원합니다. 하지만 핵심 언어가 지원된다 해도, 해당 언어로 만들어진 프레임워크의 기능에 의존하는 서버리스 함수를 실행하고 싶은 경우가 종종 있습니다. 이 글에서는 Rails 애플리케이션을 AWS Lambda에서
Rails는 다양한 상황에 맞는 편리한 도구들이 기본으로 내장되어 있는 대형 프레임워크입니다. 이 시리즈에서는 Rails의 방대한 코드베이스 속에 숨어 있는, 잘 알려지지 않은 도구들을 하나씩 살펴보고 있습니다. 이번 글에서는 ActiveRecord의 update_counters 메서드를 집중적으로 다뤄보겠습니다. 이 과정에서 멀티스레드 프로그램의 고질적인 함정인 경쟁 상태(race condition)가 무엇인지, 그리고 이 메서드가 어떻게 이러한 문제를 예방할 수 있는지 함께 알아보겠습니다. 스레드(Thread) 프로그래밍에
CSS는 마법 같은 도구이지만, 작업 시간이 오래 걸리는 것이 사실입니다. 아름답고 기능적이며 접근성 좋은 웹사이트는 사용자에게 큰 만족감을 주지만, 이를 위해 직접 CSS를 작성하는 일은 지루하고 소모적인 작업입니다. 최근 몇 년간 Bootstrap을 비롯한 다양한 CSS 라이브러리가 폭발적인 인기를 얻었으며, 2021년 현재 그 선두에는 Tailwind CSS가 자리 잡고 있습니다. Rails는 기본적으로 Tailwind를 제공하지 않지만, 이 글에서는 새로운 Ruby on Rails 프로젝트에 Tailwind CSS를 추가하는
우리가 내리는 많은 결정은 사실 수치적 관계를 중심으로 이루어집니다. 과학 연구 결과 콜레스테롤을 낮춘다고 밝혀졌기 때문에 특정 음식을 먹습니다. 더 높은 급여를 받을 가능성이 있기 때문에 교육을 계속 이어갑니다. 가장 큰 폭으로 가치가 상승할 것이라 믿는 동네에 집을 삽니다. 그렇다면 우리는 어떻게 이런 결론에 도달하게 될까요? 아마도 누군가 방대한 데이터를 수집하고 이를 분석해 결론을 도출했을 가능성이 높습니다. 여기서 가장 널리 쓰이는 기법 중 하나가 바로 선형 회귀(linear regression)이며, 이는 지도 학습(
프로그래밍에서 캐싱(caching)이란 나중에 빠르게 꺼내 쓸 수 있도록 특정 값을 미리 저장해 두는 것을 의미합니다. 주로 계산 비용이 큰 값에 적용하는데, 예를 들어 외부 API를 호출해야 하는 경우나 복잡한 연산을 거쳐야 생성되는 데이터가 대표적입니다. 캐시된 값은 보통 memcached나 Redis 같은 별도의 서버에 저장되며, 디스크에 저장할 수도 있고 RAM에 저장할 수도 있습니다. 코드 레벨에서는 비용이 큰 함수를 여러 번 호출하지 않도록 변수에 데이터를 캐싱하기도 합니다. data = some_calculation()
프로그래밍 언어가 신기하면서도 미스터리한 도구로 느껴지시나요? 그 내부를 들여다보고 어떻게 작동하는지 이해할 기회가 생긴다면 어떨까요? 직접 코딩하며 프로그래밍 언어를 처음부터 끝까지 만들어 보는 것에 관심이 있다면, 이 글과 이어지는 시리즈가 큰 도움이 될 것입니다. 이 시리즈에서는 아주 간단한 인터프리터 방식의 동적 타입 프로그래밍 언어를 한 단계씩 차근차근 만들어 볼 예정입니다. 용어의 정확한 의미가 잘 와닿지 않거나 과제 자체가 다소 부담스럽게 느껴지더라도 걱정하지 마세요. 친숙하고 사랑받는 루비(Ruby)로 인터프리터를
이 글에서는 신경망의 기본 개념과 이를 Ruby로 구현하는 방법을 함께 알아보겠습니다. 인공지능과 딥러닝에 관심이 있지만 어디서부터 시작해야 할지 막막하셨다면, 이 글이 딱 좋은 출발점이 될 것입니다. 핵심 개념을 쉽게 이해할 수 있도록 간단한 예제를 통해 차근차근 살펴볼 예정입니다.솔직히 말씀드리면, 실무에서 Ruby로 다층 신경망을 직접 작성하는 일은 드뭅니다. 하지만 코드가 단순하고 읽기 쉬워서, 신경망 내부에서 무슨 일이 일어나는지 이해하기에는 더없이 좋은 방법입니다. 먼저 한 걸음 물러나서, 우리가 어떻게 여기까지 왔는지
애플리케이션을 개발하다 보면 실행 속도가 느린 메서드를 자주 마주하게 됩니다. 데이터베이스를 조회해야 하거나 외부 서비스를 호출해야 하는 경우가 대표적이며, 이런 작업들은 메서드의 실행 속도를 크게 늦출 수 있습니다. 데이터가 필요할 때마다 메서드를 호출하고 그 오버헤드를 그대로 감수할 수도 있지만, 성능이 중요한 상황이라면 몇 가지 대안을 고려해볼 필요가 있습니다. 첫 번째 방법은 데이터를 변수에 할당한 뒤 재사용하는 것입니다. 속도는 빨라지지만, 해당 변수를 직접 관리하는 일은 금세 번거로워질 수 있습니다. 그렇다면 느린 작
참고: 이 글은 Ruby로 다양한 정렬 알고리즘을 살펴보는 시리즈의 2부입니다. 1부에서는 버블 정렬을 다루었습니다. 이번 글에서는 Ruby로 선택 정렬(selection sort) 알고리즘을 구현하는 방법을 단계별로 살펴보겠습니다. 선택 정렬은 제자리(in-place) 비교 정렬 알고리즘으로, 정렬된 요소들이 원래 배열과 동일한 저장 공간을 사용한다는 의미입니다. 본격적으로 들어가기에 앞서 한 가지 짚고 넘어갈 점이 있습니다. 선택 정렬은 데이터셋이 작은 경우(예: 10~20개 요소)를 제외하면 실무에서 거의 사용되지 않습니
돈은 화폐 단위가 무엇이든 마치 부동소수점 숫자처럼 보입니다. 하지만 통화 데이터에 float 타입을 사용하는 것은 실수입니다. Float 객체는 정의상 근사치(approximate)로 표현되는 실수이며, 시스템 아키텍처가 제공하는 배정밀도(double-precision) 부동소수점 방식에 의존합니다. 부정확한 숫자는 회계 담당자를 불행하게 만듭니다. 이 글에서는 Ruby와 Rails 환경에서 금액 데이터를 안전하게 다루기 위한 다양한 방법을 예제와 함께 살펴보겠습니다. Float란 무엇인가? 앞서 언급했듯이 float 객체는
소프트웨어 프로젝트가 성장하다 보면 누구에게나 이런 일이 생깁니다. 코드베이스의 일부가 포괄적인 테스트 스위트 없이 운영 환경에 배포되어 버리는 것이죠. 몇 달 뒤 같은 코드 영역을 다시 들여다보면 이해하기 어려워져 있고, 더 나쁜 경우에는 버그가 발생했는데도 어디서부터 고쳐야 할지 감을 잡기 힘든 상황에 직면하게 됩니다. 테스트 없는 코드를 수정하는 일은 큰 도전입니다. 수정 과정에서 무언가를 망가뜨릴지 확신할 수 없고, 모든 동작을 수동으로 확인하는 방식은 기껏해야 실수하기 쉬울 뿐 아니라 대부분의 경우 사실상 불가능합니다.
캐싱(Caching)은 어떤 코드의 실행 결과를 저장해 두었다가 나중에 빠르게 불러와 사용할 수 있도록 하는 일반적인 기법입니다. 예를 들어 자주 변경되지 않는 데이터를 얻기 위해 데이터베이스에 반복적으로 접근하는 것을 방지할 수 있습니다. 캐싱의 기본 개념은 모든 유형에서 동일하지만, Rails는 무엇을 캐싱하려는지에 따라 서로 다른 도구들을 제공합니다. Rails 개발자에게 흔히 사용되는 캐싱 형태로는 메모이제이션(memoization), 로우 레벨 캐싱(low-level caching, 이 시리즈의 이전 글에서 다룸), 그리