Express를 이용하여 간단한 서버 프로그램을 만들어보자.
// --------------- Express를 이용해서 간단한 서버 프로그램 만들기 ---------------- //
///// 1. 현재 디렉토리(cowork)를 하나의 패키지로 만들기
// - npm init
// - name만 "cowork-api-server"로 지정하고, 다른 것은 기본값으로 지정
// - 완료되면 package.json 파일이 생성됨
///// 2. Express 패키지 설치
// - npm install Express
///// 3. 코드작성
// 1) Express 패키지에서 공개하는 것을 가져온다.
const express = require('express');
// 2) Express 패키지는하나의 함수를 외부로 공개하는데 그 함수를 실행해준다.
// - 실행된 함수는 하나의 객체를 리턴한다.
// - 이 객체는 관습적으로 app이라는 이름을 붙여 사용한다. --> app 객체
const app = express();
// 3) Example [Node.js 기본기 토픽 참고]
// - 외부의 클라이언트가 보낸 리퀘스트의 URL Path 부분이 '/hello'이면, 콜백함수 실행
// - 특정 Path에 대응하는 콜백을 "route handler"이라고 부름
// --> route : 서버가 간? request의 Path부분을 보고 알맞은 작업 수행
// --> handler : 그 작업을 담당하는 존재를 의미
// route handler
// - req (request 객체) : 이 객체를 통해 클라이언트가 보낸 request를 다룰 수 있음
// - res (response 객체) : 이 객체를 통해서 적절한 response를 보낼 수 있음
app.get('/hello', (req, res) => {
res.send('<h1>Hello Express!</h1>');
})
// listen 메소드 : 외부에서 request가 오는 것을 기다리도록 함 ---> 이것을 작성해야 외부에서 request를 받을 수 있음!
// 포트 번호 (Port Number) : 서버 안에서 실행되는 여러 프로그램들 중 특정 프로그램을 식별할 수 있게 해주는 번호
// app.listen(3000);
// [8번] 여기서 추가해준 콜백 ---> 이 콜백함수는 서버가 외부의 request를 들을 준비를 마치고 나면 자동으로 실행된다.
app.listen(3000, () => {
console.log('Server is listening...');
});
///// 4. 터미널에 node app.js로 서버 실행
///// 5. 브라우저에서 localhost:3000/hello 접속
// 'localhost'는 내 컴퓨터를 의미하는 127.0.0.1과 같은 의미, 일종의 닉네임처럼 사용 가능
// '3000'은 Port 번호
// '/hello'는 Path 부분
///// 6."Hello Express!" 메시지를 볼 수 있다.
///// 7. 잠시 서버 종료
// 터미널에 Ctrl + C
///// 8. app.listen 메소드 부분에 콜백함수 추가
// 추가한 콜백함수는 서버가 외부의 request를 들을 준비를 마치고 나면 자동으로 실행된다.
///// 9. 터미널에 node app.js로 서버 재실행 & 브라우저에서 localhost:3000/hello 접속
// 결과 :
// - 터미널에서는 "Server is listening..."" 메시지를,
// (** 서버가 정상적으로 실행되었는지 확인하기 위해 이런 방식을 사용하기도 한다! **)
// - 브라우저에서는 "Hello Express!" 메시지를 확인할 수 있다.
이번에는 API 서버를 만들어보자.
// ------------------------- API 서버 만들기 ----------------------------- //
// cowork에 직원 정보 관리 웹서비스에서 사용할 API 서버를 만들 것이다.
// Q. 직원 정보는 어디에 저장 ? --> 데이터베이스 (Database)
///// 1. 코드 수정
const express = require('express');
const app = express();
const members = require('./members.js');
// 보통 api 서버에 관한 URL은 Path부분에 api라는 단어를 포함시키는 경우가 많다.
// 또는 도메인 자체에 api 단어를 포함시키기도 한다. [] ex. http://api.cowork.com/~ ]
app.get('/api/members', (req, res) => {
res.send(members);
})
// [3번] Route Parameter 설정 & 값 가져오기
// Path 부분 뒤에 새로 추가한 ":id" 의미
// - 문자열 아님!
// - 이 위치에 오는 값(members/ 뒤에 오는 값)을 id 변수에 대입하라는 뜻! ---> 이렇게 가변적인 값을 담는 부분을 Express에서는 Route Parameter 라고 부른다.
app.get('/api/members/:id', (req, res) => {
//// (1) 값 가져오기
// Route Parameter의 값은 req 객체의 params라는 객체의 property로 설정되어 있다.
// const id = req.params.id;
const { id } = req.params; // 비구조할당
//// (2) id에 해당하는 직원 찾기
// find 메소드는 값이 없으면 undefined를 리턴 ---> false 의미
const member = members.find( (m) => m.id === Number(id));
//// (3)
// - 직원정보가 있으면 response의 body에 담아서 보내고
// - 없으면(find 메소드의 리턴값이 false이면)
if (member) {
res.send(member);
} else {
// - 상태코드 ---> status 메소드
// 참고 : https://www.codeit.kr/learn/courses/nodejs-backend-development/'https://www.codeit.kr/learn/courses/javascript-intermediate/4357'
// 요청한 정보가 없다는 의미의 404
// - response의 body에 "There is no such member" 메시지 담기 ---> send 메소드
// API 서버에서는 문자열 자체를 주는 것보다 JSON 객체 안에 넣어서 주는 것이 더 좋음
// ( WHY? 나중에 response에 추가적인 정보를 더 넣어줄 때 확장하기 쉬움)
// res.status(404).send('There is no such member'); // 비추ㅠ
res.status(404).send({ message : 'There is no such member' }); // 추천!!
}
})
app.listen(3000, () => {
console.log('Server is listening...');
});
///// 2. 터미널에 node app.js로 서버 재실행 & 브라우저에서 localhost:3000/api/mambers 접속
// 결과 : 직원 정보가 담긴 배열 확인 가능
///// 3. Route Parameter 설정 & 값 가져오기
// Path부분에서 "/api/members/id값" 이렇게 members 뒤에 해당 직원의 id값을 넣고 request를 보내면 id에 해당하는 직원정보를 돌려주도록 코드 수정
📌 쿼리(Query)
- 서버에 있는 데이터를 조회할 때 기준을 정하기 위해 사용한다.
- 하나의 쿼리에는 여러 개의 Parameter가 들어갈 수 있다.
예를 들면, "http://localhost:3000/api/members?team=_____&orderby=_____&..."
특정 팀에 속한 직원의 정보를 조회해보자.
// ------------------ 특정 팀에 속한 직원 정보 조회하기 -------------------//
// URL은 어떤 방식으로?
// http://localhost:3000/api/members?team=팀명
// --> 여기서 "?" 이후의 부분을 "쿼리(Query)"라고 한다.
const express = require('express');
const app = express();
const members = require('./members.js');
app.get('/api/members', (req, res) => {
// URL의 Query에서 team이라는 parameter 값 가져오기
const team = req.query.team;
// URL에 team이라는 parameter가 존재할 경우 : 팀에 해당하는 직원 정보만
// " 존재하지 않을 경우 : 전체 직원정보
if(team) {
const teamMembers = members.filter((m) => m.team === team);
res.send(teamMembers);
} else {
res.send(members);
}
});
app.get('/api/members/:id', (req, res) => {
const { id } = req.params;
const member = members.find( (m) => m.id === Number(id));
if (member) {
res.send(member);
} else {
res.status(404).send({ message : 'There is no such member' });
}
})
app.listen(3000, () => {
console.log('Server is listening...');
});