3계층으로 나누어 별도의 논리적/물리적인 장치에 구축 및 운영하는 형태
사용자가 마주하는 계층 - 주로 사용자 인터페이스 지원(GUI, FrontEnd) → 사용자 인터페이스와 관계없는 데이터를 처리하는 로직 포함 X
Web Server
요청되는 정보를 어떠한 규칙을 바탕으로 처리하고 가공하는 것 담당(동적 데이터)
미들웨어 or 백엔드 라고 불림
Java가 이 계층에 속함
주로 DB와 DB에 접근하여 데이터를 읽거나 쓰는 것
DBMS가 이 계층에 해당
MySQL, Redis, MongoDB 등이 이 계층에 속함
3-tier
클라이언트, 어플리케이션, 데이터 계층으로 서버를 모두 물리적으로 나누어 구성하는 방법
→ 각각의 계층에서 변화가 일어나더라도 서로 영향을 받지 않고 독립적 운영
웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠를 제공
Web Server
는 파일 경로 이름을 받아와 경로와 일치하는 파일 반환css
, html
, javascript
, image
등WAS
를 거치지 않고 바로 자원 제공WAS
에 보내고, WAS
가 처리한 결과를 클라이언트에게 전달(응답)DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공
웹 애플리케이션 실행 및 데이터 처리, 웹 서버와 클라이언트 간 중계 역할
WAS
를 통해 요청에 맞는 데이터를 가져와서 비즈니스 로직에 맞게 결과를 만들어 제공함으로써 자원을 효율적으로 사용Web Server
에 의해 실행되는 프로그램을 통해 만들어진 결과물open source webserver 및 reverse proxy server software로, 고성능 및 확장 가능한 웹 응용 프로그램을 제공하기 위해 설계된 소프트웨어
apach Http server와 함께 가장 많이 사용되는 "웹서버"
nginx
를 사용하는 이유비동기 I/O 처리 방식을 사용하여 높은 성능 제공 → 대규모 웹 사이트에서도 빠른 응답 시간 보장
적은 메모리 사용 → 서버 비용 절약
클라이언트가 보내는 요청이 Text일 경우 gzip을 사용하여 해당 데이터 압축
이벤트 루프 방식 을 사용해 높은 성능 제공 → 여러 요청이 들어왔을 때 많은 트래픽을 동시에 처리하여 빠른 응답시간 보장
forward proxy(정방향 프록시)
: 사용자
들이 사이트에 접속할 때 ip주소를 숨기기 위해 중간에 프록시
를 두어 데이터를 주고받는 것주 당국 또는 기관의 검색 제한을 피하기 위해
특정 컨텐츠에 대한 엑세스 차단
자신의 신원 보호
reverse proxy(역방향 프록시)
: 손님들에게서 서버
의 정보를 숨김 → 서버 내부적으로 파일이 어디에 들어있는지, 서비스가 몇 번 포트로 돌고 있는지 등을 감춤하나 이상의 웹 서버 앞에 위치하여 클라이언트의 요청을 가로채는 서버
어떤 클라이언트도 원본 서버와 직접 통신하지 못 하도록 막음
많은 사용자가 있는 서버의 경우 단일 원본 서버로 들어오는 모든 트래픽을 처리하지 못할 수 있음
동일한 사이트에 대한 요청을 서로 다른 서버 풀에 분산
로드 밸런싱
원본 서버의 IP 주소를 공개할 필요가 없음 -> 공격하기 어려움
웹 사이트는 전 세계 여러 서버에 분산 가능
클라이언트를 지리적으로 가장 가까운 서버로 보냄 -> 요청과 응답이 이동하는 거리가 줄어 로드 시간 최소화
한 번 연결하고 난 후 응답데이터를 캐싱할 수 있음. 다음 사용자는 리버스 프록시 서버에서 캐시된 데이터를 가져오기 때문에 성능이 빨라짐
각 클라이언트에 대한 SSL통신의 암호화 및 암호 해독은 원본 서버의 경우 계산 비용이 많이 들 수 있음
리버스 프록시를 통해 모든 요청을 해독하고 나가는 모든 응답을 암호화하여 원본 서버의 리소스 확보
얄팍한 코딩사전
Nginx란 무엇인가?
Nginx에 대하여
스레드/프로세스 기반의 구조
http 요청이 올때마다 스레드나 프로세스를 새로 만들기 때문에 많은 수의 사용자가 동시 접속을 할 수록 CPI 부하가 높아짐 → 동시에 연결된 커넥션이 10,000개 이상이 되면 하드웨어 성능과 관계없이 서버가 더 이상의 커넥션을 형성하지 못하는, C10K 문제 발생
비동기 이벤트 기반의 구조
더 적은 리소스로 처리 가능
비동기 처리 : 작업이 서로 독립적으로 실행되어, 한 작업이 완료될 때까지 다른 작업이 중단되지 않고 계속 진행되는 방식
위에서 말한
WAS(Web Application Server)
의 한 종류동적인 웹을 만들기 위한 웹 컨테이너, 서블릿 컨테이너라고 불림
정적으로 처리해야할 데이터를 제외하고는 톰캣에게 전달
동적인 데이터 처리 가능, DB연결, 데이터 조작, 다른 응용프로그램과 상호 작용
Java EE 기반
서블릿 컨테이너
역할서블릿 컨테이너
: HTTP 요청을 받아 웹 페이지를 동적으로 생성컨테이너
: 동적인 데이터를 받아 가공하여 정적인 파일(HTML)로 만드는 것서블릿
: 클라이언트의 요청을 받아 처리하고, 그 결과를 클라이언트에게 제공하는 자바 인터페이스Spring Boot
는 내장 tomcat
을 가지고 있음 jar
: tomcat
이 내장된 빌드 파일war
: tomcat
이 내장되지 않은 빌드 파일 → 다른 WAS
연결 가능
CI
/CD
를 위한 오픈 소스 도구로, 소프트웨어 개발 생명주기 자동화
소프트웨어 개발 시 지속적 통합 서비스 를 제공하는 툴
개발자들이 동시에 작업한 코드 변경 사항을 통합하고, 이를 실제 환경에 지속적으로 배포하는 프로세스
CI
: Continuous Integration - 지속적 통합 → 개발자들이 작성한 코드를 중앙 저장소에 자주 통합하고, 자동화된 빌드와 테스트를 통해 문제를 빠르게 발견하고 해결하는 것 -> 서로의 코드와 충돌 없이 효율적으로 협업
CD
: Continuous Deployment - 지속적 배포 → 모든 변경사항을 자동화된 테스트와 빌드를 거친 후, 실제 사용자에게 자동 배포 -> 새로운 기능이나 수정사항을 빠르게 사용자에게 제공
jenkins
를 사용하여 코드 변경 사항이 발생할 때마다 자동으로 빌드, 테스트, 배포 과정 수행 가능
→ 코드 변경에 따른 빌드 및 테스트 과정을 수동으로 수행할 필요가 없어지며, 신속하게 개발에 대한 코드 검증 및 배포 가능, 휴먼 에러 방지
개인이 확인하지 못한 코드 표준 준수 여부의 검사나 정적 분석을 통한 코드 품질 검사를 빌드 내부에서 수행
마스터-슬레이브 아키텍처
마스터
노드 : controller
라고 불리며, 슬레이브
를 관리하고 작업 스케줄링과 모니터링 을 포함하여 다양한 작업 관리 → 작업 관리, 스케줄링, 플러그인 관리슬레이브
노드 : agent
라고 불리며, 실제 파이프라인 작업 수행. 다양한 환경에서 작동, 작업을 분산시켜 부하 감소 → 실제 빌드 및 테스트 작업 코드가 보관되어 있는 git 저장소에 코드 변경사항을 감지하여 자동으로 파이프라인 수행
파이프라인이 실행되면 `Agent(Slave)`를 통해 파이프라인 스크립트에 정의된 작업 실행 → 소스 코드 빌드, 코드 검증 테스트 등 여러 작업 순차 진행
파이프라인에서 정의한 배포 작업에 따라 애플리케이션 배포
우리 동아리에서 운영하는 프로젝트의 Jenkins
를 한 번 보자
그냥 설명하는 부분이다
GitHub 링크를 연결해준다
몇 개의 빌드를 저장할 지 선택할 수 있다
이걸 통해서 롤백을 하는 것 같다
SCM
부분이다
Repository URL
에 있는 Git 프로젝트에 접근을 한다
Credentials
은 해당 프로젝트에 접근할 때 필요한 인증 정보를 넣어놓는 곳이다
Branches to build
에 있는 브랜치에 체크아웃하여 빌드를 진행한다
다음은 빌드환경이다
SSH 서버
의 이름을 지정해주고, Transfer 부분에서 설정을 해준다
Source files
을 통해서 전송할 파일이나 디렉토리의 경로를 정해준다
Remove prefix
를 통해서 전송할 파일의 경로에서 제거할 접두사를 정해준다
Remote directory
를 통해서 파일을 전송한 원격 서버의 디렉토리를 정해준다
Exec command
를 통해서 파일을 전송한 후 원격 서버에서 실행할 명령을 정해준다
Jenkins
가 빌드를 트리거 → 수동으로 시작하거나 트리거를 통해 시작
Repository URL
에 설정된 Git에서 최신 소스 코드에 체크아웃
빌드 도구를 사용하여 프로젝트 빌드 → .jar
파일 생성
빌드가 성공하면 설정된 SSH 서버
로 빌드 아티팩트 전송 → 코인에서는 KOIN_API_V2.jar
파일을 koin_api_v2
디렉토리에 전송
파일 전송 후 Exec command
에 있는 명령 실행