스터디/KAKAOCLOUDSCHOOL

[Node] 개발자 지망생 스터디 - 12일차

shineIT 2022. 11. 17. 17:50

[1] NPM (Node Package Manager)

  • 노드에서의 패키지 매니저인데 지금은 거의 모든 자바스크립트 라이브러리들이 저장소에 있기 떄문에 자바스크립트 라이브러들은 거의 모두 NPM을 이용해서 사용
  1. package.json
    • 노드에서 패키지 관리를 위한 설정 파일
    • java에서의 build.gradle 이나 pom.xml 의 역할을 수행
    • 패키지를 설치하게 되면 패키지에 대한 정보가 전부 작성됨
      • 패키지를 설치하게 되면 pakage-lock.json 파일이 설치되는데 package.json에는 직접 설치한 패키지에 대한 정보만 기재 되어 있지만 package-lock.json 에는 의존관계 (패키지를 사용하기 위해서 필요한 패키지) 가 있는 모든 패키지에 대한 정보가 기재되어 있음
  2. 패키지 설치
    • npm install 패키지 이름 나열(나열할 때는 공백으로 구분)
      • 개발 과정에서만 사용하고 배포할 때는 제외하고자 하는 경우에는 패키지 이름 앞에 --save-dev 를 추가하면 됨.
      • 모든 프로젝트에서 사용할 수 있도록 하기 위해서는 global 모드로 설치하는데 패키지 이름 앞에 -g 를 추가하면 되지만 지금은 경고가 발생하면서 --location=global 로 설정하기를 권장함.
      • Mac이나 Linux에서 global로 설치할 때는 맨 앞에 관리자 모드를 의미하는 sudo 를 추가해야함
        • sudo npm install --location==global 패키지이름의 형태로 설치해야 함
        • 처음 한 번은 관리자 비밀번호를 입력해야 함
      • 설치된 패키지는 프로젝트 내의 node_modules 라는 디렉토리에 저장이 됨
        • 전역으로 설치했는데 패키지가 잘 불러지지 않으면 로컬로 설치하여 사용 가능함
        • 전역으로 설치했는데 패키지가 잘 불러지지 않는 경우
          • node 명령에 대한 path 설정이 안되었을 수 있음
          • node를 2개 이상 설치 했을 수 있음
  3. 내 컴퓨터에 패키지 설치
    • 프로젝트 생성 - package.json 설치 확인
    • express 패키지 설치 : express는 웹 애플리케이션 서버를 만들어주는 패키지
      • npm install express
    • morgan, cookie-parser, express-session 패키지 설치
      • npm install morgan cookie-parser express-session
    • nodemon 패키지 설치 : nodemon 패키지는 소스 코드를 수정하면 자동으로 재실행되게 해주는 패키지로 개발 과정에서만 사용함.
      • npm install --save-dev nodemon
    • rimraf 패키지 설치 : rimraf 패키지는 윈도우에서 터미널에서 rm 명령을 사용하기 위해서 설치
      • 전역 설치
        • npm install --location=global rimraf
          • --location==global 대신 -g 라고 입력해도 됨
          • Mac 이나 Linux s에서는 앞에 sudo 를 추가해야함
          • --location==global은 '학습용'으로 사용
  4. 패키지 재설치
    • 모든 패키지는 node_modules 에 다운로드 받아서 저장하게 되는데 배포를 하거나 코드를 가지고 갈 때 node_module를 포함시키면 크기가 너무 커지기 때문에 node_modules는 복사하지 않고 package.json 만 가져간 후 새로운 곳에서 npm init 명령만 다시 수행하면 패키지들이 모두 설치 됨
  5. 패키지 버전
    • 3자리로 구성
      • Major Version. Minor Version . Patch
        • Major Version 이 변경되는 경우에는 하위 버전과 호환이 안될수 있음
        • Minor Version 은 기능이 변경된 경우
        • Patch 는 오류를 수정했을 때 변경
    • 버전 이름에 alpha 나 beta 가 포함되면 테스트 버전임
  6. npm 관련 명령어
    • npm uninstall 패키지 이름: 패키지 삭제
    • npm search 검색어 : 패키지 검색
    • npm publish : 패키지 배포
    • npm unpublish : 패키지 배포 취소 - 배포 후 24시간 이내에만 가능
    • 이러한 명령어는 https://docs.npmjs.com 에서 확인이 가능함

 

