내배캠 140일차

·2023년 4월 2일
0

내일배움캠프

목록 보기
142/142

일요일

질문정리

1. 유지보수 기간에는 어느 부분을 개선하셨어요?!

  • db에서 refreshToken을 저장하고 비교하던 코드를 redis를 이용하여 데이터 엑세스 지연시간을 줄여 작업속도를 향상시켰다.
  • 단순히 유효성검사와 back에서 중복체크 정도만 되던 회원가입기능을 프론트에 중복체크 확인 버튼과 nodemailer를 이용한 이메일 검증 방식을 도입하였다.
  • 카카오톡에 이메일이 없는 분의 피드백을 통해서 이메일이 없는 경우 오류가 나지 않도록 코드를 개선하였다.
  • 불필요한 API 콜이 있을 수 있다, 악의적인 트레픽은 방어해야한다는 피드백을 받고 DoS공격을 예방하기 위해 단위 시간 동안 하나의 ip주소에서 들어오는 req 숫자를 제한할 수 있는 express-rate-limit 모듈을 이용하였다.
  • 팀이나 프로젝트가 없는 경우, url이 잘못된 경우 에러메시지만 출력하는게 아니라 다른 페이지로 바로 이동가능하도록 header가 있는 404page를 만들어줌.
  • 소켓이 작동안한다는 피드백을 받고 코드를 수정.

2. 프로젝트 진행하면서 뭐가 제일 힘들었어요?

  • 팀원들이 연락이 안될 때

3. WebRTC 기능을 설명해주실 수 있나요?

웹에서 실시간 p2p(peer to peer)로 오디오, 비디오 통신하는 오픈소스 기반의 api 이다.

4. 프로젝트 하면서 가장 아쉬웠던 부분이 있나요?

시간이 된다면 결제기능과 사용자를 기업으로 확장시키고자 했지만, 그러지 못하여서 아쉽습니다.

5. 서비스에 추천 공고가 있던데 추천 방식은 어떻게 되어있나요?

db에 like테이블을 만들어서 기록된 좋아요 많은 순으로 내림차순 정렬하여 5개를 가져오는 방식입니다.

6. 채팅 기능을 어떤식으로 구성하셨나요?

WebSocket은 매우 유용한 기술이지만 오래된 브라우저의 경우 지원하지 않는 경우가 있어
브라우저 간 호환이나 이전 버전 호환을 고려하여 Node.js를 위한 강력한 Cross-platform WebSocket API인 Socket.io를 사용하였다.

서버 측 코드

  1. Express를 사용하여 Http 서버를 생성한다. 그리고 생성된 Http 서버를 socket.io server로 upgrade한다.
  2. 클라이언트가 socket.io 서버에 접속했을 때 connection 이벤트가 발생한다. connection event handler를 정의한다
  3. connection event가 발생하면(즉 클라이언트가 접속하면) 클라이언트가 전송한 메시지를 수신하거나 클라이언트에게 메시지를 송신한다.

connection event handler function의 인자로 socket 객체가 전달된다. socket 객체는 개별 클라이언트와의 interacting을 위한 기본적인 객체이다. io 객체는 연결된 전체 클라이언트와의 interacting을 위한 객체이다.

클라이언트가 전송한 메시지 수신

  • 현재 접속되어 있는 클라이언트로부터의 메시지를 수신하기 위해서는 on 메소드를 사용

클라이언트에게 메시지 송신


클라이언트 측 코드

  1. 클라이어트 라이브러리는 script tag의 src 어트리뷰트값으로 “/socket.io/socket.io.js”을 지정하면 된다. 실제 path에 socket.io.js 파일을 배치할 필요는 없다. 그 이유는 socket.io가 서버 기동 시에 socket.io.js 라이브러리를 자동 생성해 주기 때문이다.
<script src="/socket.io/socket.io.js"></script>
  1. socket.io 서버에 접속하기 위해 io() 메소드를 호출한다.
