이전에 포스팅한 Markdown 문법 개념 및 특징에 이어 이번에는 markdown의 기초 문법이다.

 

 

Markdown 문법 개념 및 특징

1. Markdown이란?Markdown은 텍스트 기반의 경량 마크업 언어로 간단한 문법을 사용하여 문서를 쉽게 작성할 수 있도록 설계되었다. 복잡한 태그 없이도 문서를 정리할 수 있으며, 개발자 문서, 블로

mercifulcloud.tistory.com

 

1. 제목 (Heading)

- Markdown에서는 # 기호를 사용하여 제목을 작성한다.

# 제목 1
## 제목 2
### 제목 3
#### 제목 4
##### 제목 5
###### 제목 6


2. 문단 (Paragraph) 및 줄바꿈

- 일반적으로 문장을 입력하면 자동으로 문단이 구분된다.

이것은 첫 번째 문단입니다.

이것은 두 번째 문단입니다.

- 줄바꿈을 원할 경우 줄 끝에 두 칸 이상의 공백을 추가한 후 Enter를 누르면 된다.

이 문장은 줄바꿈 없이  
다음 줄에서 이어집니다.

 

3. 텍스트 강조

- Markdown에서는 텍스트의 가독성을 높이기 위해 굵게(Bold), 기울임(Italic), 취소선(Strikethrough) 등의 강조 기능을 제공한다.

1) 굵은 글씨 :

- 두 개의 별표(**텍스트**) 또는 두 개의 밑줄(__텍스트__)을 사용한다.
- 별표(**)와 밑줄(__)을 모두 사용할 수 있지만, 일반적으로 별표(**)를 더 많이 사용한다.
- 대부분의 Markdown 지원 환경에서 **굵게** 표기법을 기본적으로 인식한다.

일반 글씨

**굵은 글씨**

__굵은 글씨__

 

2) 기울임

- 별표 하나(*텍스트*) 또는 밑줄 하나(_텍스트_)를 사용한다.
- *기울임*과 _기울임_ 두 가지 방법이 가능하지만 별표(*)를 더 많이 사용한다.
- 밑줄(_)은 특정 환경(특히 문서 편집기)에서 단어 사이의 공백을 포함할 경우 인식되지 않을 수 있음에 유의해야 한다.
- 기울임체를 사용할 때 _를 사용할 경우 앞뒤 단어가 모두 밑줄 안에 있어야 정상적으로 동작한다.

*이 문장은 기울임체로 표시됩니다.*  
_이 문장도 기울임체로 표시됩니다._


_이것은 기울임체 입니다_ (O)  
_이것은 기울임체_ 입니다 (X)  → Markdown에서 공백은 인식되지 않음

 

3) 굵은 글씨 + 기울임

- 동시에 적용하려면 별표(*)나 밑줄(_)을 세 개(***텍스트*** 또는 ___텍스트___) 사용한다.
- 세 개의 *** 또는 ___를 사용하면 Bold + Italic 효과를 적용할 수 있다.

***이 문장은 굵고 기울임체로 표시됩니다.***  
___이 문장도 굵고 기울임체로 표시됩니다.___

 

4) 취소선 (가로줄)

- 물결표(틸드, ~) 두 개를 사용한다.
- ~~텍스트~~ 형식으로 감싸면 해당 부분에 취소선 효과가 적용된다.
- 일부 Markdown 렌더러에서는 지원되지 않을 수도 있다.

이 문장은 ~~취소선이 적용~~됩니다.

 

4. 목록

1) 순서 없는 목록

- 순서가 필요하지 않은 목록을 만들 때 사용하며, -, *, + 기호를 사용할 수 있다.
- -, *, + 기호 중 어떤 것을 사용해도 동일한 효과를 얻을 수 있다.
- 일반적으로 - 기호를 가장 많이 사용한다.
- 하위 목록(들여쓰기)을 만들려면 두 칸 이상의 공백을 추가한 후 -, *, +를 입력하면 된다.

- 첫 번째 항목
- 두 번째 항목
  - 하위 항목 1
  - 하위 항목 2
* 세 번째 항목
+ 네 번째 항목

 

2) 순서 있는 목록

- 숫자 뒤에 점(.)을 붙이면 된다.
- Markdown에서는 숫자를 순서대로 입력하지 않아도 자동으로 정렬된다.
- 순서를 자동 정렬해주기 때문에 모든 항목을 1.으로 입력해도 정상적으로 번호가 매겨지지만 가독성을 위해 실제 번호를 맞추는 것이 좋다.

1. 첫 번째 항목
2. 두 번째 항목
3. 세 번째 항목

1. 첫 번째 항목
1. 두 번째 항목
1. 세 번째 항목

 

3) 목록 중첩

- 순서 있는 목록과 순서 없는 목록을 중첩해서 사용할 수 있다.
- 하위 목록을 만들려면 들여쓰기(공백 2칸 또는 4칸)를 추가하면 된다.
- 공백 2칸 이상 들여쓰기 후 -, *, + 또는 숫자를 입력하면 하위 목록이 생성된다.

