Express란?

Node.js 환경의 서버 프로그램을 만들 때 사용하는 프레임워크

특징:

1. 속도가 빠름

2. 서버 프로그램에 필요한 최소한의 기능만 제공(고집이 세지 않은 프레임워크=자유도가 높은!)

     => 자유도가 높으면 처음 배울 때 접근하기 쉬움

따라서 빠르고 쉽게 서버 프로그램을 만들려고 할 때 적합하다! 

 

사실 서버 프로그램을 만들 때 쓸 수 있는 프레임워크에는 node.js말고도 다양한 프로그램이 있는데요!

예를 들어 Python에는 Django, Java에는 Spring이라고 하는 대표 프레임워크들이 있어요.

 

Express를 가지고 API Server를 만들 수 있는데요, API Server는 무엇인지 알아봐요!

API Server란?

Server의 종류

  • 웹 페이지를 Response의 Body에 담아서 보내주는 서버(Web Server)
  • 요청을 처리하고 처리한 결과를 Response의 Body에 담아서 보내주는 서버(API Server)

무슨 소리인지 모르겠죠...?ㅜㅜ 한 번 자세히 알아봐요!

Web Server는 화면을 그리는 데 필요한 재료를 Response의 Body에 담아줘요.

API Server는 요청한 작업을 처리하고 처리한 결과를 Response의 Body에 JSON등의 형식으로 담아줘요.

Visual Studio code로 Express 사용해보기

1. cowork directory를 생성하고 visual studio code로 연다.

2. app.js 파일을 생성한다.

3. cowork directory를 하나의 패키지로 만들기 위해 npm init 실행

4. name만 설정해주고 나머지는 기본값으로 설정

5. npm install express

6. app.js에 코드 입력

const express = require('express');

const app = express(); //app 객체

app.get('/hello', (req, res) => {
    res.send('<h1>Hello Express</h1>');
});  //route handler

app.listen(3000);

7. terminal에 node app.js 명령어 입력

*node [실행할 파일 이름]

8. 해당 사이트 주소로 접속하면 잘 실행됨을 확인할 수 있다.

9. server가 잘 실행되는지 확인하기 위해 listen method의 콜백 추가

const express = require('express');

const app = express();

app.get('/hello', (req, res) => {
    res.send('<h1>Hello Express</h1>');
});

app.listen(3000, () => {
    console.log('Server is listening...');
});  //listen method에 콜백 적어주기

 

직원 정보 조회하기

1. mebers.js 파일을 생성하고 다음의 직원 정보를 넣어주세요!

module.exports = [
  {
    id: 1,
    name: 'Alex',
    team: 'engineering',
    position: 'Server Developer',
    emailAddress: 'alex@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2018/12/10',
    birthday: '1994/11/08',
    profileImage: 'profile1.png',
  },
  {
    id: 2,
    name: 'Benjamin',
    team: 'engineering',
    position: 'Server Developer',
    emailAddress: 'benjamin@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2021/01/20',
    birthday: '1992/03/26',
    profileImage: 'profile2.png',
  },
  {
    id: 3,
    name: 'Charles',
    team: 'engineering',
    position: 'Android Developer',
    emailAddress: 'charles@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2018/10/09',
    birthday: '1994/09/08',
    profileImage: 'profile3.png',
  },
  {
    id: 4,
    name: 'Eric',
    team: 'engineering',
    position: 'Web Frontend Developer',
    emailAddress: 'eric@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2020/04/07',
    birthday: '1995/04/10',
    profileImage: 'profile4.png',
  },
  {
    id: 5,
    name: 'Danial',
    team: 'marketing',
    position: 'Marketing Manager',
    emailAddress: 'danial@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2021/04/21',
    birthday: '1991/07/12',
    profileImage: 'profile5.png',
  },
  {
    id: 6,
    name: 'George',
    team: 'marketing',
    position: 'Marketing Staff',
    emailAddress: 'george@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2020/01/06',
    birthday: '1997/02/09',
    profileImage: 'profile6.png',
  },
  {
    id: 7,
    name: 'Henry',
    team: 'marketing',
    position: 'Marketing Staff',
    emailAddress: 'henry@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2020/04/03',
    birthday: '1997/08/18',
    profileImage: 'profile7.png',
  },
  {
    id: 8,
    name: 'James',
    team: 'sales',
    position: 'Sales Manager',
    emailAddress: 'james@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2020/11/26',
    birthday: '1993/05/22',
    profileImage: 'profile8.png',
  },
  {
    id: 9,
    name: 'Kevin',
    team: 'sales',
    position: 'Sales Staff',
    emailAddress: 'kevin@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2020/06/19',
    birthday: '1989/06/10',
    profileImage: 'profile9.png',
  },
  {
    id: 10,
    name: 'Michael',
    team: 'sales',
    position: 'Sales Staff',
    emailAddress: 'michael@google.com',
    phoneNumber: '010-xxxx-xxxx',
    admissionDate: '2019/11/12',
    birthday: '1992/09/17',
    profileImage: 'profile10.png',
  },
];

