Skip to main content

03M. ๋งˆํฌ๋‹ค์šด

About 2 minJavaSpringAWScrashcoursejavajdkjdk8streamspringspringframeworkspringbootawsaws-ec2

03M. ๋งˆํฌ๋‹ค์šด ๊ด€๋ จ


3-13. ๋งˆํฌ๋‹ค์šด

์ ํ”„ ํˆฌ ์Šคํ”„๋ง๋ถ€ํŠธ - WikiDocs

pahkey/sbb3 - 3-13open in new window

์งˆ๋ฌธ์ด๋‚˜ ๋‹ต๋ณ€์„ ์ž‘์„ฑํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ ํ…์ŠคํŠธ ์™ธ์— ๊ธ€์ž๋ฅผ ์ง„ํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค. "๋งˆํฌ๋‹ค์šด"์ด๋ผ๋Š” ๊ธ€์“ฐ๊ธฐ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ์—๋Š” SBB์— ๋งˆํฌ๋‹ค์šด์„ ์ ์šฉํ•ด ๋ณด์ž.

๋งˆํฌ๋‹ค์šด์€ ์›น ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธ€ ์“ฐ๊ธฐ ๋„๊ตฌ๋กœ Github๋“ฑ ๋งŽ์€ ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.


๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•

SBB์— ๋งˆํฌ๋‹ค์šด์„ ์ ์šฉํ•˜๊ธฐ ์ „์— ๋งˆํฌ๋‹ค์šด์˜ ๋ฌธ๋ฒ•์„ ๋จผ์ € ์•Œ์•„๋ณด์ž.

๋ฆฌ์ŠคํŠธ

๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•œ๋‹ค.

* ์ž๋ฐ”
* ์Šคํ”„๋ง๋ถ€ํŠธ
* ์•Œ๊ณ ๋ฆฌ์ฆ˜

์œ„ ๋ฌธ์ž์—ด์„ ๋งˆํฌ๋‹ค์šด ํ•ด์„๊ธฐ๊ฐ€ HTML๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ์‹ค์ œ ํ™”๋ฉด์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ธ๋‹ค.

๋ณ€ํ™˜๊ฒฐ๊ณผ
<ul>
<li>์ž๋ฐ”</li><li>์Šคํ”„๋ง๋ถ€ํŠธ</li><li>์•Œ๊ณ ๋ฆฌ์ฆ˜</li>
</ul>

๋งˆํฌ๋‹ค์šด ํ•ด์„๊ธฐ๋Š” ์กฐ๊ธˆ ํ›„์— ์„ค์น˜ํ•˜๊ณ  ์‹ค์Šตํ•  ๊ฒƒ์ด๋‹ˆ ์šฐ์„ ์€ ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ตํ˜€๋ณด์ž.

์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ชฉ๋ก์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•œ๋‹ค.

1. ํ•˜๋‚˜
2. ๋‘˜
3. ์…‹

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋ณ€ํ™˜๊ฒฐ๊ณผ
<ol>
<li>ํ•˜๋‚˜</li><li>๋‘˜</li><li>์…‹</li>
</ol>

๊ฐ•์กฐ

์ž‘์„ฑํ•œ ๊ธ€์ž๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๊ฐ•์กฐํ•  ํ…์ŠคํŠธ ์–‘์ชฝ์— **๋ฅผ ๋„ฃ์–ด ๊ฐ์‹ผ๋‹ค.

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” **์ž๋ฐ”**๋กœ ๋งŒ๋“ค์–ด์ง„ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋ณ€ํ™˜๊ฒฐ๊ณผ
์Šคํ”„๋ง๋ถ€ํŠธ๋Š” <em>์ž๋ฐ”</em>๋กœ ๋งŒ๋“ค์–ด์ง„ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

๋งํฌ

HTML ๋งํฌ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ [๋งํฌ๋ช…](๋งํฌ์ฃผ์†Œ) ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

