Rails Concerns는 기본적으로 Ruby의 모듈(Module)이지만, Rails의 ActiveSupport::Concern을 확장하여 표준 Ruby 모듈에 비해 추가적인 개선 사항을 제공합니다. 이는 더 깔끔하고 읽기 쉬운 구문을 사용할 수 있게 하며, Rails가 내부적으로 복잡한 로직을 처리하도록 돕습니다. Concerns의 주요 이점 중 하나는 코드의 중복을 줄이는 DRY 원칙을 실현하는 것입니다. 예를 들어, 여러 컨트롤러나 모델에서 공통적으로 사용되는 복잡한 검색 기능을 Concerns로 추출하면, 해당 로직을 한 곳에서만 관리하고 필요한 곳에서 참조할 수 있어 유지보수가 훨씬 용이해집니다. 또한, Concerns는 SRP(Single Responsibility Principle)를 지원하여 각 코드 조각이 하나의 명확한 역할만 수행하도록 돕습니다. 모델은 데이터 처리, 컨트롤러는 트래픽 관리, 뷰는 UI 표시에 집중하고, 특수하거나 공유되는 동작은 Concerns로 분리함으로써 코드의 유지보수, 테스트 및 이해를 더 쉽게 만듭니다.
영상에서는 Searchable
이라는 Concerns를 생성하여 Product
모델과 Account
모델에서 공통적으로 사용되는 advanced_search
클래스 메서드를 재사용하는 구체적인 예시를 보여줍니다. Concerns 파일은 일반적으로 app/models/concerns
또는 app/controllers/concerns
디렉토리에 위치하며, 모델 Concerns의 경우 파일명 끝에 -able
접미사를 붙이는 명명 규칙을 권장하여 다른 개발자들이 해당 파일이 Concerns임을 쉽게 파악할 수 있도록 합니다. Concerns 내부에 클래스 메서드, 스코프, 인스턴스 메서드 등을 정의하여 이를 포함하는 모델이나 컨트롤러에서 사용할 수 있습니다.
Concerns는 모델뿐만 아니라 컨트롤러를 포함한 다양한 곳에서 활용될 수 있습니다. 일반적인 사용 사례로는 인증(authentication), 태그 추가와 같은 분류 기능(categorizable functionality), 타임스탬프 또는 감사 로깅(audit logging), 데이터 가져오기/내보내기 기능(import/export capabilities) 등이 있습니다. 그러나 Concerns의 남용은 코드를 지나치게 추상화하여 새로운 개발자가 코드를 이해하고 기여하기 어렵게 만들 수 있습니다. 따라서 Concerns는 항상 명확하고 집중된 책임을 가지도록 설계해야 하며, 명명 규칙을 명확히 하고 필요시 주석을 추가하여 코드의 가독성을 높이는 것이 중요합니다. 또한, 여러 모델에서 Concerns를 사용할 경우 각 모델의 스키마 차이로 인해 디자인 패턴이 흐려지거나 오류가 발생할 수 있으므로 주의해야 하며, Concerns 간의 순환 참조(circular dependencies)도 피해야 합니다.