javascript 2

Electron 크롤링 앱에 NestJS의 책임 분리를 참고한 과정

입사 당시 Electron 앱은 여러 채용 플랫폼에서 지원자를 수집하고 있었다. 플랫폼마다 로그인 방식과 DOM 구조는 달랐지만, 로그인, 중복 확인, 지원자 저장, 이력서 업로드라는 큰 흐름은 같았다. 그런데 각 플랫폼 파일이 이 흐름을 모두 들고 있어 공통 동작을 바꾸려면 여러 파일을 함께 수정해야 했다.백엔드 팀의 NestJS 코드를 보면서 Controller와 Service의 책임 분리, 생성자 주입, Module의 의존성 매핑 방식을 참고했다. 다만 Electron 앱에 NestJS나 DI 컨테이너를 넣은 것은 아니다. 필요한 개념만 TypeScript 클래스와 Factory로 옮겼다.먼저 바꾸고 싶었던 것기존 구조에서는 플랫폼별 함수 하나가 다음 작업을 모두 수행했다.로그인 -> 목록 수집 ..

개발 경험 2024.04.02

Puppeteer의 request와 response를 함께 기다리기: closure보다 중요했던 수명 관리

Electron과 Puppeteer로 크롤링 기능을 만들면서 한 페이지의 서로 다른 이벤트에서 정보를 모아야 했다. 요청 이벤트에서는 API 호출에 필요한 header가 나오고, 응답 이벤트에서는 파일을 여는 데 필요한 값이 나왔다. 두 값이 모두 준비된 뒤 다음 단계로 넘어가야 했다.처음에는 외부 변수에 값을 넣고 1초마다 확인했다.let result: PreInfo | undefined;page.on('request', (request) => { result = readRequest(request);});await page.reload();while (result === undefined) { await delay(1_000);}동작은 했지만 문제가 있었다.함수를 다시 호출할 때마다 listene..

개발 경험 2024.03.29