홈 › 실무 배치 › 02 / 6

대용량 파일 I/O (NIO, Buffered)

섹션 7진행 0 / 6

파일 I/O — 버퍼링, NIO, 대용량 파일 처리

자바 I/O 가 왜 느리고 어떻게 빨라지는지(시스템 콜, 버퍼)를 이해하고, 100만 행 CSV 를 메모리 걱정 없이 읽고·파싱하고·쪼개고·합치고·안전하게 쓰는 배치 코드를 작성할 수 있게 됩니다.

1. 왜 배우는가

배치의 입력과 출력은 대부분 파일입니다. 은행·카드사·공공기관 사이의 데이터 교환은 지금도 "정해진 형식의 파일을 정해진 시각에 정해진 폴더에 놓는" 방식입니다. 거래 내역 CSV, 고정길이 전문(電文), 정산 결과 파일, 오류 리포트. DB 를 쓰는 배치라도 입력 파일을 읽어 DB 에 넣거나 DB 를 읽어 파일로 뽑는 형태가 대부분입니다. 파일 I/O 를 모르면 배치를 만들 수 없습니다.

그런데 자바의 파일 I/O 는 클래스가 너무 많습니다.

FileReader, BufferedReader, InputStreamReader, FileInputStream, Files.lines, Files.readAllLines, Scanner, FileChannel, MappedByteBuffer... 초보자는 검색해서 나온 것을 아무거나 쓰고, 그 코드는 1만 행에서는 잘 돌다가 100만 행에서 10분이 걸리거나 OOM 으로 죽습니다.

"왜 BufferedReader 로 감싸야 하는가"를 시스템 콜 수준에서 이해하면 클래스 선택이 자동으로 됩니다.

또 파일은 DB 와 달리 트랜잭션이 없습니다. 쓰다가 프로세스가 죽으면 반쯤 쓰인 파일이 남고, 그 파일을 다른 시스템이 가져가면 사고가 납니다. 인코딩을 잘못 지정하면 한글이 깨진 파일이 은행으로 전송됩니다. 이 레슨은 그런 사고를 막는 관행(임시 파일 + 원자적 이동, 인코딩 명시, try-with-resources)을 원리와 함께 다룹니다.