const socket = io();
  1. 생성된 socket으로 서버로의 메시지 송신 또는 서버로부터의 메시지 수신을 할 수 있다.

서버로의 메시지 송신

현재 접속되어 있는 서버로 메시지를 송신하기 위해서는 emit 메소드를 사용한다.

socket.emit("event_name", msg);

서버로부터의 메시지 수신

현재 접속되어 있는 서버로부터의 메시지를 수신하기 위해서는 on 메소드를 사용한다.

socket.on("event_name", function(data) {
  console.log('Message from Server: ' + data);
});

Namespace

socket.io는 서로 다른 엔드포인트(endpoint) 또는 경로(path)를 할당하는 의미로 socket에 namespace를 지정할 수 있다.

namespace를 특별히 지정하지 않은 경우 default namespace인 /를 사용하게 된다.

// Server-side
var nsp = io.of('/my-namespace');

nsp.on('connection', function(socket){
  console.log('someone connected'):
});
nsp.emit('hi', 'everyone!');


// Client-side
// 지정 namespace로 접속한다
var socket = io('/my-namespace');

Room

각 namespace 내에서 임의의 채널을 지정할 수 있다. 이를 room이라 하며 이를 통해 room에 join되어 있는 클라이언트 만의 데이터 송수신이 가능하게 된다.

즉 각 클라이언트는 socket을 가지게 되며 이 socket은 namespace를 가지고 각 namespace는 room을 가질 수 있다.

각 socket은 랜덤하고 유일하게 작성된 socket.id로 구별된다. socket.io는 각 socket을 socket.id를 room 식별자로 사용하여 자동으로 room을 생성하고 join시킨다.

특정 클라이언트에게만 메시지를 전송할 때 io.to(id).emit를 사용하는데 이것은 사실 디폴트로 생성되어 자동 join된 개별 socket의 room에 소속되어 있는 유일한 클라이언트에 메시지를 전송한 것이다.

room에 join하기 위해서는 join 메소드를 사용한다.

// Server-side
// namespace /chat에 접속한다.
var chat = io.of('/chat').on('connection', function(socket) {
  socket.on('chat message', function(data){
    console.log('message from client: ', data);

    var name = socket.name = data.name;
    var room = socket.room = data.room;

    // room에 join한다
    socket.join(room);
    // room에 join되어 있는 클라이언트에게 메시지를 전송한다
    chat.to(room).emit('chat message', data.msg);
  });
});


// Client-side
// 지정 namespace로 접속한다
      var chat = io('http://localhost:3000/chat'),
          news = io('/news');

      $("form").submit(function(e) {
        e.preventDefault();

        // 서버로 자신의 정보를 전송한다.
        chat.emit("chat message", {
          name: $("#name").val(),
          room: $("#room").val(),
          msg: $("#msg").val()
        });
      });

      // 서버로부터의 메시지가 수신되면
      chat.on("chat message", function(data) {
        $("#chat").append($('<li>').text(data));
      });
    });

7. 사용한 기술들

https

SSL TLS 를 사용하여 http protocol 의 암호화된 버전
Secure Sockets Layer(SSL)는 클라이언트와 서버 간의 안전한 링크를 통해 송수신되는 모든 데이터를 안전하게 보장하는 과거의 보안 표준 기술
Transport Layer Security (TLS)는 어플리케이션들이 네트워크 상에서 안전하게 통신하기 위해 사용된 protocol이며, 이메일, 웹 브라우징, 메세징, 그리고 다른 프로토코들의 감청을 통한 정보의 변형을 방지한다. SSL과 TLS 모두 네트워크 상에서 보안을 제공하는 cryptographic 프로토콜을 사용한 클라이언트 / 서버 프로토콜이다. 서버와 클라이언트가 TLS로 통신을 할때, 어떠한 제 3자도 메세지를 변형시키거나 감청할 수 없도록 한다.

greenlock

