~ / posts / developer

마크다운 표 만들기 문법, 정렬·셀 병합·엑셀 붙여넣기 총정리

마크다운 표는 | 로 칸을 나누고 둘째 줄에 |---| 구분선을 넣으면 돼요. :--- 왼쪽, :---: 가운데, ---: 오른쪽 정렬이고 셀 병합은 표준 문법에 없어요. 표가 깨지는 원인 7가지, 셀 안 줄바꿈·파이프 이스케이프, 엑셀 붙여넣기 변환까지 정리했어요.

README나 블로그, 노션에 표를 넣으려고 마크다운을 쓰다 보면 표가 그냥 글자로 보이거나, 가운데 정렬이 안 되거나, 셀을 합치고 싶은데 방법이 없어서 막히곤 해요. 결론부터 말하면 마크다운 표는 | 로 칸을 나누고, 머리글 다음 줄에 |---|---| 구분선을 넣으면 만들어져요. 정렬은 구분선에 콜론(:)을 붙여 정하고, 셀 병합은 표준 마크다운(GFM)에 아예 없어서 HTML 표를 써야 해요.

이 글은 GitHub Flavored Markdown(GFM) 표 문법을 기준으로, 기본 형태부터 정렬, 표가 깨지는 흔한 원인, 셀 안 줄바꿈과 | 문자 넣기, 엑셀·구글 시트 데이터를 표로 바꾸는 방법까지 실제 예시로 정리했어요.

핵심 요약

표는 머리글 행, 구분선 행, 데이터 행 순서로 쓰고, 칸은 | 로 나눠요. 구분선은 칸마다 하이픈 최소 1개(관례상 3개)가 필요해요.

정렬은 구분선에서 정해요. :--- 는 왼쪽, :---: 는 가운데, ---: 는 오른쪽이에요. 셀마다 다르게 정렬하는 기능은 없어요.

셀 병합(colspan, rowspan)은 GFM 표준에 없어요. 꼭 필요하면 HTML table 태그를 직접 쓰고, 렌더러가 HTML을 허용하는지 확인하세요.

표가 안 보이는 가장 흔한 원인은 표 바로 위에 빈 줄이 없거나, 구분선 칸 수가 머리글과 다를 때예요.

마크다운 표 기본 문법

가장 단순한 표는 이렇게 생겼어요.

| 이름 | 언어 | 경력 |
|---|---|---|
| 민수 | Python | 3년 |
| 지영 | TypeScript | 5년 |

구조는 세 부분이에요.

  1. 머리글 행: 첫 줄. 표의 제목 칸이 돼요(HTML의 th).
  2. 구분선 행: 둘째 줄. 칸마다 ---를 넣어 "여기부터 표"라고 알려 줘요. 이 줄이 없으면 표로 인식되지 않아요.
  3. 데이터 행: 셋째 줄부터. 한 줄이 한 행이에요.

GFM 명세 기준으로 줄 맨 앞과 맨 뒤의 |는 생략해도 되고, 칸 너비를 공백으로 맞출 필요도 없어요. 아래 두 표는 똑같이 렌더링돼요.

이름 | 언어
--- | ---
민수 | Python

| 이름 | 언어       |
| ---- | ---------- |
| 민수 | Python     |

다만 양 끝 |를 생략하는 형태는 일부 렌더러(오래된 위키, 일부 블로그 에디터)에서 표로 인식하지 못하는 경우가 있어요. 양 끝 |를 항상 쓰는 습관이 호환성 면에서 안전해요. 공백으로 칸을 맞추는 건 원문 가독성을 위한 선택이고, 결과에는 영향이 없어요.

마크다운 표의 머리글 행, 구분선 행, 데이터 행 구조와 콜론 위치에 따른 왼쪽·가운데·오른쪽 정렬을 표시한 그림
마크다운 표 구조와 정렬 문법

마크다운 표 정렬: 왼쪽·가운데·오른쪽

