Actix Web은 Rust 생태계에서 고성능과 확장성을 제공하는 대표적인 웹 프레임워크입니다. 효율적인 애플리케이션 개발을 위해 프로젝트의 디렉토리 구조를 설계하고, 서버를 실행하며, 설정을 관리하는 방법을 살펴봅니다.
1. 프로젝트 디렉토리 구조 설계
Actix Web 프로젝트는 유지보수성과 확장성을 고려하여 기능별로 디렉토리를 분리하는 것이 관례입니다. 전형적인 아키텍처 구조는 다음과 같습니다.
rust-actix-app/
├── Cargo.toml
├── src/
│ ├── main.rs
│ ├── api_endpoints.rs
│ ├── logic_handlers.rs
│ └── data_models.rs
├── configs/
│ └── app_config.toml
├── assets/
│ └── main.css
└── views/
└── layout.html
주요 구성 요소 설명
- Cargo.toml: Rust 패키지 관리 파일로, Actix Web 및 필요한 크레이트(Crate) 의존성을 정의합니다.
- src/: 소스 코드가 위치하는 핵심 폴더입니다.
- main.rs: 애플리케이션의 진입점으로 서버 객체를 생성하고 구동합니다.
- api_endpoints.rs: HTTP 경로(URL)를 특정 로직과 연결하는 라우팅 규칙을 정의합니다.
- logic_handlers.rs: 클라이언트의 요청을 처리하고 응답을 생성하는 비즈니스 로직을 포함합니다.
- data_models.rs: 데이터베이스 스키마나 API 요청/응답에 사용되는 데이터 구조체를 정의합니다.
- configs/: 포트 번호, 데이터베이스 주소 등 환경별 설정 파일을 보관합니다.
- assets/ & views/: 정적 파일(CSS, JS) 및 HTML 템플릿 파일을 관리합니다.
2. 서버 엔트리 포인트(main.rs) 구현
서버를 구동하기 위한 src/main.rs 파일의 기본 구현 예시입니다. 비동기 런타임을 활용하여 서버를 초기화합니다.
use actix_web::{web, App, HttpServer};
mod api_endpoints;
mod logic_handlers;
mod data_models;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let host_address = "127.0.0.1";
let host_port = 9000;
println!("서버가 http://{}:{} 에서 시작됩니다.", host_address, host_port);
HttpServer::new(|| {
App::new()
.service(
web::scope("/api/v1")
.configure(api_endpoints::init_routes)
)
})
.bind((host_address, host_port))?
.run()
.await
}
코드 핵심 포인트
- #[actix_web::main]: Actix 시스템이 비동기적으로
main함수를 실행할 수 있게 해주는 매크로입니다. - HttpServer::new: 웹 서버 팩토리를 생성합니다. 각 워커 스레드마다 새로운
App인스턴스를 생성합니다. - web::scope("/api/v1"): 특정 접두사(Prefix)를 가진 라우트들을 그룹화하여 관리합니다.
- bind(): 서버가 수신 대기할 IP 주소와 포트를 지정합니다.
3. 환경 설정 파일(TOML) 활용
하드코딩을 방지하기 위해 configs/app_config.toml 파일을 통해 설정을 관리하는 것이 좋습니다.
[network]
host = "0.0.0.0"
port = 9000
[persistence]
db_connection = "postgres://admin:secret@localhost:5432/my_db"
max_pool = 10
설정 항목 상세
- [network]: 서버의 네트워크 인터페이스 주소와 포트를 설정합니다.
- [persistence]: 데이터베이스 연결 문자열과 커넥션 풀 크기 등 저장소 관련 설정을 정의합니다.
이러한 구조화된 방식은 팀 단위 개발에서 코드 충돌을 줄이고, 테스트 및 배포 과정을 자동화하는 데 매우 효율적입니다.