Angular 6 업그레이드 후 RxJS 6 마이그레이션 삽질기
문제 상황
회사 프로젝트를 Angular 5에서 6으로 업그레이드했다. ng update로 패키지는 올렸는데, 빌드 시 RxJS import 에러가 500개 넘게 쏟아졌다.
// 기존 코드 (RxJS 5)
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/filter';
this.http.get('/api/users')
.map(res => res.json())
.filter(user => user.active)
.subscribe(...);
RxJS 6부터는 import 경로가 완전히 바뀌었다.
해결 방법
1. rxjs-compat 설치 (임시)
npm install rxjs-compat --save
일단 호환 패키지로 빌드는 통과시켰다. 하지만 deprecated 경고가 계속 뜨고, 번들 크기도 늘어났다.
2. 파이프 연산자로 전면 수정
// RxJS 6 방식
import { Observable } from 'rxjs';
import { map, filter } from 'rxjs/operators';
this.http.get<User[]>('/api/users').pipe(
map(users => users.filter(u => u.active))
).subscribe(...);
모든 .map(), .filter() 체이닝을 pipe() 안으로 이동했다. 정규식으로 대부분 치환했지만, 복잡한 중첩 스트림은 수동으로 수정했다.
3. Subject 사용 부분
// 기존
import { Subject } from 'rxjs/Subject';
// 변경
import { Subject } from 'rxjs';
모든 Observable 관련 import를 rxjs에서 직접 가져오도록 수정했다.
결과
- 500개 에러 → 0개
- 번들 크기 12% 감소
- rxjs-compat 제거 완료
작업 시간은 이틀 정도 걸렸다. 파이프 연산자가 처음엔 어색했지만, 오히려 가독성은 나아진 것 같다. TypeScript와 함께 쓰니 타입 추론도 더 잘 된다.