정렬은 구분선 행의 콜론 위치로 정해요. 칸(열) 단위로만 지정할 수 있어요.

구분선정렬어울리는 데이터
---기본(대부분 왼쪽)일반 텍스트
:---왼쪽이름, 설명
:---:가운데상태, O/X, 아이콘
---:오른쪽금액, 수량, 퍼센트

예를 들어 구분선을 |:---|:---:|---:| 로 쓰면 첫 열은 왼쪽, 둘째 열은 가운데, 셋째 열은 오른쪽으로 정렬돼요.

숫자 열은 오른쪽 정렬이 기본이에요. 자릿수가 오른쪽 끝에서 맞아야 1,200과 98,000의 크기 차이가 한눈에 보이거든요. 반대로 숫자를 왼쪽 정렬하면 자릿수 비교가 어려워져요. 가운데 정렬은 "O/X", "완료/대기"처럼 짧고 길이가 비슷한 값에만 쓰는 게 깔끔해요.

셀 하나만 다르게 정렬하고 싶다면

GFM에는 셀 단위 정렬이 없어요. 꼭 필요하면 HTML을 허용하는 환경에서 <div align="center"> 같은 태그를 셀 안에 쓰거나, 아예 HTML 표로 바꿔야 해요. GitHub는 style 속성을 걸러 내기 때문에 style="text-align:center"는 동작하지 않아요. 대부분은 열 정렬만으로 충분하니, 셀 단위 정렬이 필요하다면 표 구조를 다시 생각해 보는 게 나아요.

마크다운 표가 깨질 때, 흔한 원인 7가지

표가 그냥 | 이름 | 언어 | 글자로 보인다면 아래를 순서대로 확인해 보세요.

증상원인해결
표 전체가 글자로 보임표 바로 위 줄이 일반 문단표 위에 빈 줄 한 줄 추가
표 전체가 글자로 보임구분선 칸 수가 머리글과 다름머리글 칸 수만큼 --- 맞추기
표 전체가 글자로 보임구분선에 콜론만 있고 하이픈이 없음칸마다 - 최소 1개
칸이 밀리거나 잘림셀 안에 파이프 문자가 들어 있음앞에 역슬래시를 붙여 이스케이프
데이터 행 칸이 모자람행마다 칸 수가 다름모자란 칸은 빈칸 처리, 넘치는 칸은 버려짐
표 아래 문단이 표에 붙음표 뒤에 빈 줄이 없음표 끝에 빈 줄 추가
일부 블로그에서만 안 됨렌더러가 GFM 표 미지원해당 서비스의 표 기능이나 HTML 사용

이 중 가장 자주 만나는 건 첫 번째예요. 마크다운에서 표는 "새 블록"이라, 바로 위에 문단 글자가 붙어 있으면 그 문단의 연속으로 해석되는 렌더러가 많아요. GFM은 문단 바로 아래 표도 인식하지만, 다른 엔진과 호환을 위해 표 위아래로 빈 줄을 하나씩 두는 습관을 들이면 문제가 거의 사라져요.

칸 수 규칙도 알아 두면 좋아요. GFM 명세상 머리글과 구분선의 칸 수는 반드시 같아야 하고, 데이터 행은 칸이 모자라면 빈칸으로 채우고 넘치면 넘친 칸을 버려요. 그래서 "마지막 열 내용이 사라졌다"면 그 행의 | 개수를 세어 보세요.

마크다운 표 원문 길이 비교 (3열 4행 표)
마크다운 표마크다운 표 · 93자93자마크다운 + 칸 맞춤마크다운 + 칸 맞춤 · 129자129자HTML tableHTML table · 200자200자

이렇게 작은 표도 HTML은 마크다운의 2배 넘게 길어요. 행이 늘수록 차이는 더 벌어져요.

