트래픽이 많은 서비스는 아니지만, 비즈니스 요구사항이 점점 늘어나면서 최근 서드파티 라이브러리를 사용 할 일이 많아졌다. RESTful API를 만들면서 나도 Swagger를 통해 API를 문서화 해본 경험 덕인지 서드파티 API 문서를 보면서 기능을 구현하는 것이 전처럼 많이 어렵지는 않았다.
이번에 채널톡, Iamport, 택배배송 조회 API(스마트택배 배송조회 API)를 기존 서비스에 연동하게 되었다.
연동을 차근차근 해나가던 와중에 들은 피드백ㅠ.ㅠ
서드파티에 과하게 의존하게 되면, 나중에 다른 서드파티를 사용하게 되었을 때 감당하기가 힘들거에요 :(
서드파티에 과하게 의존한다는 말이 어느 정도를 의미하는걸까? OOP는 나에게는 정말 어려운 말이지만, 그래도 위 피드백을 받고 구현했던 코드를 보니까 과하다는 말이 딱 어울리는 것 같았다.
위 피드백은 Iamport 결제모듈을 연동할 때 들었던 건데, 나는 결제정보와 관련된 데이터와 필드를 요청, 응답 명세 그대로 MongoDB에 저장하려고 Collection을 준비하고 있었다. 시간이 지나서 Iamport를 사용하지 않고 다른 결제모듈을 사용하게 된다면? 또는 결제제휴사가 다른 회사로 바뀐다면? 요청 또는 응답 명세가 변한다면? 그럼 그 때도 DB Schema를 변경해야하는가?
한창 Express를 처음 배웠을 때에도 어떤 기능을 추가하려고 할 때 마다 답이 없어 아예 디렉토리를 새로 만든적도 여러번이어서 유연하고 확장 가능한 서비스가 얼마나 어렵고 중요한 일인지 알게 됐었더랬다.
내가 만든 코드나 기능, 더 나가서 서비스가 유연하지 못하면 지금은 나만 힘들지 몰라도 나중엔 다른 사람이 고생하겠지 ㅠㅠ
피드백을 해주셨던 사수님이 남겨주신 코드를 바탕으로 구현했던 코드를 기록으로 남긴다.
이번에는 채널톡 연동이다.
class ChannelDeskModule {
[...]
public createMessageApiUrl(groupName: string): string {
const group: string = encodeURIComponent(groupName);
const bot: string = encodeURIComponent(this.createBotName(groupName));
return `${this.path}/open/groups/@${group}/message?botName=${bot}`;
}
public createBotName(groupName: string): string {
return `${groupName}_BOT`
}
public async sendChannelMsg(groupName: string, message: string): Promise<void> {
try {
const groupoMessageApiUrl: string = this.createMessageApiUrl(groupName);
const payload = { message: message };
await Axios.post(groupMessageApiUrl, payload, this.setHeader());
} catch (err) {
// handle error
}
}
}
class ChannelDeskTemplate extends ChannelDeskModule {
[...]
public async sendPurchaseRequestMsg(name: string, product: string, amount: number): Promise<void> {
let message = `${name}님께서 ${product}를 ${amount}원에 구매 요청`;
await this.sendChannelMsg('제품구매알림', message);
}
[...]
}
변경 전 코드가 없어서 아쉽긴 하지만, 위와 같이 변경하기 이전에는 "제품구매알림"이라는 채널에 "제품구매알림_BOT"이라는 이름으로 정해진 템플릿 메시지를 전송했다. 만약 우리가 채널톡을 이용하지 않고 다른 채널데스크 라이브러리나 모듈을 사용하게 된다면, 모든 부분에서 수정사항이 일어나야 한다. 하지만 채널데스크 모듈과 채널데스크 템플릿으로 구분을 해두면, 우리가 전달하고자 하는 이름, 제품, 가격과 어떤 채널에 보낼지가 서드파티와 분리될 수 있게 된다.
객체지향 고수가 되는 그날까지:~~!