Skip to main content

API 모듈화 하기

시작하기에 앞서

주의

해당 블로그의 모든 문서는 학습한 내용을 제 방식으로 정리하여 작성하고 있습니다.
순수 창작물도 아니고, 틀린 내용이 있을 수 있으므로 참고하고 읽어주시면 감사하겠습니다.


서론

첫 ReactJS 개인 프로젝트를 진행하고 있던 중 고민이 하나 생겼다.

필요한 데이터를 요청할 때 Axios를 통해서 받아오고 있었는데,

동일한 API를 요청할 때마다 복사 붙여넣기로 처리하다보니 중복되는 코드가 너무 많아지는것을 볼 수 있었다.

이를 어떻게 해결 할까 고민하다가 Java처럼 서비스 Class를 정의해놓으면

필요한 곳에서 인스턴스를 생성하고 메서드를 호출하면 중복을 제거할 수 있지 않을까 하는 생각이 문득 들었다.

프론트쪽은 잘 몰라서, 좋은 방법인지는 모르겠지만 그래도 한 번 정리해보려고 한다.


API 모듈화 전

const onClickHandler = () => {
const formData = { title, content, language };
const requestURL = "...";

// 등록 API 호출
axios.post(requestURL, formData, headers: {
Authorization: jwtToken,
})
.then((response) => {
...
})
.catch((err) => { ... });
}

등록 API를 A에서만 사용하고 있으면 저 코드로 끝이지만,

B와 C에서도 사용하고 있다고 생각하면 똑같은 코드를 B와 C에도 작성해줘야 한다.

중복되는 코드가 너무 많아지고 매번 동일한 코드를 복사하고 붙여넣기 해야 한다는 큰 불편함이 생긴다.

클래스를 하나 생성해서 모듈화하여 재사용성을 높여보고자 한다.


API 모듈화 후

BookService.ts
export class BookService {
axiosInstance: AxiosInstance;

constructor() {
this.axiosInstance = axios.create({
baseURL: "http://localhost:8080/api",
headers: {
Authorization: jwtToken,
},
});
}

/* 단어장 단일 조회 API */
findById = async (bookId: number) => {
try {
return await this.axiosInstance.get(`/books/${bookId}`);
} catch (err) {
console.error(err);
}
};

/* 내거 생성한 단어장 목록 조회 API */
findAll = async (page: number) => {
try {
return await this.axiosInstance.get(`/books/mine`, {
params: {
page,
},
});
} catch (err) {
console.error(err);
}
};

/* 단어장 등록 API */
create = async (formData: BookFormData) => {
try {
return await this.axiosInstance.post(`/books`, formData);
} catch (err) {
console.error(err);
}
};

/* 단어장 수정 API */
update = async (formData: BookFormData, bookId: number) => {
try {
await this.axiosInstance.patch(`/books/${bookId}`, formData);
} catch (err) {
console.error(err);
}
};

/* 단어장 삭제 API */
delete = async (bookId: number) => {
try {
await this.axiosInstance.delete(`/books/${bookId}`);
} catch (err) {
console.error(err);
}
};
}

BookService 클래스를 하나 정의하고 export 키워드로 내보내기 해준다.


// (1) Import
import { BookService } from "../service/BookService";

const ExampleView = () => {
// (2) 인스턴스 생성
const bookService = new BookService();

const onClickHandler = async () => {
const formData = { name, content, language, shareStatus };

// (3) 메서드 호출
await bookService.create(formData);
const response = await bookService.findAll(0);

...
};

return (...);
};

export 키워드로 내보내기 한 서비스 클래스를 필요한 곳에서 Import 하고 인스턴스를 생성해서

필요한 API 메서드를 호출하기만 하면 된다.

실제로 개인 프로젝트에 적용해 보니 모듈화 전보다 코드가 훨씬 단순해졌다!