웹3 인사이트, 하루 한잔 DeFi Juice

백엔드 부트캠프-21년

백엔드 부트캠프 - 4주차 핵심 개념 리뷰

레오(Leo) 2021. 10. 9. 14:54

<개발 프로젝트>

이번주는 개별 프로젝트로 회원제 게시판 및 댓글 기능을 구현함

https://github.com/seonung-park/Noejs-project-_21.10.08

 

<개념 공부>

 

Q1. 단위 테스트 코드 작성 시, Mock를 사용하는 이유는?

 

단위 테스트를 하기 위해서는 한번에 메서드 하나만을 실행해 보는 것인데 이러한 메서드가 네트워크, 데이터베이스 등에 시스템의 다른 부분에 많이 얽혀 있다면 단위 테스트를 진행하기 어렵다.

이것을 돕는것이 Mock 이다.

Mock란 실제 객체 서로 간의 의존성이 강해 구현하기 힘들 경우 가짜 객체를 만들어 사용하는 방법이다.

 

 

Q2.package.json 파일이란?

 

package.json 파일은 확장 모듈을 간편하게 관리할 수 있는 파일로, 이를 통해 크고 무거운 node-modules을 공유할 필요없이 동일한 환경을 공유할 수 있다.

노드로 확장 모듈을 작성하면 npm을 통해 중앙 저장소로 배포할 수 있다. package.json 파일은 배포한 모듈 정보를 담고자 만들어졌지만, 노드로 작성하는 애플리케이션도 package.json 파일을 사용하여 관리할 수 있다. 꼭 확장 모듈 형태로 배포하기 위한 것이 아니더라도 애플리케이션을 개발할 때 package.json 파일을 이용하면 사용하는 확장 모듈에 대한 의존성 관리가 가능하기 때문에 편리하다.

pacakge.json 파일은 기본적으로 CommonJS의 명세를 충실히 따르고 있으며 JSON 형식의 파일이다.

직접 작성할 수도 있고 npm init 명령을 통해서 자동으로 생성할 수도 있다. 그리고 해당 애플리케이션을 위해 사용한 확장 모듈에 대한 정보는 npm install -save를 통해 자동으로 모듈에 대한 정보를 추가할 수 있다.

가장 중요한 항목은 'name'과 'version이며, 이 항목이 누락되면 패키지를 설치할 수 없다.

다음은 npm init 명령을 사용하여 Node.js 프로젝트를 진행한 package.json 파일의 모습이다.

Q3. HTTP/HTTPS 프로토콜이 아닌 gRPC 프로토콜로 통신하는 서버 프로그램은 API 서버라고 부를 수 있을까요? (배포된 환경, 구현된 기능은 동일)

 

우리가 일반적인 웹서버라고 하면 데이터베이스에 있는 정보를 가져와서 웹브라우저나 json 타입으로 클라이언트에게 보여주는거라고 생각 할 수 있고 이런 서버에는 보통 php 파이썬 장고 아니면 자바스크립트 노드익스플레스 같은 언어가 통용되어지고 있다.

그런데 이런 일반적인 API서버가 아닌 C++기반만의 활용할 수 있는 기능이 있는 서버가 있다면 이 서버에 인터페이스를 정해야하는데 RESTfull Api 를 사용할수도 있고 다른 것을 사용할 수도 있다. 이런 인터페이스 중 gRPC인터페이스가 있는 것이고 크로스 플랫폼과 크로스 랭귀지 전부 지원해주기 때문에 마이크로 서비스 환경에서 꽤나 괜찮은 인터페이스가 될수 있다.

gRPC server 는 서버측에서 이 인터페이스를 구현하고 gRPC서버를 실행하여 클라이언트 호출을 처리한다. 클라이언트 측에서 클라이언트에는 서버와 통일한 방법을 제공하는 스텁 이 있고 data가 클라이언트 와 서버가 이런방식으로 오고 간다.

세부적으로 들여보면 proto 파일에 정의( service의 정의 request ,response )가 되고

이 파일을 구글 툴을 이용해 헤더를 작성하고 C++기반의 gRPC server가 만들어지고 그 헤더를 이용해 데이터를 채울 수 있다.

만약 파이썬 기반의 서비스와 소통을 하게 할려고 한다면 proto파일에 구글 툴로 이용해 파이썬 파일을 만든다. 이 파일을 클라이언트 측에서 임포트 하게 된다면 gRPC server와 request ,response 가 가능해진다. 이런 동작원리의 gRPC 프로토콜은 규칙을 통한 의사소통이라는 API개념에 비추어 충분히 API 서버라고 볼수 있을것 같다.단 웹브라우저는 gRPC와의 커뮤니 케이션을 지원하지 않는데 그래서 프론트 앤드 단에서 gRPC를 사용하려 한다면 프록시 서버를 둬야 한다.

 

Q4. Sequlize같은 ORM과 MySQL같은 데이터베이스의 차이가 무엇인가요?

 

객체지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용합니다.

여기서 객체 모델과 관계형모델간에 불일치가 존재하는데 이 객체간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결하는것이 ORM 입니다.

Object<=매핑=>DB데이터

여기서 매핑의 역할을 하는 것이 ORM따라서 MySQL같은 데이터 베이스와 Object 간의 매핑을 도와주는 역할을 하는 것이 ORM이라고 보면 된다.

 

 

Q5.express.js의 라우터는 미들웨어입니다. 어떤 원리로 동작하기 때문에 미들웨어로 라우터를 구현할 수 있나요?

 

미들웨어는 요청, 응답, next로 인자를 갖고있다.

미들웨어는 순차적으로 실행이 되며 next를 통해 다음 미들웨어로 현재 요청을 넘길 수 있기 때문이다. 만약 next가 없다면 그 다음 미들웨어는 실행되지 않고 종료가 된다.

 

 

Q6.Node.js에서 리팩토링시 사용하며, npm을 통해 다운로드 했던 모듈을 불러오는 require 함수는 어떻게 동작하나요? IIFE와 연결지어 찾아보고 정리해보세요.

 

자바스크립트 엔진은 함수를 즉시 해석해서 실행하는데 이런 즉시 실행 함수가 IIFE이다.

npm을 통해 다운받은 모듈이나 외부 모듈을 해당 js에서 즉시 적용 시키기 위해 node가 local objcet에 추가한 메서드이다.

정리가 굉장히 잘되어 있는 블로그: https://m.blog.naver.com/jdub7138/221022257248

 

Q7.불필요한 테스트코드는 무엇이며, 100개의 테스트 케이스보다 1개의 테스트 케이스가 더 효과적일 수 있는 이유는 무엇인가요?

 

불필요한 테스트 코드는 중요하지 않은 로직들까지 신경 쓴 테스트 코드, 다시 봤을때 알기 어려운 메소드방식을 쓴 작성법이 있다.

100개의 테스트 케이스보다 1개의 테스트 케이스가 더 효과적일 수 있는 이유는 다음과 같다.

테스트도 코드로 작성함으로 가독성 측면에서 봤을때 테스트 케이스가 적을수록 더 가독성이 좋다. 그리고 다른사람도 잘 이해할 수 있고 작성한 코드의 변화가 있을때 유지보수 하기 용이하다.