라이브러리(Library)와 바이너리(Binary)
이전 연습 문제에서 TicketNewError에 Error 트레이트를 구현하려니 코드가 꽤 많았죠?
Display를 직접 구현하고, Error를 위한 impl 블록도 작성해야 했습니다.
이런 번거로움을 덜어주는 도구가 있습니다. 바로 thiserror라는 Rust 크레이트입니다. thiserror는 **절차적 매크로(Procedural macro)**를 사용해 사용자 정의 오류 타입 생성을 훨씬 간편하게 만들어 줍니다.
하지만 잠시만요! thiserror는 외부 라이브러리이며, 우리가 처음으로 프로젝트에 추가하게 될 **의존성(Dependency)**입니다. 외부 라이브러리를 사용하기 전에, 먼저 Rust의 패키징 시스템에 대해 간단히 알아봅시다.
패키지(Package)란 무엇인가요?
Rust **패키지(Package)**는 Cargo.toml 파일에 의해 정의됩니다. 이 파일을 **매니페스트(Manifest)**라고도 부르죠.
[package] 섹션에서는 패키지의 이름, 버전과 같은 메타데이터를 설정할 수 있습니다.
지금 풀고 있는 연습 문제 디렉토리의 Cargo.toml 파일을 한번 확인해 보세요!
크레이트(Crate)란 무엇인가요?
하나의 패키지 안에는 **타겟(Target)**이라고도 불리는 하나 이상의 **크레이트(Crate)**가 있을 수 있습니다. 가장 흔히 볼 수 있는 두 종류는 **바이너리 크레이트(Binary crate)**와 **라이브러리 크레이트(Library crate)**입니다.
바이너리(Binary)
바이너리는 실제로 실행할 수 있는 프로그램입니다. 컴파일하면 **실행 파일(Executable file)**이 만들어지죠. 바이너리 크레이트에는 반드시 main이라는 이름의 함수가 있어야 합니다. 이 함수가 프로그램이 시작되는 **진입점(Entry point)**이 됩니다.
라이브러리(Library)
반면 라이브러리는 그 자체로는 실행할 수 없습니다. 대신, 다른 패키지에서 해당 라이브러리의 코드를 가져와서 사용할 수 있습니다. 라이브러리는 함수, 타입 등을 하나로 묶어 다른 패키지가 사용할 수 있는 의존성의 역할을 합니다.
지금까지 여러분이 해결한 모든 연습 문제들은 테스트 세트(Test suite)가 포함된 라이브러리 형태였습니다.
몇 가지 규칙(Conventions)
Rust 패키지에는 기억해두면 좋은 몇 가지 관습적인 규칙이 있습니다.
- 소스 코드는 보통
src디렉토리에 둡니다. - 만약
src/lib.rs파일이 있다면,cargo는 이 패키지에 라이브러리 크레이트가 포함되어 있다고 판단(Infer)합니다. - 만약
src/main.rs파일이 있다면,cargo는 이 패키지에 바이너리 크레이트가 포함되어 있다고 판단합니다.
물론 Cargo.toml 파일에서 직접 타겟을 선언해 이 규칙을 바꿀 수도 있습니다. 더 자세한 내용은 cargo 문서를 참고하세요.
마지막으로, 하나의 패키지에는 여러 개의 바이너리 크레이트가 있을 수 있지만, 라이브러리 크레이트는 단 하나만 존재할 수 있다는 점을 꼭 기억하세요!
Exercise
The exercise for this section is located in 05_ticket_v2/10_packages