2. app.js의 코드를 다음과 같이 수정해주세요!

const express = require('express');

const app = express();

const members = require('./members');

app.get('/hello', (req, res) => {
    res.send('<h1>Hello Express</h1>');
});

app.get('/api/members', (req, res) => {
    res.send(members);
});

app.listen(3000, () => {
    console.log('Server is listening...');
});

사이트의 주소로 접속해보면 모든 멤버의 정보를 조회할 수 있어요.

3. 특정 직원의 정보 조회하기

app.get('/api/members/:id', (req, res) => { //:id는 해당 자리에 오는 값을 id에 담으라는 뜻!(Route Parameter)
    const { id } = req.params; //const id = req.params.id와 동일한 의미인데 Object Destructing 방식으로 바꾼 것
    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' });
    }
});

4. 특정 팀만 조회하기(URL에서 쿼리 부분 가져오기)

app.get('/api/members', (req, res) => {
    const { team } = req.query;
    if (team) {
        const teamMembers = members.filter((m) => m.team === team);
        res.send(teamMembers);
    } else {
        res.send(members);
    }
});

localhost:3000/api/members?team=engineering

POST 리퀘스트를 보내는 방법

지금까지는 서버의 리소스를 조회하는 GET 리퀘스트를 사용했는데요!

이번엔 리소스를 새롭게 추가하는 POST 리퀘스트를 처리하는 코드를 작성해볼게용.

 

post request에서는 데이터가 들어있는 바디가 필요해요. 

그래서 우리가 사용하는 일반 브라우저에서는 post request를 보낼 수가 없어요.ㅜㅜ

VS Code에서 바로 POST 리퀘스트를 보내기 위해 플러그인 하나를 설치해볼게요!

1. test.http파일을 생성하고 다음 코드를 작성해주세요!

GET http://localhost:3000/api/members

###
POST http://localhost:3000/api/members
Content-Type: application/json

{
    "id": 11,
    "name": "Zake",
    "team": "Engineering",
    "position": "Android Developer",
    "emailAddress": "zake@google.com",
    "phoneNumber": "010-xxxx-xxxx",
    "admissionDate": "2021/06/12",
    "birthday": "1995/09/27",
    "profileImage": "profile11.png"
}

#3개는 각각의 리퀘스트를 구분하기 위해 쓰는 표시에요.

POST 리퀘스트는 GET 리퀘스트와 달리 헤드뿐만 아니라 바디도 있습니다. 

헤드: POST 메소드, 리퀘스트를 보낼 URL, 바디에 있는 데이터의 타입을 나타내는 Content-Type

application/json이라는 값은 바디에 있는 데이터의 타입이 JSON이라는 뜻이에요.

바디: 새롭게 추가할 직원 정보를 JSON 형식으로 작성

 

2. app.js에 특정 코드 추가

