지난 편에 이어서 자세한 이야기를 하기 위해 2편으로 돌아왔습니다!!
2편은 웹을 어떻게 만들었는지 설명해보려고 해요.
최대한 간단히 설명해보고 넘어가보겠습니다.
간단히 설명하고 넘어가려 했는데, 생각보다 길어져서, 서버는 3편에 소개드리려고 해요. 우선 웹부터 보시죠!
Web Site 개발
웹 사이트 코드 에 보면 사이트의 전부를 볼 수 있는데요, 정말 간단한 100줄 정도 되는 코드입니다!
그만큼, 들어간 내용이 없고 오로지 필요한 정보만 보여지게끔 만들어 놓았어요.
그리고 처음엔 검색기능이 없었는데, 나중에 추가해서 만들었습니다!
자세히 코드를 들여다 봅시다!
let list = new Vue({
el : '#app',
data : {
search: '',
searchedData: [],
header: ["번호", "영업점 정보", "설문조사 현황"],
original: [],
ranking: [],
names: []
}})
먼저 사이트를 이루는 데이터(변수)는 간단히 설정해두었고, Vue라는 것을 이용했습니다!
search와 searchedData는 검색 기능을 위한 변수인데, search라는 키워드에 값이 입력되면
searchData에 검색된 데이터들을 가지는 변수로 만들었어요.
header는 단순히 테이블의 열 이름들이고,
original은 제가 받아온 설문조사 현황들에 대한 모든 정보를 가지고 있는 리스트,
ranking은 테이블을 나타낼 수 있는 리스트,
names는 검색의 자동완성 기능을 위한 영업점 이름 정보들을 담고 있는 리스트에요.
이제 이 변수들로 데이터를 보여줄 거에요.
<div class="md-layout md-alignment-center-center">
<table>
<thead>
<th v-for = "item in header" style="background-color: white">{{item}}</th>
</thead>
<tbody>
<tr v-for="line in ranking">
<td v-for="item in line">{{ item }}</td>
</tr>
</tbody>
</table>
</div>
위 코드는 제일 핵심인 table을 보여주는 코드에요. 생각보다 매우 간단하죠?
v-for이 Vue 안에 있는 리스트 안에 있는 데이터를 보여줄 수 있는 것이라 생각하면 편한데요,
thead 에서는 table head 정보를, tbody에선 ranking 정보를 보여줬어요.
이렇게 만들면 다음과 같은 테이블이 만들어집니다!
물론 ranking이라는 테이블에 데이터가 있어야 가능하긴 해요.
이젠 ranking에 어떻게 데이터를 가져올 수 있는지 코드로 보여드릴게요.
let list = new Vue({
created(){
axios.get('http://survey2022.kro.kr:5000/api/data')
.then((res) => {
list.ranking = res.data;
list.original = res.data;
for(let i=0; i<res.data.length;i++){
list.names.push(res.data[i].name);
}
console.log()
})
.catch((err)=>{
console.log(err);
})
.finally(()=>{
console.log("Finish call data");
})
}
}
created 함수는 Vue라는 컴포넌트를 만들면서 실행되는 함수라 이해하시면 되고,
저는 사이트가 열릴 때 랭킹을 보여줘야 하기 때문에 created 함수에서 데이터를 가져올 수 있도록 했어요.
그래서 http://survey2022.kro.kr:5000/api/data 라는 제가 만든 서버의 api를 활용해서
설문조사 데이터를 가져오도록 했습니다!
가져오고 나서는 단순하게 ranking, original, names 리스트에 필요한 데이터만 넣었어요.
ranking과 original을 만든 이유는 검색을 하고 나서 다시 원래의 데이터를 보고 싶을 때
original을 사용할 수 있게끔 만들기 위해서였습니다!
searchMethod(){
if(this.search){
this.searchData = this.original.filter(
(data) => {
return data.name.includes(this.search);
}
);
this.ranking = this.searchData;
}else{
this.ranking = this.original;
}
}
그래서 위와 같은 searchMethod()라는 function을 만들었고, 검색을 하는 경우에만
ranking 리스트에 searchData를, 검색 키워드가 없는 경우엔 original 리스트를 가질 수 있게 해두었어요.
이게 front 웹 사이트의 코드 끝입니다! 다른 건 HTML의 기본 구조와
Vue 를 사용하기 위한 헤더? 정도입니다:) 핵심 코드는 다 다뤘어요.
하지만 여기서 끝을 내면, 사실 웹 사이트를 볼 수 없는데요, 컴퓨터 안에 있는 파일을
다른 사용자들이 들어올 수 있도록 하려면 웹 서버 라는 게 필요해요.
1편에서 소개 드렸던 것 중에 Nginx라는 친구가 웹 서버이고 컴퓨터 안에 있는 웹 사이트 파일을 볼 수 있게 해주었습니다!
server {
listen 80 default_server;
listen [::]:80 default_server;
root /home/ubuntu/QuestionCheckSystem;
index QCS_2.html;
}
이 설정은 Nginx.conf 의 설정이고, 간단한 의미로는 root인 저 폴더에서 QCS_2.html이라는 파일을 80번 포트로
보여주겠다라는 의미에요. 그리고 기본적인 http:// 로 시작하는 url들을 80번 포트를 쓰기 때문에
제 QCS_2.html이라는 프론트엔드 파일을 볼 수 있게 되는 거에요.
Nginx는 생각보다 다루기 어려운데, 구글에 많이 나와 있으니 찾아보면서 공부하시는 것도 좋을 것 같아요!
설정도 정말 많은 것들이 있어서 다양한 기능들을 설정할 수도 있습니다.
그리고 저는 AWS의 EC2를 사용했습니다
아무래도, 제 컴퓨터에 직접 포트를 열어서 데이터를 보여주기에는 보안의 위험이나 컴퓨터를 계속 켜두어야 하는 등의
문제가 있을 것이라 예상해서 가상 머신을 사용하기로 했어요.
그리고 이메일만 있으면 12개월 동안 무료로 정말 낮은 성능의 컴퓨터를 제공해주는 AWS가 있기에
AWS의 EC2로 컴퓨터를 사용했습니다.
Vue.js를 사용한 이유
Vue.js를 사용한 이유는 동적으로 데이터를 처리하는 걸 편하게 하고 싶었기 때문이에요.
프론트를 잘 모르지만, Vue를 가지고 data 처리를 하면 쉽게 데이터를 바꾸는 것을 할 수 있다는 것을 알았고,
정말 단순한 형태로만 사이트를 만들고 싶었어요. 그래서 script 태그 안에 Vue라는 객체를 만들어서
사용했습니다.
물론, Vue가 제일 좋은 도구라고 말할 순 없는데요, react나 일반적인 javascript + html도 충분히 만들 수 있어요.
하지만, 제일 가볍게(덜 건드리고) 만들 수 있는 형태가 Vue라고 생각했었을 뿐입니다!
프론트를 잘 모르니 가장 쉬운 걸 선택했다고 말씀드릴 수도 있어요.
AWS의 EC2(컴퓨터)를 다른 사람들에게 보여줄 수 있는 이유
AWS에는 탄력적 IP 라는 고정 IP를 받을 수 있는 기능이 있습니다! 그래서 제 EC2(작은 컴퓨터)에
고정 IP를 할당받을 수 있어요. 할당을 받고 나면, http://129.283.29.59/ 와 같은 형태로 EC2에
접근을 할 수 있죠.
물론 제 웹 페이지를 저렇게 IP 주소로 내보낼 수도 있는데, 좀 더 멋있게 내보내기 위해
DNS 서비스들을 찾아봤어요. 간단한 사이트기 때문에 돈을 내고 싶진 않아서
무료 도메인을 찾아봤고, kro.kr 로 끝나는 도메인을 얻고 연결할 수 있었습니다.
그렇게 제 사이트는 결국 http://survey2022.kro.kr/ 와 같은 형태를 띄게 되었어요.
이제 다른 사람들은 위 링크로만 들어오면 제 웹 사이트들을 볼 수 있게 됩니다:)
회고
프론트 웹 사이트를 만들어 본 적이 많지 않으니 정말 필요한 것만 찾아서 만들었어요.
이게 완성도나 깊이가 있진 않지만, 개발 시간을 많이 줄여주는 방향인 것 같아요.
물론 현업에서는 훨씬 더 정교하고, 깊이 있게 설계되어 개발이 되지만, 간단한 사이트 만들 때는
이런 방법을 사용하는 게 좋다고 느끼게 되었습니다.
앞으로 가끔 재밌는 것들을 만들어 볼까 해요. 회사에서도 다른 분들에게 도움이 되는
서비스와 자동화가 이루어진 서비스를 만들면 재밌을 것 같다는 생각도 했습니다!
그럼 3편에서 봐요~!