[Error Handling] CRLF, LF

김준표·2023년 3월 21일
0

CS

목록 보기
1/7
post-thumbnail

CRLF, LF란?

문자 또는 문자열에서 텍스트의 한 줄이 끝났다는 표시를 하는 "새줄 문자"를 의미합니다.

CRLFCRLF를 결합한 문자를 의미합니다.
CR이란 Carriage Return의 약자로, Escape 코드에서 \r을 의미하며 현재 라인에서 커서를 맨 앞으로 옮기라는 의미입니다.

LFLine Feed의 약자로, Escape 코드에서 \n을 의미하며 다음 라인으로 줄을 넘기라는 의미입니다.

❓ 왜 Line Feed가 줄바꿈인가?

Line Feed(줄 먹이기)는 이름만 봐서는 전혀 이해되지 않는 말입니다.
줄을 먹인다는 표현이 현대 사회에서 거의 사용되지 않는 말이기 때문인데, CR과 LF는 타자기에서 기반되었습니다.

작가 macrovector 출처 Freepik

타자기는 종이에 타이핑을 할 때마다 좌측으로 이동하기 때문에, 수동으로 문서를 다시 우측으로 가져와야 합니다. 이것이 CR입니다.

타자기에서 종이에 다음 줄을 작성하기 위해서는 종이를 조금씩 밀어야 합니다. 종이를 밀게 된다면 입력하는 위치가 한 칸 아래가 될 것이고 이 과정이 종이를 먹는다고 하여 LF라고 부릅니다.

CRLF 에러 핸들링

에러 내용

동일한 문자열을 비교했는데, false가 출력되는 문제 발생

에러를 고치기 위해서는 CRLF를 알아야 하는데, 왜 알아야 할까요?

CRLF는 새줄 문자이고, CRLF와 LF로 나뉘어지는데 windowslinux 운영체제에서 기본 새줄 문자 서식이 다릅니다.

fs.readFile(path, "utf8", (err, data) => {
  if(err)
    throw err;
  else
    return data;
})

위의 코드는 path 경로에 위치한 파일을 가져와서 "utf8" 인코딩 과정을 거친 뒤, 문자열로써 반환하는 fs메서드입니다.

일반적인 경우라면, 이 코드에서 문제가 될 만한 일은 없습니다. 하지만, 다음과 같은 경우라면 어떨까요?

const path = "/readMe.md";
const A = fs.readFile(path, "utf8", (err, data) => {
  if(err)
    throw err;
  else
    return data;
})
const B =`
	good boy
	yes
`;

console.log(A === B);

readMe라는 md 파일을 가져와서 문자열의 형태로 반환을 한 값을 가진 A와 리터럴 템플릿으로 문자열을 나타내는 B가 있습니다.

readMe에는 B 문자열과 똑같은 내용이 입력되어 있다는 가정 하에, 이 코드는 맞을수도 틀릴수도 있습니다.

windows 운영체제는 CRLF를, Linux 운영체제는 LF를 기본 새줄 문자로 사용하고 있습니다.
만약 코드를 Linux 환경에서 작성하고, 윈도우 환경에서 동작시킨다면 이 코드는 "false"를 내보내게 됩니다. 왜냐하면 리눅스 환경에서 쓴 문자열에는 새줄 문자가 \n으로 들어가기 때문입니다.

readFile 메서드로 가져온 readMe 파일은 String으로 변경되어 A에 들어갈 때 윈도우 환경에서 동작시켰기 때문에 \r\n이 들어가게 되어 두 문자열은 다르다는 표현을 하게 됩니다.

또한, 다른 새줄 문자가 들어갔기 때문에 바이트 코드 조차도 달라지게 되고, 두 코드 자체를 다른 코드로 인식하기 때문에 코딩 컨벤션에서 상당한 불편함을 겪게 됩니다.
그래서 코딩 컨벤션에 도움을 주는 Prettier에서는 LF를 권장하고 있습니다.

해결 방법

제가 작업하는 파일은 CRLF로 작성되어있었고, 비교 대상 파일은 LF로 되어 있어서 문제가 발생하였으나, 제가 불러온 파일을 LF로 변경하여 문제를 해결했습니다.

VSCode에는 다행히도 아주 쉽게 코드의 새줄 문자를 변경할 수 있는 기능이 있습니다.


바로 VSCode 최하단의 상태바에서 새줄 문자를 바꿀 수 있습니다.
CRLF라고 표시되어있는 글자를 클릭하면, CRLF와 LF 중에 선택하는 옵션이 나타나고 새줄 문자를 선택한 이후, 코드를 저장(Ctrl + S)하면 코드 내에 있는 모든 새줄 문자가 변경됩니다.

단점이라면, 이 방법은 특정 파일에만 설정할 수 있는 기능이기 때문에, 앞으로 만들어지는 모든 파일에 대한 새줄 문자를 지정하고 싶다면 Prettier에서 제공하는 End Of Line 옵션에서 새줄 문자를 선택하는것이 더 좋습니다.

출처:
1. https://ko.wikipedia.org/wiki/%EC%83%88%EC%A4%84_%EB%AC%B8%EC%9E%90
2. https://velog.io/@dev_yong/CRLF%EC%99%80-LF%EC%B0%A8%EC%9D%B4%EC%9D%98-%EC%9D%B4%ED%95%B4
3. https://velog.io/@rmaomina/CRLF-LF-error-problem-solved

profile
프론트엔드 개발자 | 문제가 있는 내용이 있다면 댓글로 알려주세요.

0개의 댓글