본문 바로가기
공부

간단한 서버 API 속성으로 만들어보기 스텝.바이.스텝 (feat. Restful API, GET, POST, PUT)

by 워킹나무 2024. 10. 11.
반응형

image0

반응형

 

하나의 서버에서 application을 만들어놓고 외부기기가 접근할 수 있도록 만들기 위해서는 API형태의 서비스로 제공하여 클라이언트 (혹은 유저)가 httlp를 통해 접근할 수 있도록 만들어야한다.

 

이번 포스팅에서는, Restful을 사용한 매우 간단한 서버 API를 속성으로 만들어보기로 하겠다. 참고로, 윈도우에서 테스팅을 해봤고, 그리 복잡한 명령어를 사용하는 것이 아니기에 Linux에서도 간단히 츄라이 가능할 것이다. 

 

[1] Restful 커맨드를 사용하기 위한 프로그램 패키지를 설치

node 명령어와 npm명령어를 필요로 하기에 깔아준다.

 

node 는 자바스크립트를 서버에서 사용할 수 있도록 해주는 역할을 하고,

npm은 자바스크립트 코드를 효율적으로 관리 및 추가적인 자바 기반의 명령어를 사용할 수 있게 해준다.

winget install Schniz.fnm
fnm env --use-on-cd | Out-String | Invoke-Expression
fnm use --install-if-missing 20

 

위의 명령어를 powershell prompt (anaconda 를사용하면 anaconda powershell prompt에서) 에서 해준다. 그리고 매번 prompt를 새롭게 열면 두번째와 세번째 명령어를 실행해주어야하는데 귀찮으면 permanent하게 setup할 수 잇는 방법이 있을것이다.

 

node와 npm이 깔렸는지 확인하려면 다음을 실행.

node -v

 

