이번 시간에는 api_key를 외부에서 적용하는 방법과 ocid를 전역변수로 다루는 방법에 대해 알아보고자 합니다.
API KEY를 argument로 받는 방법
java에서는 default로 argument를 받습니다.
public static void Main(String[] args){}
그치만 rust에서는 argument를 받지 않는 이상 cargo run
을 통해 실행이 됩니다.
만약 여기서 argument를 받게 된다면 cargo run {argument}
형식으로 받을 수 있습니다.
main 함수에서 다음과 같이 argument를 받아올 수 있습니다.
async fn main() {
let args: Vec<String> = std::env::args().collect();
}
저희는 argument로 api_key만 받아올 것이므로 args의 길이가 2보다 작으면 사용법을 출력하고, main 함수를 마무리하면 됩니다.
해당 방식은 다음과 같이 가능합니다.
async fn main() {
let args: Vec<String> = std::env::args().collect();
if args.len() < 2 {
println!("사용법: cargo run <arg>");
return;
}
}
이렇게 rust를 실행할 때 cargo run {api_key}
를 입력해주면 argument로 받은 api_key를 maple open api에 요청을 보낼때 마다 사용할 수 있습니다.
API KEY를 함수마다 전달?
이렇게 argument로 받은 api_key를 각 함수마다 전달하는 방식으로 하게 된다면, 코드가 복잡해지고 불편해질 것으로 보입니다.
그러면 해당 방식을 어떻게 해결해야 할까요?
여기서는 전역 변수로 선언해 두고, 각 함수에서 사용하는 방식을 사용할 것입니다.
rust에서는 전역변수를 사용하는 방법들(구조체에 Mutex 변수 선언, lazy Arc Mutex 등)이 존재합니다.
해당 프로젝트에서는 struct를 활용하여 Mutex<String>
를 사용하는 방식으로 진행할 것입니다.
다음과 같이 API라는 구조체명으로 key를 저장하는 구조체를 만들어 줍니다.
pub struct API {
pub key: Mutex<String>
}
이후 main에서 args로 받은 api_key를 API라는 구조체의 key라는 변수에 다음과 같이 저장이 가능합니다.
let api_key = Arc::new(API {
key: Mutex::new(args[1].clone()),
});
이렇게 선언해두고, 각 api 요청시에 해당 구조체의 key를 사용할 수 있도록 axum에서는 Extension 지원하는 방법으로는 .layzer(Extension(api_key))
와 같이 사용할 수 있습니다.
그러면 다음과 같이 선언하여 각 api 함수들에서 사용할 수 있습니다.
let app = Router::new()
.route("/getOcid", post(get_ocid))
.route("/getUserInfo", get(get_user_default_info))
.layer(Extension(api_key));
각 함수들은 다음과 같이 인자값으로 Extension을 선언해줘야 합니다.
pub async fn get_ocid(
Extension(api_key): Extension<Arc<API>>,
Json(character): Json<Character>,
)
그러면 OCID도 전역변수로?
OCID는 get_ocid를 통해 특정 nickName을 가진 사용자의 고유값을 받아오는 연산을 수행한 뒤, 각 api 함수들에서 해당 값을 사용하는 방식으로 작동됩니다.
그러면 해당 값은 어떻게 선언하여 사용하여야 할까요?
OCID로 api_key와 마찬가지로 같은 전역변수로 관리해주면 됩니다.
API 구조체에 ocid를 추가해줍니다.
pub struct API {
pub key: Mutex<String>,
pub ocid: Mutex<String>,
}
초기에 key값을 받아오면서 기본 문자열인 ""으로 초기화를 진행해줍니다.
let api_key = Arc::new(API {
key: Mutex::new(args[1].clone()),
ocid: Mutex::new("".to_string()),
});
이렇게 하면 key값과 마찬가지로 각 함수들에서 해당 ocid값을 사용할 수 있습니다.
그러면 get_ocid를 사용하지 않고 바로 선언하면 어떻게 떠? 라고 하실 수 있는데
각 api마다 response.status().is_success()
가 아닌 경우 "Failed to fetch OCID" 다음과 같이 에러 메시지를 출력하고 400 Bad Request를 출력하기 때문에 프론트에서 어떤 작업을 수행해야 하는지에 대해 확인이 가능합니다.
다음 시간에는 api 관련 함수가 많아짐에 따라, main과 같이 작성될 경우, main.rs가 엄청 길어질 것으로 예상되어 함수를 분리하는 내용에 대해 다뤄보고자 합니다.
'Rust > 프로젝트' 카테고리의 다른 글
Rust로 백엔드 개발기(feat. 메이플스토리) - 07 Null 제외하는 방법 (0) | 2025.03.31 |
---|---|
Rust로 백엔드 개발기(feat. 메이플스토리) - 06 프로젝트 분리 (0) | 2025.03.26 |
Rust로 백엔드 개발기(feat. 메이플스토리) - 04 캐릭터 정보 조회 (0) | 2025.03.13 |
Rust로 백엔드 개발기(feat. 메이플스토리) - 03 OPEN API (0) | 2025.03.13 |
Rust로 백엔드 개발기(feat. 메이플스토리) - 02 GET, POST, JSON 통신 (0) | 2025.03.09 |
댓글