์ ์: Stephanie Drescher ์๋ฌธ: https://24ways.org/2017/lint-the-web-forward-with-sonarwhal/
๋ช ํด ์ , ํ์๊ฐ ๋ํ ์กธ์ ๋ฐ์ผ ๋ ์น ๊ฐ๋ฐ ๊ณผ์ ์ ๋ ๊ฐ์ง์ ๊ธฐ์ ์ ์ด์ ์ ๋์๋ค. ํ๊ฐ์ง๋ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค ์ฆ, HTML๊ณผ CSS, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ ๊ฐ์ง๋ Adobe Flash์๋ค. ํ์๋ ํฌํธํด๋ฆฌ์ค์ ์ถ๊ฐํ๊ธฐ ์ํด Action Script3.0๋ก ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ์น์ฌ์ดํธ๋ฅผ ์์ฑํ๋๋ฐ ๋ง์ ์๊ฐ์ ๋ค์๋ค. ๋ํ์ ์กธ์ ํ ๋ค ๋ช ๊ฐ์์ด ์ง๋, ํ์๋ Flash๋ก ๊ณ ๊ฐ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ์ฃผ์๊ณ ๊ทธ๊ฒ์ด ์ฒ์์ด์ ๋ง์ง๋ง์ด์๋ค. Flash๋ ์ฃฝ์ด๊ฐ๊ณ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์์ ์ด๋ ฅ์๋ ํฌํธํด๋ฆฌ์ค์์๋ ์ฌ์ฉํ์ง ์๊ฒ ๋์๋ค.
๊ทธ๊ฒ์ ๋ฐ๋๋ ๊ธฐ์ ์ ๋ณํ ์๋์ ๋ํ ์ฒซ ๋ฒ์งธ ๊ตํ์ด์๊ณ , ์กธ์ ํ ์ด์ ๋ง ์ค๋ฌด๋ก ๋ฐ์ด๋๋ ์ฌ๋์๊ฒ๋ ๋งค์ฐ ๋๋ ค์ด ๊นจ๋ฌ์์ด์๋ค. ๊ทธ ํ 7๋ ํ์ธ ์ง๊ธ, ํ์๋ Microsoft Edgeํ์์ ๋์์ธ์ ๋๊ณ , ํ์๊ฐ ๋๊ผ๋ ๋ถ์๊ฐ์ ์ค์ฌ์ค ๋๊ตฌ(Sonarwhal)๋ฅผ ๊ฐ๋ฐํ๋ค.
Sonawhal์ ํ ์น ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ๊ฒ์ฌ ๋๊ตฌ์ด๋ค. ์คํ์์ค์ด๋ฉฐ JS Foundation ์์์ ์ด์๊ฐ๊ณ ์๋ค. ์ด ๋๊ตฌ๋ ๊ฐ๋ฐ์์ ๋์์ด๋์๊ฒ ๊ณ์๋๋ ๋ณํ์ ๋ฐ์ ๋ง์ถ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ๋ฉด ์ข์์ง ์ง์์ ์ผ๋ก ์๋ ค์ค๋ค.
Sonarwhal ๋ง์ค์ฝํธ์ธ "Nellie"
์น ๊ฐ๋ฐ์ ์ ํ๊ธฐ๋ ํ๋ ์ผ์ด๋ค. HTML, CSS JavaScript๋ง์ด ์ ๋ถ๋ ์๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ ๊ทผ์ฑ, ์ฑ๋ฅ, ๋ณด์, ์๋ก ์๊ธฐ๊ณ ์๋ ํ์ค, ๊ทธ ์ด์์ ๊ฒ๋ค์ ์ดํดํด์ผ ํ๋ค. ๋ช ๊ฐ์ ๋ง๋ค ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ์ง์์ด ์๋ก์์ง๋ค. ๋ฐฐ์์ผ ํ ๊ฒ์ด ๋ฌด๊ถ๋ฌด์งํ๋ค.
์น ๊ฐ๋ฐ์ ์ด๋ ต๋ค
ํญ์ ์ต์ ์ ์ง์์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์ด ํ์ง ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๊ฒ ํ ์๋๋ ฅ์ด๋ค. ๋น์ ์ด ๊ฐ ์์ํ ๊ฐ๋ฐ์๊ฑด, ํ์์ด๊ฑด, 10๋ ์ด์์ ๊ฒฝํ์ด ์๊ฑด Sonarwhalํ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๋์ํ๋ ๋น์ ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋๋ค.
ํ์ฌ Sonarwhal์ 5๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก ๋ฒ์ฃผ๋ฅผ ํ์ธํ๋ค. ์ ๊ทผ์ฑ, ์ํธ ์ด์ฉ์ฑ, ์ฑ๋ฅ, Progressive Web Apps, ๋ณด์์ด๋ค. ๊ฐ๊ฐ์ ๊ฒ์ฆ ์กฐ๊ฑด์ ๊ท์น(rule)์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ฌ๋ฌ๋ถ์ ์์ ๋ง์ ๊ท์น์ ๋ง๋ค์ด์ ํ๋ก์ ํธ์ ํนํ๋ ์ง์นจ์ ๋ฐ๋ฅด๋๋กํ ์ ์๋ค. (์๋ฅผ๋ค์ด ํต๊ณ ์งํ ๊ฒ์ฆ์ด๋, ํ์ด์ง์ ํํ ๋ฑ ์ด ์๋ค.)
Sonarwhal ์ฌ์ฉ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
์จ๋ผ์ธ ๊ฒ์ฌ๊ธฐ๋ ๊ฐ์ํ๋ ์น์ฌ์ดํธ ๊ฒ์ฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. URL์ ์ ๋ ฅํ๋ฉด ์ฌ๋ฌ๋ถ์ ์น ํ์ด์ง ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์๊ตฌ์ ๋งํฌ๋ก ๋ฐ์๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฃผ์๋ฅผ ์ธ์ ๋ ๊ณต์ ํ๊ณ ์ฌ๋ฐฉ๋ฌธํ ์ ์๋ค.
Sonarwhal ์จ๋ผ์ธ ๊ฒ์ฌ๊ธฐ
ํ์์ ํ์ด ์๋ก์ด ๊ท์น์ ์ถ๊ฐํ ๋ ๊ท์น์ ๋ํ ์ฝ๋๋ฅผ ์ง๋ ์๊ฐ๋ณด๋ค ๊ฐ ์ฃผ์ , ์์ค์ฝ๋ ๊ฒ์, ๋ฌธ์ํ์ ๋ ๋ง์ ์๊ฐ์ ๋ค์ธ๋ค. ๊ฒ์ฌ์ ๋ํด ๋จ์ํ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์ด๋ค ๋ถ๋ถ์ ์ํด์ ์คํจ๋ ๊ฒ์ธ์ง ์ดํด์ํค๋ ๊ฒ๋ ์ค์ํ๋ค. ์คํจํ ๊ฐ๊ฐ์ ๊ท์น๋ค ์ฌ์ด์์ ์ฌ๋ฌ๋ถ์ ์์ธํ ๋ฌธ์์ ๋งํฌ๋ฅผ ๋ณผ ์ ์์ ๊ฒ ์ด๋ค. ๊ทธ ๋ฌธ์๋ ์ ์ฌ๋ฌ๋ถ์ด ์ด ๊ท์น์ ์ฃผ์ํด์ผ ํ๋ฉฐ ํ ์คํธ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง, ํต๊ณผํ ์์ ๋ ์ด๋ค์ง, ๋ฐ๋๋ก ์คํจ๋ ์์ ๋ ๋ฌด์์ธ์ง, ์ด ๊ท์น์ ๊ด์ฌ์ด ์๋ค๋ฉด ๊น์ ์ดํด๋ฅผ ์ํด ํ์ํ ์ ์ฉํ ๋ฌธ์ ๋งํฌ๋ ์ ๊ณตํ๋ค.
๋ฌธ์๋ฅผ ์ฝ๊ณ , Sonarwhal์ ์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ณผ์ ์์ ๊ฐ๋ฐ์๊ฐ ์ต์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉ ํ๊ธฐ๋ฅผ ๋ฐ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ฉด์ ๊ฑฐ๋ญ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ธ์งํ ์๋ก, ๊ทธ๋ค์ ์์ฃผ ๋น ํธ๋ฆฐ ์๋ฆฌ๋จผํธ๋, ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ์ฝ๋๋ฅผ ๋จผ์ ๊ณ ์น๊ธฐ ์์ํ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋จ๋ฐฉํฅ ์์ฌ์ํต์ด ์๋๋ค. ๋ฌธ์๋ Sonarwhal ์น์ฌ์ดํธ ๋ฟ๋ง ์๋๋ผ, ์์ ์ ์ํด Github์๋ ์์ผ๋ ๋ ์ข์ ๋ฌธ์๋ฅผ ์ํด ์ฐ๋ฆฌ๋ฅผ ๋์์ฃผ๊ธธ ๋ฐ๋๋ค.
๊ฒ์ฌ ๊ฒฐ๊ณผ
ํ์ฌ Sonarwhal ์น์ฌ์ดํธ์ ๊ฒ์ฌ ์ค์ ์ ๋งค์ฐ ์๊ฒฉํ ์ํ์ด๋ค. ๊ทธ๋ฌ๋, ์๋ง๋ ์ฌ๋ฌ๋ถ์ ๋ง์์ ์ํ๊ฒ ํ ์๋ ์๋ค. (ํ์์ ๊ฐ์ธ ์น์ฌ์ดํธ๋ฅผ ํ ์คํธ ํด๋ดค์๋๋ ๊ทธ๋ฌ๋ค.)๊ทธ๋ฌ๋ CLI์์์ฒ๋ผ ๋ชจ๋ ๊ท์น์ ์๊ฒฉํจ ์์น๋ฅผ ์กฐ์ ํ ์ ์๋ค.
CLI๋ Sonarwhal์ ๋ํ ๋ชจ๋ ์กฐ์ ์ ํ ์ ์๋ค. ์ด๋ค ๊ท์น์ ์ฌ์ฉํ๋ฉฐ ์ด๋ป๊ฒ ๊ฐ์กฐํ ์ง, ์ด๋ค ๋๋ฉ์ธ์ผ๋ก ์ ์ํ ์ง ๋ชจ๋ ๊ฐ๋ฅํ๋ค. NodeJs ๋ฒ์ ์ ์ต์ LTS(v8)๋ Stable(v9)์ด ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ npm ๊ฐ์ ์ฌ๋ฌ๋ถ์ด ์ฆ๊ฒจ ์ฌ์ฉํ๋ ํจํค์ง ๋งค๋์ ๋ ํ์ํ๋ค:
npm install -g Sonarwhal
์ค์น๊ฐ ๋๋ฌ๋ค๋ฉด ์ฌ๋ฌ๋ถ์ ์ด์ ์ด๋ ๊ณณ์์๋ ๋ค์๊ณผ ๊ฐ์ด Sonarwhal์ ์ฌ์ฉํ ์ ์๋ค:
Sonarwhal https://example.com
๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธฐ
๊ตฌ์ฑ ์์๋ .sonarwhalrc
ํ์ผ์ ํตํด ์ค์ ํ ์ ์๋ค. ์ฌ์ดํธ๋ฅผ ๋ถ์ํ ๋๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ ์ ์๋ค. ์ด๋๋ ํ๋กฌํํธ๋ก ๋จ๋ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋ตํด์ผ ํ๋ค:
Sonarwhal ํ๊ฒฝ๊ตฌ์ฑ ์์ฑ๊ธฐ๊ฐ ์ง๋ฌธํ๊ณ ์๋ค
ํ๋ฒ ์ด ์ง๋ฌธ๋ค์ ๋ตํ๋ฉด .sonarwhalrc
ํ์ผ์ด ์๋์ ๊ฐ์ด ์์ฑ๋๋ค.
{
"connector": {
"name": "jsdom",
"options": {
"waitFor": 1000
}
},
"formatters": "stylish",
"rulesTimeout": 120000,
"rules": {
"apple-touch-icons": "error",
"axe": "error",
"content-type": "error",
"disown-opener": "error",
"highest-available-document-mode": "error",
"validate-set-cookie-header": "warning",
// ...
}
}
๊ฒ์ฌ๋ฅผ ์งํํ๊ณ ๋ ๋ค ๋ช ์ด๊ฐ ์ง๋๋ฉด ์ฌ๋ฌ๋ถ์ ๊ฒ์ฌ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค. ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ ์ด๋ค ํฌ๋งคํฐ๋ฅผ ์ฌ์ฉํ๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ณด์ด๋ฏ๋ก, ํ ๊ฐ์ฉ ์ฌ์ฉํด๋ณด๊ณ ์ฌ๋ฌ๋ถ์ด ๋ ์ ํธํ๋ ํฌ๋งคํฐ๋ก ๋ณ๊ฒฝํ๊ธธ ๋ฐ๋๋ค.
์น ์ฌ์ดํธ Sonarwhal ๊ฒ์ฌ ๊ฒฐ๊ณผ๊ฐ ๋์ด๊ณผ ๋์์ ํ์์ ๋ง์๋ ์ฐ์ฐ ์กฐ๊ฐ์ด ๋ฌ๋ค๐
์ด์ ์ฌ๋ฌ๋ถ์ ์ค๋ฅ ๋ฆฌ์คํธ๊ฐ ์๊ฒผ๋ค. ์ด๊ฒ์ ํตํด ์ฌ์ดํธ๋ฅผ ๊ฐ์ ํด๋ณด์! ์์๋ ๊ฒ์, ์น์ฌ์ดํธ๋ฅผ ๊ฒ์ฌํ ๋ ํ์ด์ง์ ์ถ๊ฐ๋ ํต๊ณ์งํ๋ ์ด๋๊ฐ์์ ๊ฐ์ ธ์จ ๊ธ์จ์ฒด๋ ๊ฒ์ฌํ๋ค. ์ฌ๋ฌ๋ถ์ด ์ด ํ์ผ๋ค์ ์์ ํ์ง๋ ๋ชปํ์ง๋ง CLI๋ฅผ ํตํด ์ด ํ์ผ๋ค์ ๋๋ฉ์ธ์ ๋ฌด์ํ๋๋ก ์ค์ ํด์ ์ฌ๋ฌ๋ถ์ด ์ ์ดํ ์ ์๋ ํ์ผ๋ค๋ง ๊ฒฐ๊ณผ์ ๋์ค๋๋ก ํ ์ ์๋ค.
์ ๊ณต๋๋ ๋ฌธ์๋ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์์ ํ ์ง์ ๋ํ ์ถฉ๋ถํ ๊ธธ์ก์ด๊ฐ ๋ ๊ฒ์ด์ง๋ง, ์ด๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ฅผ ๋์์ ์ด๋ป๊ฒ ์์ ํ๋ฉด ์ข์์ง ์ ์์ ๋ถํํ๋ค. ์ด๊ฒ์ ์ปค๋ฎค๋ํฐ์ ๋ ธ๋ ฅ์ด๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ๊ถ๊ธํ๋ ๊ฒ์ ๊ถ๊ธํดํ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๋ ์ผ์ด๋ค. ํ์์ ์น์ฌ์ดํธ๋ค์ ๊ฒ์ฌํ๋ฉด์ Sonarwhal์ ํ์์๊ฒ Apple ํฐ์น ์์ด์ฝ์ด ์๋ค๊ณ ๊ฒฝ๊ณ ํ๋ค. ํ์๊ฐ Sonarwhal ๋ฌธ์๋ฅผ ์ฐพ์๋ณด์ง ์๊ณ ์น ๊ฒ์์ ํ์๋, ๊ฐ์ฅ ์์ ์๋ 3๊ฐ์ ๊ฒ์ ๊ฒฐ๊ณผ๋ ํ์์๊ฒ ์ค๋๋ ์ ๋ณด๋ฅผ ์ฃผ์๋ค. ํ์๋ ๋ค์ํ ์์ด์ฝ ์น์๋ฅผ ์ถ๊ฐํด์ผํ๋ค. ํ์ง๋ง ๋์ ๊ธฐ๊ธฐ์ ๋ง๋ ๋ชจ๋ ์์ด์ฝ ์น์๋ค๊น์ง๋ ํ์ํ์ง ์๋ค. ์ถฉ๋ถํ ํฐ 180px * 180px ํ๊ฐ์ ์น์๋ฅผ ์ ์ธํ๊ณ ์ค๋๋ ๊ธฐ๊ธฐ๋ค์ ๋ง๊ฒ ์ถ์ํด์ ์ ๊ณตํ๋ฉด ๋๋ค.
๊ฐ์ฅ ์์ ์๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ผ๋ ํญ์ ์ณ์ง๋ ์์ผ๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ์ค๋๋ ์ ๋ณด๋ค์ ๊ฒ์ํ์ง ์๊ธธ ๋ฐ๋๋ค. Sonarwhal์ ๊ฐ๋ฅ์ฑ์ด ๋ ํ์ฅ๋ผ์, ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ๋ฅผ ํ๊ณณ์์ ์๋ฒ ํ ์คํธ ํ ์ ์๋๋ก ๋๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
Microsoft Edgeํ์, ๊ฐ๋ฐ์๋ค์ด ๋ฉ์ง ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋์์ ์ฃผ๋๋ฐ์ ๋ชฐ๋ํด์๋ค. ๋งค์ผ ๋ง์ ์น์ฌ์ดํธ๊ฐ ์ฐ๋ฆฌ์ ์ด์ ์ถ์ ์์คํ ์ผ๋ก ๋ค์ด์ค๋ ๊ฒ์ ๋ณด๊ณ ์๋ค.(๊ทธ๋ฐ ๋ฒ๊ทธ๋ค์ ์์ฑํด ์ฃผ๋ ๊ฒ์ ๊ฐ์ฌ๋ฅผ ์ ํ๋ค. ๊ทธ๋ค์ Microsoft Edge๋ฅผ ๋์ฑ๋ ์ข๊ฒ ๋ง๋ค๊ณ ์๋ค) ๊ณ์ํด์ ๋ฐ์ํ๋ ๋ช ๊ฐ์ง ์ด์๋ค์ ์ํ๊น์ด ์ค์์ด๊ฑฐ๋, ๋ค๋จ์ด์ง '๋ชจ๋ฒ ์ฌ๋ก๋ค'์ด๋ฉฐ ๋ฐ๋์ ํผํด์ผ ํ๋ค. ๊ทธ๋์ ์ด ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ ๋ชจ๋๊ฐ ์น์ ๋ ์ข์ ๋ชจ์ต์ผ๋ก ๋ง๋ค๋๋ก ๋๊ณ ์๋ค.
์ฐ๋ฆฌ๊ฐ Sonarwhal์ ๋ง๋ค๊ธฐ๋ก ํ์ ๋, ์ฐ๋ฆฐ ์ฌ๋๋ค์ด ๋ ์ข์, ์ต์ ๊ธฐ์ ์ ์ฝ๋๋ฅผ ๊ทธ๋ค์ ์น ์ฌ์ดํธ์ ์ฌ์ฉํ๊ธธ ๋ฐ๋๋ค. Sonarwhal์ด ๋๊ตฌ์๊ฒ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฏ๋ก, ์ด๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ 3๊ฐ์ง ์ง์นจ์ ์ ํ๋ค:
์ด๊ฒ์ ์์์ ๋ถ๊ณผํ๋ฉฐ ์ฌ์ ํ ํด์ผ ํ ์ผ์ด ๋ง์ผ๋ฉฐ, ์์ผ๋ก์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํ ๋๋ด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ด์ฌํ ๋ชฉ๋ก์ผ๋ก ๋ง๋๋ ์ค์ด๋ค. ๊ทธ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค:
์ด๊ฒ์ ์น ์ปค๋ฎค๋ํฐ๋ฅผ ์ํ, ์น ์ปค๋ฎค๋ํฐ์ ์ํ ๋๊ตฌ์ด๋ค. ์ฌ๋ฌ๋ถ์ด Sonarwhal์ ๊ด์ฌ์ ๊ฐ์ง๊ฑฐ๋, ๋ ์ข์ ์น์ ๋ง๋ค๊ณ ์ถ๊ฑฐ๋, Sonarwhal์ ๊ธฐ์ฌํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์ฐ๋ฝํ๊ธธ ๋ฐ๋๋ค. ์ฐ๋ฆฌ์ ์ด์ ์ค ๋ช ๊ฐ์ง๋ ์ฌ๋ฌ๋ถ์ด ๋์ธ ์ ์์์ง ๋ชจ๋ฅธ๋ค. Sonarwhal์ ์๊ธฐ ์ํด Github organization๋ ๋ฐฉ๋ฌธํ๋ ๊ฒ๋ ์์ง ๋ง๋ผ. PR์ ์ธ์ ๋ ์ฌ๋ฌ๋ถ์๊ฒ ์ด๋ ค์๋ค.
@NarwhalNellie Twitter๋ก ์ค์บ๋์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์ฌ๋ฌ๋ถ์ ์๊ฒฌ์ ์๋ ค์ฃผ๊ธธ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ค. ์ฐ๋ฆฌ์ ํจ๊ป ์น์ ๋ฏธ๋๋ฅผ ๊ฒ์ฌํ์!
์๋ฌธ : https://24ways.org/2017/lint-the-web-forward-with-sonarwhal/
๋ช ํด ์ , ํ์๊ฐ ๋ํ ์กธ์ ๋ฐ์ผ ๋ ์น ๊ฐ๋ฐ ๊ณผ์ ์ ๋ ๊ฐ์ง์ ๊ธฐ์ ์ ์ด์ ์ ๋์๋ค. ํ๊ฐ์ง๋ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค ์ฆ, HTML๊ณผ CSS, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ ๊ฐ์ง๋ Adobe Flash์๋ค. ํ์๋ ํฌํธํด๋ฆฌ์ค์ ์ถ๊ฐํ๊ธฐ ์ํด Action Script3.0๋ก ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ์น์ฌ์ดํธ๋ฅผ ์์ฑํ๋๋ฐ ๋ง์ ์๊ฐ์ ๋ค์๋ค. ๋ํ์ ์กธ์ ํ ๋ค ๋ช ๊ฐ์์ด ์ง๋, ํ์๋ Flash๋ก ๊ณ ๊ฐ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ์ฃผ์๊ณ ๊ทธ๊ฒ์ด ์ฒ์์ด์ ๋ง์ง๋ง์ด์๋ค. Flash๋ ์ฃฝ์ด๊ฐ๊ณ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์์ ์ด๋ ฅ์๋ ํฌํธํด๋ฆฌ์ค์์๋ ์ฌ์ฉํ์ง ์๊ฒ ๋์๋ค.
๊ทธ๊ฒ์ ๋ฐ๋๋ ๊ธฐ์ ์ ๋ณํ ์๋์ ๋ํ ์ฒซ ๋ฒ์งธ ๊ตํ์ด์๊ณ , ์กธ์ ํ ์ด์ ๋ง ์ค๋ฌด๋ก ๋ฐ์ด๋๋ ์ฌ๋์๊ฒ๋ ๋งค์ฐ ๋๋ ค์ด ๊นจ๋ฌ์์ด์๋ค. ๊ทธ ํ 7๋ ํ์ธ ์ง๊ธ, ํ์๋ Microsoft Edgeํ์์ ๋์์ธ์ ๋๊ณ , ํ์๊ฐ ๋๊ผ๋ ๋ถ์๊ฐ์ ์ค์ฌ์ค ๋๊ตฌ(Sonarwhal)๋ฅผ ๊ฐ๋ฐํ๋ค.
Sonawhal์ ํ ์น ์ปค๋ฎค๋ํฐ์์ ๋ง๋ ๊ฒ์ฌ ๋๊ตฌ์ด๋ค. ์คํ์์ค์ด๋ฉฐ JS Foundation ์์์ ์ด์๊ฐ๊ณ ์๋ค. ์ด ๋๊ตฌ๋ ๊ฐ๋ฐ์์ ๋์์ด๋์๊ฒ ๊ณ์๋๋ ๋ณํ์ ๋ฐ์ ๋ง์ถ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ๋ฉด ์ข์์ง ์ง์์ ์ผ๋ก ์๋ ค์ค๋ค.
Sonarwhal ๋ง์ค์ฝํธ์ธ "Nellie"
์น ๊ฐ๋ฐ์ ์ ํ๊ธฐ๋ ํ๋ ์ผ์ด๋ค. HTML, CSS JavaScript๋ง์ด ์ ๋ถ๋ ์๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ ๊ทผ์ฑ, ์ฑ๋ฅ, ๋ณด์, ์๋ก ์๊ธฐ๊ณ ์๋ ํ์ค, ๊ทธ ์ด์์ ๊ฒ๋ค์ ์ดํดํด์ผ ํ๋ค. ๋ช ๊ฐ์ ๋ง๋ค ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ์ง์์ด ์๋ก์์ง๋ค. ๋ฐฐ์์ผ ํ ๊ฒ์ด ๋ฌด๊ถ๋ฌด์งํ๋ค.
์น ๊ฐ๋ฐ์ ์ด๋ ต๋ค
ํญ์ ์ต์ ์ ์ง์์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์ด ํ์ง ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๊ฒ ํ ์๋๋ ฅ์ด๋ค. ๋น์ ์ด ๊ฐ ์์ํ ๊ฐ๋ฐ์๊ฑด, ํ์์ด๊ฑด, 10๋ ์ด์์ ๊ฒฝํ์ด ์๊ฑด Sonarwhalํ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๋์ํ๋ ๋น์ ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋๋ค.
ํ์ฌ Sonarwhal์ 5๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก ๋ฒ์ฃผ๋ฅผ ํ์ธํ๋ค. ์ ๊ทผ์ฑ, ์ํธ ์ด์ฉ์ฑ, ์ฑ๋ฅ, Progressive Web Apps, ๋ณด์์ด๋ค. ๊ฐ๊ฐ์ ๊ฒ์ฆ ์กฐ๊ฑด์ ๊ท์น(rule)์ด๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ฌ๋ฌ๋ถ์ ์์ ๋ง์ ๊ท์น์ ๋ง๋ค์ด์ ํ๋ก์ ํธ์ ํนํ๋ ์ง์นจ์ ๋ฐ๋ฅด๋๋กํ ์ ์๋ค. (์๋ฅผ๋ค์ด ํต๊ณ ์งํ ๊ฒ์ฆ์ด๋, ํ์ด์ง์ ํํ ๋ฑ ์ด ์๋ค.)
Sonarwhal ์ฌ์ฉ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
์จ๋ผ์ธ ๊ฒ์ฌ๊ธฐ๋ ๊ฐ์ํ๋ ์น์ฌ์ดํธ ๊ฒ์ฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. URL์ ์ ๋ ฅํ๋ฉด ์ฌ๋ฌ๋ถ์ ์น ํ์ด์ง ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์๊ตฌ์ ๋งํฌ๋ก ๋ฐ์๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฃผ์๋ฅผ ์ธ์ ๋ ๊ณต์ ํ๊ณ ์ฌ๋ฐฉ๋ฌธํ ์ ์๋ค.
Sonarwhal ์จ๋ผ์ธ ๊ฒ์ฌ๊ธฐ
ํ์์ ํ์ด ์๋ก์ด ๊ท์น์ ์ถ๊ฐํ ๋ ๊ท์น์ ๋ํ ์ฝ๋๋ฅผ ์ง๋ ์๊ฐ๋ณด๋ค ๊ฐ ์ฃผ์ , ์์ค์ฝ๋ ๊ฒ์, ๋ฌธ์ํ์ ๋ ๋ง์ ์๊ฐ์ ๋ค์ธ๋ค. ๊ฒ์ฌ์ ๋ํด ๋จ์ํ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์ด๋ค ๋ถ๋ถ์ ์ํด์ ์คํจ๋ ๊ฒ์ธ์ง ์ดํด์ํค๋ ๊ฒ๋ ์ค์ํ๋ค. ์คํจํ ๊ฐ๊ฐ์ ๊ท์น๋ค ์ฌ์ด์์ ์ฌ๋ฌ๋ถ์ ์์ธํ ๋ฌธ์์ ๋งํฌ๋ฅผ ๋ณผ ์ ์์ ๊ฒ ์ด๋ค. ๊ทธ ๋ฌธ์๋ ์ ์ฌ๋ฌ๋ถ์ด ์ด ๊ท์น์ ์ฃผ์ํด์ผ ํ๋ฉฐ ํ ์คํธ๋ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง, ํต๊ณผํ ์์ ๋ ์ด๋ค์ง, ๋ฐ๋๋ก ์คํจ๋ ์์ ๋ ๋ฌด์์ธ์ง, ์ด ๊ท์น์ ๊ด์ฌ์ด ์๋ค๋ฉด ๊น์ ์ดํด๋ฅผ ์ํด ํ์ํ ์ ์ฉํ ๋ฌธ์ ๋งํฌ๋ ์ ๊ณตํ๋ค.
๋ฌธ์๋ฅผ ์ฝ๊ณ , Sonarwhal์ ์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ณผ์ ์์ ๊ฐ๋ฐ์๊ฐ ์ต์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉ ํ๊ธฐ๋ฅผ ๋ฐ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ฌ์ดํธ๋ฅผ ๋ง๋ค์ด ๋๊ฐ๋ฉด์ ๊ฑฐ๋ญ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ธ์งํ ์๋ก, ๊ทธ๋ค์ ์์ฃผ ๋น ํธ๋ฆฐ ์๋ฆฌ๋จผํธ๋, ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ์ฝ๋๋ฅผ ๋จผ์ ๊ณ ์น๊ธฐ ์์ํ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋จ๋ฐฉํฅ ์์ฌ์ํต์ด ์๋๋ค. ๋ฌธ์๋ Sonarwhal ์น์ฌ์ดํธ ๋ฟ๋ง ์๋๋ผ, ์์ ์ ์ํด Github์๋ ์์ผ๋ ๋ ์ข์ ๋ฌธ์๋ฅผ ์ํด ์ฐ๋ฆฌ๋ฅผ ๋์์ฃผ๊ธธ ๋ฐ๋๋ค.
๊ฒ์ฌ ๊ฒฐ๊ณผ
ํ์ฌ Sonarwhal ์น์ฌ์ดํธ์ ๊ฒ์ฌ ์ค์ ์ ๋งค์ฐ ์๊ฒฉํ ์ํ์ด๋ค. ๊ทธ๋ฌ๋, ์๋ง๋ ์ฌ๋ฌ๋ถ์ ๋ง์์ ์ํ๊ฒ ํ ์๋ ์๋ค. (ํ์์ ๊ฐ์ธ ์น์ฌ์ดํธ๋ฅผ ํ ์คํธ ํด๋ดค์๋๋ ๊ทธ๋ฌ๋ค.)๊ทธ๋ฌ๋ CLI์์์ฒ๋ผ ๋ชจ๋ ๊ท์น์ ์๊ฒฉํจ ์์น๋ฅผ ์กฐ์ ํ ์ ์๋ค.
CLI๋ Sonarwhal์ ๋ํ ๋ชจ๋ ์กฐ์ ์ ํ ์ ์๋ค. ์ด๋ค ๊ท์น์ ์ฌ์ฉํ๋ฉฐ ์ด๋ป๊ฒ ๊ฐ์กฐํ ์ง, ์ด๋ค ๋๋ฉ์ธ์ผ๋ก ์ ์ํ ์ง ๋ชจ๋ ๊ฐ๋ฅํ๋ค. NodeJs ๋ฒ์ ์ ์ต์ LTS(v8)๋ Stable(v9)์ด ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ npm ๊ฐ์ ์ฌ๋ฌ๋ถ์ด ์ฆ๊ฒจ ์ฌ์ฉํ๋ ํจํค์ง ๋งค๋์ ๋ ํ์ํ๋ค:
npm install -g Sonarwhal
์ค์น๊ฐ ๋๋ฌ๋ค๋ฉด ์ฌ๋ฌ๋ถ์ ์ด์ ์ด๋ ๊ณณ์์๋ ๋ค์๊ณผ ๊ฐ์ด Sonarwhal์ ์ฌ์ฉํ ์ ์๋ค:
Sonarwhal https://example.com
๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธฐ
๊ตฌ์ฑ ์์๋ .sonarwhalrc
ํ์ผ์ ํตํด ์ค์ ํ ์ ์๋ค. ์ฌ์ดํธ๋ฅผ ๋ถ์ํ ๋๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ ์ ์๋ค. ์ด๋๋ ํ๋กฌํํธ๋ก ๋จ๋ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋ตํด์ผ ํ๋ค:
Sonarwhal ํ๊ฒฝ๊ตฌ์ฑ ์์ฑ๊ธฐ๊ฐ ์ง๋ฌธํ๊ณ ์๋ค
ํ๋ฒ ์ด ์ง๋ฌธ๋ค์ ๋ตํ๋ฉด .sonarwhalrc
ํ์ผ์ด ์๋์ ๊ฐ์ด ์์ฑ๋๋ค.
{
"connector": {
"name": "jsdom",
"options": {
"waitFor": 1000
}
},
"formatters": "stylish",
"rulesTimeout": 120000,
"rules": {
"apple-touch-icons": "error",
"axe": "error",
"content-type": "error",
"disown-opener": "error",
"highest-available-document-mode": "error",
"validate-set-cookie-header": "warning",
// ...
}
}
๊ฒ์ฌ๋ฅผ ์งํํ๊ณ ๋ ๋ค ๋ช ์ด๊ฐ ์ง๋๋ฉด ์ฌ๋ฌ๋ถ์ ๊ฒ์ฌ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค. ๊ฒ์ฌ ๊ฒฐ๊ณผ๋ ์ด๋ค ํฌ๋งคํฐ๋ฅผ ์ฌ์ฉํ๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ณด์ด๋ฏ๋ก, ํ ๊ฐ์ฉ ์ฌ์ฉํด๋ณด๊ณ ์ฌ๋ฌ๋ถ์ด ๋ ์ ํธํ๋ ํฌ๋งคํฐ๋ก ๋ณ๊ฒฝํ๊ธธ ๋ฐ๋๋ค.
์น ์ฌ์ดํธ Sonarwhal ๊ฒ์ฌ ๊ฒฐ๊ณผ๊ฐ ๋์ด๊ณผ ๋์์ ํ์์ ๋ง์๋ ์ฐ์ฐ ์กฐ๊ฐ์ด ๋ฌ๋ค๐
์ด์ ์ฌ๋ฌ๋ถ์ ์ค๋ฅ ๋ฆฌ์คํธ๊ฐ ์๊ฒผ๋ค. ์ด๊ฒ์ ํตํด ์ฌ์ดํธ๋ฅผ ๊ฐ์ ํด๋ณด์! ์์๋ ๊ฒ์, ์น์ฌ์ดํธ๋ฅผ ๊ฒ์ฌํ ๋ ํ์ด์ง์ ์ถ๊ฐ๋ ํต๊ณ์งํ๋ ์ด๋๊ฐ์์ ๊ฐ์ ธ์จ ๊ธ์จ์ฒด๋ ๊ฒ์ฌํ๋ค. ์ฌ๋ฌ๋ถ์ด ์ด ํ์ผ๋ค์ ์์ ํ์ง๋ ๋ชปํ์ง๋ง CLI๋ฅผ ํตํด ์ด ํ์ผ๋ค์ ๋๋ฉ์ธ์ ๋ฌด์ํ๋๋ก ์ค์ ํด์ ์ฌ๋ฌ๋ถ์ด ์ ์ดํ ์ ์๋ ํ์ผ๋ค๋ง ๊ฒฐ๊ณผ์ ๋์ค๋๋ก ํ ์ ์๋ค.
์ ๊ณต๋๋ ๋ฌธ์๋ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์์ ํ ์ง์ ๋ํ ์ถฉ๋ถํ ๊ธธ์ก์ด๊ฐ ๋ ๊ฒ์ด์ง๋ง, ์ด๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ฅผ ๋์์ ์ด๋ป๊ฒ ์์ ํ๋ฉด ์ข์์ง ์ ์์ ๋ถํํ๋ค. ์ด๊ฒ์ ์ปค๋ฎค๋ํฐ์ ๋ ธ๋ ฅ์ด๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ๊ถ๊ธํ๋ ๊ฒ์ ๊ถ๊ธํดํ ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๋ ์ผ์ด๋ค. ํ์์ ์น์ฌ์ดํธ๋ค์ ๊ฒ์ฌํ๋ฉด์ Sonarwhal์ ํ์์๊ฒ Apple ํฐ์น ์์ด์ฝ์ด ์๋ค๊ณ ๊ฒฝ๊ณ ํ๋ค. ํ์๊ฐ Sonarwhal ๋ฌธ์๋ฅผ ์ฐพ์๋ณด์ง ์๊ณ ์น ๊ฒ์์ ํ์๋, ๊ฐ์ฅ ์์ ์๋ 3๊ฐ์ ๊ฒ์ ๊ฒฐ๊ณผ๋ ํ์์๊ฒ ์ค๋๋ ์ ๋ณด๋ฅผ ์ฃผ์๋ค. ํ์๋ ๋ค์ํ ์์ด์ฝ ์น์๋ฅผ ์ถ๊ฐํด์ผํ๋ค. ํ์ง๋ง ๋์ ๊ธฐ๊ธฐ์ ๋ง๋ ๋ชจ๋ ์์ด์ฝ ์น์๋ค๊น์ง๋ ํ์ํ์ง ์๋ค. ์ถฉ๋ถํ ํฐ 180px * 180px ํ๊ฐ์ ์น์๋ฅผ ์ ์ธํ๊ณ ์ค๋๋ ๊ธฐ๊ธฐ๋ค์ ๋ง๊ฒ ์ถ์ํด์ ์ ๊ณตํ๋ฉด ๋๋ค.
๊ฐ์ฅ ์์ ์๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ผ๋ ํญ์ ์ณ์ง๋ ์์ผ๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ์ค๋๋ ์ ๋ณด๋ค์ ๊ฒ์ํ์ง ์๊ธธ ๋ฐ๋๋ค. Sonarwhal์ ๊ฐ๋ฅ์ฑ์ด ๋ ํ์ฅ๋ผ์, ์ฌ๋ฌ๋ถ์ ์น์ฌ์ดํธ๋ฅผ ํ๊ณณ์์ ์๋ฒ ํ ์คํธ ํ ์ ์๋๋ก ๋๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
Microsoft Edgeํ์, ๊ฐ๋ฐ์๋ค์ด ๋ฉ์ง ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๋์์ ์ฃผ๋๋ฐ์ ๋ชฐ๋ํด์๋ค. ๋งค์ผ ๋ง์ ์น์ฌ์ดํธ๊ฐ ์ฐ๋ฆฌ์ ์ด์ ์ถ์ ์์คํ ์ผ๋ก ๋ค์ด์ค๋ ๊ฒ์ ๋ณด๊ณ ์๋ค.(๊ทธ๋ฐ ๋ฒ๊ทธ๋ค์ ์์ฑํด ์ฃผ๋ ๊ฒ์ ๊ฐ์ฌ๋ฅผ ์ ํ๋ค. ๊ทธ๋ค์ Microsoft Edge๋ฅผ ๋์ฑ๋ ์ข๊ฒ ๋ง๋ค๊ณ ์๋ค) ๊ณ์ํด์ ๋ฐ์ํ๋ ๋ช ๊ฐ์ง ์ด์๋ค์ ์ํ๊น์ด ์ค์์ด๊ฑฐ๋, ๋ค๋จ์ด์ง '๋ชจ๋ฒ ์ฌ๋ก๋ค'์ด๋ฉฐ ๋ฐ๋์ ํผํด์ผ ํ๋ค. ๊ทธ๋์ ์ด ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ ๋ชจ๋๊ฐ ์น์ ๋ ์ข์ ๋ชจ์ต์ผ๋ก ๋ง๋ค๋๋ก ๋๊ณ ์๋ค.
์ฐ๋ฆฌ๊ฐ Sonarwhal์ ๋ง๋ค๊ธฐ๋ก ํ์ ๋, ์ฐ๋ฆฐ ์ฌ๋๋ค์ด ๋ ์ข์, ์ต์ ๊ธฐ์ ์ ์ฝ๋๋ฅผ ๊ทธ๋ค์ ์น ์ฌ์ดํธ์ ์ฌ์ฉํ๊ธธ ๋ฐ๋๋ค. Sonarwhal์ด ๋๊ตฌ์๊ฒ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฏ๋ก, ์ด๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ 3๊ฐ์ง ์ง์นจ์ ์ ํ๋ค:
์ด๊ฒ์ ์์์ ๋ถ๊ณผํ๋ฉฐ ์ฌ์ ํ ํด์ผ ํ ์ผ์ด ๋ง์ผ๋ฉฐ, ์์ผ๋ก์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํ ๋๋ด์ฃผ๋ ๊ธฐ๋ฅ๋ค์ ์ด์ฌํ ๋ชฉ๋ก์ผ๋ก ๋ง๋๋ ์ค์ด๋ค. ๊ทธ ๊ธฐ๋ฅ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค:
์ด๊ฒ์ ์น ์ปค๋ฎค๋ํฐ๋ฅผ ์ํ, ์น ์ปค๋ฎค๋ํฐ์ ์ํ ๋๊ตฌ์ด๋ค. ์ฌ๋ฌ๋ถ์ด Sonarwhal์ ๊ด์ฌ์ ๊ฐ์ง๊ฑฐ๋, ๋ ์ข์ ์น์ ๋ง๋ค๊ณ ์ถ๊ฑฐ๋, Sonarwhal์ ๊ธฐ์ฌํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์ฐ๋ฝํ๊ธธ ๋ฐ๋๋ค. ์ฐ๋ฆฌ์ ์ด์ ์ค ๋ช ๊ฐ์ง๋ ์ฌ๋ฌ๋ถ์ด ๋์ธ ์ ์์์ง ๋ชจ๋ฅธ๋ค. Sonarwhal์ ์๊ธฐ ์ํด Github organization๋ ๋ฐฉ๋ฌธํ๋ ๊ฒ๋ ์์ง ๋ง๋ผ. PR์ ์ธ์ ๋ ์ฌ๋ฌ๋ถ์๊ฒ ์ด๋ ค์๋ค.
@NarwhalNellie Twitter๋ก ์ค์บ๋์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์ฌ๋ฌ๋ถ์ ์๊ฒฌ์ ์๋ ค์ฃผ๊ธธ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ค. ์ฐ๋ฆฌ์ ํจ๊ป ์น์ ๋ฏธ๋๋ฅผ ๊ฒ์ฌํ์!