프로그래밍/Node.js

[NodeJS] readFile, readFileSync - 리눅스와 윈도우간 차이점

채윤아빠 2023. 11. 19. 15:30
728x90
반응형

문제점 및 증상

윈도우 환경에서 개발할 때 전혀 문제 없던 것이 리눅스 운영 환경으로 배포하였더니, 윈도우에서 발생하지 않던 오류가 발생하였습니다.


프론트 스크립트 파일의 문자열에 문자열 처리에 오류가 발생하였는데, 핸들바 템플릿을 통하여 전달된 문자열에 들어 있으면 안되는 "\n" 문자가 포함되어 브라우저에서 문법 오류가 발생하면서 프론트단 전체가 제대로 동작하지 않았습니다.


원인 분석

도저히 이해가 되지 않는 현상이라, 아래와 같은 간단한 프로그램을 작성하여 시험해 보았습니다.

let fs = require('fs')

let data_list = fs.readFileSync(process.cwd() + '/data_list.txt').toString()
console.log(data_list)
console.log('data_list')

다음은 "data_list.txt" 파일의 내용입니다.

ABCD001,ABCD002,ABCD003

위 소스를 윈도우에서 실행했을 경우에는 예상한대로 다음과 같이 출력됩니다.

ABCD001,ABCD002,ABCD003
data_list

그런데, 리눅스 운영 환경에서 실행했을 경우에는 다음과 같이 마지막에 "\n"이 적용된 형태로 출력이 되었습니다. ㅠ.ㅠ

ABCD001,ABCD002,ABCD003

data_list

혹시나 싶어서 각 환경의 node 버전을 확인해 봤더니, 운영측 리눅스 환경의 node는 v16.5.0 이었고, 윈도우 환경의 node는 v18.12.0 이었습니다.

버전의 차이인가 싶어서 도커로 최신 노드 컨테이너(node:21.2.0-alpine3.17)를 받아서 동일한 소스를 실행해 봤지만, 위와 동일한 결과가 나왔습니다.

혹시나 싶어서 ".toString()" 부분을 빼고 바이트 배열로 봤더니, 리눅스 결과에만 파일에 없던 '0a'가 추가되어 나옵니다.


<Buffer 53 4e 42 50 32 31 30 37 30 30 38 2c 53 4e 42 50 32 31 30 37 30 30 39 2c 53 4e 42 50 32 31 30 37 30 31 30 0a>
data_list

괜스레 node 버전을 아무리 바꿔도 마지막에 추가되는 '0a'를 잡을 수가 없었습니다.


해결 방법

개발 및 운영환경에서 동일하게 동작되도록 하기 위하여 마지막 '0a'를 제거하기로 하였습니다.

제가 적용한 방법은 다음과 같습니다.

let fs = require('fs')

let data_list = fs.readFileSync(process.cwd() + '/data_list.txt', 'utf-8').split('\n')[0]
console.log(data_list)
console.log('data_list')

위의 방식은 파일에서 읽어온 데이터가 1줄일 경우에만 적용할 수 있는 방법입니다. 여러 줄의 데이터를 읽을 경우에는 다음과 같이 처리하시면 됩니다.

let fs = require('fs')

let device_list = fs.readFileSync(process.cwd() + '/device_list.txt')
device_list = (device_list[device_list.length - 1] === 10) ? device_list.slice(0, -1).toString() : device_list.toString()
console.log(device_list)
console.log('device_list')

참고자료