본 포스트는 사내 발표 자료로 활용한 내용입니다.
최신 웹개발 트렌드
Keyword
- Progressive Web App
- More faster CMS( Google AMP )
- Static web sites
- Bot
- SPA
Progressive Web App
Mobile Web으로 App의 경험을
- 빌드 X, 배포 X, 설치 O, 오프라인 O, 푸시알림 O
- 모바일 최적화 성능 + Native 기능 결합
Why Progressive Web App?
- Mobile 사용자 증가
- 양분화된 어플리케이션 시장과 개발자의 고민 : Web, mobile, Hybrid
- Hybrid 앱의 단점 : 성능
- 번거로운 앱 개발 주기 : 앱 개발, 빌드, 배포, 검색, 다운, 설치, 확인
- Offline Web App 의 필요성
Technical Advantage
- Responseive : PC, Mobile, Tablet…
- Connectivity: 저속 네트워크, 오프라인에서도 가능
- App-like : Mobile App과 동일한 실행방식, 사용자 UX 제공
- Discoverable : URL로 사이트 접근 후 원클릭 설치
- Engageable : Push 알림으로 사용자 재방문 유도
- Safe : HTTPS 통신
Feature
-
Web App Manifest
- 홈 화면에 앱 Icon 추가
- 사이트 방문시 배너, Splash 화면
-
Service Worker
- 오프라인 서비스, 푸시알림
- 브라우저 백그라운드에서 돌아가는 스크립트, 브라우저 - 네트워크 미들웨어
- 웹 페이지에서 네트워크 요청시 요청을 가로챈다.
- 캐시가 있을 경우 즉시 로딩
- 캐시가 없으면 네트워크
PWA 마무리
- Service Worker 디버깅이 어려워요.
- 기존에 개발된 서비스에 적용하기 어려워요.
- HTTPS 보안
-
일부 모바일앱을 대체할 수 있는 사용자 경험
- 그렇지만 iPhone은 지원하지 않습니다.
Google AMP
유사 서비스
- Facebook Instance Articles
- Apple News
정치적인 얘기를 해볼까요?
- 페이스북이나 애플에 종속족인 서비스들
- 애플 / 페이스북은 자사 플랫폼을 통해서
-
그럼 구글은?
- 구글 검색 엔진으로!
AMP 란?
- 모바일 컨텐츠 최적화 표준
- 뉴스 / 블로그 등 정적인 컨텐츠에 적합
- 15~85% 성능 향상
- 성능향상을 위해 심한 제약을 걸었다!
- 속도 떨어뜨리는 기술은 쓰지마세요!
광고, JS, CSS
- 이런기능들은 어떻게 하죠?
- 그냥은 못씁니다…
- AMP에서 제공해주는 걸 써야해요
AMP 구성
-
AMP HTML
- 기존 HTML 문서에서 속도에 부담을 주는 요소를 배제
- 몇몇 확장 속성을 추가한 HTML 확장
-
AMP JS
- AMP HTML을 읽고 렌더링 하는 런타임
-
Google AMP Cache
- 구글이 제공하는 AMP HTML 문서 캐싱 서비스
- AMP 문서를 만들어 올리면 구글이 자체 CDN을 통해 더 빠른 엑세스를 제공하게 해준다.
- 이렇게 작성된 AMP 페이지는 모바일 디바이스 환경에서 구글 검색을 수행할 경우 기존의 웹 페이지를 대체하여 보여지게된다.
- 따라서 사용자는 빠른 모바일 사용자 경험을 얻게 된다.
너무 좋기만 한거 아니에요?
그렇습니다. 단점을 시작해볼까요?
- 외부 자바스크립트 사용 불가
- CSS도 하나만 링크 걸 수 있음.
- 이미지 / 파일의 경우 AMP 표준에서 제시하는 별도의 커스텀 요소를 써야한다.
- AMP성능향상방식
문서 간 연결
<!-- AMP에서 원본 연결 -->
<link rel="canonical" href="https://www.example.com/url/to/full/document.html">
<!-- 원본에서 AMP 연결 -->
<link rel="amphtml" href="https://www.example.com/url/to/amp/document.html">
그럼 기존 CMS에서는요?
-
wordpress는 플러그인을 제공합니다. 플러그인이 AMP 문서를 대신 만들어줘요.
- PageFrog라는 플러그인은 AMP / Instant Articles / Apple News까지 만들어줍니다.
- jekyll은 플러그인으로 사이트 빌드할 때 AMP를 적용할 수 있습니다.
AMP 마무리
- 아무래도 정적인 컨텐츠에 맞춰져 있다 보니 SPA등에 적용하기는 힘들어 보입니다.
- 좋은 방향을 제시해 준 것 같습니다.
- 저런 제약사항에 맞춰 개발을 한다면 AMP를 쓰지 않더라도 많은 성능 향상이 있으리라 생각됩니다.
- 결론 : AMP 제약사항 정도면 AMP 안써도 빨라질 것 같다.
Google AMP, PWA 정리
- 프로젝트에 당장 적용하기는 힘들어 보인다.
- 모바일 웹 개발시 방향을 가이드 해주는 느낌이다.
- PWA 서비스 워커의 경우 디버깅이 힘들지만, 고려해볼만 하다.
- AMP 역시 적용은 못하더라도 극단적인 제약사항을 들여다보면, 어떤 기능이 웹 성능을 하락 시키는지 확인해볼 수 있다.
- 한마디로 : 적용은 힘들겠지만, 연구해볼만한 가치가 있는 프로젝트.
Static websites
- Hexo
- GitBook
- Gatsby
- Jekyll
- see StaticGen
Why static page?
- 빠르다.
- 안전하다.
- 저렴하다.
Bot
- Facebook Messenger bot
- Slack bot
- Telegram bot
- twitch bot
- Kakaotalk bot
어떻게 활용할까요?
- 문의 및 답변
- 제품 추천
- 확인 절차 축소
- 방송 플랫폼에서는 음란 / 비속어 / 도배 / 광고 등을 필터링 하는데도 사용됩니다.
- 메시지 플랫폼에서는 도착 예정시간, 상품의 배송과정 등을 공유하는데 사용됩니다.
현재 프론트엔드개발자가 갖추어야 할 기본소양
Web Developer roadmap in 2018
Beginner
- git
- ssh
- http / https
- terminal : bash / cmd( window ) basic
- 데이터구조 / 알고리즘
- 캐릭터 인코딩의 이해
- Github : 프로젝트에 기여하는 방법과 절차에 대한 이해
Basic study
- HTML
- CSS
- Javascript
조금 더 들어가볼까요?
Javascript
- Task Runner ( npm script / gulp / grunt )
- Package Manager( npm, yarn )
- TypeScript, ES6
- Testing( jest, mocha, jasmin, enzyme )
-
Framework( Angular, Reactjs, Vuejs )
- Flux, Redux, Mobx, RxJS, TypeScript
- Module Loader / Bundler ( Webpack )
CSS
- Responsive Web
- Framework( Bootstrap, Semantic, Materialize )
- Preprocessor( Sass, Less )
이제 어느정도 갖추었습니다. 더 업그레이드 해볼까요?
- CSS -> Flexbox, transform, transition…
- JS -> Design Pattern, Regex, testing…
- SVG -> d3
이정도 하시는 분이면 Expert!
- 이제부터는 Trend에 따라 취향에 따라 Study 하시면 됩니다.
- 아니시라면 각 선택지에서 하나씩 학습 하시길 추천합니다.
웹 개발은 쉽다고 들었는데, 왜 이렇게 복잡한거죠?
JavaScript
- 1995년 시작
- prototype 기반 언어
- functional language
- IE에서 독자적으로 표준 무시하고 개발 -> 파편화
JavaScript 어때요?
- 알면 좋고, 몰라도 지장 없어요
- 구현이 어려워요.
- 언어도 모호해요. 동작원리를 잘 모르겠어요.
- 브라우저 파편화도 심하구요.
어떻게 좀 극복해볼 수 없을까?
- jQuery
- AJAX
HTML5
-
1999 W3C :: XHTML 발표 + HTML 버전업 하지않음.
- W3C의 방향이 맘에 들지 않습니다.
- WHATWG 워킹 그룹에서 연구 시작
- HTML API로 앱을 만들자
- Client Web Application API 제공
- 2008 논의 시작 - 2014 표준화
NodeJS
- 브라우저에서나 쓰던 JS가 브라우저 밖으로!
- 크롬에 들어가 있던 v8엔진 -> 오픈소스 -> NodeJS 탄생
- JS로 OS위에서 동작하는 어플리케이션 작성할 수 있음.
- 이로 인해 신분상승.
- MEAN stack에 대해 알고계세요?( MongoDB + Express + Angular + NodeJS )
- 이와 더불어 ES도 진화함.
변화 속도, 도구는 어떤걸로? 너무 빨라요
- Backend에서 사용하던 프로그래밍 기술, 개발 툴등이 Frontend로 넘어옴 -> 자동화
- 적절한 리서치(스타, issue closing, 커뮤니티 규모)를 통해 도구를 선택하세요.
- 더 좋은 도구가 있다면, 항상 환승할 준비를 하세요.
- 각 주요 파트마다 최소 하나씩은 스터디 한다는 마음의 준비를 하세요.
TypeScript?
- MS에서 2012년에 발표한 오픈 소스 프로그래밍 언어
- 대규모 어플리케이션 개발을 위해 만들어짐
- 컴파일 과정을 가치면 JavaScript가 된다.
- 이런 프로그래밍을 메타프로그래밍이라고 한다.
- JavaScript의 superset
- Google의 공식언어로 채택됨
왜 컴파일 해가면서까지 이걸 써야되요?
- 기능을 추가할 수 있어요.
- 현재 JS의 단점들을 보완할 수 있는 기능들을요.
- Abstract Class, Interface, TypeCheck, Asyc Await
- OOP 방식으로 JS 개발을 할 수 있어요.
NPM부터 Webpack까지
구식 으로 개발해보기
- 패키지 매니저 없이 파일을 다운로드 받아 js/libs 폴더 같은 곳에 저장한다.
- 특정 패키지가 업데이트 된다.
- 다시 내려받는다.
- 반복
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript Example</title>
<script src="js/app/index.js"></script>
<script src="js/lib/moment.min.js"></script>
</head>
<body>
<h1>Hello from HTML!</h1>
</body>
</html>
NPM 사용해보기
- 터미널에서 커맨드를 입력하라구요?
- 아니 여보세요. NPM은 Nodejs 패키지 관리자 아니에요?
- 프론트엔드에서 백엔드 패키지 관리자를 어떻게 쓰는데요?
$ npm init
# package.json이 생성 될 거에요
{
"name": "your-project-name",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
$ npm install moment --save
# package.json에 moment 의존성이 추가될 거에요
```json
{
"name": "modern-javascript-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"moment": "^2.19.1"
}
}
<!-- 인덱스 파일을 수정해볼까요? -->
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript Example</title>
<script src="node_modules/moment/min/moment.min.js"></script>
<script src="app/index.js"></script>
</head>
<body>
<h1>Hello from HTML!</h1>
</body>
</html>
이제부터 다른 사용자와 코드를 공유할 때 package.json 파일과 소스파일만 주시면됩니다. moment.js의 존재는 잠시 잊으셔도 좋습니다.
import 할 때 path가 너무 길어요…
- 맞습니다.
node_modules
아래 깊은 곳 까지 파고들어야 HTML에서 불러올 수 있습니다. - nodejs처럼 쉽게 import 하고 싶어요
JS module bundler : Webpack
JS에는 Import 기능이 없습니다.
- 오직 Browser 환경에서 구동되도록 만들어졌습니다.
- 보안상의 이유로 computer 파일시스템에 접근할 수 없기 때문입니다.
CommonJS
- 이제 JS도 Import를 해보자!
- module Import, Export에 대한 명세.
- 더이상 전역변수에 할당하지 않아도 됩니다!
- 누가 이걸 쓰는데요? NodeJS요!
// index.js
var moment = require('moment');
console.log("Hello from JavaScript!");
console.log(moment().startOf('day').fromNow());
달달하쥬?
잠깐..
이거 브라우저 코드 아니잖아요 NodeJS코드 잖아요
Webpack!
$ npm install webpack --save-dev # --save-dev : 개발 의존성 추가
{
"name": "modern-javascript-example",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"moment": "^2.19.1"
},
"devDependencies": {
"webpack": "^3.7.1"
}
}
$ ./node_modules/.bin/webpack index.js bundle.js
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JavaScript Example</title>
<script src="bundle.js"></script>
</head>
<body>
<h1>Hello from HTML!</h1>
</body>
</html>
명령어가 길어요
// webpack.config.js
module.exports = {
entry: './index.js',
output: {
filename: 'bundle.js'
}
};
설정파일을 추가하고 아래와 같이 실행하면 됩니다.
$ ./node_modules/.bin/webpack # 이렇게 하면 자동으로 설정파일을 읽고 webpack을 실행합니다.
ES6등 부가기능은 어떻게 사용하나요?
babel, webpack dependency를 추가하고,
{
"devDependencies": {
"babel-loader": "^6.1.0",
"babel-preset-es2015": "^6.1.18",
"babel-polyfill": "^6.3.14",
"webpack": "^1.12.6",
"webpack-dev-server": "^1.12.1",
"copy-webpack-plugin": "^0.2.0"
},
"scripts": {
"build": "webpack",
"watch": "webpack --watch",
"start": "webpack-dev-server --hot --inline"
},
"babel": {
"presets": ["es2015"]
}
}
webpack.config 파일을 수정 해서 사용합니다.
var dir_js = path.resolve(__dirname, 'js');
var dir_html = path.resolve(__dirname, 'html');
var dir_build = path.resolve(__dirname, 'build');
module.exports = {
entry: path.resolve(dir_js, 'main.js'),
output: {
path: dir_build,
filename: 'bundle.js'
},
module: {
loaders: [
{
loader: 'babel-loader',
test: dir_js,
}
]
},
plugins: [
// Simply copies the files over
new CopyWebpackPlugin([
{ from: dir_html } // to: output.path
]),
],
// Create Sourcemaps for the bundle
devtool: 'source-map',
devServer: {
contentBase: dir_build,
},
};
복잡한 frontend 설정 : create-react-app
- ReactJS의 create-react-app
- 이런 bundling, transpiling 등의 작업을 간략화 시켜줍니다.
- 내부적으로 설정 파일을 만들고, 설정파일을 안으로 숨겨 디렉도리 구조를 간략화 시켜줍니다.
- 앱 생성 후에
npm run reject
하시면 이런 설정들이 밖으로 튀어 나옵니다.
References
- https://clockwise.software/blog/web-development-trends-in-2018/
- https://medium.freecodecamp.org/a-roadmap-to-becoming-a-web-developer-in-2017-b6ac3dddd0cf
- http://www.usefulparadigm.com/2016/02/24/adding-the-google-amp-to-mobile-website/
- https://moon9342.github.io/front-end-ecosystem
- https://rhostem.github.io/posts/2018-01-25-top-java-script-libraries-tech-to-learn-in-2018/
- https://spoqa.github.io/2018/01/23/follow-the-changing-web-platform.html
- https://march23hare.github.io/2017/11/30/tr-modern-javascript-explained-for-dinosaurs/
- https://cheese10yun.github.io/kakao-bot-node/