Encrypt(암호화)를 사용하여 Wildcard SSL을 포함한 무료 SSL 인증서를 생성합니다. 완전히 자동화된 HTTPS에 대한 인증서 자동 갱신을 지원합니다.

ec2

Amazon EC2는 프로세서, 스토리지, 네트워킹, OS 및 구매 모델의 다양한 옵션을 제공하며, 클라우드에서 안전하고 크기 조정 가능한 컴퓨팅을 제공

pm2

JavaScript 런타임 Node.js의 프로세스 관리자
무중단 서비스를 하기 위해 사용함

github actions

GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행
pr 에 상호작용하며 자동화

nunjucks

HTML 템플릿 엔진 중 하나로 HTML 문법을 그대로 사용하며 JS 와 유사한 문법으로 사용할 수 있어 접근성이 좋다

socket.io

WebSocket 의 부가기능이 아닌 가끔 WebSocket 을 이용해서 실시간, 양방향, event 기반 통신을 제공하는 라이브러리

express-rate-limit

Express용 기본 속도 제한 미들웨어. 공용 API 및/또는 비밀번호 재설정과 같은 엔드포인트에 대한 반복 요청을 제한하는 데 사용하여 모집 공고 등록, 회원가입 등 요청의 수와 시간을 제한

passport

node.js 용 인증 미들웨어
회원가입과 로그인은 직접 구현할 수도 있지만, 세션과 쿠키 처리 등 복잡한 작업이 많으므로 검증된 모듈을 사용하는 것이 좋다.

node mailer

쉽게 이메일을 보낼 수 있는 Node.js 애플리케이션용 모듈

redis

"키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템

multer

Multer는 파일 업로드를 위해 사용되는 multipart/form-data 를 다루기 위한 node.js 의 미들웨어

jwt

JSON 형태의 데이터를 안전하게 교환하여 사용
여러가지 암호화를 사용가능
header.payload.signature 형식으로 3가지 데이터를 포함하여 생성됨
Stateless(무상태)로 관리할 수 있다
변조만 불가능할 뿐 암호화키를 모르더라도 복호화 가능하기 때문에 쉽게 노출되므로 민감한 정보는 제외
여러 언어에서 사용 가능하며 개념으로서 존재하며 이 개념을 코드로 구현하여 공개된 코드를 우리가 사용하는게 일반적

sequelize

Sequelize는 Postgres , MySQL , MariaDB , SQLite , DB2 , Microsoft SQL Server 및 Snowflake 를 위한 사용하기 쉬운 Promise 기반 Node.js ORM 도구

s3

아마존 웹 서비스에서 제공하는 온라인 스토리지 웹 서비스

lambda

아마존이 아마존 웹 서비스의 일부로서 제공하는 사건 기반 서버리스 컴퓨팅 플랫폼이다. 이벤트에 대응하여 코드를 실행하는 컴퓨팅 서비스이며 해당 코드에 의해 필요한 컴퓨팅 자원을 자동으로 관리

mysql

오픈 소스의 관계형 데이터베이스 관리 시스템

ubuntu

데비안 리눅스를 포크해 개발되며, 데비안에 비해 사용 편의성에 초점을 맞춘 리눅스 배포판

express

nest 가 아닌 왜 express 를 선택하였는지?

NestJS가 기본 제공하는 프레임워크(미들웨어, IoC, CQRS 등 이미 많은 기능을 프레임워크 자체에 포함)의 크기가 크기 때문에 가볍게 테스트용 서버를 띄울 땐 성능면에선 Express가 좋음. 하지만 여러 패키지를 추가하게 되면 별 차이 없음.
아이디어를 빠르게 검증하는 데에 좋고 단순하며 자유도가 높음
커뮤니티가 가장 큼
다른 프레임워크들이 Express를 기반으로 만들어 진 것들이 많음
매우 안정적인 프레임워크

참고
socket.io

profile
개발자 꿈나무

0개의 댓글