Validate AMP pages
AMP์ ์ฃผ์ ๊ฐ์ ์ ํ์ด์ง ์๋๋ฅผ ํฅ์ํ ๋ฟ๋ง ์๋๋ผ ํฅ์๋ ํ์ด์ง ์๋์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ Twitter, Instagram ๋๋ Google Search์ ๊ฐ์ ํ์ฌ์์๋ ๋ถ๋ด ์์ด ๋์ฑ ํฅ๋ฏธ๋กญ๊ฒ ์ฌ์ฉ์์๊ฒ AMP ํ์ด์ง๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ด ํ์ด์ง๊ฐ ์ ํจํ AMP์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
AMP ๋ฌธ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ชจ๋ ๋์ผํ๋ฏ๋ก ๋ด ๊ฐ๋ฐ ์คํ์ผ์ ๋ง๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ธ์.
AMP ์ ํจ์ฑ์ ๊ฒ์ฌํ ๋ฟ๋ง ์๋๋ผ AMP ๋ฌธ์๊ฐ ํ์ฌ ํ๋ซํผ์์ ๊ฒ์๋๋์ง ํ์ธํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ์ฝ์
AMP ๊ฒ์ฌ๊ธฐ๋ AMP JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ๋ค๋ก ์ ๊ณต๋๋ฏ๋ก ๋ชจ๋ AMP ํ์ด์ง์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ์์ AMP ํ์ด์ง๋ฅผ ์ฝ๋๋ค.
- URL์ "
#development=[1,actions,amp,amp4ads,amp4email]
"๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ดhttp://localhost:8000/released.amp.html#development=1
๋AMP
ํ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๊ธฐ์กด์ ์๋จ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์http://localhost:8000/released.amp.html#development=amp4email
URL์ ์ด๋ฉ์ผ์ฉ AMP ์ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค. - Chrome DevTools ์ฝ์์ ์ด๊ณ ์ ํจ์ฑ ์ค๋ฅ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ๋ฐ์ ์ฝ์์ ์ค๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
์น ์ธํฐํ์ด์ค
AMP ๊ฒ์ฌ๊ธฐ๋ validator.ampproject.org์์ ์น ์ธํฐํ์ด์ค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ํ์ด์ง์ HTML ์์ค์ ํจ๊ป ์ธ๋ผ์ธ์ผ๋ก ํ์๋ ์ค๋ฅ๋ฅผ ํ์ํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ๋ํํ ํธ์ง๊ธฐ์ด๋ฉฐ ๋ํํ ์ ํจ์ฑ ์ฌ๊ฒ์ฌ ์ HTML ์์ค์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์๋ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ
AMP ๊ฒ์ฌ๊ธฐ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ํตํด ๋ธ๋ผ์ฐ์ ํด๋ฐ์์ ๋ฐ๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์๊ฐ ํ์ํ๋ฉด์ ๋ฐฉ๋ฌธํ ๋ชจ๋ AMP ํ์ด์ง์ ์ ํจ์ฑ์ ์๋์ผ๋ก ๊ฒ์ฌํ๊ณ ์์ ์์ด์ฝ์ผ๋ก ํ์ด์ง์ ์ ํจ์ฑ์ ์๊ฐ์ ์ผ๋ก ํ์ํฉ๋๋ค.
| AMP ํ์ด์ง ๋ด์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์์ด์ฝ์ด ๋นจ๊ฐ์์ผ๋ก ํ์๋๋ฉฐ ๋ฐ์ํ ์ค๋ฅ์ ์๋ฅผ ํ์ํฉ๋๋ค. |
| AMP ํ์ด์ง ๋ด์ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ํ์ฅ ํ๋ก๊ทธ๋จ ์์ด์ฝ์ด ๋ น์์ผ๋ก ํ์๋๋ฉฐ ๊ฒฝ๊ณ ๊ฐ ์๋ค๋ฉด ๊ฒฝ๊ณ ์ ์๋ฅผ ํ์ํฉ๋๋ค. |
| AMP๋ ์๋์ง๋ง AMP ๋ฒ์ ์ด ์๋ ํ์ด์ง์ธ ๊ฒฝ์ฐ ๋งํฌ ์์ด์ฝ๊ณผ ํจ๊ป ์์ด์ฝ์ด ํ๋์์ผ๋ก ํ์๋๋ฉฐ ํ์ฅ ํ๋ก๊ทธ๋จ์ ํด๋ฆญํ๋ฉด AMP ๋ฒ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค. |
AMP ๊ฒ์ฌ๊ธฐ ํ์ฅ ํ๋ก๊ทธ๋จ์ Chrome ๋ฐ Opera์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
CI์ฉ NPM ํจํค์ง
amphtml-validator ๋๋ gulp-amphtml-validator(Gulp ํ๋ฌ๊ทธ์ธ) ๋ฑ์ AMP ๊ฒ์ฌ๊ธฐ NPM ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ AMP ๊ฒ์ฌ๊ธฐ๋ฅผ ๋น๋ํ๊ณ ํ ์คํธ ํ์ดํ๋ผ์ธ์ ์ผ๋ถ๋ก ํตํฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, AMP ๊ฒ์ฌ๊ธฐ NPM ํจํค์ง๋ก ํตํฉ ํ ์คํธ๋ฅผ ์งํํ๊ฑฐ๋ ํด๋น ํจํค์ง๋ฅผ ํ๋ก๋์ ๋จ๊ณ์ AMP ํ์ด์ง์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ์์ฝ๋ ์์ ์ ์์ฉํ ์ ์์ต๋๋ค.
์ : AMP HTML ํ์ผ ์ ํจ์ฑ ๊ฒ์ฌ
์ด ์์์๋ amphtml-validator NPM ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ AMP HTML ํ์ผ์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค. ์ ํจ์ฑ ๊ฒ์ฌ ์ํ๋ ์ฝ์๋ก ์ ๋ฌ๋ฉ๋๋ค.
'use strict';
var amphtmlValidator = require('amphtml-validator');
var fs = require('fs');
amphtmlValidator.getInstance().then(function (validator) {
var input = fs.readFileSync('index.html', 'utf8');
var result = validator.validateString(input);
(result.status === 'PASS' ? console.log : console.error)(result.status);
for (var ii = 0; ii < result.errors.length; ii++) {
var error = result.errors[ii];
var msg =
'line ' + error.line + ', col ' + error.col + ': ' + error.message;
if (error.specUrl !== null) {
msg += ' (see ' + error.specUrl + ')';
}
(error.severity === 'ERROR' ? console.error : console.warn)(msg);
}
});
์: Gulp ์์ ์ ํ์ฉํ AMP HTML ์ ํจ์ฑ ๊ฒ์ฌ
์ด ์์์๋ ๋ชจ๋ AMP HTML ํ์ผ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ Gulp ์์ ์ ์ฌ์ฉํฉ๋๋ค. AMP ์ ํจ์ฑ ํ๊ฐ ์ค๋ฅ๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ด ์ข ๋ฃ๋๋ฉฐ ์ค๋ฅ ์ฝ๋ (1)์ด ํ์๋ฉ๋๋ค.
const gulp = require('gulp');
const gulpAmpValidator = require('gulp-amphtml-validator');
const paths = {
src: 'src/*.html',
};
gulp.task('amphtml:validate', () => {
return gulp
.src(paths.src)
.pipe(gulpAmpValidator.validate())
.pipe(gulpAmpValidator.format())
.pipe(gulpAmpValidator.failAfterError());
});
gulp.task('default', ['amphtml:validate'], function () {});
๋ช ๋ น์ค ๋๊ตฌ
AMP HTML ๊ฒ์ฌ๊ธฐ ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ AMP HTML ํ์ผ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ ์ ์์ต๋๋ค.
์์ํ๊ธฐ:
- ์์คํ ์ ํจํค์ง ๊ด๋ฆฌ์ 'npm'์ด ํฌํจ๋ Node.js๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
npm install -g amphtml-validator
๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ AMP HTML ๊ฒ์ฌ๊ธฐ ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ค์นํฉ๋๋ค.
์ด์ ์ค์ AMP HTML ํ์ด์ง์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํด๋ณด๊ฒ ์ต๋๋ค.
$ amphtml-validator https://amp.dev/ https://amp.dev/: PASS
๋น์ฐํ ์ด ํ์ด์ง๋ ์ ํจํ AMP HTML์
๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ํจํ์ง ์์ ํ์ด์ง์ธ several_errors.html์์ ๊ฒ์ฌ๋ฅผ ์คํํด๋ณด๊ฒ ์ต๋๋ค. amphtml-validator
๋ช
๋ น์ด๋ฅผ ์คํํ๋ ค๋ฉด ํ์ด์ง์ URL ๋๋ ๋ก์ปฌ ํ์ผ ์ด๋ฆ์ ์ ๊ณตํฉ๋๋ค. several_errors.html์ ๋ค์ด๋ก๋ํ์ฌ ํ์ผ์ ์ ์ฅํ๊ณ ๋ค์์ ์คํํฉ๋๋ค.
$ amphtml-validator several_errors.html several_errors.html:23:2 The attribute 'charset' may not appear in tag 'meta name= and content='. several_errors.html:26:2 The tag 'script' is disallowed except in specific forms. several_errors.html:32:2 The mandatory attribute 'height' is missing in tag 'amp-img'. (see /ko/documentation/components/amp-img/) several_errors.html:34:2 The attribute 'width' in tag 'amp-ad' is set to the invalid value '100%'. (see /ko/documentation/components/amp-ad/) ...
์ค๋ฅ ๋ฉ์์ง์ ํ์์ ํ์ผ ์ด๋ฆ, ํ, ์ด, ๋ฉ์์ง๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ข ์ข AMP HTML ์ฐธ์กฐ ๋งํฌ๊ฐ ๋ค์ ์ด์ด์ง๋๋ค. Emacs(์ปดํ์ผ ๋ช ๋ น์ด์ ํธ์ง ๋ชจ๋๊ฐ ์์)๋ฅผ ํฌํจํ ์ผ๋ถ ํธ์ง๊ธฐ๋ ์ด ํ์์ ํด์ํ ์ ์์ผ๋ฉฐ ์๋ณธ ํ์ผ์์ ์ค๋ฅ๋ก ์ด๋ํ ์ ์๊ฒ ํด์ค๋๋ค.
๋๋ง์ AMP ํ์ด์ง๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋จผ์ minimum_valid_amp.html๋ก ์์ํด ๋ณด์ธ์.
$ amphtml-validator minimum_valid_amp.html minimum_valid_amp.html: PASS
๋ช ๋ น์ค ๋๊ตฌ๋ ์์ ์ฌ์ฉ ํด์ , JSON ์ถ๋ ฅ ์ธ์, ํน์ ๋ฒ์ ์ ๊ฒ์ฌ๊ธฐ Javascript ์คํ(๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ ๊ฒ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํจ) ๋ฑ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
$ amphtml-validator --help Usage: index [options] <fileOrUrlOrMinus...> Validates the files or urls provided as arguments. If "-" is specified, reads from stdin instead. Options: -h, --help output usage information -V, --version output the version number --validator_js <fileOrUrl> The Validator Javascript. Latest published version by default, or dist/validator_minified.js (built with build.py) for development. --format <color|text|json> How to format the output. "color" displays errors/warnings/success in red/orange/green. "text" avoids color (e.g., useful in terminals not supporting color). "json" emits json corresponding to the ValidationResult message in validator.proto.
ํ์ด์ง๊ฐ ์ ํจํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์?
AMP ๊ฒ์ฌ๊ธฐ์ ์ฉ๋๋ ๊ฐ๋ฐํ๋ ๋์ ํธ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ๋ง์ด ์๋๋๋ค. Twitter ๋๋ Google๊ณผ ๊ฐ์ ํ๋ซํผ์์ ๋ด AMP ํ์ด์ง๋ฅผ ํ๋ซํผ์ ์ฝํ ์ธ ๋๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ํตํฉํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ด ์๋ฒ์ ์ง์ ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๋์ ํ์ด์ง๋ฅผ ์บ์ํ๊ณ ์ ์ธ๊ณ์์ ์ด์ฉํ ์ ์๋๋ก ํ์ฌ ํ์ด์ง ๋ก๋ ์๋๋ฅผ ํ์ธต ๋ ํฅ์์ํค๋ ๋ฌด๋ฃ ์๋น์ค์ธ Google AMP ์บ์๋ฅผ ํ์ฉํฉ๋๋ค.
AMP ์ ํจ์ฑ ๊ฒ์ฌ ์๋น์ค์์ ํ์ด์ง์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ ๊ฒฝ์ฐ ํ์ฌ ์น์ฌ์ดํธ์์ ๋ฐ๊ฒฌํ๊ณ ๋ฐฐํฌํ์ง ๋ชปํ๋ฉฐ Google AMP ์บ์์ ํ์๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์บ์์ ์๋์์ ์ฅ์ ์ ์๊ฒ ๋ ๋ฟ ์๋๋ผ ํ์ด์ง๊ฐ ์ฌ๋ฌ ์์น์์ ํ์๋์ง ์์ ์ ์์ต๋๋ค. ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
์ ํจ์ฑ ์ค๋ฅ๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์?
๋๋ถ๋ถ์ ์ ํจ์ฑ ์ค๋ฅ๋ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ค์ HTML ํ๊ทธ๋ฅผ ์ดํด๋ด ์๋ค.
<img src="cat.png">
์ด AMP ์ ํจ์ฑ ์ค๋ฅ์ ์์ธ์ ์๋์ ์ฌ๋ฌ ๋๊ตฌ์ ํ์๋ฉ๋๋ค.
-
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ์ฝ์ {amp-img0}{/amp-img0}
-
์น ์ธํฐํ์ด์ค
-
๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ
๊ฐ ๋๊ตฌ๋ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- HTML ๋ฌธ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์น(ํ๊ณผ ์ด): ์ผ๋ถ ์ธํฐํ์ด์ค์์๋ ์ด ์์น๋ฅผ ํด๋ฆญํ์ฌ ๊ฐ์กฐ ํ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฌธ์ ๋ ํ 11, ์ด 2์์ ๋ฐ์ํ์ต๋๋ค.
- ํด๋น ์ค๋ฅ๋ฅผ ์ค๋ช
ํ๋ ํ
์คํธ ํ: ์ด ๊ฒฝ์ฐ ํ
์คํธ๋
<amp-img>
ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ<img>
ํ๊ทธ๋ฅผ ์ฌ์ฉ ์ค์์ ๋ํ๋ ๋๋ค. - ์ค๋ฅ ๊ด๋ จ ๋ฌธ์์ ๋ํ ๋งํฌ: ์ด ๊ฒฝ์ฐ
<amp-img>
ํ๊ทธ์ ๋ํ ๋ฌธ์์ ๋๋ค. ์ผ๋ถ ์ค๋ฅ๋ ๋ฌธ์ ๋งํฌ๋ฅผ ์์ฑํ์ง ์์ต๋๋ค.
์ฌ์์ ์ฃผ์ ๊น๊ฒ ๋ค์ ์ฝ์ผ๋ฉด <amp-img>
ํ๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ <img>
ํ๊ทธ๋ฅผ ์ฌ์ฉ ์ค์์ ์ ์ ์์ต๋๋ค.
๋ฐ์ํ ์ ์๋ ์ค๋ฅ์ ์ ์ฒด ๋ชฉ๋ก์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด AMP ์ ํจ์ฑ ์ค๋ฅ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์. ์์ธํ ์ดํด๋ณด์ ํ์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋ ๊ฒฝ์ฐ ๋ฌธ์ํด ์ฃผ์๋ฉด ๋์์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.