개발을 하다 보면 협업 과정에서 코드는 똑같은데 에러가 나는 상황이 종종 발생한다. 특히 Windows와 macOS/Linux 환경을 오가면서 작업할 때 자주 발생하는 문제 중 하나가 바로 줄 바꿈(Line Ending) 문제이다. 이때 등장하는 개념이 CRLF와 LF이다. 결론부터 말하면 CRLF와 LF는 모두 줄 바꿈을 의미하지만, 표현 방식이 다르고 운영체제에 따라 사용하는 방식이 다르다.
CRLF(CR + LF)와 LF(Line Feed)
CRLF와 LF는 모두 개행 문자(Line Ending)이다. 즉, 한 줄이 끝나고 다음 줄로 넘어간다는 것을 표현하는 방식이다.
각각의 정의는 다음과 같다. 그 전에 CR(Carriage Return)과 LF(Line Feed)가 뭔지 간단히 정리하면 다음과 같다.
- CR(Carriage Return, ( \texttt{\r} ))
→ 커서를 현재 줄의 맨 앞으로 이동 - LF(Line Feed, ( \texttt{\n} ))
→ 한 줄 아래로 이동
CRLF(\r\n)
- CR + LF를 함께 사용
- Windows에서 기본 사용
- 두 번의 동작 수행
- 줄의 시작으로 이동 (CR)
- 다음 줄로 이동 (LF)
CRLF 예시 (Windows)
Hello\r\nWorld
1. Hello 출력
2. \r → 커서를 줄 맨 앞으로 이동
3. \n → 다음 줄로 이동
result:
Hello
World
LF(\n)
- LF 하나만 사용
- Linux, macOS에서 기본 사용
- 한 번의 동작만 수행
- 다음 줄로 이동
LF 예시 (Linux / macOS)
Hello\nWorld
1. Hello 출력
2. \n → 다음 줄로 이동
result:
Hello
World
차이를 한 줄로 정리하면 다음과 같다.
- CRLF → 앞으로 이동 + 아래로 이동
- LF → 아래로 이동만
즉, CRLF는 두 동작을 모두 수행하고, LF는 하나의 동작만 수행한다.
이 개념은 의외로 타자기에서 유래했다. 타자기로 문서를 작성할 때 줄을 바꾸려면 두 가지 동작이 필요했다.
- 캐리지를 왼쪽으로 이동 (CR)
- 종이를 한 줄 올림 (LF)
즉, 줄바꿈은 원래 두 단계 작업이었다.
CR → 줄의 시작으로 이동
LF → 다음 줄로 이동
이 개념이 그대로 컴퓨터에 들어오면서 CRLF와 LF가 나뉘게 되었다.
OS별 줄바꿈 방식 차이
운영체제마다 기본 줄 바꿈 방식이 다르다.
Windows → CRLF (\r\n)
Linux / Unix → LF (\n)
macOS → LF (\n)
이 차이 때문에 협업 시 문제가 발생한다. CRLF와 LF의 차이는 단순한 개념이지만, 실제로는 다음과 같은 문제를 만든다.
1. 실행 오류
Linux에서 실행해야 하는 스크립트가 CRLF로 저장된 경우 CR(\r)이 포함되어 에러 발생한다.
/bin/bash^M: bad interpreter
2. Git 충돌 문제
CRLF와 LF는 내부적으로 다른 값이다. 따라서 Git에서는 이를 다른 변경으로 인식한다
코드 수정 안 했는데도 변경됨 표시
3. 협업 문제
- Windows → CRLF
- Mac/Linux → LF
이렇게 서로 다른 환경에서 파일을 주고받으면 줄 바꿈이 깨지게 된다.
실무에서는 보통 LF를 사용하도록 통일한다. 이유는 다음과 같다.
- 대부분의 서버 환경(Linux)이 LF 사용
- 바이트 사용량이 적음
- Git 충돌 최소화
- 협업 시 안정적
CRLF는 ( \texttt{\r\n} )로 두 문자이고, LF는 ( \texttt{\n} ) 하나이기 때문에 데이터도 더 간결하다.
4. 해결 방법
1. IDE에서 통일
- VSCode: LF/CRLF 설정 변경
- IntelliJ: Line Separator 설정
2. Git 설정
git config --global core.autocrlf input
- LF 기준으로 관리
3. lint / formatter 설정
'linebreak-style': ['error', 'unix']
- LF 강제
정리하자면 아래와 같다.
- CRLF와 LF는 모두 줄바꿈 문자이다
- CRLF는 두 동작, LF는 한 동작이다
- Windows는 CRLF, Linux/macOS는 LF를 사용한다
- 환경이 다르면 실행 오류나 Git 충돌이 발생할 수 있다
- 실무에서는 LF로 통일하는 것이 일반적이다
CRLF와 LF는 단순한 개행 문자 차이지만, 실제 개발 환경에서는 중요한 문제를 만든다. 특히 협업 환경에서는 이 차이를 이해하지 못하면 실행 오류, Git 충돌, 디버깅 시간 증가와 같은 문제가 발생한다. 잘 기억해 두고 이 일로 시간 허비하지 않도록 주의가 필요할 것 같다.
참고 자료
https://brunch.co.kr/@hongjyoun/97
https://velog.io/@dev_yong/CRLF와-LF차이의-이해
https://42jerrykim.github.io/post/2024-10-15-crlf/