이번 라이트닝 토크에서는 Rails 8.1의 여러 핵심 개선 사항들이 소개되었습니다.
1. PostgreSQL NOT NULL 위반 문제 해결
Shopify는 MySQL 기반 모놀리식 애플리케이션을 PostgreSQL과 같은 다중 데이터베이스 환경으로 전환하는 과정에서 insert_all 및 upsert_all 작업 시 id 컬럼의 NOT NULL 위반 문제를 겪었습니다. MySQL은 nil ID 값에 대해 자동 증가 값을 사용하지만, PostgreSQL은 이를 nil로 간주하여 오류를 발생시켰습니다. Rails 8.1에서는 이러한 비호환성을 해결하기 위해, 기본 키 컬럼의 값이 nil일 경우 자동으로 데이터베이스 연결의 기본 삽입 값(대부분 SQL DEFAULT 키워드)을 사용하도록 처리하여 개발자가 nil 값을 수동으로 처리할 필요가 없도록 개선되었습니다.
2. 구조화된 이벤트 리포터 (Rails.events) 도입
기존 Rails 로그는 개발 및 수동 검사에 유용하지만, 관측성 플랫폼에서 데이터를 집계하고 쿼리하기에는 부적합했습니다. Rails 8.1에 도입될 Rails.events는 이러한 문제를 해결하기 위한 새로운 구조화된 로깅 API입니다. 이는 Rails.logger와 함께 작동하며, 명확하게 정의된 이벤트 이름과 키워드 인수로 구성된 페이로드 데이터를 통해 로그를 구조화합니다. 이를 통해 데이터 플랫폼이 로그를 쉽게 데이터베이스에 저장하고 즉시 쿼리할 수 있게 되어, 쿼리 속도 향상, 스토리지 비용 절감, 타입 안전성 및 균일한 형식의 이점을 제공합니다.
3. 민감 데이터 로깅 필터링 개선
로그에 민감한 정보(예: 신용카드 번호)가 포함되는 보안 문제를 해결하기 위해 Rails 8.1에서는 기존 filter_parameters 외에 모델 수준에서 filter_attributes 기능이 확장됩니다. 기존 filter_attributes는 수동으로 생성된 로그 메시지만 필터링했지만, 이제는 요청 파라미터도 필터링할 수 있도록 개선됩니다. 이로써 개발자는 모델 정의 시 민감한 속성을 명시하여 로그에서 해당 정보가 노출되는 것을 방지하고, 대규모 애플리케이션에서 민감 데이터 관리를 더욱 용이하게 할 수 있습니다.
4. 어설션 없는 테스트 경고 및 개선 방안
Rails 7.1부터 도입된 어설션 없는 테스트 경고 기능의 중요성이 강조되었습니다. 이 기능은 테스트가 실제로 아무것도 검증하지 않는 경우를 경고하여 테스트 스위트의 신뢰성을 높입니다. 발표에서는 다음과 같은 일반적인 어설션 없는 테스트 유형과 개선 방안이 제시되었습니다: * 예외 발생 여부만 확인하는 테스트: assert_raises 또는 refute_raises 등으로 명시적 어설션 추가. * 환경 기반 조건부 테스트: skip을 사용하거나 조건에 따라 테스트 자체를 정의하지 않음. * 빈 컬렉션 순회 테스트: 컬렉션이 비어있을 경우 테스트가 실패하도록 명시적 검증 추가. * 과도한 목(mock) 또는 스텁(stub) 사용 테스트: mock.verify 또는 assert_mock과 같은 실제 어설션을 사용하여 목 호출 여부 검증. 이러한 개선은 테스트가 의도한 대로 동작을 검증하도록 보장하며, 오픈 소스 기여 기회로도 제시되었습니다.
5. Rails 에러 리포터 미들웨어
Rails 7에 도입된 에러 리포터는 애플리케이션 내에서 에러를 보고하는 통합된 방법을 제공하지만, 여러 구독자 간에 공통 로직(예: 에러 분류, 백트레이스 분석)을 공유하는 데 어려움이 있었습니다. Rails 8.1에 추가될 에러 리포터 미들웨어는 에러 보고 호출과 구독자 호출 사이에 위치하여, 공통 메타데이터를 에러 컨텍스트에 추가할 수 있도록 합니다. 이를 통해 중복 코드를 방지하고, 에러 추적, 로깅, 메트릭 전송 등 다양한 에러 보고 관심사를 깔끔하게 분리하여 더욱 모듈화되고 유지보수하기 쉬운 아키텍처를 구축할 수 있게 됩니다.