본문 바로가기

이것 저것 공부/프론트엔드 백엔드 몰입교육

mongo db, server와 client, docker로 서비스 돌리기 13일차

같은 이미지로 컨테이너로 달라진 것만 조금씩 변경하여 사용할 수 있지만

그렇지만 데이터 베이스는 실존하는 것이기에 볼륨을 사용한다.

 

curl 사용법

curl -i -X GET http://localhost:8080

-i 는 헤더까지 출력

-X는 method 지정해주는 것 (GET 방식, POST 방식)

대용량 파일 업로드 시에는 POST, 일반적인 로그인나 페이지의 상품 목록의 경우는 GET을 사용한다. 

맨 뒤에 uri 지정

uri는 http(스키마)를 포함한 전체 요청 문장이다. 쉽게 말하면 http를 빼면 ip주소/포트/pass명 arguement

 

url과 uri는 차이점 (제가 간략하게 조사한 내용을 담은 게시글이니 참고하시면 됩니다.)

wget -> 주로 파일 받을 때

 

mongo db(docker)

docker pull mongo:버전 (버전을 쓰지 않으면 자동으로 최신버전)

 

mongo shell

mongo compass는 GUI

mongosh는 CLI

 

module

import -> es6

정적 import 문은 다른 모듈에서 내보낸 바인딩을 가져올 때 사용합니다.

 

import.js 코드

import printHello from "./ex01_lib.js";
import foo from "./ex02_lib.js"

const lib20bj = foo();
printHello();

lib20bj.foo1;
lib20bj.foo2;
console.log(lib20bj.data);

ex01_lib.js 코드

function printHello(){
    console.log('hello es5');
}

// export default 공유할 함수명 적어줌
export default printHello;

ex02_lib.js 코드

function 중요한함수1(){
    console.log("hello");
}
function 중요한함수2(){
    console.log("es6");
}
var dataa = 7;
//데이터도 가능하다.
function foo(){
    return {
        data : dataa,
        foo1 : 중요한함수1,
        foo2 : 중요한함수2
    }
}
// 위의 함수들을 간접적으로 호출하는 법: 함수를 가르치는 오브젝트를 넘겨준다
// 리액트나 뷰에서 요구하는 방식이고 필요한 함수를 만들고 싹 다 return으로 넘긴다
// 객체를 함수로 보는 것이다. 클래스 대신 함수로 
export default foo;

require -> commonjs

 

require.js 코드

const foo = require('./ex03_lib.js');

let lib0bj = foo();
lib0bj.foo1();
lib0bj.foo2();
/*
    같은 표기법이지만 조금 다르지만 아직은 공존하지만
    점점 import로 넘어가는 추세이다
*/

ex03_lib.js 코드

// commonjs 형식 require
function 중요한함수1(){
    console.log("hello");
}
function 중요한함수2(){
    console.log("es6");
}

function foo(){
    return {
        foo1 : 중요한함수1,
        foo2 : 중요한함수2
    }
}

module.exports = foo

package.json은 npm init하면 만들 수 있다.

현재 과정에서는 수정하지 않을 내용은 모두 엔터해주고 import 문을 사용하기 위해서 type: "module"만 추가해준다

 

UDP는 TCP보다 가볍고 아예 헤더 없이 보낼 수 도 있다.

그래서 임베디드 환경에서 통신을 할 때에는 UDP로 통신한다. 

 

구조적으로 서버는 소켓을 받을 수 있는 컨테이너를 만들고 클라이언트는 소켓을 만든다.

tcp server

net 모듈 사용, createServer(내부적으로 생성)

서버 는 소켓을 열고(만들고) 기다린다.

접속이 들어오면 클라이언트 소켓을 하나 만든다.

요청을 처리한다.

접속종료

// tcp 서버 
// net -> http, ftp, ssh, smtp
import net from 'net'

const port = 8070;

//웹서버와 거의 같은 패턴
const tcp_server = net.createServer((_client) => {
    //packet 처리
    /*
        8070포트로 누군가 들어오기를 기다리는데 누군가 들어오면 client소켓을 받고
        상대는 정보를 주고받을 client 소켓을 받음 
    */
   _client.on('data', (playload) =>{
       console.log(playload + "");

       _client.write("ok"); //응답
       _client.destroy();
   })

   _client.on('close', ()=>{
       console.log('closed');
   })
}).listen(port)

console.log(`server listen ${port}`);

// 결국 tcp서버만으로 http 서버로 만들 수 있다.

tcp client

net, new 키워드를 사용한다. (new net.Socket) 직접 생성한다.

소켓을 만들고 접속을 시도한다.

서버에게 접속을 요청한다. 

서버로 부터 접속 종료 통지받는다.

client에서는 소켓을 직접 무단으로 종료하는 경우는 없다. 

pc를 강제로 끄는 것과 같은 비정상 종료도 서버에서 따로 처리해야 한다.

import net from 'net'

const host = '192.168.25.35';
const port = 8070;
// 클라이언트는 손님 서버는 가게주인 같은 개념이다.
/*
    직접 소켓을 생성
    헤 당 소켓을 사용하여 접속
 */
const socket = new net.Socket();

//접속시도
socket.connect(port, host, () => {
    //접속 성공하면 해야될 일 하기
    socket.write('hello\r\n', 'utf-8', () =>{
        //send ok
        console.log('send message');
    })
});

socket.on('data', (playload) =>{
    console.log('recv from server' + playload);
})
socket.on('close', () =>{
    console.log('close');
})

// docker exec -it 0254e5e41460 ls 
//bash 는 명령어를 계속 주고받을 수 있게 해준느 툴 일뿐 -it속성 덕에 나한테 보이게 됨
// -w 생략되면 기본적으로 워킹디렉토리가 루트임

// docker exec -it -w /home/work/nodeJsStudy  0254e5e41460 ls
// 한 터미널에서 하려면 -it 지우고 -d로 데몬으로 백그라운드에서 돌려서 테스트
// -w 옵션은 워킹 폴더를 지정하는 것
// 컨테이너가 중지되면 자동으로 종료됨

 

osi 7계층 (제가 조사한 내용이니 참고하실 분은 참고하시면 됩니다.)

 

docker로 서비스 돌리기

 

docker exec -d -w <워킹디렉토리> -p 호스트포트:가상기기포트 <컨테이너ID> 명령어 

-d 데몬으로 실행(백그라운드 실행)

-w 명령을 실행할 때 기준이 되는 디렉토리

 

 

git & docker

컨테이너 내용을 유지하기 위해 git 저장소를 이용한다.

원격으로 컨테이너 접속하여 소스 작업 후 commit 하고 push 한다.

다른 원격 컨테이너에서 변경한 내용은 pull로 가져온다

 

push <=> pull을 통해 서로 다른 원격환경에서 동기화한다.