웹서버 vs WAS, Stack과 Queue 그리고 Array와 Linked List 의 차이

송현진·2023년 7월 27일

Java

목록 보기
5/11
post-thumbnail

웹 서버

"웹 브라우저 클라이언트로부터 HTTP 요청을 받아드리고 HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램"

  • 정적 컨텐츠를 제공하는 서버
  • 동적 컨텐츠 요청 받으면 WAS에게 요청을 넘겨주고, WAS에서 처리한 결과를 클라이언트에게 전달해주는 역할도 한다

    정적 컨텐츠
    웹 서버에서 요청에 알맞은 파일 반환, 항상 동일한 페이지 반환
    단순 HTML 문서, CSS, javascript, 이미지, 파일 등 즉시 응답 가능한 컨텐츠

WAS

"인터넷 상에서 HTTP 프로토콜을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어로서, 주로 동적 서버 컨텐츠를 수행하는 것으로 웹 서버와 구별 되며, 주로 데이터베이스 서버와 같이 수행"

  • 웹 서버 단독으로 처리할 수 없는 데이터 베이스 조회나 다양한 로직 처리가 필요한 동적 컨텐츠 제공

    동적 컨텐츠
    데이터베이스, 서버 내 로직 등 활용해 만들어진 컨텐츠 반환
    php, jsp, asp 등

웹서버와 WAS의 차이

"동적인 컨텐츠를 다룰 수 있는가?"

  • 웹 서버는 정적 컨텐츠만 줄 수 있다
  • WAS는 어떤 애플리케이션을 돌리고, DB를 연결하고, 어떤 로직을 수행해서 만든 데이터를 전달할 수 있다.

WAS를 사용해 클라이언트가 서버로부터 데이터 받는 방식

  1. 클라이언트가 웹 서버에 데이터 요청
  2. 웹 서버에서 동적 컨텐츠이지 확인
    • 동적 컨텐츠라면 웹 컨테이너로 이동
    • 정적 컨텐츠라면 클라이언트에게 데이터 전송
  3. 동적 컨텐츠를 전송받은 웹 컨테이너는 Servlet 구동환경 제공
  4. 제공 받은 환경에서 동적 컨텐츠를 생성하고 이를 웹서버에 넘겨줌
  5. 넘겨 받은 동적 컨텐츠를 클라이언트에게 제공

WAS에서 모든 기능을 수행하면 되지 않나? 웹 서버를 왜 사용할까?

기능을 분리하여 서버 부하를 방지한다.

  • WAS는 DB 조회, 다양한 로직을 수행하느라 바빠서 단순 정적 컨텐츠는 웹 서버에서 빠르게 클라이언트에게 제공하는 것이 좋다
  • 정적 컨텐츠 요청까지 WAS가 수행하게 되면 부하가 커지게 되고, 동적 컨텐츠 처리가 지연됨에 따라 수행속도가 느려진다

물리적으로 분리하여 보안을 강화시킨다.

  • SSL에 대한 암복호화 처리에 웹 서버 사용

여러대의 WAS를 연결해 로드 밸런싱 용도로 사용할 수 있다.

  • Fail over, Fail back 처리에 유리하다
  • 대용량 웹 애플리케이션의 경우, 웹 서버와 WAS를 분리해 오류가 발생한 WAS를 사용하지 않고, 다른 WAS를 사용하게 만듦으로써 무중단 운영 가능하게 한다

여러 언어의 웹 애플리케이션 서비스가 가능하다.

  • 하나의 서버에서 PHP Application, Java Application을 함께 사용하는 등과 같이 여러 웹 애플리케이션의 활용이 가능해진다
  • Tomcat은 Java 언어만 해석 가능하다. JSP 같은 경우, 처리가 가능하지만 PHP는 실행이 불가능하다. 그러므로, 웹 서버로 Apache를 사용해 PHP를 사용할 수 있게 만들 수 있다

Stack

