가끔씩 가다보면, 윈도우 컴퓨터에서 아래와 같은 에러를 마주할 때가 있다고 합니다. (저는 맥사용자라...)
물론 이 에러는 prettier에서 end of line
설정을 auto
로 해주면 해결되는 문제인데요,
이게 LF
와 CRLF
의 차이라고 어찌저찌 알고는 있었는데 그럼 이 둘의 차이점은 무엇일까요?
LF와 CRLF의 차이
일단 LF
와 CRLF
의 풀네임은 각각 Line Feed
와 Carriage Return Line Feed
입니다. 둘 다 줄넘김의 뜻을 가지고 있긴 한데, Line Feed
는 직역하면 라인 먹이기라는 뜻입니다. 근데 이게 왜 줄넘김이 됐을까요? 그 유래는 typewriter라 불리는 기계에서 찾아볼 수 있습니다.
소위 '타자기' 라고 불리는 기계인데요. 아마 옛날 미드나, 영드에서 많이 본적 있으실거예요.
이 타자기는 타자를 칠 때마다 종이가 오른쪽으로 움직여서 글씨간의 가로 간격이 형성됩니다. 그리고 오른쪽 끝에 다다르면 Carriage Return
이라는 행위를 통해 다시 종이를 왼쪽으로 끌어오게 됩니다.
만약에 타자를 치다가, 같은 위치에서 줄만 아래줄로 내리고 싶다면? 그럴 때 사용하는 것이 Line Feed
라고 생각하시면 됩니다.
즉 Line Feed
는 같은 위치에서 줄바꿈만 하는 것이고, Carriage Return
은 커서는 맨앞으로, 그리고 아래줄로 넘겨주는 행위라고 생각하시면 됩니다.
- CRLF: 이전 타자기에서의 줄넘김 개념을 그대로 가져온 것
- LF: 현대 디지털 기기에서의 줄넘김을 말하는 것
OS별 LF, CRLF
요약하자면, windows에서는 줄넘김 값으로 CRLF
를 기본값으로 많이 씁니다. linux에서는 줄넘김 값을 LF
를 많이 씁니다.
windows에서 CRLF를 많이 쓰는 이유는 과거에 있던 장치들과 호환하기 위해서였습니다. 몇몇 장치는 LF를 썼지만, 여전히 CRLF를 쓰는 장치가 있었기 때문입니다.
컴퓨터 관점에서의 CR과 LF
컴퓨터의 관점에서는 CR과 LF는 그저 바이트코드의 차이입니다. 사실 우리가 보는 이 한글과 영어도 컴퓨터에게는 그저 2진수로 이뤄진 숫자일 뿐일 것입니다. Carriage Return
은 ASCII로 표현하면 13이고 2진수로는 00001101입니다. Line Feed는 ASCII로 표현하면 10이고, 2진수로는 00001010입니다.
LF, CRLF가 발생시키는 문제
그렇다면 Prettier는 왜 ␍을 지우라고 난리법석일까요? 그 이유는 바로 Prettier 공식문서 중 End of Line에 대한 부분을 읽어보면 알 수 있습니다.
간단히 읽어보면 이게 모두 협업 때문임을 알 수 있습니다.
컴퓨터상에서 LF와 CRLF는 다른 바이트코드로 인식이 되기 때문에 줄넘김을 LF로 하는 것과 CRLF로 하는 것을 git에서는 diff로 인식하게 됩니다. 그래서 내가 정확히 어떤 소스코드를 변환시켰는지 기록하는데 잡음이 되는 것이죠.
Prettier v2.0.0부터는 LF로 강제시켜서 이러한 잡음을 없애겠다는 것 같습니다.