const express = require('express');

const app = express();

const members = require('./members');
//추가한 코드
app.use(express.json()); //middleware 
.
. //생략
.
//추가한 코드
app.post('/api/members', (req, res) => {
    const newMember = req.body;
    members.push(newMember);
    res.send(newMember);
});

app.listen(3000, () => {
    console.log('Server is listening...');
});

코드를 저장하고 서버를 다시 실행한 후, POST 리퀘스트를 보내면 새로운 멤버 Jake가 잘 추가됩니다.

 

nodemon과 npm start

1. terminal에서 다음 명령어 실행

npm install nodemon --save-dev

2. package.json의 scripts부분을 다음과 같이 바꿔주세요!

  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },

이렇게 하면 코드를 수정할 때마다 서버를 종료시키고 다시 실행할 필요 없이,

npm start 또는 npm run dev를 이용하여 편하게 사용할 수 있어요!

 

기존 직원 정보 수정하기

1. app.js에 다음 코드를 추가해주세요!

app.put('/api/members/:id', (req, res) => {
    const { id } = req.params;
    const newInfo = req.body;
    const member = members.find((m) => m.id === Number(id));
    if (member) {
        Object.keys(newInfo).forEach((prop) => {
            member[prop] = newInfo[prop];
        });
        res.send(member);
    } else {
        res.status(404).send({ message: 'There is no member with the id'})
    }
});

2. npm run dev 실행

3. test.http에 다음 코드를 추가해주세요.

###
PUT http://localhost:3000/api/members/1
Content-Type: application/json

{
    "id": 1,
    "name": "Alex",
    "team": "engineering",
    "position": "IOS Developer",
    "emailAddress": "alex@google.com",
    "phoneNumber": "010-xxxx-xxxx",
    "admissionDate": "2018/12/10",
    "birthday": "1994/11/08",
    "profileImage": "profile1.png"
}

PUT 리퀘스트를 보내보면 Alex의 position이 IOS Developer로 잘 바뀐 것을 확인할 수 있어요!

기존 직원 정보 삭제하기

1. app.js의 위쪽에서 선언했던 member변수를 const에서 let으로 바꿔주세요.

let members = require('./members');

2. app.js에 다음 코드를 추가해주세요.

app.delete('/api/members/:id', (req, res) => {
    const { id } = req.params;
    const membersCount = members.length;
    members = members.filter((member) => member.id !== Number(id));
    if (members.length < membersCount) {
        res.send({ message: 'Deleted' });
    } else {
        res.status(404).send({ message: 'There is no member with the id!'});
    }
});

filter method를 통해 members에서 삭제할 직원 정보의 아이디와 일치하지 않는 직원들의 정보만 추려내서 

새로운 배열을 만듦으로써 delete를 수행하고 있어요.

3. test.http에 다음 코드를 추가해주세요.

###
DELETE http://localhost:3000/api/members/3

Delete 리퀘스트를 보내고 나서 GET 리퀘스트를 통해 3번 직원의 정보가 잘 삭제된 것을 확인할 수 있어요!

 

 

출처: 코드잇(https://www.codeit.kr/topics/intro-to-express)

다른 사람과 함께 협업하고 있는 레포지토리에 내가 작업한 내용을 올리려고 하는데

내가 작업하는 동안 다른 사람이 커밋을 했다면 어떻게 될까요?

 

로컬 레포지토리가 원격 레포지토리보다 이전 버전을 가리키고 있기 때문에,

바로 커밋할 수는 없을거에요...

 

그래서 로컬 저장소와 원격 저장소의 버전을 맞춰주기 위해 git pull을 해봤더니,

다음과 같이 에러가 발생하네요!

$ git pull
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 4), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), 2.11 KiB | 56.00 KiB/s, done.
From https://github.com/shinyewon/Jumping_cat
   8655375..f2be300  main       -> origin/main
error: Your local changes to the following files would be overwritten by merge:
        plan.cpp