추가적으로 npm express 라이브러리를 설치해준다 (API를 쉽게 관리할수 있는 툴과 스크립트를 제공한다.

npm install express

 

[2] 서버로 사용할 폴더만들기

실험용으로 아무데나 자신이 서버로만들고자 하는 폴더를 만들고 그 폴더를 서버로 초기화해준다.

mkdir test
cd test
npm init -y

해당폴더의 메타데이터와 라이브러리 관계성을 만들어낸다고 하는데, 그냥 서버로 사용하겠다 정도로 생각해놓고 나중에 필요하면 더 공부해보자.



[3] 예제파일을 실행시켜본다.

[3-1] 다음의 예제파일을 다운받고  test 폴더에 넣어준다. [예제파일_샘플1: index.js] 

참고로 첫번째 sample은 같은 네트워크안에 있는 같은 기계에서만 접근이가능한 예제이다. 일단은 가장 쉬운예제로 실행을 시켜볼 예정이다.

 

위의 샘플 코드에서 중요한 명령어 용어정리는 다음과 같다.

 

GET: 클라이언트가 서버에게 GET을 요청하면 GET이 어떤 특정 알고리즘을 프로세싱한뒤에 클라이언트에게 output정보를 내뱉어준다. 보통 .json 파일의 포맷으로 소통을 한다. 즉, 서버가 클라이언트에게 output을 줄때, .json 파일 포맷으로 해당 아웃풋을 내뱉게 되고, json파일을 다시 parsing (가공처리) 하여 원하는 포맷으로 저장해야한다.

POST : 새로운 아이템을 추가한다. 즉, 클라이언트가 서버측의 아이템의 변경을 하용하고자 할때는 POST를 사용한다. 

PUT : 기존의 존재하는 아이템의 value (값)을 변경하기 위해 사용된다.

DELETE:  POST와는 반대로 아이템을 제거하기 위해 사용되는 명령어다.

 

 

 

[3- 2] 파일을 실행시켜준다.

node index.js

 그럼 아래와 같이 서버가 시작됬다고 한다.

image2


[4] 커맨드 라인을 사용하여 서버에 Output을 요청해 볼 수 있다.

이때, curl을 사용할 예정이므로, curl없다면 설치해야한다.

curl http://localhost:3000/api/items -o results.json

 

-o는 output file의 이름을 지정할수 있게 해주는 옵션이다.

 

[5] 다른컴퓨터에서도 접근가능하도록 만들기

[5-1] index.js 파일에서 app.listen부분을 일단 수정해준다. 

app.listen(port, () => { console.log(`API server running on http://localhost:${port}`); });

 

와 같이 listen에 어떤 것도 적혀있지 않으면 local로만 접근가능하다는 뜻이다. 이 부분을 외부에서도 접근가능하도록 바꾸어준다.

app.listen(port, '0.0.0.0', () => { console.log(`API server running on http://0.0.0.0:${port}`); });

위와 같이 바꾸어주어야, 그러면 다른 기기에서도 서버에 접근이가능하다.

 

혹시 바꾸기 귀찮다면 그냥 미리준비된 다음의 파일을 다운받아준다 [예제파일 샘플2: index_open.js]

 

[5-2] index_open.js 실행해준다.

node index_open.js

 

 

imaged3

 

[5-3] 운영할 서버의 ip확인하기.

현재 운영하고 있는 서버의 ip를 알아야 해당 ip를 공공 ip로 만들어줄수 있기 때문에, 일단 ip확인을 한다.

ipconfig

(linux에서는 ifconfig)를 사용해서 서버의 ip어드레스확인한다. 이때, 

IPv4 쪽을 확인하면된다 (아래의 빨간 박스). 

image4

 

[5-4] 포트포워딩.

서버와 다른 네트워크에 있는 기계를 사용하고 있는 사용자가 서버로 접근을 하기위해, 서버의 port를 공용 인터넷 포트로 열어주어야 한다. 좀더 자세히들여다보자.

 

index_open.js 파일을 들여다 보면 서버에서 사용될 포트를 “3000”번으로 사용하고 있으므로, 이 3000번 포트를 공용가 접근할수 있도록 열어주어야한다.

 

[5-5-1] 터미널하나를 더 열여서, npm 명령어를 사용하기 위해 위해 [1] 과정으로 셋업하기.

[5-5-2] 포트포워드 터널링을 위한 툴 설치.

npm install -g localtunnel

[5-5-3] 포트를 열어줘서 public 링크주소를 받는다. 이때, 위에서 말한대로 포트번호는 3000번으로 쓰기로해보자.

lt --port 3000

 

위의 명령어를 돌려주면, 다음과같이 랜덤하게 url을 뿌려준다 (분명 url을 커스터마이징 하는 법이 있을테지만 일단은 스킵한다).

image5

 

[5-6] [4] curl명령어를 새로생겨난 http주소와함께 사용하면된다. 예를들면, 

curl https://famous-meals-brush.local.lt -o results.json

   

[5-7] 서버접근에 패스워드를 적용하고 싶은경우에는 다음과 같이 한다.

 

[5-7-1] authentication (확인절차) 를 위한 툴 설치

npm install express-basic-auth

 

[5-7-2] index_open.js 파일에 가장 첫줄에 basic-auth를 import해주고, authentication 절차를 넣어준다.

const basicAuth = require('express-basic-auth');  // Import express-basic-auth for authentication

위의 코드부분을 아래와 같이 고쳐준다.

app.use(basicAuth({
   users: { 'admin': 'password' }, // Replace 'admin' and 'password' with your desired username and password
   challenge: true,
   unauthorizedResponse: 'Unauthorized'
}));

여기서 admin은 서버이름이고, password는 자신이원하는 패스워드로 바꿔준다. 예를들면 '0000'.

 

위의 변경이 귀찮으면 그냥 미리 만들어진 다음의 script를 사용하면 된다.[예제파일3: index_open_password.js]

 

[5-7-3] 패스워드가 들어간 서버운영 시작.

node를 시작하여 패스워드가 들어간 서버운영을 시작한다. 

 node index_open_password.js

운영을 시작한 뒤에, [5-5-3]과정에서 해준 포트포워딩도 잊지말고 다시 해준다.

lt --port 3000

 

[5-7-4] 임의로 생성된 서버주소로 들어가면, 초기 tunnel 패스워드를 필요하한다. 다음의 문구대로 ip를 확인한후 해당 ip를 패스워드로 넣어주면된다.

image6

 

[5-7-5] curl command로도 패스워드와 아이디 authentication이 가능하다. -u [아이디]:[패스워드] 를 curl에 사용하여 로그인을 함께 해줄 수 있다.

(sever의 가장 초기 진입)

curl -u [서버이름]:[패스워드] https://famous-meals-brush.local.lt -o hello_world.json

(sever의 GET data얻기)

curl -u [서버이름]:[패스워드] https://famous-meals-brush.local.lt/app/items/ -o results.json

(참고로 '/'로 잘끝내야지 제대로 동작한다)

 

 

지금까지 Restful을 사용한 가장 기초적인 서버를 만들어보았다. 이 기초를 토대로 응용을 하면 될것같다. 사용자가 어떤 정보를 json파일을 통해 서버에 요청하고, 서버는 사용자가 준 정보를 토대로, 내부의 알고리즘 처리후 의미있는 정보를 output으로 주는 파이프라인을 만들어야하지 않을까. 특히, GET과 POST를 사용해서 응용을 해보고자 한다.

 

-워킹나무-

 

 

반응형