단위: 자 · 자료: 같은 3열 4행 예시 표(이름·언어·경력)를 직접 작성해 글자 수를 셈 (공백·줄바꿈 포함)
표로 보기
구분글자 수
마크다운 표93
마크다운 + 칸 맞춤129
HTML table200

셀 안에서 줄바꿈, 파이프(|), 코드 넣기

표 셀은 한 줄이어야 해요. 셀 안에서 엔터를 치면 그 자리에서 행이 끝나 버려요. 대신 이렇게 처리해요.

셀 안에 문단이나 코드 블록처럼 여러 줄짜리 내용이 들어가야 한다면, 그 데이터는 표보다 소제목 + 목록 구조가 더 읽기 좋은 경우가 많아요.

마크다운 표 셀 병합은 안 될까

GFM 표에는 셀 병합(colspan, rowspan) 문법이 없어요. 일부 확장 문법(MultiMarkdown의 ||, 특정 정적 사이트 생성기 플러그인)이 병합을 지원하지만, GitHub·노션·대부분의 블로그에서는 통하지 않아요.

병합이 꼭 필요할 때 선택지는 세 가지예요.

  1. HTML 표 직접 쓰기: <table>, <tr>, <td colspan="2">로 작성해요. GitHub README에서도 동작해요. 다만 원문이 길어지고, HTML 블록 안에서는 마크다운 문법이 해석되지 않는 경우가 많아 굵게·링크도 HTML로 써야 해요.
  2. 표 구조 바꾸기: 병합하고 싶은 이유는 대개 "같은 값이 반복돼서"예요. 그 값을 열로 빼거나, 그룹마다 표를 나누면 병합 없이도 읽기 쉬워져요.
  3. 빈 칸으로 흉내 내기: 아래 행의 같은 값을 비워 두거나 〃를 넣는 방식이에요. 보기엔 병합처럼 보이지만 데이터로 다시 쓰기 어렵다는 단점이 있어요.
<table>
  <tr><th>분기</th><th>월</th><th>매출</th></tr>
  <tr><td rowspan="2">1분기</td><td>1월</td><td>120</td></tr>
  <tr><td>2월</td><td>98</td></tr>
</table>

이렇게 쓰면 "1분기" 칸이 두 행에 걸쳐 합쳐져요. 마크다운 렌더러가 HTML을 허용하지 않는 환경(일부 댓글창, 보안 설정이 강한 위키)에서는 태그가 그대로 글자로 보이니 미리보기로 꼭 확인하세요.

셀 병합이 필요할 때 HTML 표, 표 구조 바꾸기, 빈칸 흉내 세 가지 방법을 비교한 판단 순서도
마크다운 표 셀 병합 대안 고르기

엑셀·구글 시트 표를 마크다운으로 바꾸기

엑셀에서 범위를 복사해 텍스트 에디터에 붙여넣으면 칸은 탭 문자, 행은 줄바꿈으로 들어와요. 이 구조를 이용하면 변환이 쉬워요.

  1. 엑셀·구글 시트에서 머리글을 포함해 범위를 복사해요.
  2. 마크다운 표 생성기에 붙여넣으면 탭을 |로 바꾸고 구분선을 자동으로 넣어 줘요. 정렬도 열마다 고를 수 있어요.
  3. 결과를 복사해 README나 블로그에 붙여넣어요.

직접 하려면 에디터의 찾아 바꾸기로 탭(\t)을 | 로 바꾸고, 줄 앞뒤에 |를 붙인 뒤 둘째 줄에 구분선을 넣으면 돼요. 이때 주의할 점이 있어요.

반대로 마크다운 표를 엑셀로 옮길 때는 표를 렌더링된 화면(GitHub 미리보기 등)에서 드래그해 복사하면 대부분 칸이 유지된 채 붙여넣어져요.

어디서 쓰느냐에 따라 다른 점

같은 마크다운이라도 서비스마다 표 지원이 조금씩 달라요.