Please commit your changes or stash them before you merge.
Aborting
Updating 8655375..f2be300

 

error: Your local changes to the following files would be overwritten by merge:
        plan.cpp

협업자 중 누군가가 나와 같은 파일을 수정했다면 merge과정에서 문제가 생길 수 있기 때문에 

이런 에러를 띄워주고 있네요!

 

Please commit your changes or stash them before you merge.라고 하네요.

그럼 먼저 commit을 통해 해결해 볼게요.

 

1. 첫번째 해결법: 수정 내용 커밋하기

다음 명령어들을 순차적으로 실행해주세요!

git add .
git commit -m "[커밋 메시지 입력]"
git pull
git push

그러면 아래와 같이 2개의 커밋을 생성하면서 수정 내용이 원격 저장소에 제대로 반영됩니다.

 

흠..하지만 저는 개인적으로 2개의 commit이 불필요하게 생성되는 것 같아 1개의 commit만 생성하고 싶은데요,

그렇다면 git stash를 사용하면 됩니다!

2. 두번째 해결법: git stash

- git stash 명령어를 통해 작업하던 내용을 임시적으로 저장해주세요!

- git pull

- git stash apply를 통해 방금 임시적으로 저장한 내용을 다시 가져와줄게요.

- 다음 명령어들을 순차적으로 실행해주세요!

git add .
git commit -m "[커밋 메시지 입력]"
git push
git stash clear

그러면 깃허브에 1개의 커밋을 생성하면서 수정 내용이 원격 저장소에 제대로 반영됩니다.

 

읽어주셔서 감사합니다:)

'Git' 카테고리의 다른 글

github 잘못 올라간 파일 히스토리까지 삭제하기  (0) 2023.08.23
[Git] Open Source Software  (0) 2023.04.06
Git 협업하기  (0) 2022.12.30
브랜치 사용하기  (0) 2022.12.30
커밋 다루기 정리 노트  (0) 2022.12.30

이 포스팅 내용은 아주 기초적인 파이썬 지식을 필요로 합니다:)


컴퓨터 메모리 표현

각각의 칸은 1byte이고 써있는 숫자들은 메모리의 물리적인 주소를 나타내요!


파이썬은 다른 언어와 달리 자료형에 char가 따로 존재하지 않고 string만 존재하는데요.

string은 char들의 배열로 볼 수 있겠죠?

 

 A = "SAMPLE"이라고 선언을 하고, 각각의 char가 2byte를 차지한다고 가정하면, 

위의 사진과 같이 메모리에 문자열이 존재할거에요.

 

현재 A[0]의 주소는 2146을 가리키고 있네요.

현재 이 배열은 모두 char로만 이루어져 있어서 메모리의 주소를 계산하기도 아주 간편해요!

예를 들어 (A[2]의 주소) = (A[0]의 주소) + (index) * (자료형의 바이트크기) = 2146 + 2 * 2로 계산할 수 있어요.


고차원의 추상화


배열에 들어있는 자료형의 크기가 다르다면?

 

파이썬에서는 객체 참조를 통해 크기가 다른 객체들의 배열을 만들어요.

배열에 데이터를 직접 저장하는 것이 아니라, 각각의 데이터가 저장된 메모리 주소를 참조하고 있는거죠!

예를 들면, 'Rene'은 주소 100에, 'Joseph'은 주소 308에 이런식으로 각자 저장이 되어있고, 

우리는 주소를 참조해서 각각의 데이터에 접근할 수 있게 되는 거죠.


이미 존재하고 있던 primes라는 배열이 있고, primes를 이용해 temp라는 새로운 배열을 생성하려고 해요.

그렇게 하면 파이썬은 새로 데이터를 생성하고 저장하는 것이 아니라,

단지 새로운 참조자들을 만들면 된답니다!


엇 그런데 temp[2]에 있는 데이터 값을 15로 변경하면 어떻게 될까요?

그러면 15를 저장할 새로운 메모리가 생성되고, temp[2]는 그 주소를 참조하게 돼요.