■ node를 이용한 웹서버 만들기

* 실제로는 대부분이 이 방법을 사용하지는 않고 express 모듈을 이용하는 경우가 많음.

* 웹의 개념을 알기 위해 진행함.

 

[1] 최근의 Web

  1. web 3.0
    • Semantic Web 개념 등장 : 로봇이 정보자원의 뜻을 이해하고 논리적 추론까지 가능해짐. 명확한 의미 전달이 중요, Rest API
      • 속도의 변화
      • 인공지능
      • 자신만의 컨텐츠나 정보를 구성할 수 있도록 하는 사용자의 권한이 증가
      • 블록체인
  2. WOA (Web Oriented Architecture)
    • 사용자의 요구 사항 변경
      • 여러 디바이스를 사용하고 디바이스끼리 끊어짐이 없는 서비스 요구가 증대되면서 이를 구현하기 위한 방법으로 웹 기술이 각광 받음
      • 기술의 변화 - 인프라 측면에서는 클라우드 나 가상화 기술이 각광을 받고 있고 소프트웨어 측면에서는 WOA(전체 시스템아키텍쳐를 웹 중심으로 설계)
    • Framework 를 이용한 애플리케이션 개발

 

[2] 웹 서비스 구축 방식

  1. 정적 웹 서비스
    • 요청이 오면 요청에 해당하는 HTML 페이지를 찾아서 출력하는 방식
  2. CGI (Common Gateway Interface)
    • 클라이언트의 요청이 오면 서버가 작업을 수행해서 결과를 전송하거나 화면을 전송하는 방식
    • Perl이 시초
    • 이 방식은 사용자의 요청을 별도의 프로세스로 만들어서 처리
      • 하나의 요청을 전부 처리하기 전까지는 다른 요청을 처리할 수 없음
    • Perl 이나 ASP 가 이런 형태로 동작
  3. Application Server 방식
    • 사용자의 요청을 Tread를 만들어서 처리
    • 여러 사용자의 요청을 한꺼번에 처리하는 것 처럼 처리
      • Java → Servlet(JSP) → Spring Framwork
      • C# → asp.net
      • JavaScript → node.js Framework
      • PHP → laravel Framwork
      • Python → Flask 나 Django Framwork
      • Rudy → Rails
  4. 웹 프로그래밍의 구조
    • 웹 브라우저 ↔ 웹 서버 ↔ 애플리케이션 서버(Controller, Service, Repository) ↔ 데이터 저장소 
    • 언어나 프레임워크는 애플리케이션 서버를 만들기 위한 기술
    • Serverless는 서버가 없는 것이 아니라 서버를 직접 구현할 필요가 없는 것임 (누군가 만들어 둔 서비스를 이용하는 것)
    • ★ 웹 브라우저에서 서버에게 요청하는 것을 request 라고 하고 서버가 웹 브라우저에게 대답을 하는 것을 response 라고 함.

 

[3] HTTP 모듈

