린팅(Linting)은 코드에서 잠재적인 문제를 찾아내기 위해 정적 분석을 수행하는 과정입니다.무엇이 문제인지에 대한 기준은 프로그래밍 언어에 따라 다를 수 있고, 심지어 같은 언어 안에서도 프로젝트마다 달라집니다. 일반적으로 이러한 문제들은 다음과 같은 카테고리로 분류할 수 있습니다:프로그래밍 문제보안 문제스타일 문제성능 문제지금부터 각 유형별 예시를 살펴보겠습니다.스타일(Stylistic) 문제코드 스타일에는 객관적으로 옳은 방식이란 없습니다. 전적으로 코드를 읽는 사람의 취향에 달려 있기 때문입니다. 다만 핵심은 일관성입니다.
Ruby 코드를 작성하고 있다면 아마 백그라운드 작업 처리에 Sidekiq을 사용하고 있을 가능성이 높습니다. ActiveJob 환경에서 오신 분들도 계속 읽어보세요. 이 글에서 다루는 팁 중 일부는 그곳에도 그대로 적용할 수 있습니다.개발자들은 다양한 목적으로 Sidekiq 같은 백그라운드 잡(job)을 활용합니다. 어떤 이들은 숫자를 집계하고, 어떤 이들은 사용자에게 환영 이메일을 발송하고, 또 어떤 이들은 데이터 동기화를 예약합니다. 용도가 무엇이든 언젠가는 중복 작업을 방지해야 하는 요구사항에 직면하게 됩니다. 여기서 말하는
테스트는 유지 보수가 악몽처럼 느껴지지 않고 새로운 기능이 꾸준히 추가되고 기존 기능이 개선되는, 잘 운영되는 대부분의 Rails 애플리케이션에서 빼놓을 수 없는 요소입니다. 그런데 아쉽게도 많은 애플리케이션이 무거운 작업 부하나 대량의 트래픽에 처음 노출되는 순간은 바로 프로덕션 환경입니다. 이런 테스트에는 비용이 상당히 들기 때문에 어찌 보면 당연한 일이기도 하죠.다행히 Rails는 단위 테스트, 엔드투엔드(E2E) 테스트, 통합 테스트뿐만 아니라 성능 및 부하 관련 테스트도 폭넓게 지원합니다. 이 글에서는 이 모든 내용을 다루
애플리케이션 아키텍처 전체를 조망하고 각 구성 요소가 서로 어떻게 연결되는지 이해하는 것은 매우 중요합니다. 관찰 가능성(Observability)이 먼저이고, 그다음이 모니터링입니다.이 글에서는 아키텍처 중 데이터베이스 부분에 초점을 맞춰 데이터베이스 성능을 모니터링하고 최적화하는 방법을 살펴봅니다. 다음에서 소개하는 원칙 대부분은 사용하는 스택이나 PostgreSQL, MongoDB 등 어떤 데이터베이스를 쓰는지와 무관하게 적용할 수 있습니다.데이터베이스 성능을 모니터링해야 하는 이유어떤 쿼리가 아주 느려서 애플리케이션이 결과를
Ruby on Rails 패턴과 안티패턴 시리즈의 마지막 편에 오신 것을 환영합니다. 이 주제들을 연구하고 글로 옮기는 과정은 꽤 긴 여정이었습니다. 이번 포스트에서는 지난 몇 년간 Rails 애플리케이션을 개발하고 배포하면서 직접 겪었던 가장 흔한 문제들을 다뤄보려고 합니다.여기서 소개하는 내용들은 코드 어디에서나 적용할 수 있는 보편적인 원칙입니다. 따라서 MVC(Model-View-Controller) 패턴에 국한된 이야기가 아니라 일반적인 관점으로 읽어주시면 좋겠습니다. Rails MVC와 관련된 패턴과 안티패턴이 궁금하시다
데이터베이스는 수많은 애플리케이션의 심장과 같습니다. 따라서 데이터베이스에 문제가 발생하면 심각한 성능 저하로 이어질 수 있습니다.ActiveRecord나 Mongoid 같은 ORM은 구현 세부 사항을 추상화해 주고 더 빠른 개발을 가능하게 해주지만, 그만큼 내부에서 어떤 쿼리가 실행되고 있는지 확인하지 못하는 경우가 많습니다.Bullet 젬은 이렇게 잘 알려진 데이터베이스 관련 문제들을 찾아내는 데 도움을 줍니다:N+1 쿼리: 목록의 각 항목을 로드하기 위해 개별 쿼리를 반복 실행하는 경우불필요한 즉시 로딩(Unused Eager
다음과 같은 가상의 시나리오를 상상해 보세요. 임대 부동산 관리 시스템에서 직원 A가 임대 매물 X의 연락처 정보를 편집하며 추가 전화번호들을 입력하고 있습니다. 거의 같은 시점에 직원 B가 바로 그 임대 매물 X의 연락처 정보에서 오타를 발견하고 이를 수정합니다. 몇 분 후, 직원 A가 새로운 전화번호를 포함해 임대 매물 X의 연락처 정보를 업데이트하면… 오타를 고쳤던 업데이트는 흔적도 없이 사라져 버립니다!이건 분명 좋지 않은 상황입니다! 그리고 이조차 꽤 단순한 시나리오입니다. 만약 이런 충돌이 금융 시스템에서 발생한다면 어떤
아래 글은 2017년 Nate Berkopec이 작성한 Understanding Ruby GC through GC.stat라는 아티클에 기반한 것으로 밝혀졌습니다. 원작자가 지적하기 전까지 이 글의 일부가 표절되었음을 인지하지 못했습니다. 모든 아티클을 발행 전에 표절 검사 도구로 검수하고 있지만, 이번 사례는 적발되지 않았습니다. 이러한 부주의로 인해 Nate와 독자 여러분께 진심으로 사과드립니다.Ruby에서 가비지 컬렉션이 어떻게 동작하는지 제대로 이해하는 것은 애플리케이션 성능을 완벽하게 관리하기 위해 반드시 필요합니다.이 글
프로덕션 환경에서 애플리케이션을 운영하고 유지보수할 때 가장 중요한 것은 애플리케이션이 의도한 대로 동작하고 있다는 확신을 갖는 것이며, 문제가 발생했을 때 즉시 인지하는 것입니다. 최소한으로도 에러를 추적하고, 성능을 모니터링하며, 애플리케이션 전반에 걸쳐 필요한 지표(metrics)를 수집할 수 있어야 합니다.하지만 개발자라면 누구나 유지보수하기 쉬운 솔루션을 선호하기 마련입니다. 여러 도구와 통합 설정, 의존성이 뒤엉켜 오히려 관리가 더 어려워지는 상황은 피하고 싶겠죠.이 글에서는 Ruby on Rails 애플리케이션에 App
Rails 7의 출시가 눈앞으로 다가왔습니다. 확정된 릴리스 날짜는 아직 발표되지 않았지만, 크리스마스 전에 공개될 것으로 예상되므로 그리 멀지 않았습니다. 이 글을 작성하는 시점의 최신 버전은 첫 번째 릴리스 후보(release candidate)인 7.0.0.rc1입니다. Basecamp, HEY, GitHub, Shopify 등이 이미 프로덕션 환경에서 Rails 7 알파 버전을 운영하고 있으므로, 릴리스 후보 단계에서도 상당히 안정적일 것으로 기대할 수 있습니다.이 글에서는 Rails 7이 가져올 주요 새 기능과 변경 사항을
연말을 맞아 한 해를 마무리하고 계신가요? 바쁜 일상에서 잠시 벗어나, 지난 한 해 동안 발행했던 최고의 Ruby 게시물들을 돌아보는 건 어떨까요?따뜻한 핫초코 한 잔을 준비하고, 포근한 담요 속에서 몸을 녹이며, 실력 있는 게스트 작가들이 집필한 훌륭한 글들(우리 말이지만요!)을 천천히 둘러보세요.그럼 바로 시작해 보겠습니다!2021년 Ruby 블로그 게시물 TOP 5 💎RBS: Ruby 3의 새로운 타입 언어 실전 가이드실용적인 예제를 통해 Sorbet과 새롭게 공개된 RBS의 차이점과 공통점을 살펴봅니다.Ruby on Rai
이번 2부작 시리즈의 첫 번째 글에서는 Ruby on Rails 애플리케이션에 AppSignal을 설정하는 방법을 다루며, 별도의 설정 없이도 즉시 얻을 수 있는 다양한 인사이트를 살펴보았습니다. AppSignal은 에러를 자동으로 추적하고, 성능을 모니터링하며, 일부 의존성에 대한 메트릭까지 보고해 줍니다.하지만 대부분의 경우 각 애플리케이션은 저마다 다른 방식으로 동작하기 때문에, 범용적인 모니터링만으로는 충분하지 않습니다.이번 글에서는 Ruby on Rails 애플리케이션에 커스텀 계측(custom instrumentation
루비(Ruby)에서 문자열을 포맷하는 방법에 대해 알아보겠습니다. 문자열 포맷팅은 왜 필요할까요? 10보다 작은 숫자 앞에 0을 붙여 두 자리로 표시하거나(예: 01, 02, 03…), 콘솔 출력 결과를 보기 좋게 열 단위로 정렬해야 하는 상황에서 특히 유용합니다. C 언어를 사용해 본 적이 있다면 printf 함수가 낯설지 않을 겁니다. printf를 사용하려면 포맷 지정자(format specifier) 목록과 그에 대응하는 변수 또는 값 목록을 함께 전달해야 하는데, 루비에서도 비슷한 방식으로 문자열 포맷팅을 할 수 있습니다.
Ruby로 HTML을 파싱해야 하는 상황인가요? 적절한 도구가 없다면 이 작업은 생각보다 까다로울 수 있습니다. 하지만 걱정하지 마세요. Ruby에는 Nokogiri라는 훌륭한 라이브러리가 있어서 HTML 파싱이 산책처럼 쉬워집니다. 지금부터 실제 예제를 통해 하나씩 살펴보겠습니다. Nokogiri 설치하기 먼저 다음 명령어로 nokogiri 젬(gem)을 설치합니다. gem install nokogiri 설치 중 오류가 발생한다면 시스템 라이브러리를 사용하도록 옵션을 추가해 보세요. gem install nokogiri -- --
Ruby에서 난수와 랜덤 문자열을 생성하는 방법을 배우고 싶으시다면, 잘 찾아오셨습니다. 이 글이 바로 그 주제를 다루고 있기 때문입니다! 난수를 활용하면 배열에서 임의의 요소를 선택하거나, 목록에서 당첨자를 뽑거나, 주사위 굴리기를 구현하는 등 다양한 작업을 할 수 있습니다. Ruby에는 여러 특성을 가진 난수를 생성하는 다양한 방법이 존재합니다. 예를 들어… rand 메서드는 세 가지 방식으로 사용할 수 있습니다: 인자 없이 호출하면 0과 1 사이의 부동소수점 숫자를 반환합니다 (예: 0.4836732493) 정수 인자를 전달
카이사르 암호(Caesar Cipher)에 대해 들어본 적 있으신가요? 율리우스 카이사르(Julius Caesar)는 바로 이 기법을 사용해 적에게 보내는 비밀 메시지를 숨겼다고 합니다! 카이사르 암호는 가장 원시적인 암호화 기법 중 하나로, 그 핵심 아이디어는 아주 간단합니다. 바로 알파벳 문자를 x개 위치만큼 회전(밀기)시키는 것입니다. 예를 들어 x = 1이라면 A는 B로, C는 D로 바뀌는 식입니다. 그렇다면 이것을 코드로 어떻게 구현할 수 있을까요? 생각보다 어렵지 않습니다. 핵심은 문자를 숫자(ASCII 코드)로 표현할
파싱(Parsing)이란 문자열 덩어리를 분석해 우리가 이해할 수 있는 형태로 변환하는 작업입니다. 정규표현식(regular expression)을 사용할 수도 있지만, 모든 상황에 적합한 도구는 아닙니다. 예를 들어, HTML을 정규표현식으로 파싱하는 것은 좋지 않은 방법이라는 사실은 이미 널리 알려져 있습니다. Ruby에는 이런 작업을 대신 처리해 주는 nokogiri라는 훌륭한 라이브러리가 있지만, 직접 파서를 만들어 보면 많은 것을 배울 수 있습니다. 그럼 시작해 보겠습니다! Ruby로 파싱하기 우리 파서의 핵심은 Strin
루비로 나만의 네트워크 클라이언트와 서버를 직접 만들고 싶으신가요? 아니면 그 동작 원리를 이해하고 싶으신가요? 그렇다면 반드시 소켓(Socket)이라는 개념을 다뤄야 합니다. 이 글에서는 루비 네트워크 프로그래밍의 기본기를 다지고, 루비를 사용해 다른 서버와 클라이언트와 실제로 통신하는 방법까지 함께 살펴보겠습니다. 소켓이란 무엇인가? 소켓은 통신 채널의 양 끝단(엔드포인트)을 의미하며, 클라이언트와 서버 모두 소켓을 통해 서로 데이터를 주고받습니다. 동작 방식은 매우 간단합니다: 연결이 한 번 수립되면 소켓에 데이터를 넣으면 됩
배열(Array)이란 무엇일까요? 배열은 Ruby에 내장된 클래스로, 0개 이상의 요소를 목록 형태로 담는 자료구조입니다. 요소를 쉽게 추가하고, 접근하고, 반복 처리할 수 있도록 다양한 메소드를 함께 제공합니다. 배열이 없다면 값 하나하나마다 별도의 변수를 만들어야 하기 때문에 매우 불편할 것입니다. 예를 들어: a = 1 b = 2 c = 3 하지만 배열을 사용하면 이렇게 간단해집니다: numbers = [1, 2, 3] 배열의 가장 큰 장점은 무엇일까요? 어떤 객체든 배열 안에 넣을 수 있다는 것입니다! 숫자(Numb
오늘은 Ruby에서 파일을 읽고 쓰는 방법을 배워보겠습니다. 파일 내용을 추출하고, 새로운 파일을 생성하고, 원하는 정보를 찾는 방법까지 실전 예제와 함께 알아봅니다!목차1. Ruby에서 파일 읽는 방법2. Ruby에서 파일에 쓰는 방법3. Ruby 파일 메서드4. 디렉터리 작업5. FileUtils 모듈 사용법6. 마무리그럼 바로 시작해볼까요?Ruby에서 파일 읽는 방법Ruby에서 파일을 읽는 기본 흐름은 다음과 같습니다.open 메서드로 파일을 엽니다.파일을 읽습니다. 전체를 한 번에 읽거나, 한 줄씩, 또는 특정 바이트만큼 읽