1. 첫 번째 항목
   - 하위 항목 1
   - 하위 항목 2
2. 두 번째 항목
   1. 하위 항목 1
   2. 하위 항목 2

 

4) 체크리스트

- GitHub Flavored Markdown(GFM)에서는 체크리스트(Task List)를 지원한다.
- 체크리스트는 [ ] 또는 [x] 형식으로 작성하면 된다.
- GitHub 웹에서는 체크리스트가 정상 작동하지만 로컬에서는 대부분의 Markdown 뷰어가 지원하지 않는다.
- 만일 로컬에서 .md파일을 열었을 때 체크리스트가 정상적으로 보이려면 GFM을 지원하는 Markdown 뷰어를 사용해야 된다. VS Code의 경우 Markdown Preview Enhanced 확장을 설치하면 볼 수 있다.

- [ ] 해야 할 일 1
- [x] 완료한 일 2

 

5. 코드 블록

- 코드는 **인라인 코드(Inline Code)**와 블록 코드(Block Code) 두 가지 방식으로 작성할 수 있다.

1) 인라인 코드

- 인라인 코드란 문장 중간에 코드가 포함되는 경우를 의미한다.
- 코드를 감싸기 위해 백틱(Backtick, ` ) 기호를 사용한다.
- 백틱(`) 한 개로 감싸면 인라인 코드가 된다.
- 줄 바꿈 없이 문장 내에서 사용할 수 있다.

인라인 코드 예시 `print("Hello, World!")`처럼 백틱(`)을 사용한다.

 

2) 블록 코드

- 여러 줄의 코드를 입력하려면 백틱 3개(```)를 사용하여 코드 블록을 만든다.
- 코드 블록을 만들 때 언어를 명시하면 문법 강조(Syntax Highlighting)가 적용된다.

  
블록 코드 예시 

```python
def hello():
    print("Hello, World!")
```
끝

 

3) 코드 블록에서 특수 문자 이스케이프

