루비 온 레일즈 면접 완벽 대비 가이드
루비 온 레일즈(Ruby on Rails)는 루비 프로그래밍 언어를 기반으로 하는 가장 널리 알려진 웹 프레임워크 중 하나입니다. 이 프레임워크의 인기 비결은 사용하기 쉽고, MVC 아키텍처를 채택했으며, 활발한 커뮤니티와 확장성을 갖추고 있다는 점에 있습니다.
깃허브(GitHub), 드리블(Dribble), 쇼피파이(Shopify), 에어비앤비(Airbnb), 엣시(Etsy), 킥스타터(Kickstarter), 트위치(Twitch), 젠데스크(Zendesk) 등 다양한 분야의 유명 기업들이 루비 온 레일즈를 활용하고 있습니다.
만약 당신이 루비 온 레일즈 개발자로서 중급 또는 숙련된 수준이라면, 면접에서 나올 수 있는 질문 유형을 미리 파악하는 것이 매우 중요합니다.
준비가 부족하면 면접이 부담스러울 수 있지만, 철저히 준비한다면 자신감을 얻을 수 있으며, 꿈에 그리던 회사에서 새로운 기회를 얻을 가능성도 높아집니다.
다음은 루비 온 레일즈 면접에서 자주 등장하는 질문과 그에 대한 답변을 정리한 내용입니다.
루비 온 레일즈란 무엇인가?
루비는 간결한 문법을 특징으로 하는 객체 지향 프로그래밍 언어입니다.
루비 온 레일즈는 루비 언어를 기반으로 웹 애플리케이션 개발을 용이하게 하는 프레임워크입니다.
루비 온 레일즈의 장점은 무엇인가?
- 코드 간결성: 레일즈를 사용하면 최소한의 코드로 많은 기능을 구현할 수 있습니다.
- 풍부한 라이브러리 및 젬(Gem): 루비 온 레일즈 애플리케이션의 기능을 확장할 수 있는 수많은 라이브러리와 젬을 제공합니다.
- 쉬운 학습 곡선: 루비 온 레일즈 코드는 마치 영어를 읽는 것처럼 이해하기 쉽습니다.
- 활발한 커뮤니티: 큰 규모의 커뮤니티가 있어 개발 과정에서 도움을 얻기 용이합니다.
루비 온 레일즈의 한계는 무엇인가?
- 성능 제약: Django나 Node.js와 비교했을 때 레일즈의 실행 속도 및 성능은 상대적으로 낮을 수 있습니다.
- 일부 젬의 문서 부족: 특정 젬에 대한 상세한 문서가 부족할 수 있습니다.
- 프레임워크의 경직성: 루비 온 레일즈는 개발자의 유연성을 제한하는 측면이 있습니다.
레일즈 컨트롤러란 무엇인가?
레일즈 컨트롤러는 루비 온 레일즈 애플리케이션의 핵심적인 논리 처리 부분입니다. 사용자, 모델, 뷰 간의 모든 상호 작용을 관리하고 조정하며 감시합니다.
레일즈 액티브 레코드란 무엇인가?
액티브 레코드는 객체 관계 매핑(ORM) 기술입니다. 이 루비 코드 계층은 코드 논리와 데이터베이스 사이에서 작동합니다. 루비 코드를 작성한 후 ‘마이그레이션’을 실행하여 데이터베이스를 변경합니다.
MVC란 무엇이며 어떻게 작동하는가?
MVC(모델-뷰-컨트롤러) 아키텍처 패턴은 비즈니스 로직을 입력 및 프레젠테이션 로직으로부터 분리하는 구조입니다.
- 모델: 애플리케이션의 모든 데이터 로직을 담당합니다.
- 뷰: 사용자가 보는 애플리케이션의 인터페이스 부분입니다.
- 컨트롤러: 모델과 뷰가 통신할 수 있도록 연결하는 역할을 합니다.
루비 온 레일즈의 액션 컨트롤러란 무엇인가?
액션 컨트롤러는 MVC 패턴에서 ‘C’, 즉 컨트롤러에 해당합니다. 액션 컨트롤러는 수신된 요청을 분석하고 이해하여 적절한 응답을 생성합니다.
레일즈에서 레이크(Rake)란 무엇인가?
레이크는 루비 온 레일즈 및 일반 루비 애플리케이션을 위한 작업 실행기입니다. 레일즈는 테스트 실행, 마이그레이션, 데이터베이스 생성 등 미리 정의된 레이크 작업을 제공합니다.
루비 온 레일즈에서 yield란 무엇인가?
yield는 메서드 내부에서 블록을 호출하는 데 사용되는 키워드입니다. 블록에 전달할 수 있는 인수의 개수에는 제한이 없습니다. 여기서 블록은 익명의 메서드처럼 작동하며 다른 메서드의 추가 인자로 전달될 수 있습니다.
가비지 컬렉션(Garbage Collection)이란 무엇인가?
가비지 컬렉션은 컴퓨터 프로그램이 사용하는 메모리를 관리하는 프로세스입니다. 루비 온 레일즈는 프로그래머가 아닌 프로그램 자체적으로 사용 중인 객체를 추적합니다. 이를 통해 개발자는 메모리 할당 문제에 신경 쓰지 않고 로직과 규칙에 집중할 수 있습니다.
레일즈 앱에서 가비지 컬렉션의 역할은 무엇인가?
시스템 메모리를 확보하여 다른 프로세스가 실행될 수 있도록 하는 것입니다. 가비지 컬렉션은 프로그램 실행 후 접근할 수 없게 된 객체들을 제거함으로써 이를 가능하게 합니다.
자산 파이프라인(Asset Pipeline)이란 무엇인가?
루비 온 레일즈의 자산 파이프라인은 CSS 및 JavaScript 자산을 축소하고 결합하는 프레임워크를 제공합니다. 이 프레임워크를 사용하면 레일즈 앱의 모든 자산을 다른 젬의 자산과 자동으로 통합할 수 있습니다.
동적 스캐폴딩과 정적 스캐폴딩의 차이점은 무엇인가?
스캐폴딩은 레일즈 애플리케이션의 주요 부분을 생성하는 프로세스입니다.
정적 스캐폴딩은 각 필드에 필요한 데이터를 생성하는 명령어를 명시적으로 입력합니다. 정적 스캐폴딩을 완료하려면 마이그레이션을 실행해야 합니다.
동적 스캐폴딩은 런타임 동안 콘텐츠와 사용자 인터페이스를 생성합니다. 이 프로세스는 레일즈 앱에서 작업을 생성, 수정 및 삭제하는 데 사용할 수 있습니다.
클래스 라이브러리란 무엇인가?
클래스 라이브러리는 스레드 프로그래밍 및 데이터 유형과 같은 루비 온 레일즈의 도메인으로 구성됩니다. 클래스 라이브러리를 통해 개발자는 코드 추상화를 생성하여 앱의 다양한 요소에서 동일한 로직을 재사용할 수 있습니다.
레일즈의 다형성 연관(Polymorphic Association)을 설명하라
다형성 연관은 액티브 레코드 연관의 한 유형입니다. 다형성은 객체가 여러 형태를 가질 수 있음을 의미합니다. 레일즈 컨텍스트에서 다형성 연관을 사용하면 반복 코드 없이도 다른 모델과 연결되거나 다른 모델에 속할 수 있는 단일 모델을 정의할 수 있습니다.
루비에서 문자열 보간이란 무엇인가?
문자열 보간은 문자열 객체 내에서 다른 값을 참조하는 자리 표시자를 추가하는 것입니다. 값을 보간하는 가장 간단한 방법은 더하기 연산자를 사용하는 것입니다.
예를 들어,
name = "Titus" puts "Hello " + name
의 결과는 다음과 같습니다.
Hello Titus
객체 관계 모델(ORM)이란 무엇인가?
ORM은 데이터베이스와 객체 지향 프로그램 사이의 다리 역할을 합니다. 레일즈에서 객체 관계는 클래스가 데이터베이스 내의 테이블에 어떻게 매핑되는지를 나타냅니다.
레일즈 마이그레이션에 대해 설명하라
마이그레이션은 개발자가 데이터베이스 스키마를 편리하게 변경할 수 있도록 도와줍니다. 이를 통해 개발자는 제어된 환경에서 데이터베이스 스키마의 롤아웃 및 롤백을 관리할 수 있습니다. 이러한 접근 방식을 사용하면 변경 사항을 정의하기 위해 개별 SQL 스크립트를 관리할 필요가 없습니다.
레일즈의 명명 규칙에 대해 설명하라
- 클래스 및 모듈: MixedCase를 사용하되 밑줄은 사용하지 않습니다. 클래스와 모듈 이름은 대문자로 시작합니다.
- 데이터베이스 테이블: 복수형 및 snake_case를 사용해야 합니다.
- 변수: 소문자로 시작해야 하며, snake_case 방식으로 밑줄로 구분해야 합니다.
- 모델: MixedCase를 사용하고 단수형으로 이름을 지정해야 합니다.
- 컨트롤러: 컨트롤러 이름은 복수형으로 지정합니다.
레일즈에서 string과 text의 차이점은 무엇인가?
:string은 최대 255자의 짧은 텍스트를 저장하는 데 적합합니다. 이름, 사용자 이름, 이메일, 비밀번호 및 제목 등에 사용됩니다.
:text는 긴 설명을 저장하는 데 적합합니다. 블로그 게시물 또는 상점 설명에 대한 댓글을 저장하는 데 사용할 수 있습니다.
class CreatePosts < ActiveRecord::Migration def self.up create_table:posts do |t| t.string:description t.text :content end end
교차 사이트 요청 위조(CSRF)에 대해 설명하라
CSRF(Cross-Site Request Forgery)는 공격자가 인증된 사용자를 속여 특정 작업을 대신 수행하도록 하는 공격입니다.
레일즈는 CSRF 공격을 방지하기 위해 개발자가 ApplicationController에 “protect_from_forgery”를 추가하도록 요구합니다. 앱은 사용자를 인증하기 위해 항상 CSRF 토큰을 요구합니다.
레일즈에서 믹스인(mixin)이 무엇인지 설명하라
믹스인은 클래스에 기능을 추가하는 제어된 방법을 제공합니다. 여러 믹스인이 클래스를 구성할 수 있습니다. 믹스인을 사용하면 다중 상속이 필요하지 않습니다.
루비에서 load와 require의 용도는 무엇인가?
require()는 라이브러리/젬을 가져오는 데 사용됩니다.
load()는 코드 블록을 실행하는 데 사용됩니다.
루비 온 레일즈에서 콜백과 옵저버의 차이점은 무엇인가?
레일즈 옵저버는 메서드가 객체의 수명 주기와 직접적으로 관련이 없을 때 사용됩니다. 수명 주기가 길고 언제든지 연결하거나 분리할 수 있습니다.
콜백은 객체 수명 주기의 특정 시점에서만 호출할 수 있습니다. 예로는 업데이트, 생성 및 유효성 검사 등이 있습니다. 콜백은 짧은 기간 동안만 활성화됩니다.
루비에서 하네스(harness)와 픽스처(fixture)는 무엇인가?
픽스처는 테스트하려는 데이터를 구성하는 방법을 나타냅니다. .yml 확장자를 가진 파일에서 만들 수 있습니다.
하네스는 레일즈 테스트를 실행하기 위한 환경 또는 테스트 실행기입니다. 픽스처는 하네스에 설정됩니다.
extend와 include의 차이점은 무엇인가?
“Include”는 인스턴스 메서드를 클래스에 추가합니다. 따라서 코드는 클래스 메서드를 통해 접근할 수 있습니다.
“Extend”는 모듈에 정의된 인스턴스 메서드를 확장된 클래스에 추가합니다.
루비에서 젬(gem)과 플러그인은 동일한가?
젬은 설치해야 하는 패키지된 루비 애플리케이션입니다. 범용적으로 사용되며, 기능 구현을 위해 레일즈에 의존하지 않습니다.
루비 온 레일즈의 플러그인은 레일즈 애플리케이션과 함께 배포됩니다. 레일즈의 핵심 기능을 수정하거나 추가합니다.
레일 옵저버란 무엇인가?
레일 옵저버는 하나의 객체의 상태가 변경될 때 다른 객체에 알리는 메커니즘을 제공합니다. 객체 하나가 변경되면 연결된 다른 객체에 자동으로 변경 사항을 알려주는 일대다 관계에 적합합니다.
마이그레이션을 생성하는 데 사용되는 명령어는 무엇인가?
bin/rails db:migrate
루비에서 클래스, 인스턴스 및 전역 변수를 정의하는 방법을 보여라
- 클래스 변수: 클래스 내 어디에서나 사용할 수 있습니다. 클래스 하위 클래스에서도 접근할 수 있습니다. @@로 시작합니다.
- 인스턴스 변수: 생성된 객체의 인스턴스에 특정한 로컬 범위에서 사용됩니다. 객체마다 다른 값을 가질 수 있습니다. @로 시작합니다.
- 전역 변수: 프로그램 내 어디에서나 접근할 수 있습니다. $로 시작합니다.
루비 데모 디렉토리에서 제공되는 rakefile의 역할은 무엇인가?
Rakefile은 레일즈 코드의 테스트 및 패키징을 돕습니다. 이 파일은 테스트를 실행하거나 애플리케이션의 기능을 시연하는 작업을 정의합니다.
레일즈에서 스위퍼(sweeper)란 무엇인가?
스위퍼는 캐싱에서 터미네이터 역할을 합니다. 스위퍼는 필터와 옵저버의 역할을 동시에 수행하며, 이 두 가지 역할에 대한 콜백을 구현합니다. ‘expire_cache’를 사용하여 만료되어야 하는 캐시 조각을 찾아서 삭제합니다.
필터란 무엇인가?
필터는 컨트롤러의 작업이 실행되기 “전” 또는 “후”에 실행되는 메서드입니다. 이러한 메서드는 상속이 가능하며, ApplicationController에서 설정되면 앱에서 수신하는 모든 요청과 함께 실행됩니다.
레일즈에서 리디렉션과 렌더링의 차이점을 설명하라
렌더링: 템플릿을 렌더링한 후 클라이언트에 응답으로 전송하는 데 사용됩니다. 템플릿은 브라우저에 표시할 페이지를 생성합니다.
리디렉션: 새 HTTP 요청을 다른 URL로 보냅니다. 클라이언트를 다른 컨트롤러 또는 작업으로 리디렉션합니다. 이 방법은 클라이언트가 브라우저에서 보는 URL을 변경하려는 경우에 유용합니다.
super() 호출과 super 호출의 차이점을 설명하라
- Super: 호출된 메서드의 모든 인수를 가지고 현재 객체의 부모 클래스에 메시지를 보냅니다.
- super(): 부모 클래스에 어떤 인수도 보내지 않습니다.
Procs와 Blocks의 차이점은 무엇인가?
- 블록: do/end 문 또는 중괄호로 묶인 코드 조각입니다. 메서드가 호출될 때마다 생성되고 실행됩니다.
- Procs: 로컬 변수 집합에 바인딩된 코드 블록입니다. 다른 컨텍스트에서 호출될 수 있으며, 변수에 여전히 접근할 수 있습니다.
puts와 print 문의 차이점은 무엇인가?
화면에 무엇인가를 출력하고 싶을 때 puts를 사용합니다. 예를 들어,
puts “Hello World!!!”
결과: Hello World!!!가 화면에 출력됩니다.
콘솔에 새 줄을 추가하지 않고 싶을 때는 print를 사용합니다.
print “Hello World!!!”
결과: Hello World!!!를 출력하지만, 콘솔에 새 줄이 추가되지 않습니다.
동적 파인더란 무엇인가?
동적 파인더는 개발자가 원시 SQL 쿼리를 사용하지 않고 데이터베이스에서 레코드를 검색할 수 있게 합니다. find_by_ 키워드 뒤에 검색하려는 속성을 붙여서 사용합니다.
레일즈가 AJAX를 구현하는 방법을 설명하라
- 폼 제출 또는 버튼 클릭과 같은 트리거가 시작됩니다.
- JavaScript 메서드가 트리거 데이터를 서버의 핸들러로 보냅니다.
- 서버 측 핸들러가 데이터에 대해 작업을 수행하고 HTML을 웹 클라이언트로 보냅니다.
- 클라이언트 측 JavaScript 처리기가 HTML 콘텐츠를 받아 현재 페이지를 업데이트합니다.
Dig, Float, Max에 대해 설명하라
- Dig: 중첩된 해시 또는 배열에서 값을 추출하는 데 사용되는 메서드입니다.
- Float: 부동 소수점 정밀도로 실수를 나타내는 루비 데이터 유형입니다.
- Max: 배열 및 해시와 함께 사용할 수 있는 메서드로, 항목/값 모음에서 최대값을 반환합니다.
array = [2, 9, 4, 7, 3] maximum = array.max
결과: 콘솔에 가장 큰 숫자인 9가 출력됩니다.
결론
위 내용은 루비 온 레일즈 면접에서 나올 수 있는 몇 가지 질문입니다. 다재다능한 소프트웨어 엔지니어라면 Node.js 면접 질문도 확인해 보는 것이 좋습니다. 면접에 참석하기 전에 루비 온 레일즈 엔지니어의 직무 설명을 충분히 숙지했는지 확인하십시오.