- 내장 모듈이므로 별도로 설치할 필요는 없음

 

  1. 서버 생성
    • http 모듈. createServer((request, response) => {내용});
  2. 서버 실행
    • 서버객체.listen(포트번호, 아이피주소);
      • 아이피주소는 현재 컴퓨터에 여러 개의 IP가 존재하는 경우 작성
  3. 서버 종료
    • 서버객체.close();
  4. 서버에 발생하는 이벤트
    • request : 클라이언트의 요청이 있을 때
    • connection : 클라이언트가 접속했을 때
    • clientError : 클라이언트 오류가 발생했을 때
  5. request 객체
    • url : 요청한 url
    • method : 요청 방식(GET, POST, PUT, PATCH, DELETE, OPTION 등)
  6. 웹 서버 만들고 응답을 생성하기
    1. js 파일을 추가한 후 작성하고 실행 - server.js
    2. 서버 실행 : node server.js 를 터미널에 입력 - 메시지 출력 확인
    3. 클라이언트에서 접속
      • 브라우저를 실행하고 url 입력
        • 자기 컴퓨터의 경우 http://localhost:8000, http://IP주소:8000
        • 다른 컴퓨터의 경우 http://서버컴퓨터의 IP:8000 (서버 컴퓨터의 방화벽이 해제되어 있어야 함)
        • 동일한 와이파이로 접속해야 다른 컴퓨터에서 접속이 가능함.
      • 서버 중지는 터미널에서 Ctrl + C
  7. 서버에서 html 파일을 읽어서 출력
    • ....
  8. request 객체
    • url : 클라이언트의 요청 경로
      • 요청 경로를 만들 때는 이해하기 쉬운 경로를 만들어 주어야 하고 '_' 사용은 하지 않는 것을 권장
    • method : 요청 방식 (CRUD)
      • GET : 서버 자원을 가져올 떄 사용 (조회 - READ)
      • POST : 서버에 자원을 등록하고자 할 때 사용 (삽입 - CREATE)
      • PUT : 서버의 자원을 수정하고자 할 때 사용 (수정 - UPDATE)
      • PATCH : 서버 자원의 일부분만 수정하고자 할 때 사용 (수정 - UPDATE, 권장하지는 않음)
      • DELETE : 서버 자원을 삭제하고자 할 때 사용 (삭제 - DELETE)
      • OPTIONS : 요청을 하기 전에 통신 옵션을 설명하기 위해서
  9. REST(Representational State Transfer) API
    • 서버의 자원을 정의하고 자원에 대한 URL을 지정하는 방법
    • URL 과 Method 만으로 작업을 예측할 수 있도록 하는 것
      • URL은 /member 이고 Method는 POST 라면 회원 가입
    • 클라이언트의 종류에 상관없이 동일한 작업은 동일한 URL로 처리
      • 클라이언트 애플리케이션을 서버 애플리케이션과 분리해서 구현하고 서버는 클라이언트의 뷰를 만들지 않고 데이터를 전송
      • 클라이언트 애플리케이션과 서버 애플리케이션을 하나의 프로젝트로 구현하면 모바일 기기의 Native Application 과 Web Browser 의 요청에 응답하는 부분을 동일한 URL로 처리할 수 없음.
      • IPhone에서 회원가입이 URL은 /member 이고 Method는 POST 라면 Android에서 동일해야 하고 Web Browser에서도 동일한 URL로 처리 되어야 함. (서버의 확장성 때문임)
    • 이렇게 만들어진 서버를 RESTful 하다고 함
  10. axios 라이브러리
    • 브라우저나 Node.js에서 Promise API를 이용해서 HTTP 비동기 통신을 할 수 있도록 해주는 API
    • 자바스크립트의 fetch api를 사용하기 쉽도록 해주는 라이브러리
    • axios 라이브러리 / fetch api 비교
      • axios 라이브러리
        1. 별도로 설치 필요
        2. XSRF 보호 제공
        3. 응답을 받으면 결과는 JSON 파싱한 결과
        4. 요청을 취소할 수 있고 타임아웃 설정 가능
        5. download 진행 중을 확인할 수 있음
      • fetch API
        1. 설치할 필요 없음
        2. XSRF 별도 제공하지 않음
        3. .json()을 호출해야 파싱된 결과를 만들수 있음
        4. 기능 없음
        5. 기능 없음
    •  XSRF(Cross-Site Request Forgery) : 쿠키만으로 인증하는 서비스의 취약점을 이용해서 사용자가 모르게 서비스에 특정 명령을 요청하는 것
      • 브라우저에서 삽입하겠다고 요청을 하기 위해서 폼을 조회했는데 이 폼의 URL을 복사해서 다른 기기에서 데이터를 삽입하는 작업을 수행하는 것이 대표적
    • Promise 를 이용한 사용
      • const axios = require('axios');
      • axios.요청 메서드(url).then((response) => {
      • 가져오는데 성공하였을 경우 수행할 내용
      • }).catch((error) => {
      • 에러가 발생했을 때 수행할 내용
      • }).then(() => {
      • 성공과 실패 여부에 상관없이 수행할 내용});
  11. Cookie 와 Session
    • HTTP 나 HTTPS 는 상태가 없음
      • 클라이언트가 서버에게 요청을 할 때 일시적으로 연결이 된 후 서버가 응답을 하고 나면 연결이 해제되버리기 때문에 다음 연결이 될 때는 이전에 어떤 상태였는지 알 수 없음. 
      • 클라이언트 와 서버가 이전에 어떤 상태였는지 알 수 있도록 하기 위해 Cookie 와 Session의 개념을 사용
    • Cookie
      • 클라이언트에 저장해서 클라이언트가 서버에게 요청할 때 마다 전송되는 객체
      • 쿠키는 http 나 https 요청의 헤더에 ' 이름과 값 ' 의 구조로 저장
      • node의 http 모듈에서 response.writeHead(코드, {'Set-Cookie':'쿠키이름=값'}) 의 형태로 작성
        • 쿠키가 여러개이면 ' ; ' 을 하고 추가
      • 쿠키의 옵션
        • 이름
        • Expires : 만료시간 - 날짜
        • Max-age : 만료시간 - 초
        • Domain : 도메인 // 같이 사용할때 생각해볼 필요가 있음
        • Path : URL
        • Secure : HTTPS 인 경우만 전송 // 보안 때문
        • HttpOnly : 자바스크립트에서 수정을 못하도록 하는 경우 사용
    • Session
      • 클라이언트의 정보를 서버에 저장하는 기술
      • 클라이언트에 저장하게 되면 노출이 되고 이를 수정할 수 있기 때문에 보안에 취약 함
      • 노출이 되면 안되는 데이터를 서버에 자장하고 클라이언트에서는 이 정보를 구별할 수 있는 세션 키만 저장
      • 클라이언트와 서버가 동일한 도메인인 경우만 가능하지만, 쿠키를 이용하면 클라이언트와 서버의 도메인이 달라도 가능함
      • 주로 로그인 정보를 저장하는데 많이 이용하였으며, 최근에는 JWT(Json Web Token)를 이용하는 것을 권장하면서 사용빈도가 줄어듬
    • Cookie의 대안
      • Web Storage, WebSQL, Indexed DB 같은 HTML5 API를 이용하기도 함.
  12. https 모듈
    • http 서버를 https 로 변경하기 위한 모듈
    • https 는 암호화를 위한 인증서가 필요 - 무료나 유료로 인증서를 발급받아야 이 모듈을 사용하는 것이 가능
      • https는 데이터가 암호화되서 전송되기 때문에 중간에 가로채도 변경을 할 수 없음
      • https를 사용하면 데이터 전송 간에는 암호화를 할 필요가 없는데 개발자들은 혹시 모르는 경우를 대비하여 해야한다고 하는 편임.
    • 최근에는 브라우저에서 https 서버가 아니면 접속을 못하도록 하기도 함
    • 스마트폰에서는 http에 접속하려면 별도의 설정을 추가해야함
    • https 모듈의 속도를 개선한 https2 모듈도 있음
  13. cluster
    • CPU 코어를 전부 사용할 수 있도록 해주는 모듈
    • 여러 개의 연산을 동시에 수행할 수 있도록 해주는 모듈
    • 직접 서버 설정을 한다면 사용하지만 최근처럼 Cloud를 사용하는 경우는 직접 설정하지 않음

 

