R-Blogger블로그·해설한국어2025-09-22
R6 인터페이스(백엔드용): 무엇을 정의하라, 어떻게 하지 마라
신뢰성 있는 테스트를 위한 R6 클래스 활용 외부 의존성 및 비즈니스 로직 가짜 만들기 실용 가이드 이 문서는 R6 클래스를 사용하여 외부 의존성과 비즈니스 로직을 가짜로 만들어 테스트의 안정성과 재현성을 높이는 방법을 소개합니다. R6는 객체 지향 프로그래밍을 R 환경에 자연스럽게 도입해 주므로, 실제 애플리케이션 코드와 거의 동일한 구조로 가짜를 만들 수 있습니다. 왜 가짜(모킹)가 필요한가? 외부 API 호출 등 네트워크 지연 없이 빠른 테스트 실행 비용이 높은 서비스 호출을 최소화 불확실한 외부 데이터에 의존하지 않고 예측 가능한 결과 확보 비즈니스 로직을 독립적으로 검증 R6 클래스 개요 R6 클래스는 클래스 정의와 인스턴스 생성을 모두 객체지향 스타일로 구현합니다. 예시: library(R6) Person <- R6Class( "Person", public = list( name = NULL, initialize = function(name) { self$name <- name }, greet = function() { paste0("Hello, ", self$name) } ) ) p <- Person$new("Alice") p$greet() # "Hello, Alice" 외부 의존성 가짜 만들기 외부 서비스(예: REST API, 데이터베이스)를 호출하는 R6 클래스를 정의하고, 테스트 시에는 실제 구현 대신 가짜를 삽입합니다. # 실제 서비스 클래스 APIClient <- R6Class( "APIClient", public = list( getData = function(id) { # 실제 HTTP 요청 (생략) } ) ) # 테스트용 가짜 클래스 FakeAPIClient <- R6Class( "FakeAPIClient", public = list( getData = function(id) { list(id = id, value = "mocked") } ) ) 테스트에서는 FakeAPIClient$new()를 주입해 실제 HTTP 호출 없이도 안정적으로 테스트할 수 있습니다. 비즈니스 로직 가짜 만들기 비즈니스 로직을 담당하는 클래스를 가짜로 만들면, 로직 내부의 외부 의존성을 제거하고 순수 로직만 검증할 수 있습니다. # 실제 비즈니스 로직 클래스 Calculator <- R6Class( "Calculator", public = list( client = NULL, initialize = function(client) { self$client <- client }, compute = function(id) { data <- self$client$getData(id) # 복잡한 계산 (생략) data$value } ) ) # 테스트용 가짜 FakeCalculator <- R6Class( "FakeCalculator", public = list( compute = function(id) { paste0("result for ", id) } ) ) 테스트에서는 FakeCalculator$new()를 사용해 외부 호출을 전혀 하지 않고도 결과를 검증합니다. 실전 예시: 테스트 스위트 test_that("Calculator computes correctly", { fake_client <- FakeAPIClient$new() calc <- Calculator$new(fake_client) expect_equal(calc$compute(42), "mocked") }) test_that("FakeCalculator behaves as expected", { fake_calc <- FakeCalculator$new() expect_equal(fake_calc$compute(42), "result for 42") }) 이렇게 하면 테스트가 빠르고, 실제 외부 서비스에 의존하지 않으면서도 비즈니스 로직이 올바르게 동작하는지 검증할 수 있습니다. 정리 R6 클래스는 R에서도 객체지향 프로그래밍을 자연스럽게 구현해 줍니다. 외부 의존성이나 복잡한 비즈니스 로직을 Fake 클래스로 대체하면 테스트가 빠르고 안정적이 됩니다. 테스트 환경과 실제 환경에서 동일한 인터페이스를 사용하기 때문에 코드가 깨지지 않습니다. 가짜 구현은 실제 구현과 API를 동일하게 유지해 두어, 나중에 실제 코드와 교체가 용이합니다. 이 가이드를 통해 R6 클래스를 활용한 가짜 구현과 테스트 설계에 익숙해지시길 바랍니다. 궁금한 점이 있으면 언제든 이슈 트래커에 문의해 주세요.
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
- 작성자
- R-Blogger
- 출처
- R-Blogger
- 플랫폼
- R-Blogger
- 분류
- 블로그·해설
- 언어
- 한국어
- 발행일
- 2025-09-22