React Query의 useMutation은 서버와의 데이터를 변경하는 작업(POST, PUT, DELETE 등)을 처리하는 데 강력한 도구입니다. 이 글에서는 useMutation의 매개변수 타입이 한 개인 경우와 두 개 이상인 경우를 비교하며, 어떤 상황에서 어떤 방식이 더 적합한지 설명합니다.
(매개변수 처리 방식은 useMutation뿐만 아니라 함수 설계 전반에서 고려해야 할 중요한 요소입니다.)
■ 매개변수가 두 개인 경우
return useMutation<String, Error, { sendData: RouteData; user: UserFormData }>({
mutationFn: ({ sendData, user }) => route(sendData, user),
onSuccess: (data) => {
},
onError: () => {
},
});
// 호출
mutate({ sendData: routeData, user: userData });
- mutationFn의 매개변수가 두 개 이상인 경우, 객체로 묶어서 처리해야 합니다.
- 제네릭의 세 번째 인자에 { sendData: RouteData; user: UserFormData }와 같은 객체 타입을 정의해야 합니다.
장점
- 매개변수 확장성
- 여러 매개변수를 객체로 묶어 전달하므로, 매개변수를 추가하거나 변경하기 쉬움.
- 명시적 전달
- 호출부에서 각 매개변수의 의미를 명확히 알 수 있음.
단점
- 코드가 길어짐
- mutationFn에서 매개변수를 객체로 분해하고 타입을 정의해야 하므로 코드가 다소 복잡해질 수 있음.
- 가독성 저하
- 간단한 API 호출에도 불필요한 객체 구조가 추가될 수 있음.
■ 매개변수가 한 개인 경우
return useMutation<String, Error, RouteData>({
mutationFn: joinRoute,
onSuccess: (data) => {
},
onError: () => {
},
});
// 호출
mutate(sendData);
- mutationFn의 매개변수가 단일 타입(RouteData)로 처리됩니다.
- 제네릭의 세 번째 인자에 RouteData 타입만 지정하면 됩니다.
장점
- 간결한 코드
- mutationFn에 API 호출 함수명만 지정하면 되므로 코드가 간단하고 가독성이 좋아짐.
- 타입 정의가 간단
- 매개변수가 한 개라면, 타입 정의와 호출부 모두 최소화 가능.
- 가독성 향상
- 호출부와 mutationFn 모두 간단해져 코드를 읽기 쉽습니다.
단점
- 매개변수가 늘어나는 경우, 기존 구조를 변경해야 할 수 있음.
■ 매개변수 타입 처리 비교
특성매개변수 | 매개변수 1개 | 매개변수 2개 이상 |
코드 간결성 | 매우 간결 | 비교적 길어질 수 있음 |
가독성 | 좋음 | 매개변수가 많아지면 가독성이 저하될 수 있음 |
확장성 | 매개변수 추가 시 구조 변경 필요 | 매개변수를 객체로 묶으므로 확장성이 높음 |
적합한 상황 | 매개변수가 한 개로 충분한 경우 | 매개변수가 두 개 이상이거나 추가될 가능성이 높은 경우 |
어떤 방식을 선택해야 할까?
매개변수가 한 개인 경우
- 매개변수가 한 개인 경우에는 단일 타입으로 처리하고, mutationFn에 메서드명만 전달하는 방식이 좋습니다.
- 이유:
- 코드가 간결하고 가독성이 높습니다.
- 불필요한 객체 분해와 타입 정의를 피할 수 있습니다.
매개변수가 두 개 이상인 경우
- 매개변수가 두 개 이상이라면, 객체로 묶어서 전달해야 합니다.
- 이유:
- 매개변수를 객체로 처리하면 순서에 민감하지 않으며, 추가 매개변수를 더 쉽게 확장할 수 있습니다.
- 호출부에서 매개변수의 의미를 명확히 표현할 수 있습니다.
추천
- 매개변수가 한 개로 충분히 처리 가능한 경우, 타입과 호출부를 간결하게 유지하기 위해 단일 타입으로 작성하세요.
- 매개변수가 두 개 이상이거나 확장 가능성이 있는 경우, 객체 타입으로 처리하는 것이 유지보수에 유리합니다.
'React' 카테고리의 다른 글
[Middleware] Next.js를 활용한 인증 로직 구현하기 (0) | 2025.01.30 |
---|---|
[WebSocket] React로 WebSocket 구현하기(feat.Typescript) (0) | 2025.01.27 |
[TypeScript] 매개변수 처리 방식 (직접 받기 vs 객체로 받기) (0) | 2025.01.14 |
[useMutation] 폴더 구조를 재구성하며 커스텀 훅으로 분리 (0) | 2025.01.10 |
[SEO] SEO와 Metadata 설정(Next.js) (2) | 2024.10.04 |