교육/코드스테이츠
[14일차] Was & Web Server
nooh_ij
2022. 12. 15. 17:49
서버(Server)란?
- - 사용자의 요청을 받고, 이에 따른 응답과 데이터를 보내주는 역할을 수행한다.
- - 서비스를 제공하는 컴퓨터 내의 프로그램을 의미한다.
- - 이러한 프로그램(소프트웨어)이 실행되는 컴퓨터(하드웨어) 역시 서버라고 불린다.
서버의 종류
- 웹 서버(Web Server)
- 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 있는 그대로 반환하는 서버를 말한다.
- 이 때 웹 페이지는 그림, CSS, JS을 포함하며, 이러한 파일들을 정적 파일이라고 부른다.
- 정적 파일들을 브라우저에 그대로 전달하는 역할을 하기 때문에 웹 서버는 정적 웹 서버(Static Web Server)라고 부르기도 한다.
- 웹 서버의 예시로는 nginx, Apache Web Server 등이 있다.
- 웹 애플리케이션 서버(Web Application Server)
- 데이터를 동적으로 처리해서 제공하기 위해 만들어진 서버를 의미
- 웹 서버와 같이 웹 페이지를 전달하는 역할을 하지만 WAS의 핵심 역할은 웹 페이지를 구성하는 동적인 컨텐츠를 생성하거나 업데이트 하는 비즈니스 로직을 수행할 수 있게 한다.
- 서버 측 비즈니스 로직에 클라이언트가 접근할 수 있는 방법을 제공하는 것이다.
- 역할을 수행하기 위해서 웹 애플리케이션 서버가 갖는 특징이 있다.
- 웹 페이지를 구성하는 동적인 요소를 생성하는 서버 사이드 코드가 구동될 수 있는 프로그래밍 언어적 런타임 혹은 소프트웨어 엔진을 제공한다.
- 웹 애플리케이션 서버의 클라이언트는 애플리케이션 그 자체가 될 수도 있고, 웹 서버나 다른 웹 애플리케이션 서버, 데이터베이스 서버가 될 수도 있다. WAS를 사용한다면 경우에 따라 다양한 형태의 아키텍처가 생성될 수 있다.
웹 어플리케이션 서버(WAS)는 복잡한 비즈니스 로직, 데이터 베이스와 통신 등을 책임지며 웹 서버는 WAS와 통신해서 얻은 결과 값을 바탕으로 가공 작업을 거친다. 최종적으로 만들어진 동적인 웹 파일을 클라이언트에게 전달해 주며. 기본적으로 동적 웹은 정적 웹에 비해 복잡한 로직들과 리소스를 필요로 한다고 보면 된다.
- 데이터베이스 서버
- - 데이터베이스 서버는 사용자가 데이터베이스에 연결할 수 있도록 해준다.
- - 데이터베이스는 사용자 정보나 사진, 동영상 등에 대한 정보를 담고 있는 서버이다.
- - 데이터베이스 서버의 종류로는 MySQL, MongoDB, Oracle 등 여러 종류로 또 나뉘어진다.
- 프록시 서버
- - 리소스를 요청하는 클라이언트와 응답으로 리소스를 전달하는 서버 사이에 중계 역할을 하는 서버를 의미한다.
- - 어디에 위치하느냐에 따라 포워드 프록시와 리버스 프록시로 나누어진다
- - 수행하는 기능으로는 보안, 캐시, 로드밸런싱 등이 있다.
정적 웹사이트와 동적 웹사이트
- 정적 웹사이트
- - 정적(static)은 외부 환경에 관계 없이 일정한 결과값을 제공해주는 걸 의미
- - HTML 파일(코드) 자체로 배포되는 사이트 (CSR, Client Side Rendering)
- 동적 웹사이트
- - 외부 환경에 따라 다른 결과값을 제공해주는 걸 의미
- - 서버에 의해 HTML 파일이 동적으로 생성되는 사이트 (SSR, Server Side Rendering)
- - 동적 웹은 클라이언트의 요청에 따라 다양한 화면을 제공해 준다.
- ex) 로그인을 한 후 마이페이지를 들어가면 각기 다른 정보를 확인할 수 있다
- SPA : Single Page Application
- 최초 한번 페이지 전체를 로딩한 이후 부터는 데이터만 변경하여 사용할 수 있는 웹 어플리케이션
- Client Side Rendering
클라이언트 사이드 렌더링은 SPA로, 클라이언트 사이드에서 HTML을 반환한 후에, JS가 동작하면서 데이터만을 주고 받아서 클라이언트에서 렌더링을 진행하는 것이다.
점점 더 복잡해지는 웹페이지를 구현하기 위해서 전통적인 방식의 SSR보다는 CSR로 웹을 구현하는 경우가 많아진다.
- Server Side Rendering
서버에서 렌더링을 작업하는 렌더링 방식, 전통적인 웹 어플리케이션 렌더링 방식으로 사용자가 웹 페이지에 접근할 때, 서버에 각각의 페이지에 대한 요청을 하며 서버에서 html, js 파일 등을 다 다운로드해서 화면에 렌더링하는 방식이다.
빌드와 빌드 도구
- 빌드
- 프로그램의 소스 코드를 독립적인 아티팩트(artifact)로 변환하는 과정이다.
- 아티팩트 그 자체로도 실행이 가능하며, 대체로 런타임(소프트웨어 실행 환경)이 필요한 경우가 많다.
- 아티팩트: 운영체제나 애플리케이션을 사용하면서 생성되는 흔적을 말한다
- 프레임워크
- 소프트웨어 개발을 쉽게 만들어주기 위해 필요한 도구, 규약의 집합체이다.
- 프레임워크 없이 밑바닥부터 모든 코드를 작성하는 것도 가능하지만, 프레임워크를 통해 만들고자 하는 소프트웨어의 기본 골격이 제공되기 때문에, 현대의 소프트웨어 개발에서는 많은 부분을 프레임워크에 의존한다.
- 백엔드 웹 애플리케이션 개발용 프레임워크
- Spring (Java, Kotlin), Django (Python), Express (JavaScript)
- 프론트엔드 웹 애플리케이션 개발용 프레임워크
- React 및 관련 라이브러리 (JavaScript), Vue.js, Svelte (JavaScript)
대표적인 빌드 도구
JavaScript 기반의 React 생태계
React 프레임워크를 사용하는 경우 create-react-app 또는 next.js 와 같은 프레임워크를 사용합니다. 이 경우 대부분 다음과 같은 과정으로 프로덕션용 빌드 결과물(아티팩트)를 만들어낼 수 있습니다.
- node.js 개발 환경 준비
- 프로젝트 폴더로 이동 - package.json 파일이 있는지 확인합니다
- 의존성 (dependency) 설치 - npm install 명령 입력
- 빌드 - npm run build 명령 입력
- 빌드 결과물 확인
- - build 폴더 확인
- - React는 프론트엔드 웹 애플리케이션으로 결과물로는 HTML, CSS, JS 파일을 포함한다
- - 이후 이 파일들을 nginx 등에서 정적 호스팅할 수 있습니다.
- 의존성 설치 후 빌드하지 않고, 바로 애플리케이션을 실행하기 위해서는 npm run start 등의 명령어를 사용할 수 있습니다. 마찬가지로, 애플리케이션에 단위 테스트가 제공된다면, 애플리케이션의 테스트를 위해 npm run test 명령어를 사용합니다. 각 프로젝트에서 사용하는 package.json 파일이 어떻게 구성되어 있느냐에 따라 달라질 수 있습니다.
- Java/Kotlin 기반의 Spring Boot 생태계 (Gradle)
- Java/Kotlin 애플리케이션을 빌드하면 JVM(자바 런타임) 위에서 실행되는 war 파일이 아티팩트로 생성된다.
- Spring 및 Spring Boot 생태계에서는 대표적인 빌드 도구가 두가지(maven, Gradle)가 있다.
- 그 중에서 여기서는 Gradle 위주로 간략하게 흐름을 설명합니다.
- 자바 개발 환경(JDK, OpenJDK가 대표적) 준비
- gradle 설치
- 프로젝트 폴더로 이동
- 빌드 - gradlew build 명령 입력
- 자바 애플리케이션은 실행을 위해서 빌드가 필수적이다
- - 빌드 후에 실행을 위해서 gradlew bootRun 명령을 통해 애플리케이션의 실행이 가능하다
- 빌드가 필요없는 경우
- node.js 앱이나 Python과 같이 소스 코드 그대로 런타임을 실행할 수 있는 경우, 즉 다른 변환 작업이 필요없는 경우에는 빌드 과정이 생략될 수 있다.
- package.json
- npm 모듈을 활용하기 위해 해당 모듈에 대한 정보를 담은 파일
- 즉, 프로젝트 전반에 관한 정보가 들어있다
- dependency (의존성 모듈) 프로그램 실행과 관계없는 오로지 개발을 위해 필요한 모듈 확인
- scripts: CLI에서 사용 가능한 명령을 기술한다 – npm run <스크립트 이름>
- npm
- Node Package Manager로 일종의 앱스토어다
- 필요한 모듈을 다운로드할 수 있는, 모듈들이 모여있는 모듈 스토어이다.
- npm init: package.json파일을 생성한다
- npm install [패키지명]: 패키지를 설치 (npm i [패키지명]으로도 사용 가능)
- npm uninstall [패키지명]: 패키지를 삭제한다 (npm rm [패키지명]으로도 사용 가능)
- npm update [패키지명]: 패키지를 업데이트 한다.
- npm run [스크립트명]: package.json의 "script" 프로퍼티 중 지정한 스크립트를 실행한다.