** express 모듈을 이용한 웹 서버 생성 및 실행

  1. express 모듈
    • 내장 모듈이 아님 - 설치가 필요
    • http 모듈을 가지고 웹 서버를 만들 수 있는데 가독성이 떨어 지고 확장성이 떨어짐
    • http 모듈 보다는 코드 관리가 용이하고 편의성이 높은 모듈
    • 이 모듈을 제외하고 웹 서버를 생성해주는 모듈은 여러가지가 있고 최근에도 추가되고 있음
    • 현재 가장 많이 사용되는 노드의 웹 서버 모듈
  2. 패키지 설치
    • express(웹 서버 제작을 위한 모듈), nodemon(소스 코드를 수정하면 자동으로 재시작되도록 해주는 모듈)
      • npm install express
      • npm install --save-dev nodemon
  3. package.json 파일의 설정을 수정
    • main 속성에 시작 파일의 이름을 설정 : app.js
    • script 속성에 "start" : "nodemon app" 이라는 태그 추가
      • npm start 라는 명령을 실행하면 nodemon app 이라는 명령을 수행
  4. express web server의 기본 틀
    1. const express = require('express'); // 모듈 가져오기
    2. const app = express(); // 웹 서버 인스턴스 생성
    3. app.set('port', 포트번호); // 포트 설정
    4. // 사용자의 요청을 처리하는 코드
    5. app.listen(app.get('port'),()=>{
    6. // 서버가 정상적으로 구동되었을 때 수행할 내용
    7. // 일반적으로는 콘솔에 메시지를 출력
    8. });
  5. 사용자의 요청을 처리하는 함수
    1. 종류 - 요청 방식에 맞는 함수를 적용
      • app.get
      • app.post
      • app.delete
      • app.put
      • app.patch
      • app.option
    2. 함수의 매개변수
      • 첫번째는 url
      • 두번째는 2개의 매개변수를 갖는 콜백 함수로 이 함수가 url 요청이 왔을 때 호출됨
        • 콜백 함수
          • 첫번째 매개변수는 사용자의 요청 객체 (request)
          • 두번째 매개변수는 사용자에게 응답을 하기 위한 객체 (response)
    3. 사용자에게 응답
      • 직접 작성 : response.send(문자열)
      • html 파일 출력 : response.sendFile(html 파일 경로)
  6. 웹 서버 만들기
    1. 출력할 html 파일 1개 생성 - maindex.html
    2. package.json 파일에 entry point(시작 포인트)로 설정한 파일을 생성하고 웹 서버를 구동시키는 코드를 작성
    3. 구동
      • npm start 또는 node 작성한 스크립트 파일명
        • 특별한 경우가 아니면 npm start로 실행
    4. 정상적으로 구동되었으면 브라우저에서 확인
      • http://localhost:3000
  7. 요청 객체 : 일반적으로 request 객체라고 함.
    • 클라이언트의 요청 정보를 저장하고 있는 객체
      • request.app : app 객체에 접근
      • request.body : body-parser 미들웨어가 만드는 요처의 본문을 본문을 해석한 객체
        • post 나 put 요청이 왔을 때 파라미터 읽기
      • request.cookies : 쿠키 정보를 가지는 객체
      • request.ip : 요청을 전송한 클라이언트의 ip 정보 - ip를 알면 접속한 국가를 알 수 있음.
      • request.params : 라우트 매개변수에 담긴 정보
      • request.query : query string - get이나 delet 요청에서 파라미터 읽기
      • request.get(헤더이름) : 헤더의 값 가져오기, 인증에서 많이 사용, 최근에는 API 사용 권한을 토큰을 이용해서 발급하고 토큰의 값을 헤더에 저장해서 전송하도록 만드는 경우가 많음
      • request.signedCookies : 서명된 쿠키 정보
      • request.session : 세션 객체
  8. 응답 객체 - response 객체
    • response.cookie(키, 값, 옵션) : 쿠키 생성
    • response.clearCookie(키, 값, 옵션) : 쿠키 삭제
    • response.end() : 데이터 없이 응답을 보냄
    • response.json(JSON 문자열) : JSON 형식으로 응답
    • response.redirect(URL) : 리다이렉트
    • response. render(뷰이름, 데이터) : 템플릿 엔진을 이용해서 서버의 데이터를 html에 출력하고자 할 때 사용
      • 이를 서버 랜더링이라고 함.
    • response.send(메시지) : 메시지를 화면에 출력
    • response.sendFile(파일경로) : 파일을 읽어서 화면에 출력
    • response.set(헤더이름, 값) : 헤더를 설정
    • response.statuse(코드) : 응답 코드 설정
  9. dotenv
    • .env 파일을 읽어서 process.env 로 생성해주는 패키지
      • .env 파일에 작성한 내용을 소스 코드에서 process.env 객체를 이용해서 사용 가능하도록 하는 패키지
    • 환경의 변화(개발 환경, 운영 환경, 테스트 환경) 때문에 변경되는 설정을 별도의 텍스트 파일에 만들어두면 환경이 변경 될 때 텍스트 파일의 내용만 변경하면 되기 때문에 컴파일이나 빌드를 다시 할 필요가 없음.
      • 이러한 정보의 대표적인 것이 데이터베이스 접속 위치와 API 키임.
  10. Middle Wave
    • 사용자의 요청이 발생하고 서버가 요청을 처리하고 응답을 전송하는 시스템에서 요청을 처리하기 전이나 후에 동작할 내용을 수행하는 객체
    • 요청을 처리하기 전에 수행하는 일은 필터링이고 요청을 처리한 후 수행하는 일은 변환임
      • 필터링을 할 때는 유효성 검사 작업과 로그인 확인 작업이 대표적
    • node 에서는 app.use(미들웨어) 형태로 장착
      • app.use(미들웨어) : 모든 요청에서 미들웨어가 동작
      • app.use(url, 미들웨어) : url에서만 미들웨어가 동작
    • next() : 현재 미들웨어에서 다음 미들웨어로 넘어가는 함수
      1. morgan
        • 로그를 기록해주는 미들웨어
        • morgan(format,options) 으로 사용
          1. format
            1. dev : 개발용, 배포를 할 때는 모두 삭제
            2. tiny
            3. short
            4. common
            5. combined
          2. options
            1. immediate : response에 기록하는 것이 아니고 request에서 기록(에러가 발생해도 기록됨)
            2. skip : 로깅을 스킵하기 위한 조건을 설정
            3. stream : 기본적으로 로그는 화면에 출력되지만 파일에 출력하고자 할 때 사용
        • 로그 파일을 생성해주는 패키지 : npm install file-stream-rotator
          • 이 패키지를 이용하면 주기적으로 파일을 생성해서 로그를 기록하는 것이 가능
        • 로그 형식
          • HTTP요청방식 요청URL 상태코드 응답속도 트래픽
        • 조금 더 자세한 로그를 원하는 경우에는 winston 패키지를 사용
      2. 날짜 별로 로그 파일에 로그를 기록
        1. 패키지 설치 : mogan, file-stream-rotator
        2. 서버를 다시 생행하고 log 디렉토리와 오늘 날짜로 된 파일이 생성되는지 확인해보고 브라우저에서 접속한 후 로그 파일을 확인
      3. static(정적 - 내용이 변하지 않는)
        • 정적인 파일의 경로를 설정하는 미들웨어
        • 사용하는 방식
          • app.use(url, express.static(실제 경로));
          • url 요청이 오면 실제 경로에 있는 파일을 출력
        • 예 : app.use('/',express.static(path.join(__dirname,'public'));
          • /index 라고 요청을 하면 프로젝트 안에 있는 public 디렉토리의 index라는 파일을 출력함
          • 요청 경로와 실제 파일의 경로를 일치하지 않도록 하기 위해서
      4. body-parser
        • 요청의 본문을 해석해주는 미들웨어로 별도로 설치할 필요 없음.
          • express를 설치하면 자동으로 설치가 됨
        • 클라이언트에서 post 방식이나 put(patch) 방식으로 데이터를 전송할 때 그 데이터를 읽기 위한 미들 웨어
        • 설정
          1. app.use(express.json());
          2. app.use(express.urlencoded({extended : false}));
        • 파일을 전송하는 경우에는 다른 미들웨어를 사용해야함.
      5. compression
        • 데이터를 압축해서 전송하기 위한 미들웨어
          • 클라이언트에게 결과를 전송할 때 압축을 해서 전송하기 때문에 트래픽이 줄어듬
        • 외부 모듈이라서 설치해야 함
          • npm install compression
        • 설정
          1. const compression = require('compression');
          2. app.use(compression());
      6. 쿠키를 해석할 수 있도록 해주는 미들웨어
        • app.use(cookieParser(key)); 를 작성하면 서버에서 쿠키를 읽을 수 있음.
          • request객체.cookies 하게 되면 모든 쿠키가 넘어오게 됨.
      7. express-session
        • session(사용자의 정보를 서버에 저장) 관리를 위한 미들웨어 - Cookie는 클라이언트에 저장
        • 클라이언트 측에서 이전 작업에 이어서 다른 작업을 하고자 할 때 세션을 이용
        • 세션은 서버의 메모리를 사용하기 때문에 세션이 너무 크거나 많아지면 서버의 성능이 저하됨
          • 이런 경우는 세션을 파일이나 데이터베이스에 유지하는 것이 좋음
      8. 세션을 사용하는 예제 : 새로고침을 하면 이전 내용에 +1을 출력하기
        • 세션을 사용하기 위해서는 express-session 패키지 이용
        • 세션은 접속한 브라우저 별로 따로 생성 됨
        • 브라우저에서 접속을 하고 새로 고침을 한 후 다른 브라우저에서 동일한 URL로 접속해서 num 과 req.session.num을 비교
더보기

※  "Forwarding" 와 "Redirect"

  • 서버에서 화면을 만들 때만 의미를 갖음. API Server를 만드는 경우레는 해당 사항 없음
  • Forwarding 은 현재 흐름을 유지한 채 이동하는 것으로 URL이 변경되지 않음, node 에서 html을 출력할 때 기본
  • Redirect는 현재 흐름을 끊어 버리고 이동하는 것으로 URL이 변경됨
  • Fowarding은 조회 작업에 사용하고 그 이외의 작업은 redirect를 해야 함
  • Fowarding을 하게 되면 새로 고침을 했을 때 작업이 다시 이루어 짐
  • Redirect를 하게 되면 새로고침을 할 때 결과만 새로 고침이 됨.
  • 새로고침을 가지고 판단하는 것이 좋음
  • 대부분의 경우 조회는 forwarding을 해야 하지만 트래픽을 줄이고자 할 때는 조회도 redirect 하기도 함
  • 삽입, 삭제, 갱신은 반드시 redirect 해야 함

 

프로젝트를 만들게 되면 프로젝트 내의 파일은 2가지로 분류함.

하나는 소스 코드이고 다른 하나는 소스 코드 이외의 자원임.

자원을 읽어서 사용하는 것이 소스 코드 실행을 위한 코드임

 

<코드가 실행되는 과정>

소스 코드 -> 컴파일해서 운영체제나 Virtual Machine 이 이해할 수 있는 코드로 변경( 이상황에서 에러가 발생하면 문법 오류) -> 컴파일이 끝나고 나면 번역된 파일들을 실행할 수 있도록 작업을 함. 이 작업을 build 라고 함. (이 과정에서 에러가 발생하면 구조를 잘못 만든 것) -> 실행

 

실제 배포를 할 때는 소스 코드를 배포하는 것이 아니고 빌드 된 내용을 배포함.

소스 코드를 수정하면 컴파일과 빌드를 다시 해야 함

소스 코드를 되도록 수정하지 않고 업데이트를 하거나 환경을 변경하는 것이 가능하도록 프로그램을 제작하는 것이 바람직함.

이것 때문에 DevOps 나 CI/CD를 공부하는 것임.

 

클라이언트 <-> 서버 프로그래밍

클라이언트가 요청을 보내면 서버가 처리를 하고 결과 또는 화면을 클라이언트에게 전송

클라이언트에서 서버에게 적절하게 요청을 하면 서버가 그 요청을 받는데 이 때 클라이언트가 데이터를 같이 보내는 경우가 있는데 그러면 서버는 그 데이터를 읽어서 작업을 수행(비지니스 로직을 처리하는 것와 데이터를 반 영구적으로 저장하고 읽어오는 것)하고 결과 나 화면을 만들어서 전송을 함.