본문 바로가기

책책책/프로가 되기 위한 웹기술 입문

📋 프로가 되기 위한 웹기술 입문 4-6

2021-04-15글

4. CGI에서 웹 애플리케이션으로


리다이렉트의 구조

상태코드 302일 경우 Location 헤더에 표시된 URL에 다시 요청을 발행한다.
이처럼 처음 요청한 URL과 다른 URL로 유도하는 것을 리다이렉트라고 한다.

상태 유지 프로토콜과 무상태 프로토콜의 차이

FTP는 서버가 앞선 요청을 기억하는 상태 유지 프로토콜이다.
상태 유지 프로토콜은 통신 절차가 많아 오버헤드가 크다.

HTTP는 상태를 가지 않는 무상태 프로토콜이다.
상태를 유지하지 않을 경우 오버헤드가 적지만 상태를 유지하지 않으니, 로그인 같은 인증에 대한 상태 관리를 하기 어려웠다.

쿠키의 개념과 구현 방법

쿠키는 무상태 프로토콜안 HTTP의 규격을 확장해 웹 애플리케이션과 웹 브라우저 사이에서 정보를 교환할 수 있게한다.
요청을 할 때 웹 브라우저의 상태를 Cookie 라는 헤더에 실어 보낸다.

쿠키의 문제점

요청 헤더, 응답 헤더에 쿠키를 설정하기 때문에 보안상의 위협이 있다.

세션의 개념과 구현 방법

세션이란 일련의 처리 흐름을 말한다.
이 처리 흐름이 한 번에 완료 되지 않는다면 세션에 상태를 추가해야 한다.
이러한 세션의 상태는 웹 서버에서 관리하고 세션 ID만을 주고 받는다.
세션 ID는 단순한 숫자(또는 문자열) 이므로 쿠키를 이용해 관리한다.

로그인과 같은 세션을 개시할 때 웹 서버가 새로운 세션 ID를 발행하고, 쿠키에 저장되어 브라우저에 전달된다.
이후 요청부터는 브라우저는 쿠키를 서버에 보내 인증을 성공한다.

쿠키에 세션ID만 저장함으로써 쿠키에 저장할 수 있는 정보량의 제한을 무시할 수 있고, 안정성을 높인다.

5. 웹 애플리케이션의 구성 요소


웹 애플리케이션은 클라이언트와 서버가 HTTP를 통해 통신함에 따라 구현된다.

➕ 프로그램 VS 애플리케이션 VS 서버 VS 프로세스

프로그램

컴퓨터가 실행하는 처리의 순서를 지시한 것.
소스코드 자체를 프로그램이라고 할 때도 많다.

애플리케이션

워드프로세서, 표 계산 등 컴퓨터 상에서 작동하며, 사용자에게 기능을 제공하기 위한 것.
웹 애플리케이션 또한 웹을 이용해 특정 목적을 달성하기 위한 소프트웨어

서버

특정 기능을 제공하는 데 특화된 소프트웨어.
단독으로 시스템을 구성하지는 못한다.
애플리케이션을 비롯한 다른 소프트웨어와 조합하여 사용하여야 한다.
서버를 이용하는 것이 클라이언트이다.

프로세스

컴퓨터 상에서 작동하고 있는 소프트웨어

웹 서버

애플리케이션 서버

서블릿이나 JSP는 어디에서 작동하는가?

자바 프로그램은 컴퓨터가 직접 실행하는 것이 아니라 JVM이라는 가상의 컴퓨터가 실행한다.
때문에 JVM도 컴퓨터가 볼 때는 하나의 프로세스로, 웹 서버, 데이터베이스와 마찬가지로 독립된 프로세스로 동작한다.

JVM에서는 애플리케이션 서버라는 소프트웨어가 작동되고, 이 서버가 서블릿이나 JSP를 작동시킨다.
CGI는 웹 서버로 요청이 올 때마다 새로운 프로세스가 기동되었다가 종료되는 1회용 모델이지만,
애플리케이션 서버는 항상 프로세스가 상주해 있고 웹 서버로부터 요청을 받아 서블릿이나 JSP를 실행하는 재사용 모델이다.

웹 서버와 애플리케이션 서버의 연동

톰캣

아파치에서 개발한 오픈 소스 애플리케이션 서버.
웹 서버와 연동하기 위해 톰캣은 아파치용으로 mode_jk라는 연동 모듈을 제공하며, 아파치 확장 기능으로 탑재해 연동을 구현한다.

아파치에 도착한 HTTP 요청을 mod_jk가 톰캣으로 전송하고, 톰캣이 이 기반에서 작동하는 웹 애플리케이션에 전달한다.
웹 애플리케이션이 처리를 실행하고, 애플리케이션 서버로 결과를 되돌려준다.
애플리케이션 서버는 mod_jk에 결과를 되돌려주고 아파치가 웹 브라우저로 HTTP 응답을 되돌려준다.

image

또한 여러 대의 애플리케이션 서버를 다른 노드에 배치해 분담시킬 수도 있다.