환경GFM 표정렬HTML 표(병합)참고
GitHub README·이슈OOOstyle 속성은 제거됨
GitLabOOOGFM과 거의 동일
노션붙여넣기 시 변환일부X노션 자체 표 블록으로 바뀜
VS Code 미리보기OOO기본 렌더러가 markdown-it
Jekyll·Hugo 등 정적 사이트OO설정에 따라엔진·옵션 확인 필요
슬랙·카카오톡XXX표 문법 미지원, 코드 블록으로 대체

메신저처럼 표를 지원하지 않는 곳에서는 표를 코드 블록(백틱 세 개)으로 감싸 고정폭 글꼴로 보여 주는 게 차선책이에요. 이때는 공백으로 칸 너비를 맞춰 둬야 정렬돼 보여요. 한글은 고정폭 글꼴에서도 영문 2칸 너비로 그려지는 경우가 많아, 한글과 영문이 섞인 표는 칸이 어긋나기 쉬워요.

자주 묻는 질문

마크다운 표에서 가운데 정렬은 어떻게 하나요?

구분선 행에서 그 열을 :---: 처럼 양쪽에 콜론을 붙이면 돼요. 오른쪽 정렬은 ---:, 왼쪽 정렬은 :---예요. 정렬은 열 단위로만 지정할 수 있어요.

마크다운 표에서 셀 병합이 되나요?

표준 GFM에는 병합 문법이 없어요. HTML <table>에 colspan, rowspan을 쓰면 GitHub 등 HTML을 허용하는 곳에서는 병합돼요. 가능하면 표 구조를 바꿔 병합이 필요 없게 만드는 게 관리하기 편해요.

표 안에서 줄바꿈하려면요?

셀 안에서는 엔터 대신 <br>을 써요. 엔터를 치면 행이 끝나 버려요. 대부분의 마크다운 렌더러가 표 셀 안의 <br>을 지원해요.

표가 표로 안 보이고 글자 그대로 나와요.

표 위에 빈 줄이 있는지, 둘째 줄 구분선의 칸 수가 머리글과 같은지 먼저 확인하세요. 구분선 칸마다 하이픈이 최소 1개 있어야 하고, 쓰는 서비스가 GFM 표를 지원하는지도 확인해야 해요.

구분선 하이픈은 꼭 3개여야 하나요?

GFM 명세상 칸마다 하이픈 1개 이상이면 돼요. 3개는 관례이고, 원문을 보기 좋게 하려고 칸 너비만큼 길게 쓰기도 해요. 길이는 렌더링 결과에 영향을 주지 않아요.

정리

마크다운 표는 머리글 행 → 구분선 행 → 데이터 행 세 부분이면 끝이에요. 정렬은 구분선의 콜론으로(:--- 왼쪽, :---: 가운데, ---: 오른쪽), 셀 안 줄바꿈은 <br>, 셀 안 파이프는 \|로 처리해요. 셀 병합은 표준에 없으니 HTML 표를 쓰거나 표 구조를 바꾸는 게 답이에요. 표가 깨지면 빈 줄과 칸 수부터 확인하세요.

엑셀 데이터를 붙여넣어 바로 표로 바꾸고 싶다면 마크다운 표 생성기를 써 보세요. 표에 넣을 데이터를 다룰 때는 JSON 문법 오류 패턴도 함께 참고하면 좋아요.

#마크다운 표#마크다운 테이블#markdown table#마크다운 표 정렬#마크다운 셀 병합#엑셀 마크다운 변환#마크다운 줄바꿈#GFM 표
← 이전 글서브넷 마스크·CIDR 계산법, /24 /26 호스트 수와 나누기 예제다음 글 →px rem em 차이, 언제 무엇을 쓰나와 px→rem 변환표 총정리

더 둘러보기

💻 개발자 다른 도구

🔥 많이 찾는 도구

🔮 재미로 한 번 더

📝 읽어 볼 만한 글

글 전체 보기 →