์Šคํ”„๋ง ํ™ˆํŽ˜์ด์ง€๋Š” [https://spring.io](https://spring.io) ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์Šคํ”„๋ง ํ™ˆํŽ˜์ด์ง€๋Š” <a href="https://spring.io">https://spring.io</a> ์ž…๋‹ˆ๋‹ค.

์†Œ์Šค์ฝ”๋“œ

์†Œ์Šค์ฝ”๋“œ๋Š” ๋ฐฑ์ฟผํŠธ ` 3๊ฐœ๋ฅผ ์—ฐ์ด์–ด ๋ถ™์—ฌ ์œ„์•„๋ž˜๋กœ ๊ฐ์‹ธ๋ฉด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑ์ฟผํŠธ๋Š” ๋ฐฑํ‹ฑ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

\`\`\`
package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello Spring Boot Board";
    }
}
\`\`\`

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @GetMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello Spring Boot Board";
    }
}

์ธ์šฉ

์ธ์šฉ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ >๋ฅผ ๋ฌธ์žฅ ๋งจ ์•ž์— ์ž…๋ ฅํ•˜๊ณ  1์นธ ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•œ ๋‹ค์Œ ์ธ์šฉ๊ตฌ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

> ๋งˆํฌ๋‹ค์šด์€ Github์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธ€์“ฐ๊ธฐ ๋„๊ตฌ์ด๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋ณ€ํ™˜๊ฒฐ๊ณผ
<blockquote>
<p>๋งˆํฌ๋‹ค์šด์€ Github์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธ€์“ฐ๊ธฐ ๋„๊ตฌ์ด๋‹ค.</p>
</blockquote>

๋งˆํฌ๋‹ค์šด์˜ ๋ณด๋‹ค ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ• ๊ณต์‹ ๋ฌธ์„œ: www.markdownguide.org/getting-started

๋งˆํฌ๋‹ค์šด ์„ค์น˜

SBB์— ๋งˆํฌ๋‹ค์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋งˆํฌ๋‹ค์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์ฒ˜๋Ÿผ build.gradle ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋งˆํฌ๋‹ค์šด์„ ์„ค์น˜ํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/build.gradle

// (... ์ƒ๋žต ...)
dependencies {
    // (... ์ƒ๋žต ...)
    implementation 'org.commonmark:commonmark:0.21.0'
}
// (... ์ƒ๋žต ...)



ย 


.["Refresh Gradle Project"]๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ตœ์‹ ๋ฒ„์ „์ธ 0.21.0 ๋ฒ„์ „์˜ commonmark ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜์ž.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ›„ ๋กœ์ปฌ์„œ๋ฒ„ ์žฌ์‹œ์ž‘๋„ ์žŠ์ง€๋ง์ž.

build.gradle ํŒŒ์ผ์—์„œ commonmark์˜ ๋ฒ„์ „์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์ง€๊ธˆ๊นŒ์ง€ build.gradle ํŒŒ์ผ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋“ฑ๋กํ• ๋•Œ ๋ฒ„์ „์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ commonmark๋Š” ์œ„์™€ ๊ฐ™์ด 0.21.0 ์ด๋ผ๋Š” ๋ฒ„์ „์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด ์ฐจ์ด๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹๋•Œ๋ฌธ์ด๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜๋ฉด ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ํ•„์š”์—†๊ณ  ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ฆ‰, commonmark๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.

์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๊ฐ€์žฅ ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๋ฒ„์ „์œผ๋กœ ์ž๋™ ์„ ํƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ํ˜ธํ™˜์„ฑ์„ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋ฒ„์ „ ์ •๋ณด๋Š” ๋”ฐ๋กœ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ํŽธ์ด ์ข‹๋‹ค.


๋งˆํฌ๋‹ค์šด ์ปดํฌ๋„ŒํŠธ

์ด์ œ ์งˆ๋ฌธ์ด๋‚˜ ๋‹ต๋ณ€์˜ "๋‚ด์šฉ"์— ๋งˆํฌ๋‹ค์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์งˆ๋ฌธ์ด๋‚˜ ๋‹ต๋ณ€์„ ์กฐํšŒํ•œ ํ›„์— ๋งˆํฌ๋‹ค์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ณ€ํ™˜๋œ HTML์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ณด๋‹ค๋Š” ์ข€ ๋” ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆํฌ๋‹ค์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ํƒ€์ž„๋ฆฌํ”„ ํ…œํ”Œ๋ฆฟ์—์„œ ์ž‘์„ฑํ•œ ๋งˆํฌ๋‹ค์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๋‹ค์Œ์ฒ˜๋Ÿผ CommonUtil ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/src/main/java/com/mysite/sbb/CommonUtil.java

package com.mysite.sbb;

import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import org.springframework.stereotype.Component;

@Component
public class CommonUtil {
    public String markdown(String markdown) {
        Parser parser = Parser.builder().build();
        Node document = parser.parse(markdown);
        HtmlRenderer renderer = HtmlRenderer.builder().build();
        return renderer.render(document);
    }
}

@Component ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ CommonUtil ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ œ CommonUtil ํด๋ž˜์Šค๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๋นˆ(bean, ์ž๋ฐ”๊ฐ์ฒด)์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋นˆ(bean)์œผ๋กœ ๋“ฑ๋ก๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ํ…œํ”Œ๋ฆฟ์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CommonUtil ํด๋ž˜์Šค์—๋Š” markdown ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. markdown ๋ฉ”์„œ๋“œ๋Š” ๋งˆํฌ๋‹ค์šด ํ…์ŠคํŠธ๋ฅผ HTML ๋ฌธ์„œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฆฌํ„ดํ•œ๋‹ค. ์ฆ‰, ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์ด ์ ์šฉ๋œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ๋ณ€ํ™˜๋œ(์†Œ์Šค์ฝ”๋“œ, ๊ธฐ์šธ์ด๊ธฐ, ๊ตต๊ฒŒ, ๋งํฌ ๋“ฑ) HTML๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

์ฐธ๊ณ  - commonmark/commonmark-javaopen in new window

ํ…œํ”Œ๋ฆฟ์— ๋งˆํฌ๋‹ค์šด ์ ์šฉ

์ด์ œ ์งˆ๋ฌธ ์ƒ์„ธ ํ…œํ”Œ๋ฆฟ์— ๋งˆํฌ๋‹ค์šด์„ ์ ์šฉํ•ด ๋ณด์ž.

ํŒŒ์ผ๋ช…: /sbb/src/main/resources/templates/question_detail.html

<!-- (... ์ƒ๋žต ...) -->
<!-- ์งˆ๋ฌธ -->
<h2 class="border-bottom py-2" th:text="${question.subject}"></h2>
<div class="card my-3">
    <div class="card-body">
        <div class="card-text" th:utext="${@commonUtil.markdown(question.content)}"></div>
        <div class="d-flex justify-content-end">
        <!-- (... ์ƒ๋žต ...) -->

<!-- ๋‹ต๋ณ€ ๋ฐ˜๋ณต ์‹œ์ž‘ -->
<div class="card my-3" th:each="answer : ${question.answerList}">
    <a th:id="|answer_${answer.id}|"></a>
    <div class="card-body">
        <div class="card-text" th:utext="${@commonUtil.markdown(answer.content)}"></div>
        <div class="d-flex justify-content-end">
        <!-- (... ์ƒ๋žต ...) -->





ย 







ย 


์ค„ ๋ฐ”๊ฟˆ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ ๊ธฐ์กด์˜ style="white-space: pre-line;" ์Šคํƒ€์ผ์€ ์‚ญ์ œํ•˜๊ณ  ${@commonUtil.markdown(question.content)}์™€ ๊ฐ™์ด ๋งˆํฌ๋‹ค์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์šฉํ–ˆ๋‹ค. ์ด ๋•Œ th:text๊ฐ€ ์•„๋‹Œ th:utext๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„์— ์ฃผ์˜ํ•˜์ž. ๋งŒ์•ฝ th:utext ๋Œ€์‹  th:text๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ HTML์˜ ํƒœ๊ทธ๋“ค์ด ์ด์Šค์ผ€์ดํ”„(escape)์ฒ˜๋ฆฌ๋˜์–ด ํƒœ๊ทธ๋“ค์ด ๊ทธ๋Œ€๋กœ ํ™”๋ฉด์— ๋ณด์ธ๋‹ค. ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋ณ€ํ™˜๋œ HTML ๋ฌธ์„œ๋ฅผ ์ œ๋Œ€๋กœ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์ถœ๋ ฅํ•˜๋Š” th:utext๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋งˆํฌ๋‹ค์šด ํ™•์ธ

์ด์ œ ์งˆ๋ฌธ ๋˜๋Š” ๋‹ต๋ณ€์„ ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•ด ๋ณด์ž.

**๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•ด ๋ด…๋‹ˆ๋‹ค.**

* ๋ฆฌ์ŠคํŠธ1
* ๋ฆฌ์ŠคํŠธ2
* ๋ฆฌ์ŠคํŠธ3


ํŒŒ์ด์ฌ ํ™ˆํŽ˜์ด์ง€๋Š” [http://www.python.org](http://www.python.org) ์ž…๋‹ˆ๋‹ค.
์œ„์™€ ๊ฐ™์ด ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์€ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค.
์œ„์™€ ๊ฐ™์ด ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์€ ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค.

โ€ป ์ฐธ๊ณ : ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ

๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ๋ชฐ๋ผ๋„ simplemdeopen in new window์™€ ๊ฐ™์€ ๋งˆํฌ๋‹ค์šด UI ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งˆํฌ๋‹ค์šด์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค


์ด์ฐฌํฌ (MarkiiimarK)
Never Stop Learning.