쌓아 올리는 자료구조이다.
같은 구조와 크기의 자료를 정해진 방향으로 쌓을 수 있고, 한 방향으로만 접근할 수 있다.
top을 통해서 push, pop을 하면서 삽입과 삭제가 일어난다. 즉, Last-In-First-Out(LIFO)인 선입 후출 구조이다.
List로 구현하면 객체를 제거하는 작업이 필요하다. 하지만 Array로 구현하면 삭제할 필요 없이 index를 줄이고 초기화만 하면 되므로, Array로 구현하는 것이 좋으며 DFS나 재귀에서 사용된다.

Queue

원소의 줄을 세우는 자료구조이다.
한쪽 끝에서 삽입 작업을 하고 다른 쪽 끝에서 삭제 작업을 진행한다. 즉, First-In-First-Out(FIFO)인 선입선출 구조이다.
주로 데이터가 입력된 시간 순서대로 처리되어야 하는 경우 사용한다.
Array로 구현하면 poll 연산 이후 객체를 앞당기는 작업이 필요하다. 하지만 List로 구현하면 객체 1개만 제거하면 되므로 삽입 및 삭제가 용이한 LinkedList로 구현하는 것이 좋으며 BFS나 캐시를 구현할 때 사용된다.

Array

Random Access를 지원한다.
연관된 데이터를 연속적인 형태로 구성된 구조를 가진다.
배열에 포함된 원소는 순서대로 index가 붙는다.

Random Access(비순차 접근)
집합 내의 요소의 주소를 알고 있다면 요소의 개수와 무관하게 모든 요소에 대하여 쉽고 효율적으로 동일한 시간에 접근할 수 있는 방식이다.

특징

  • 고정된 크기를 가진다.
  • 컴파일 단계에서 메모리 할당이 일어나고 이는 Stack 메모리 영역에 할당된다.
  • 원하는 원소의 index를 알고 있다면 O(1) 시간에 찾을 수 있다.

단점

  • 특정 index를 삭제할 경우 빈 공간이 생김. 따라서 연속적인 특징을 유지하기 위해서 그 뒤 index 원소들을 shift 해줘야 하는 비용이 발생하고 최악의 경우 O(n)의 시간복잡도를 가질 수 있다.
  • 첫번째 자리나 중간에 원소를 삽입할 경우에도 O(n)의 시간 복잡도를 가진다.

추가와 삭제가 반복되는 로직이라면 배열을 권장하지 않는다. 배열은 탐색이 많은 경우 유리하다.

LinkedList

Sequential Access를 지원한다.
삽입, 삭제가 반복되는 로직에 비효율적인 배열의 문제점을 해결하기 위한 자료구조이다.
각 요소를 포인터로 연결하여 관리하는 선형 자료구조이다. 각 요소는 노드라고 부르며 데이터 영역과 포인터 영역으로 구성된다.

Sequential Access(순차 접근)
순서가 정해진 원소 그룹을 순차적으로 접근하는 방법이다. 데이터 구조는 한 가지 특정 순서로만 포함된 값을 방문할 수 있는 경우 가능하다.

특징

  • 크기가 동적이다.
  • 런타임 단계에서 새로운 node가 추가 될때마다 Heap 영역에 할당된다.
  • 탐색은 O(n)이 소요된다.
  • 요소를 삽입하거나 삭제할 때 O(1)이 소요된다.

단점

  • 논리적 저장 순서와 물리적 저장 순서가 일치하지 않기 때문에 어떠한 원소를 삽입, 삭제 하려고 할 때, 그 원소를 찾기 위해 O(n)의 시간이 추가적으로 발생한다.
  • 결국 탐색, 삽입, 삭제 O(n)의 시간복잡도를 가진다. LinkedList는 Tree 구조의 기본이며 Tree에 사용되었을 때 그 유용성이 드러난다.

탐색이 많은 로직이라면 LinkedList를 권장하지 않는다. LinkedList는 삽입, 삭제가 반복되는 로직에서 유리하다.

시간복잡도
프로그램의 성능을 정확히 파악하는 것은 불가능하기 때문에 대략적인 값을 비교하기 위한 상대적인 크기를 사용한다. 문제를 해결하는데 걸리는 시간과 입력의 함수 관계를 시간 복잡도라고 하며 일반적으로 빅오 표기법으로 나타낸다.

참고
웹서버와 WAS 자료
Stack, Queue 자료
Array, LinkedList 자료

profile
개발자가 되고 싶은 취준생

0개의 댓글