Rust 하위 Workspace 만들기

CharlieMoon·2026년 1월 25일

Rust

목록 보기
3/3
post-thumbnail

개발을 진행하다보면 규모가 점점 커지게 되고 관리하기 쉽지 않다 그럴때 패키지 단위로 관심사를 분류해서 관리하게 되는데 Rust에서는 Workspace로 나누어 관리하면 좋다. 필자의 경험을 바탕으로 비유하자면 Android 개발에서 다중 모듈화 라고 볼 수 있겠다.

프로젝트 생성하기

기존 프로젝트에서 새로운 프로젝트를 생성해준다.

	cargo new <새로운 워크스페이스 이름>

Workspace 추가

root에 위치한 Cargo.toml 파일에 workspace 테이블을 만들고 resolver,member키를 선언하고 값을 입력해준다.

resolver

Cargo에서 지원하는 프로젝트 dependency의 feature 조합을 계산하는 기능이다.

주요 차이점:
resolver = "1": 오래된 방식
resolver = "2": dev-dependencies가 일반 dependencies의 feature에 영향을 주지 않음, edition 2021 부터는 2이 기본값이다.
resolver = "3": Rust 1.84+ 필수, MSRV(Minimum Supported Rust Version) 관리 개선, edition 2024 부터는 3이 기본값이다.

members

어떤 패키지를 멤버로 사용할지 정의한다. 대괄호를 사용하여 (경로가 포함 된)디렉토리 이름을 문자열로 선언해줍니다.



이렇게 해놓으면 root에서 cargo build를 수행하여도 하위 workspace들까지 모두 한번에 build가 된다.

Workspace 사용해보기

의존성 추가

main.rslib.rs 로 변경한다. 그리고 fn main을 다른 함수로 작성한다. main.rslib.rs로 만드는 이유는 이 프로젝트를 실행 가능한 프로그램이 아닌 재사용 가능한 라이브러리로 전환한다는 의미이다.

root Cargo.toml의 depentancies 테이블에 의존성을 등록해준다.

root의 main.rs에 하위 워크스페이스의 함수를 호출하는 코드를 작성한다.

실행을 시키면 잘 동작한다.

그래서 Workspace를 사용하면 뭐가 좋은가?

빌드 시간 단축

독립적 컴파일, 증분 빌드

모노리스 프로젝트로 관리하게 되면 파일 하나만 변경하여도 전체를 다시 컴파일 해야 할 수 도 있지만 워크스페이스를 사용하여 여러 크레이트(패키지)로 관리하면 변경되지 않은 크레이트의 컴파일 결과물을 재사용하게 되어 시간 단축이 있다.

의존성 관리 효율화 및 일관성

단일화

워크스페이스 내의 모든 크레이트는 하나의 Cargo.lock 파일을 공유하게 된다.

버전 통일

단일 Cargo.lock 파일을 통해 모든 크레이트가 동일한 버전의 의존성을 사용하도록 보장하고, target 폴더를 공유하여 중복 빌드를 방지한다.

코드 구조화 및 모듈화

논리적 분리

애플리케이션의 핵심 로직, CLI 도구, API 서버 등 분리하여 관리 할 수 있다.

코드 재사용

공통으로 사용하는 유틸리티나 데이터 모델을 별도의 라이브러리로 만들어 다른 크레이트에서 쉽게 재사용을 할 수 있다.

관심사 분리

각 크레이트가 자신만의 책임을 갖게 되어 코드 베이스가 깔끔해지고 유지보수가 용이해 진다.

개발 워크플로우 최적화

한번에 빌드/테스트

cargo <command> --workspace 명령을 사용해서 root에서 모든 크레이트를 한번에 빌드하거나 테스트 할 수 있다.

언제 사용해야 하나

  • 프로젝트가 커져서 빌드 시간이 답답하게 느껴질 때
  • 하나의 프로젝트 안에 여러 개의 실행 파일(Binary)이나 라이브러리가 공존할 때
  • 공통 코드를 여러 곳에서 공유해야 할 때

Cargo Book

profile
산만한 개발자의 노트

0개의 댓글