동적 배열

배열이 가득 차있는데 삽입이 필요할 때 동적으로 그 배열의 크기를 조정합니다.

 

배열 A가 가득 차 있는데 새로운 요소를 삽입하는 방법을 살펴볼게요.

1. 더 큰 크기의 배열 B를 만든다. 

2. B[i] = A[i]를 i = 0부터 n -1까지 실행한다.(n은 현재 항목들의 개수)

3. A = B

4. 새로운 배열에 새로운 요소를 삽입한다.


참조)

-"Data structures and algorithms in Python." Goodrich, Michael T., Roberto Tamassia, and Michael H. Goldwasser. John Wiley & Sons Ltd, 2013.
-"Data Structures and Algorithms Made Easy." 5th edition. Narasimha, Karumanchi. CareerMonk Publications. (2018).

- 한국외국어대학교 Walid Abdullah Al 교수님의 자료 구조 강의

-Yung Yi, KAIST(PPT 참조)

-Prof. Chansu Shin, HUFS(PPT 참조)

안녕하세요! 

오늘은 API 명세서 작성법에 대해 정리해보려고 해요.

백엔드 개발자로서 협업을 하다 보면 API 명세서를 만들 날이 오는데요...!

프론트엔드 개발자가 백엔드 개발자가 작성한 라우터 관련 코드를 보고 어떤 백엔드 서버 주소로,

어떤 정보를 보내줘야 하는지, 그러면 어떤 정보가 오게 되는지 파악하기란 쉽지 않을 수 있어요.

그래서 협업 시에 API 명세서를 만들어서 프론트엔드에게 제공해주어야 해요.

또한 백엔드 개발 과정에서 자신의 코드가 잘 작동하는지 확인용으로 쓸 수도 있어요.

생각보다 쉽게 만들 수 있으니 따라해 보세요!

 

저는 API 명세서를 만들기 위해 Postman을 추천받아 사용했어요.

1. 포스트맨 다운로드

https://www.postman.com/downloads/

 

Download Postman | Get Started for Free

Try Postman for free! Join 25 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

위 사이트에 접속해서 자신의 운영체제에 맞는 방법으로 다운로드 한 후 회원가입을 해주세요.

 

2. Workspace 생성

새로 워크스페이스를 생성하거나 기본적으로 만들어져있는 My Workspace에 진입해주세요!

 

3. Collection 생성

New 버튼을 누른 후 Collection을 눌러서 Collection을 생성해 주세요!

 

Collection 이름을 자신의 프로젝트 이름 등으로 수정해주세요! 

저는 제가 하고있는 프로젝트 웹사이트 이름인 Rangpid로 해줬어요.

 

이 Collection이 어떤 api 정보를 모아놨는지에 대한 설명서를 작성해주세요.

 

4. Request 생성

저는 로그인, 회원가입, 사용자 정보 조회 등을 테스트 하기 위해 각각의 Request를 생성해줬어요!

Add request 클릭

5. Get 요청 보내기

필요한 정보들을 입력하고 send버튼을 누르면 결과를 확인할 수 있어요!

(백엔드 서버를 실행시킨 상태에서 진행해주세요!)

Save 버튼을 눌러 저장

 

6. POST 요청 보내기

Body에 보낼 정보들을 입력해주세요!

Save 버튼을 눌러 저장

 

7. PUT 요청 보내기

필요한 정보들을 입력해주세요!

 

저는 Authorization도 필요해서 해줬어요!

 

8. 예시 추가하기

자 이제 필요한 모든 요청들의 기본적인 걸 작성했다면 추가적으로 예시도 작성해줄게요!

아까 만든 요청에 들어가서,

Body의 데이터 값이나 경로 변수들을 바꿔가면서 Send를 하고 Save as example을 눌러주세요!

그리고 나서 Rename을 클릭해 예시의 이름을 써주세요.

 

