개요
- Front-end 개발은 Web App 또는 Web Site의 UI/UX를 제작하고 관리하는 과정
- Front-end 프레임워크와 라이브러리를 사용하여 개발 효율성을 높이고, Web App의 복잡성을 관리
- Front-end 개발에 사용되는 주요 기술은 HTML, CSS, JavaScript
Web App이란?
- 웹 브라우저에서 실행되는 어플리케이션 소프트웨어
- Vibe 웹사이트로 이동
- 개발자 도구 > 디바이스 모드
- 웹 페이지가 그대로 보이는 것이 아닌 디바이스에 설치된 App처럼 보이는 것
- 웹 페이지가 디바이스에 맞는 적절한 UX/UI로 표현되는 형태
SPA (Single Page Application)
Web App과 함께 자주 등장할 용어 SPA
이전까지는 사용자의 요청에 대해 적절한 페이지 별 template을 반환
SPA는 서버에서 최초 1장의 HTML만 전달받아 모든 요청에 대응하는 방식
SPA 반대는 NPA
[참고] SSR(Server Side Rendering) 이란?
- 기존의 요청 처리 방식
- Server가 사용자의 요청에 적합한 HTML을 렌더링하여 제공하는 방식
- 전달 받은 새 문서를 보여주기 위해 브라우저느 새로고침을 진행
- 한상차림으로 나온다는 느낌
CSR (Client Side Rendering) 이란?
CSR 사용하는 이유
모든 HTML 페이지를 서버로부터 받아서 표시하지 않아도 됨
== 클라이언트 - 서버간 통신 즉, 트래픽 감소
== 트래픽이 감소한다 = 응답 속도가 빨라진다
매번 새 문서를 받아 새로고침하는 것이 아니라 필요한 부분만 고쳐 나가므로 각 요청이 끊김 없이 진행
BE와 FE의 작업 영역을 명확히 분리 할 수 있음
CSR은 만능인가
CSR vs SSR
Vue 기본구조
Vue없이 코드 작성하기
- 입력 받은 값을 name 뒤에 출력하기
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="app"> <p id="name">name : </p> <input id="inputName" type="text"> </div> <script> const name = document.querySelector('#name') const input = document.querySelector('#inputName') input.addEventListener('input', function (e) { name.innerText = name.innerText + e.target.value }) </script> </body> </html>
Vue CDN
Vue로 코드 작성하기
- 입력 받은 값을 name 뒤에 출력하기
- Vue CDN 가져오기
- Vue instance 생성
- Vue instance - 1개의 Object
- 미리 정해진 속성명을 가진 Object
el, data
설정
- data에 관리할 속성 정의
- 선언적 렌더링
{{}}
- Vue data를 화면에 렌더링
- input tag에
v-model
작성
- input에 값 입력 -> Vue data 반영
- Vue data -> DOM 반영
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="app"> <p id="name">name : {{ message }} </p> <input id="inputName" type="text" v-model="message"> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> // CODE HERE const app = new Vue({ el: '#app', data: { message:'', }, }) </script> </body> </html>
Facebook 예시
- 한명의 유저가 이름을 변경한다면
화면에서 조작해야할 영역이 매우 많음- Vue를 통해 데이터를 관리하면
-> 변경 사항 한 번에 반영 (하나의 데이터로 관리하기 때문)
MVVM Pattern
소프트웨어 아키텍처 패턴의 일종
마크업 언어로 구현하는 그래픽 사용자 인터페이스(view)의 개발을
백엔드(model)로부터 분리시켜
view가 어느 특정한 모델 플랫폼에 종속되지 않도록 함
view
: 눈에 보이는 부분 = DOM
Model
: 실제 데이터 = JSON
View Model
(Vue)
MVVM Pattern 정리
Vue instance
<!-- Vue CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const vm = new Vue()
console.log(vm)
</script>
el(element)
<!-- Vue CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '#app'
})
console.log(app)
</script>
<body>
<div id="app">
{{message}}
</div>
<div>
{{message}}
</div>
<!-- Vue CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app'
})
console.log(app)
</script>
</body>
data
<body>
<div id="app">
{{message}}
</div>
<div>
{{message}}
</div>
<!-- Vue CDN -->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: 'Hello, Vue!!!!!!!!'
},
})
</script>
</body>
methods
<script>
const app = new Vue({
el: '#app',
data: {
message: 'Hello, Vue!!!!!!!!'
},
methods: {
print:function () {
console.log(this.message)
},
}
})
</script>
<script>
const app = new Vue({
el: '#app',
data: {
message: 'Hello, Vue!!!!!!!!'
},
methods: {
print:function () {
console.log(this.message)
},
bye : function () {
this.message = 'Bye, Vue!!!!!'
},
}
})
</script>
[주의] methods with Arrow Function
- 메서드를 정의 할 때,
Arrow Function을 사용하면 안됨- Arrow Function의 this는 함수가 선언될 때
상위 스코프를 가리킴- 즉 this가 상위 객체 window를 가리킴
- 호출은 문제 없이 가능하나
this로 Vue의 data를 변경하지 못함<script> const app = new Vue({ el: '#app', data: { message: 'Hello, Vue!!!!!!!!' }, methods: { print:function () { console.log(this.message) }, bye : function () { this.message = 'Bye, Vue!!!!!' }, arrowBye: () => { this.message = 'Arrow?' console.log(this) } } }) </script>