웹 서버와 애플리케이션 서버의 분담

  • 웹 서버 : 정적인 데이터를 처리한다.
  • 애플리케이션 서버 : 동적 데이터를 처리한다.

이와 같이 서버 사이드에서 프로세스 두개가 연동한다.
클라이언트가 페이지에 따라 요구를 보낼 프로세스가 제각각이면 골치아프니, 클라이언트의 HTTP 요청을 웹 서버가 전부 받고,
애플리케이션 서버가처리해야 할 요청만 웹 서버가 전달한다.

이 두 서버를 분리함으로써
처리는 가벼운 대신 횟수가 많은 정적 콘텐츠에 대한 요청은 웹 서버,
횟수는 적지만 처리량이 무거운 동적 컨텐츠 요청은 애플리케이션으로 분담한다.

사실 대부분의 애플리케이션 서버는 웹 서버 기능도 가지고 있다.

데이터 베이스 서버

대량의 정보를 기록하고 빠르게 검색, 집계할 수 있는 소프트웨어 (Database Management System)

SQL

Structured Query Language (구조적 질의 언어).
무엇을(SELECT), 어디에서(WHERE), 어떻게(GROUP BY 등) 추출할 것인지 표현하는 작업에 특화되어 있다.

데이터베이스와 클라이언트의 관계

데이터베이스는 독립적으로 작동하는 프로세스이고, 쿼리를 통해 결과를 취득하는 쪽도 프로세스이다.
웹 애플리케이션에서는 웹 애플리케이션 프로그램이 SQL을 발행한다.
만약 고객이 상품의 리스트를 조회하고 싶을 때 상품 목록을 HTML에 매번 직접 기술하는 것이 아닌,
요청이 들어올 때마다 데이터 베이스에서 목록을 조회해온다.

데이터베이스 서버의 분리

DBMS는 여러 애플리케이션에서 동시에 이용되기 때문에 단독 프로세스로 작동한다.
즉 웹 서버와 데이터베이스 서버는 다른 프로세스로서 작동한다.
일반적으로는 웹 서버를 작동시킬 컴퓨터와 데이터베이스를 작동시킬 컴퓨터를 따로 준비해 각 프로세스를 각 컴퓨터에서 실행한다.
이 경우, 처리가 분산되어 부하가 줄어들며 새로운 시스템이 구축되더라도 여러 클라이언트가 DB 서버를 이용하기 편리해진다.

웹 애플리케이션과 데이터 베이스의 통신

웹 브라우저와 웹 서버가 HTTP를 사용해 통신하듯이,
웹 애플리케이션과 데이터베이스가 통신할 경우에도 고유의 통신 프로토콜을 사용해 통신한다.

6. 웹 애플리케이션을 효율적으로 개발하는 방법


서블릿/JSP만으로는 부족한가?

웹 애플리케이션 대부분에서 자바를 사용하는 이유

  • 역사 깊은 언어
  • 객체지향, 재사용적
  • 오픈 소스 라이브러리와 프레임워크의 양과 질이 충실
  • 수많은 개발 지원 도구가 오픈소스로 제공

서블릿과 JSP의 연동

서블릿은 HTTP 요청을 받아 브라우저에 되돌려줄 HTML을 자바 프로그램에서 출력할 수 있게 한 것.
JSP는 HTML 속에 자바를 스크립틀릿으로 심을 수 있게 한 것이다.
JSP만을 이용할 경우, 처리가 복잡한 웹 애플리케이션을 만들 때 JSP 안에 기술되는 코드가 늘어나 개발 관리가 힘들어진다.

이 문제를 해결하기 위해 HTML 표시는 JSP가, 애플리케이션에서 처리하는 부분은 서블릿이 담당하게 한다.

<!-- 서블릿 정의 -->
<servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>kr.co.wiki.webtext.pizza.servlet.LoginServlet</servlet-class>
</servlet>

<!-- 서블릿 매핑 -->
<servlet-mapping>
    <servlet-name>login</servlet-name>
    <servlet-pattern>login.do</servlet-pattern>
</servlet-mapping>
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

    String id = req.getParameter("realname");
    String password = req.getParameter("mypassword");
}

포워드 vs 리다이렉트

서블릿에서 JSP로 이동은 브라우저를 통하지 않고 애플리케이션 서버 내에서만 진행된다.
웹 애플리케이션에서는 이와 같은 이동을 포워드라고 하며 리다이렉트와는 구분된다.

  • 리다이렉트 : 상태코드 302를 통해 이동할 URL을 알려주어 클라이언트에서 서버로 다시 요청을 보낸다. (요청이 2번 일어남)
  • 포워드 : 애플리케이션 서버 내에서만 이동 처리가 진행되어 서버측 처리 결과가 클라이언트로 돌아온다. (요청이 1번 일어남)

요청 스코프

서블릿과 JSP 사이에서 정보를 공유하기 위한 방식이다.
즉, 포워드 한 곳과 포워드 된 곳 사이에서 정보를 공유하기 위한 방식이다.