- 코드 블록 내부에서 Markdown 문법을 그대로 표시하려면 이스케이프(Escape) 처리를 해야 한다.
- Markdown 문법을 코드로 설명하고 싶을 때는 백틱(```)을 네 개 사용해야 한다.

````markdown
```python
print("Hello, World!")
```
````

 

6. 인용문

1) 기본 인용문

- > 기호를 사용하면 해당 줄이 인용문으로 표시된다.
- 인용문 내부에서는 일반 텍스트, 링크, 강조 문법 등을 사용할 수 있다.

인용문 예시
> 이것은 인용문입니다.

내부에서 다른 문법 사용 예시
> **강조된 인용문**입니다.  
> *기울임체*도 사용할 수 있습니다.  
> [Google](https://www.google.com) 링크를 추가할 수도 있습니다.

끝

 

2) 여러 줄 인용문

- 여러 줄에 걸쳐 사용할 수도 있다.
- 줄바꿈 없이 계속 이어지는 인용문을 만들려면 > 기호를 각 줄 앞에 붙여야 한다.
- 첫 번째 줄에만 >를 사용해도 이후 줄이 자동으로 인용문에 포함될 수 있다. 다만 뷰어마다 동작 방식이 다를 수 있으므로 가급적 >를 모든 줄에 명시하는 것이 좋다.
- 빈 줄을 추가하면 인용문이 분리

1. 각 줄에 >를 명시한 여러줄 인용문
> 첫 번째 줄입니다.
> 두 번째 줄입니다.
> 세 번째 줄입니다.

2. 여러 줄 인용문
> 첫 번째 줄입니다.
두 번째 줄입니다.
세 번째 줄입니다.

3. 빈 줄을 추가하면 인용문이 끊길 수 있음
> 첫 번째 줄입니다.
두 번째 줄입니다.

세 번째 줄입니다.

 

3) 중첩 인용문

- > 기호를 여러 개 사용하여 인용문의 단계(depth)를 조절한다.
- >를 여러 번 사용할수록 들여쓰기 단계가 깊어진다.

> 첫 번째 인용문입니다.
>> 두 번째 인용문입니다.
>>> 세 번째 인용문입니다.

 

4) 인용문 내부에 다른 요소 추가

- 인용문 내부에는 목록, 코드 블록, 표 등을 추가할 수 있다.
- 줄바꿈이 필요할 경우 > 뒤에 빈 줄을 추가한다.

> 목록을 포함한 인용문
> - 첫 번째 항목
> - 두 번째 항목
>   - 하위 항목

> 코드 블록을 포함한 인용문
> 
> ```python
> def hello():
>     print("Hello, World!")
> ```

> 표를 포함을 포함한 인용문
> 
> | 이름  | 나이 | 직업   |
> |------|----|------|
> | 홍길동 | 25 | 개발자 |
> | 이몽룡 | 30 | 기획자 |

 

7. 링크

1) 기본 링크

- 가장 일반적인 Markdown 링크 문법은 [텍스트](URL) 형식이다.

[구글 링크 클릭](https://www.google.com)

 

2) 자동 링크 (Auto Link)

- < > 기호를 사용하면 URL이 자동으로 링크로 변환된다.
- 이메일 주소도 자동 링크가 가능하다.

<https://www.google.com>

 

3) 링크에 제목(툴팁) 추가

- 링크에 제목(툴팁)을 추가하면 마우스를 올렸을 때 설명이 표시된다.

[Google](https://www.google.com "구글로 이동")

 

4) 이미지 링크

- [![이미지 설명](이미지 URL)](링크 URL) 형식으로 작성한다.

[![검은고양이](https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg)](https://www.google.com)

 

5) 문서 내부 링크 (같은 파일 내 이동)

- 문서 내부에서 특정 제목으로 이동하려면 [링크 텍스트](#제목) 형식을 사용한다.
- 대소문자는 구분되지 않는다.
- 공백은 -로 변환되므로 링크를 작성할 때 반영해야 한다.( 제목이 여러 단어로 구성된 경우의 공백 처리)
- 특수문자가 포함된 경우 일부 문자는 제거되거나 변환될 수 있으므로 실제 테스트 후 동작 여부를 확인하는 것이 좋다.

# 목차
- [개요](#개요)
- [프로젝트 소개로 이동](#project-intro)
- [설치 방법](#설치-방법)
- [사용법!](#사용법)

### 개요
이 문서는 Markdown 내부 링크 사용법을 설명합니다.

### 프로젝트 소개 {#project-intro}
프로젝트를 소개합니다.

### 설치 방법
Markdown 문서를 작성하는 방법을 설명합니다.

### 사용법!
내부 링크를 활용하는 다양한 방법을 다룹니다.

 

6) 참조 스타일 링크

- 참조 스타일(Reference Style) 링크를 사용하여 가독성을 높일 수 있다.
- 본문에서는 [텍스트][참조 ID] 형식을 사용한다.
- 실제 URL은 문서의 다른 곳에 [참조 ID]: URL 형식으로 작성한다.
- 여러 개의 같은 링크를 사용할 때 유용하다.
- 제목 링크는 공백이 -로 변환되므로 정확한 ID를 사용해야 한다.
- 일부 Markdown 렌더러에서 지원되지 않을 수도 있다.

[Google][google-link]

[google-link]: https://www.google.com

 

8. 이미지 삽입

1) 이미지 삽입 기본 문법

- 기본 문법은 ![이미지 설명](이미지_URL) 형태로 한다.
- 마우스를 올릴 때 툴팁을 표시하려면 " " 안에 텍스트를 입력하면 된다.
- ![이미지 설명](이미지_URL)을 [ ]로 감싸고 (링크_URL)을 추가하면 이미지 클릭 시 특정 웹페이지로 이동한다.

# 기본 이미지 삽입
![검은고양이](https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg)

# 이미지에 제목(툴팁) 추가
![검은고양이](https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg "마우스를 올려보세요")

# 클릭 가능한 이미지 (이미지 링크)
[![검은고양이](https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg)](https://www.google.com)

 

2) 로컬 이미지 삽입

- Markdown 문서(ex 리드미파일)와 같은 폴더에 있는 이미지를 삽입 가능하다.
- 아래 폴더구조를 참고해서 보면 현재 Markdown 파일(README.md)이 있는 위치를 기준으로 images 폴더 내 sample.png 와 logo.jpg를 불러온다.
- Markdown 문서와 이미지가 같은 프로젝트 내에 있을 때 유용하다.
- 만일 GitHub에서 로컬 이미지가 표시되지 않는 경우 GitHub에 이미지를 올리고 GitHub 저장소의 이미지 URL을 사용한다.

![샘플 이미지](./images/sample.png)
![로고](./images/logo.jpg)
📂 프로젝트 폴더
│── 📄 README.md
│── 📂 images
│   ├── 📄 sample.png
│   ├── 📄 logo.jpg


3) 이미지 크기 조절

- Markdown 기본 문법으로는 이미지 크기 조절이 어려워 HTML을 사용해야 한다.

### 기본 이미지
![검은고양이](https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg)

### 크기 조절
<img src="https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg" width="200" height="100">

 

4) 이미지 정렬

- Markdown에서는 기본적으로 이미지를 가운데 정렬할 방법이 없으므로 HTML을 사용해야 한다.
- <p align="center"> 태그를 사용하면 이미지를 가운데 정렬할 수 있다.

### 정렬 전
<img src="https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg" width="200" height="100">

### 정렬 후
<p align="center">
  <img src="https://cdn.pixabay.com/photo/2017/11/13/07/14/cats-eyes-2944820_1280.jpg" width="200" height="100">
</p>

 

9. 수평선

- 세 개 이상의 -, *, _을 입력하면 수평선이 생성된다.

---
***
___

- 일부 Markdown 렌더러에서는 ---가 제목 아래 위치할 경우 제목 스타일(#)로 해석될 수도 있으므로 수평선 위에 빈 줄을 추가하는 것이 좋다.
- 아래에서 ===는 Markdown에서 제목(h1, h2)으로 해석되는 문법이다.

제목 1
---
제목 2
===


제목 1

---
제목 2
===


10. 테이블

1) 기본 테이블 문법

- 파이프(| ) 기호를 사용하여 열(Column)을 구분한다.
- 하이픈 기호(-)를 사용하여 테이블 헤더와 내용을 구분한다.
- 각 열의 구분선(|---|---|---|)을 맞추지 않아도 동작하지만 정렬을 맞추는 것이 가독성에 좋다.

 

| 이름  | 나이 | 직업   |
|------|----|------|
| 홍길동 | 25 | 개발자 |
| 이몽룡 | 30 | 기획자 |

 

2) 테이블 정렬

- 기본적으로 테이블의 텍스트는 왼쪽 정렬된다.
- 하지만 콜론(:)을 사용하면 정렬을 변경할 수 있다.

  • :------ → 왼쪽 정렬
  • ------: → 오른쪽 정렬
  • :----: → 가운데 정렬

 

| 이름  | 나이 | 직업   |
|:------|----:|:----:|
| 홍길동 | 25 | 개발자 |
| 이몽룡 | 30 | 기획자 |

 

11. 기타

1) 특수문자 출력

- Markdown에서는 *, _, #, | 등 일부 문자가 문법 요소로 해석된다.
- 백슬래시(\)를 사용하여 문법을 무시하고 일반 문자로 출력할 수 있다.

\*이것은 강조가 아닙니다.\*
\_이것은 기울임이 아닙니다.\_
\# 이것은 제목이 아닙니다.
\| 테이블 구분자가 아닙니다. |

 

2) 주석

- HTML의 <!-- -->을 사용하여 주석을 작성할 수 있다.

# 주석1
<!-- 이 부분은 화면에 표시되지 않습니다. -->
주석2

 

3) HTML 태그 활용

- Markdown에서는 HTML 태그를 함께 사용할 수 있다.
- 일부 Markdown 환경에서는 HTML을 지원하지 않지만 대부분의 플랫폼에서는 정상적으로 동작한다.

<b>굵은 텍스트</b>
<br>
<i>기울임 텍스트</i>
<u>밑줄 텍스트</u>

 

 

 

1. Markdown이란?

Markdown은 텍스트 기반의 경량 마크업 언어로 간단한 문법을 사용하여 문서를 쉽게 작성할 수 있도록 설계되었다. 복잡한 태그 없이도 문서를 정리할 수 있으며, 개발자 문서, 블로그, README 파일, 기술 보고서 등에서 널리 사용된다.

Markdown은 2004년 존 그루버(John Gruber)와 애런 스워츠(Aaron Swartz)가 공동 개발했다. 두 사람은 복잡한 HTML을 직접 작성하는 대신, 더 직관적이고 사람이 읽기 쉬운 문법을 만들고자 Markdown을 고안했다.

 

2. Markdown의 특징

1) 간결한 문법

- Markdown은 단순한 기호만으로 문서를 작성 가능하므로 초보자도 쉽게 배울 수 있다.

2) 가독성이 뛰어남

- HTML 코드처럼 태그가 많지 않기 때문에 원본 텍스트만으로도 가독성이 뛰어나다.

3) 다양한 포맷으로 변환 가능

- Markdown은 기본적으로 HTML로 변환되도록 설계되었지만 다양한 형식으로 변환이 가능하다.

4) Git과 함께 사용하기 최적화됨

- 코드와 함께 문서를 관리할 수 있어 유지보수가 쉬움

5) 다양한 플랫폼에서 지원

 

  • GitHub, GitLab, Bitbucket → README, 이슈, PR에서 사용
  • Jupyter Notebook → 데이터 분석, AI 연구용 문서화
  • Obsidian, Notion, Typora → 노트 및 문서 정리
  • MkDocs, Sphinx → 기술 문서 자동화
  • Hugo, Jekyll, Hexo → 블로그 포스트 작성

 

 

3. Markdown과 HTML의 차이점

 
항목 Markdown HTML
사용 용도 간단한 문서 작성 정교한 웹 페이지 제작
가독성 사람에게 읽기 쉬움 태그가 많아 가독성이 낮음
변환 가능성 HTML, PDF 등 다양한 포맷으로 변환 가능 Markdown으로 변환하려면 추가 작업 필요
스타일 적용 제한적( CSS를 적용하려면 HTML과 함께 사용해야 함 ) CSS, JavaScript와 결합 가능

 

4. Markdown의 한계점

 

- 스타일(Custom CSS 적용)이 제한적

- 수식 및 다이어그램 기능 기본 미지원

 

  • 기본 Markdown에는 LaTeX 수식, Mermaid 다이어그램 같은 기능이 없음
  • Jupyter Notebook, MkDocs, GitHub 등 특정 플랫폼에서는 확장 기능 지원

 

- 인터랙티브한 기능 부족

 

  • Markdown 자체로는 JavaScript와 같은 동적 기능을 포함할 수 없음
  • 일부 확장 문법(GFM, Markdown Extra)에서는 HTML을 삽입 가능하지만 일반적인 Markdown에서는 지원되지 않음

 

 

5. Markdown 표준 및 확장

Markdown은 처음에는 단순한 문서 작성 도구였지만 여러 플랫폼에서 확장되면서 다양하게 문법이 확장되었다.

1) CommonMark – 공식 표준 Markdown

Markdown은 원래 명확한 표준 없이 여러 버전이 혼재되었으나, 이를 표준화하려는 움직임이 생겼다.
2014년, CommonMark 프로젝트가 시작되면서 Markdown의 명확한 문법과 동작 방식을 정의했다.

* CommonMark의 특징
- Markdown을 일관되게 사용할 수 있도록 표준화
- GitHub, Stack Overflow, Reddit 등의 주요 플랫폼에서 지원
- 기존 Markdown과 호환성을 유지하면서 명확한 사양을 제공

CommonMark는 현재 가장 많이 사용되는 Markdown 표준 사양이다.

 

2) GitHub Flavored Markdown (GFM)

GitHub에서 Markdown을 확장하여 개발자 친화적인 기능을 추가한 버전이다.

* GitHub Flavored Markdown(GFM)의 특징
- Task List (체크리스트) 
- 표 지원
- 코드 블록 강조
- 이슈 및 PR 참조

GFM은 GitHub뿐만 아니라 GitLab, Bitbucket 등에서도 널리 사용된다.

 

3) MultiMarkdown (MMD)

MultiMarkdown은 기본 Markdown 문법을 확장하여 각주, 표, 메타데이터, 인용문 등을 추가한 버전이다.

* MultiMarkdown의 주요 기능
- 각주(Footnotes)
- 메타데이터 지원 → 문서 정보 포함 가능
- LaTeX 변환 가능 → 논문 작성에도 활용 가능

Markdown을 논문 작성이나 연구 문서에 활용하고 싶다면 MultiMarkdown이 유용하다.

 

4) Markdown Extra

Markdown Extra는 PHP 기반의 Markdown 확장 버전으로, 추가적인 문법을 지원한다.

* Markdown Extra의 주요 기능
- 표 (Table)
- 각주
- 제목 ID 자동 생성

이 버전은 특히 WordPress, CMS 문서 작성 등에 활용된다.

 

5) Pandoc Markdown

Pandoc은 다양한 문서 포맷을 변환할 수 있는 도구로, Markdown을 기반으로 확장된 기능을 제공한다.

* Pandoc Markdown의 특징
- Markdown을 HTML, LaTeX, PDF, EPUB 등 다양한 포맷으로 변환 가능
- YAML 메타데이터 지원
- Markdown을 논문 및 학술 문서에 활용 가능

LaTeX와 함께 사용하여 Markdown을 논문 형식으로 변환하는 경우에 Pandoc이 많이 활용된다.

 

6. Markdown 표준 및 사용처

Markdown 버전 사용 플랫폼 주요 특징
CommonMark GitHub, Stack Overflow, Reddit Markdown 표준화 프로젝트
GFM (GitHub Flavored Markdown) GitHub, GitLab, Bitbucket 체크리스트, 표, 코드 블록 강조
MultiMarkdown 개인 문서, 논문, 연구 문서 각주, 메타데이터, LaTeX 변환 가능
Markdown Extra WordPress, CMS 문서 표, 각주, 제목 ID 자동 생성
Pandoc Markdown LaTeX 논문, 학술 문서 PDF, LaTeX, EPUB 변환 가능

 

7. Markdown vs LaTeX 

항목 Markdown LaTeX
사용 용도 간단한 문서, 블로그, README 논문, 학술지, 수식 포함 문서
배우기 쉬움 쉬움 (직관적인 문법) 어려움 (복잡한 문법)
스타일링 CSS 필요 고급 스타일링 가능
공식 표준 없음 (CommonMark이 표준화 역할) 있음 (TeX, LaTeX 표준)
변환 가능성 HTML, PDF, EPUB 등 변환 가능 PDF 변환 기본 지원
결론 블로그, 기술 문서, README 파일 등에 적합 학술 논문, 수식이 포함된 문서 작성에 적합

 

 

 

 

블로그와 stackoverflow를 샅샅이 뒤진 결과 도커 데스트답 설치하는 과정에서 생긴 오류들을 해결한 과정을 정리해뒀다.

순서는 좀 틀릴 수 있는데, 다 해본 과정이고 해결은 됐다.

명령어는 모두 파워셸 관리자모드에서 실행해야 한다.

 

 

1. 에러 발생(WslRegisterDistribution failed with error: 0x80370102)

- WSL2 (Windows Subsystem for Linux 2) 가 현재 컴퓨터 설정에서 지원되지 않음을 의미한다.

- 이 에러는 WSL2와 가상화 기능의 설정이 잘못됐거나 비활성화된 경우에 발생한다.

 

 

2. 현재 컴퓨터 상태 확인

1. CPU 가상화 지원 확인

- 작업 관리자 ( Ctrl + Shift + Esc ) > 성능 탭 > CPU 항목

- 가상화 : 사용으로 돼있는지 확인

 

2. BIOS 설정에서 가상화 기능 활성화돼있는지 확인

- 내 컴퓨터는 사용자가 할 수 없는 컴퓨터라 AS센터에 가서 직접 활성화시키고 왔
다. 갔다와서도 안되길래 다른 센터에 가서 한 번 더 하고 와서 확실히 활성화시켰다. 하지만 그럼에도 같은 에러가 났다. 

- BIOS 모드 진입 방법 :  컴퓨터 다시 시작하면서 F2, F10, Del 중에 하나를 연타하면 BIOS 설정 화면에 진입할 수 있다. (LG그램 기준으로 F2였다.)

- 가상화 관련 옵션 이름 :

  • Intel CPU : Intel VT-x, Intel Virtualization Technology 
  • AMD CPU : AMD-V, SVM Mode

- 설정했다면 저장하고 재부팅한다.

 

3. 윈도우 버전 확인 - wsl2 지원여부 확인

- 내 컴퓨터는 윈도우 10Home이었고 아슬아슬하게 지원이 가능한 버전이었다. 

- Windows 10 Home에서도 WSL 2를 지원하려면 Windows 10 버전 1903 이상 (빌드 18362 이상)이어야 한다.

- 버전이 낮다면 최신 버전으로 업데이트가 필요하다.

- 파워셸에서 아래 명령어로 윈도우 버전 확인 가능하다.

winver

- 명령어 실행 시 윈도우 정보 창이 뜬다.

 

4. 윈도우 기능 설정

- 제어판 > 프로그램 > Windows 기능 켜기/끄기

- Hyper-V, Linux용 Windows 하위 시스템, 가상 머신 플랫폼을 체크해준다.

 

 

3. WSL/ Virtual Machine Platform 활성화

- Windows 기능 중 Linux용 Windows 하위 시스템(WSL)과 가상 머신 플랫폼(Virtual Machine Platform)을 활성화한다.

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux, VirtualMachinePlatform

 

4. WSL 설치는하되, 기본 Linux 배포판(Ubuntu 등)을 설치하지 않는 옵션

- Virtual Machine Platform, WSL2 커널 등 WSL 실행에 필요한 모든 시스템 구성 요소 설치

- 기본 배포판(Ubuntu)을 설치하지 않고 WSL 환경만 준비

- 이 명령어를 실행한 후 WSL 환경이 설정되면, 원하는 배포판을 수동으로 설치해야한다.

wsl.exe --install --no-distribution

 

 

5. Hypervisor 관련 명령어 실행 : 순서대로 실행

1.  Hyper-V 활성화

- Windows의 Hyper-V 기능을 활성화하는 명령어

- Hyper-V 기능이 비활성화되어 있는 경우 WSL2 설치를 진행하기 위해 실행

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

 

2. Hypervisor Launch Type 확인

- 현재 Hypervisor Launch Type 설정 상태를 확인하는 명령어

- 결과 예시 : 

  • hypervisorlaunchtype Auto : Hyper-V가 정상적으로 동작할 준비가 됨.
  • hypervisorlaunchtype Off : Hyper-V가 비활성화 상태

 

bcdedit /enum | findstr /i hypervisorlaunchtype

 

3. Hypervisor Launch Type 활성화

- Hyper-V가 Off 상태일 때 이를 Auto로 변경하여 활성화

bcdedit /set hypervisorlaunchtype Auto

 

4. Hypervisor 설정 상태 재확인

- 앞서 설정한 Hypervisor Launch Type이 제대로 적용되었는지 확인

bcdedit /enum | findstr /i hypervisorlaunchtype

 

 

6. WSL 설치 상태 확인

- WSL의 설치된 배포판 목록과 버전(WSL 1 또는 WSL 2) 확인

- 내 경우 UBUNTU가 뜨지 않았다.

wsl -l -v

 

 

7. wsl2를 기본 버전으로 설정

- 새로 설치되는 모든 WSL 배포판이 기본적으로 WSL2를 사용하도록 설정

wsl --set-default-version 2

- 여기까지 했을 때 드디어 새로운 오류가 떴다. 오류가 났음에도 매우 기쁨.

 

 

8. 도커 완전 삭제

- Docker Desktop 프로그램 삭제  : 설정 > 앱 > 앱 및 기능 > Docker Desktop 제거

- Docker 관련 파일 및 데이터 삭제

C:\ProgramData\Docker
C:\Users\<사용자명>\AppData\Local\Docker
C:\Users\<사용자명>\AppData\Roaming\Docker
C:\Users\<사용자명>\.docker (숨김 파일)

- WSL2에 저장된 Docker 데이터 제거

wsl --list --verbose
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data

- Docker 관련 레지스트리 키 삭제 :  Windows + R을 눌러 regedit 실행.

아래 경로로 이동해 Docker 관련 항목 삭제한다.  없을 수도 있다. 내 경우엔 없었다.

HKEY_LOCAL_MACHINE\SOFTWARE\Docker Inc.
HKEY_CURRENT_USER\Software\Docker Inc.

- 환경 변수 삭제 : 내 PC > 속성 > 고급 시스템 설정 > 환경변수 클릭 > PATH 변수에서 Docker 관련 경로 삭제

- 삭제 완료되었다면 반드시 시스템 재부팅

 

9. WSL 커널 업데이트

- WSL 커널이 손상되었거나 최신 버전이 아닌 경우에도 에러가 발생할 수 있다.

- 아래 사이트에서 최신 패키지를 다운로드 후 설치해준다.

https://aka.ms/wsl2kernel/  

 

이전 버전 WSL의 수동 설치 단계

wsl install 명령을 사용하지 않고 이전 버전의 Windows에 WSL을 수동으로 설치하는 방법에 대한 단계별 지침입니다.

learn.microsoft.com

 

- 설치 후 wsl을 다시 시작한다.

wsl --shutdown
wsl

 

 

10. WSL 업데이트

- 현재 WSL 버전 및 상태 확인

wsl --update

- WSL 최신 버전으로 업데이트

wsl --version

- 업데이트 적용 후 WSL 다시 시작

wsl --shutdown

 

 

11. 새로운 Ubuntu 배포판 및 도커 데스트톱 재설치

- Ubuntu 배포판을 다시 설치

- 파워셸에서 기본 배포판으로 설정

wsl --set-default-version 2
wsl --set-default Ubuntu

- Docker Desktop 재설치

- WSL 설정 확인

wsl --list --verbose

- 여기까지 했을 때 비록 정지 상태지만 드디어 우분투와 도커 데스크톱이 모두 보였다. 

 

 

12. WSL 배포판 시작하기

- Stopped 상태의 WSL 배포판 활성화

- docker-desktop 시작 :

wsl --distribution docker-desktop

- Ubuntu 시작 :

wsl --distribution Ubuntu

- 필수 기능 활성화 안돼있다면 활성화 : 이후 컴퓨터 재부팅 필요

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All
Enable-WindowsOptionalFeature -Online -FeatureName WindowsSubsystemForLinux -All

- Docker Desktop 실행 : Settings > WSL Integration > Enable integration with my default WSL distro 활성화

 

13. Windows 복구 및 무결성 검사

- 위에서도 에러가 났었는데, 결론적으로 여기부터 실행한 것이 결정적인 해결책이었다.

- 참고로 아래 명령어 두 개는 실행 시 시간이 오래 걸린다.

- Windows 이미지 복구 : 손상된 시스템 파일이나 누락된 구성 요소를 Windows Update를 통해 복구

dism /online /cleanup-image /restorehealth

- 시스템 파일의 무결성 검사 : 손상된 파일이 발견되면 자동으로 복구

sfc /scannow

- 여기까지 실행했을 때 분명 최신 버전으로 윈도우 업데이트 했었음에도 또다시 Windows 업데이트 알림이 떴다.

- dism /restorehealth 명령이 Windows Update를 사용하여 손상된 파일을 복구했기 때문에, 관련 업데이트를 설치하라는 알림이 뜨는 경우가 있다고 한다.

- 업데이트 후 시스템을 재부팅해준다.

 

 

14. WSL 설치

1. WSL 설치 상태 확인

wsl --list --verbose

2. 필수 기능 활성화 여부 확인

- 아래 항목들이 Enabled로 표시되어야 한다.

  • Microsoft-Windows-Subsystem-Linux
  • VirtualMachinePlatform
  • Microsoft-Hyper-V-All

 

dism /online /get-features /format:table

- 위 명령어는 뭔가 너무 많이 나와서 확인하기 어렵다면 아래 명령어로 확인

Get-WindowsOptionalFeature -Online | Where-Object {$_.FeatureName -match "Subsystem|Hyper-V|VirtualMachine"}

- 위에서 Disabled로 표시되는 기능이 있다면 다음 명령으로 활성화

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -All
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -All
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -All

3. WSL 버전 확인

- 에러가 없다면 기본 WSL 버전이 2로 설정된다.

wsl --set-default-version 2

 

 

15. 레거시 콘솔 설정 문제

- PowerShell > 상단의 창 제목 표시줄 우클릭 > 속성 > 옵션 >  레거시 콘솔 사용 옵션 비활성화(체크 해제)

 

 

16. 배포판 설치 및 Docker 설정

- wsl 설치

wsl --install

- Docker Desktop에서 Settings > WSL Integration 설정이 활성화되었는지 확인

- 아래 명령어로 Docker가 정상적으로 작동하는지 확인

- 파워셸 창을 껐다가 다시 실행해야 된다.

docker --version
docker run hello-world
docker images
docker ps

 

 

 

17.  정상인 상태

wsl --list --verbose

 

 

 

 

배포를 하기엔 클라우드 비용이 부담스러워서 내 컴퓨터 외에서도 잘 실행되는지 궁금할 때가 있다. 또는 잠깐의 시간동안 공유를 하는 경우 배포보다 유용한 도구가 있어 사용해봤다.

ngrok은 로컬 서버를 인터넷을 통해 외부에서 접근 가능하도록 만들어주는 도구이다. 개발 및 테스트 환경에서 사용된다.

클라우드 서버 없이도 인터넷만 가능한 환경이라면 로컬 서버에 접속을 가능하게 해준다.

 

1. 회원가입

- 먼저 ngrok 공식 웹사이트에서 회원가입을 해야 한다.

https://dashboard.ngrok.com/signup

 

2. 다운로드

- 다운로드는 각자 운영체제에 맞는 것으로 다운 받으면 된다.

- 윈도우 기준으로 압축파일을 다운 받아 압축을 풀어주면 ngrok.exe 파일 하나가 들어 있고 용량은 45.9MB라 크게 부담이 없다.

https://download.ngrok.com/windows?tab=download

 

Download ngrok

Download ngrok

download.ngrok.com

 

3. ngrok.exe 실행

- ngrok.exe 파일만 더불 클릭하면 설치하는 것도 없이 바로 이렇게 ngrok 터미널이 실행된다.

 

4. 인증 토큰 등록하기

- 실행 후 ngrok 인증 토큰 등록이 필요하다. 인증토큰 후 회원가입 후 ngrok 사이트 대시보드에서 확인 가능하다.

- 토큰은 한번 등록하면 일반적으론 같은 컴퓨터에선 다시 등록하지 않아도 된다.

- 컴퓨터를 새로 변경하거나 ngrok를 새로 설치했거나 인증토큰이 만료 또는 변경된 경우에는 재등록이 필요하다.

- 아래 명령어가 인증토큰과 함께 대시보드에 나와있어서 바로 붙여넣기 하면 등록이 완료된다.

ngrok config add-authtoken 인증토큰

- 인증 토큰 등록이 완료되면, 이렇게 아래 경로로 ngrok.yml 파일이 생성이 되는데 경로는 사용자마다 다를 수 있다.

- 이 ngrok.yml 파일에 인증토큰이 저장되므로 이후 ngrok 실행 시 자동으로 인증된다.

 

5. 로컬에서 웹 서버 실행

- flask로 간단한 웹을 만들고 있었어서 flask를 vscode에서 실행했다.

- ngrok를 사용하려면 반드시 로컬에서 웹 서버가 실행 중이어야 한다.

 

6. ngrok를 통해 로컬에서 실행중인 특정 포트를 외부에서 접근 가능하게 터널링

- 위에서 flask를 사용했고 따로 포트 설정을 안 했다면 flask는 기본적으로 5000번 포트를 사용하기 때문에 5000을 넣어줬다.

- ngrok 명령어를 통해 이 포트를 외부에 노출하면, 로컬 Flask 애플리케이션을 외부에서 테스트하거나 공유할 수 있다.

- Forwarding 옆에 있는 부분이 외부에서 접근 가능한 url이다.

ngrok http 5000

 

7. 실행

- 화살표 앞에 .app까지가 실행 주소이다.

- url을 붙여넣으면 visit site라는 버튼이 표시되고 클릭하면 내가 개발하던 화면이 나타난다.

- 무료 플랜이었기 때문에 연결 시간이 길지는 않으며, 한번 종료하면 다시 실행할 때마다 url이 바뀐다.

- 유료 플랜의 경우 고정된 서브도메인 사용도 가능하며 연결 시간이 더 긴 혜택 등이 있다.

 

8. ngrok 종료

- 터미널에서 ctrl + c로 종료

 

 

 

* 여러 도메인 할당

- 무료 플랜에서는 제한은 있기는 하나 ngrok에 여러 도메인 할당도 가능하다.

- 실행해야 하는 로컬 서버가 두 개 이상인 경우 다중 터널 생성이 가능하다.

- 이런 식으로 두 개의 터널을 각각 생성하면 두 개의 외부 도메인이 생성되고, 서로 다른 두 개의 url이 각각 생성된다.

ngrok http 5000
ngrok http 8000

- 여러 터널을 한 번에 실행하려면 ngrok.yml 설정 파일을 수정하면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

코딩을 배우기 시작한 지 얼마 안 됐다면 오류가 발생할 때마다 당황하게 된다.

분명 이전에 했을 땐 됐는데 똑같이 했는데 왜 안되지 하면서.

이번에 발생했던 오류는 코드 문제는 아닌 것 같은데 실행이 안되는 오류였다.

아니, 정확하게는 실행이 되긴 되는데 자꾸 이전에 실행했던 코드가 실행되는 것이다.

먼저 실행창의 terminated라고 돼있는 빨간색 네모 버튼을 눌러도 안된다면 아래와 같이 해보자!

상단의 window - preferences로 들어가서,

 

 

Run/Debug - Launching으로 들어가 아래와 같이 똑같이 체크해주고 적용을 누르고 실행해보니 해결이 된다.

특히 Launch Operation에서

Launch the selected resource or active editor. If not launchable : Launch the associated project

가 체크돼있는지 확인하고 Apply 클릭!

이전에는 Launch the previously launched application에 체크돼있었다.

이러니까 자꾸 이전에 실행됐던 게 실행되었던 것이다.

 

 

+ Recent posts