이렇게 각각의 요청별로 여러 예시들을 만들어주면 request와 respond가 여러 가지 상황에서 어떻게 오고 가는지 잘 파악할 수 있겠죠?

 

9. 명세서 공유하기

이제 마지막이에요!

우측 하단의 이 버튼을 클릭해주세요!

 

우측 상단의 Publish 클릭!

 

나타난 페이지에서 publish 클릭!

 

 

URL을 복사해서 카톡이나 이메일 등으로 다른 사람에게 공유하면 완료입니다:)

수고하셨어요!!!

 

 

참고문헌: https://inpa.tistory.com/entry/-%F0%9F%92%BD-%ED%8F%AC%EC%8A%A4%ED%8A%B8%EB%A7%A8-%EC%82%AC%EC%9A%A9%EB%B2%95-API-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%90%EB%8F%99%ED%99%94-%EA%B3%A0%EA%B8%89-%ED%99%9C%EC%9A%A9%EA%B9%8C%EC%A7%80

What is Github?

Git: Source Control 방법

Github: Git을 기반으로 하는 소프트웨어 프로젝트 관리 사이트

             Open Source 계의 왕

 

What is OSS(Open Source Software)?

  • 소스 코드를 공개해 누구나 특별한 제한 없이 그 코드를 보고 사용할 수 있는 오픈소스 라이선스를 만족하는 소프트웨어로서 통상 간략하게 오픈소스라고 말한다.
  • 소프트웨어의 내용인 소스코드가 공개되어 특정 라이선스 방식을 통해 배포되고, 수정, 복제, 사용, 재배포가 자유로운 소프트웨어를 지칭한다.

유명한 오픈소스 소프트웨어

(사진=위키피디아)

오픈소스SW의 장점

  • 낮은 개발 비용
  • 빠른 기술지원과 유연한 개발-최신기술 정보 및 문제점과 해결책을 공유하는 형태로 자유롭게 운영되기 때문에 독점 프로그램에 비해 기술 발전속도가 빠름
  • 오픈 포맷과 프로토콜 -표준화된 포맷과 프로토콜을 사용하기 때문에 서로 다른 SW간 연동성이 보장됨
  • 신뢰성과 안정성-전세계 우수한 개발자들이 개발과 디버깅 과정에 참여하기 때문
  • 강력한 네트워킹 지원-대부분 상용 프로그램과 호환되기 때문에 상품화해도 잘 활용될 수 있음

오픈소스SW의 단점

  • 빈약한 문서-상용프로그램에 비해 체계적인 문서를 갖고 있지 않은 경우가 많음
  • 불확실한 개발 로드맵-영리를 목적으로 운영되는 것이 아니므로 상용프로그램 수준의 로드맵을 기대하기 어려움
  • 지적재산권기업이 보유한 특허 및 소스코드가 오픈소스SW에 포함되는 경우 오픈소스SW 라이선스에서는 일반적으로 특허에 대한 사용료 없이 배포할 것을 요구하고 있기 때문에 오픈SW를 이용하여 특허를 구현하거나 기존 소스코드를 포함하고자 하는 경우 반드시 특허 사용료에 대한 입장을 명확히 하여야 함

OSS 라이센스

[오픈소스 라이센스 정책 비교 - 정보통신부 2014]

표에서 아래쪽으로 갈수록 저작권이 강해지기 때문에 기업친화적인 라이센스라 볼 수 있다.

 

 

[출처] Git 교과서-길벗

'Git' 카테고리의 다른 글

github 잘못 올라간 파일 히스토리까지 삭제하기  (0) 2023.08.23
git pull error 해결 방법  (0) 2023.05.19
Git 협업하기  (0) 2022.12.30
브랜치 사용하기  (0) 2022.12.30
커밋 다루기 정리 노트  (0) 2022.12.30

init.js가 main파일일 때, 

init.js, db.js, server.js 이렇게 3가지 파일을 생성하고 나면 db와 콜렉션이 생성된다. 

 

+ Recent posts