우리가 흔히 사용하는 워드 프로세서는 WYSIWYG (What You See Is What You Get, 보이는 대로 얻는다) 방식을 사용합니다. 버튼을 클릭하면 굵게, 기울임꼴, 목록 만들기 등 복잡한 서식 변경이 즉각적으로 눈에 보이게 적용되죠. 하지만 웹 세상은 조금 다릅니다. 초기 웹에서는 HTML이라는 마크업 언어를 사용해야만 글에 서식을 적용할 수 있었습니다.
보시다시피 HTML은 태그가 많아 다소 번거롭고, 글 자체의 가독성을 해치기도 합니다. 글을 쓰기 위한 목적보다는 문서의 구조를 정의하는 데 더 초점이 맞춰져 있었죠. 이런 불편함을 해소하기 위해 2004년 존 그루버(John Gruber)는 "쉽게 쓰고, 쉽게 읽히고, 쉽게 HTML로 변환되는" 마크다운 언어를 만들었습니다.
쉬운 문법: #, *, - 와 같이 간단한 기호 몇 가지만으로도 서식을 표현할 수 있습니다. # 제목 → <h1>제목</h1> **굵게** → <strong>굵게</strong> * 목록 → <ul><li>목록</li></ul> 높은 가독성: 마크다운 문법 자체가 읽기 쉽게 디자인되어 있습니다. HTML처럼 복잡한 태그 없이도 글의 구조를 파악하기 용이합니다. 플랫폼 호환성: 텍스트 파일이면 어디서든 작성하고 읽을 수 있으며, 다양한 도구를 통해 HTML, PDF 등 여러 형식으로 쉽게 변환할 수 있습니다. 간편한 협업: 글쓰기에 집중할 수 있어 블로그, README 파일, 개발 문서, 메시지 등 다양한 환경에서 널리 사용됩니다. GitHub의 README 파일이 대표적인 예시입니다.
이번 예제에서는 상태 관리 (useState): 사용자 입력 값을 실시간으로 저장하고 업데이트하는 방법을 배웁니다. 이벤트 핸들링: onChange 이벤트를 통해 사용자의 입력을 감지하고 상태를 변경하는 메커니즘을 익힙니다. 외부 라이브러리 연동 (marked): 강력한 기능을 가진 외부 라이브러리를 가져와서 내 애플리케이션에 통합하는 방법을 배웁니다. DOM 조작과 보안 (dangerouslySetInnerHTML): 리액트에서 HTML을 렌더링하는 방식과 그에 따른 보안적 고려사항을 이해합니다. (선택적) 부수 효과 처리 (useEffect): 창 크기 변화와 같은 컴포넌트 외부의 변화에 반응하고 관리하는 방법을 알아봅니다.
예제코드
body {
margin: 0;
font-family: sans-serif;
background-color: #f0f0f0;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
overflow: hidden; /* 스크롤 방지 */
}
.app-container {
display: flex;
width: 90vw;
height: 85vh;
background-color: #fff;
box-shadow: 0010pxrgba(0, 0, 0, 0.1);
border-radius: 8px;
overflow: hidden;
}
.editor-pane,
.preview-pane {
flex: 1;
padding: 20px;
overflow-y: auto; /* 내용이 길어지면 스크롤 */
height: 100%;
box-sizing: border-box;
}
.editor-pane {
border-right: 1pxsolid#ccc;
resize: horizontal; /* 사용자가 너비 조절 가능하게 */
overflow: hidden; /* textarea 자체가 resize 되므로 필요 */