요청 매개변수와의 차이

  • 요청 매개변수 : HTTP 메서드를 통해 클라이언트에서 웹 애플리케이션에 문자열로 전달된다. 서블릿이나 JSP에서 참조는 할 수 있지만 받은 값은 변경할 수 없다.
  • 요청 스코프 : 애플리케이션 서버에서 제공된는 구조로, 포워드 전후에 자바 객체를 공유할 수 있다. 하지만 HTTP 요청을 1회 처리하는 동안만 유효하므로 요청 처리가 종료되면 요청 스코프에 담겼던 정보는 사라진다. 즉 리다이렉트에서는 정보를 인계할 수 없다.

요청 스코프가 필요한 이유

세션은 보존한 정보를 언제 해제해야 할지 모른다.
이를 세션 타임아웃으로 해결할 수 있지만 세션은 메모리도 많이 소비하는 단점이 있다.

세션 스코프와 요청 스코프의 차이

  세션 스코프 요청 스코프
유효 범위 세션 시작, 종료 또는 타임아웃 될 때까지 요청 받은 다음 응답을 돌려줄 때까지
시작과 종료 웹 애플리케이션이 제어 애플리케이션 서버가 제어
주된 용도 사용자 정보의 보존 페이지 이동전후의 보존

웹 애플리케이션의 아키텍쳐

건축을 할 때 꼼꼼한 설계를 하듯, 소프트웨어도 개발 초기에 전체적인 구조를 철저히 검토해야한다.

  • 아키텍처 : 소프트웨어는 필연적으로 닮은 부분이 나타나는데, 이런 설계 스타일과 설계에 바탕을 둔 전체 구조

➕ 자바를 부품화하기 위한 방법 - JavaBeans

자바 클래스를 부품화하기 위한 것으로, 웹 애플리케이션에서는 단순히 데이터를 보존하기 위한 클래스 정도의 의미밖에 없다.
웹 애플리케이션의 자바빈즈는 필드에 대응하는 세터와 게터가 존재한다.

애플리케이션의 고유 처리를 비즈니이라고 한다.
비즈니스 로직은 사용자 인터페이스에 영향받지 않고 존재하는 부분이다.
ex) 회원 관리 서비스를 웹 애플리케이션이 아니라 GUI 애플리케이션으로 구현한다면, 화면 구현 방법은 달라지지만 로그인 처리는 같다.

JDBC를 통한 DB 접근

웹 애플리케이션에서 데이터베이스로부터 정보를 얻기 위한 API로 JDBC를 사용한다.

  • 데이터 소스 획득 : 데이텁베이스에 대한 접속을 구하기 위한 객체
  • 연결 획득
  • SQL의 실행
  • SQL 실행 결과의 취득

JDBC를 사용할 경우 단점

단순한 쿼리에도 방대한 코드를 작성해야한다.

MVC + Layered Architecture

Layered Architecture은 시스템을 계층화하고 하위 레이어가 제공하는 기능을 상위 레이어가 이용함으로 각 레이어 구조를 단순화한다.
각 레이어를 먼제 3 계층으로 분리한다.

  • 프레젠테이션 레이어 : 사용자와의 인터페이스를 담당하는 레이어
  • 비즈니스 로직 레이어 : 애플리케이션에서 구현해야 할 고유의 작업을 처리하기 위한 레이어
  • 데이터 엑세스 레이어 : 비즈니스 로직 레이어와 데이터베이스를 중개하기 위한 레이어. 비즈니스 로직에서 분리해 데이터베이스 연결 절차를 의식하지 않게 해준다.

컨트롤러와 뷰는 프레젠테이션 레이어이며, 모델은 비즈니스 로직 레이어와 데이터 엑세스 레이어가 된다.

DAO 패턴을 이용한 데이터 액세스 레이어의 구현

DAO의 역할은 데이터베이스 접속을 은폐하는 것이다.

RDB와 객체의 임피던스 불일치

OR 매핑은 프로그래밍 언어의 객체와 관계형 데이터베이스를 대응시킨다.
관계형 데이터 베이스는 여러 개의 테이블과 그 관계를 이용해 정보를 관리한다.
객체와 관계형 데이터베이스는 본질적으로는 같은 정보이지만, 표현 방법에는 큰 차이가 있을 수 있다.
이를 임피던스 불일치라고 한다.

이런 임피던스 불일치릃 해결해주는 것이 바로 OR 매핑 프레임 워크이다.
(이 밖에도 데이터베이스와의 접속을 관리하거나, 정보를 캐싱해 데이터베이스 접속을 빠르게 하는 등의 기능도 제공힌다.)

아이바티스를 이용하면 SQL이나 테이블의 구성이 변경되더라도 소스코드가 아니라 SQL 앱 파일만 바꾸면 되어 변경하기 쉽다.

프레임워크 이용의 장점과 단점

장점

  • 설계, 개발 공수의 절감 : 아이바티스는 데이터베이스 연결에 관한 대부분의 처리를 대신 해준다.
  • 품질 향상
  • 테스트 공수의 절감

단점

  • 학습 비용의 증대
  • 설계의 자유도 저하
  • 장기적인 기술력의 저하