[Web]웹 애플리케이션

다콩이·2022년 9월 12일
0

Java

목록 보기
4/4
post-thumbnail

웹 애플리케이션

1. 웹 서버

웹 서버(Web Server)

  • HTTP를 통해 웹 브라우저(클라이언트)에서 요청(request)하는 정적인 컨텐츠를 전송하는 서비스 프로그램
    - 어떤 사용자가 접속해도 같은 화면(Html)만 전송된다.
    - Apache, Nginx, IIS 등이 있다.

    - 하지만 사용자 입력을 받아 그 결과를 보여주는 동적 페이지가 필요해졌다.
    - 웹 서버에서 프로그램을 호출하고,프로그램의 처리 결과를 웹 서버가 받아 클라이언트에 넘기는 방식이 고안된다.

CGI(Common Gateway Interface)

  • 웹 서버와 프로그램 간 전송방식에 대한 규약
    - 웹 서버가 받은 요청을 외부 프로그램(애플리케이션)에 위임해 처리하고, 다시 서버로 받아 클라이언트로 전송한다.
    - 이러한 서버와 애플리케이션 간 데이터를 주고 받는 규칙이 CGI(Common Gateway Interface)이다.

    - 하지만 요청(request)이 들어올 때마다 프로세스(process)를 만들어 비효율적이다.
    - 프로세스를 스레드(thread)로 바꿨지만, 스레드가 다르면 구현체가 하나씩 생기는 문제가 발생한다.
    - 이것을 싱글톤으로 바꾼 것이 Servlet이다.

2. 웹 애플리케이션 서버

웹 애플리케이션 서버(Web Application Server)

  • 자바 J2EE 스펙을 구현해 서블릿이나 JSP로 작성된 애플리케이션 서버
    - 클라이언트의 요청(request)을 받아 DB 조회나, 어떤 로직을 처리해야 하는 동적인 컨텐츠를 응답(response)하는 서버이다.
    - 웹 서버(Web Server) + 웹 컨테이너(Web Container)로 구성된다.

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

  • 웹 애플리케이션 서버(WAS)가 웹 서버(WS)의 역할도 수행하지만, 여러가지 측면에서 분리
    - 정적인 컨텐츠, 동적인 기능(DB 조회, 로직 수행 등) 을 분리해 서버 부하 방지
    - SSL에 대한 암복화하 처리에 웹 서버(WS)를 사용하는 등 물리적으로 분리해 보안을 강화
    - 여러 대의 WAS를 연결해 무중단 운영 등 로드 밸런싱 용도로 사용
    - 하나의 서버에서 php application, java application을 함께 사용하는 등 여러 웹 애플리케이션의 활용 가능

웹 컨테이너(Web Container)와 서블릿(Servlet)

  • 서블릿(Servlet) 이란?
    - 자바 프로그래밍 언어로 구현된 CGI 프로그램이다.
  • 웹 컨테이너(Web Container)란?
    - 서블릿 컨테이너(Servlet Container)라고도 하며, Java에서 CGI 기능을 하는 컨테이너
    - 서블릿(Servlet)의 생명주기를 관리하고, URL과 특정 서블릿을 mapping해 URL 요청이 올바른 접근 권한을 갖도록 보장한다.
    - 서블릿과 웹 서버가 서로 통신할 수 있는 쉬운 방법들을 제공한다.
    - 클라이언트의 요청에 따라 서블릿을 생성하고, 이미 생성된 서블릿에 대한 요청을 스레드를 생성해 실행하는 등 멀티스레딩을 지원한다.
    - 보안에 관련된 내용을 배포 서술자(web.xml)에 기록해 선언적인 보안관리가 가능하다.

3. 프로그래밍 패턴의 변화

MVC 패턴

  • Model, View, Controller로 서블릿과 JSP의 역할을 분리한 것이 MVC 패턴

    - 하나의 서블릿이나 JSP만으로 요청을 모두 처리하기에 많은 역할이 주어진다.
    - UI를 수정하는 일, 비즈니스 로직을 수정하는 일은 각각 다르게 발생하고 서로 영향을 주지 않는다.
    - 따라서 해당 업무만 담당하도록 기능이 특화 되었다.

    Model : View에 출력할 데이터를 담아두는 역할
    View : Model에 담겨있는 데이터를 통해 화면에 렌더링 하는 역할
    Controller : HTTP 요청 파라미터를 검증 / 비즈니스 로직 수행 / 결과 데이터를 Model에 담음

    - 하지만 프로그램 규모가 커짐에 따라 공통처리가 어렵다.
    - View로 이동하는 코드와 ViewPath가 중복되고, HttpServletRequest, HttpServletResponse를 사용하지 않을 때가 있다.
    - 이를 해결하기 위해 프론트 컨트롤러가 도입되었다.


프론트 컨트롤러 패턴

  • 서블릿 하나로 클라이언트의 요청을 받고, 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출하는 패턴

    - 요청 경로마다 서블릿을 정의해 주는 것은 핸들러마다 공통된 로직을 중복 작성해야 한다는 측면에서 비효율적이다.
    - 공통된 로직을 하나의 서블릿만 앞단엔 두어 모든 클라이언트의 요청을 처리해 개발자는 핵심 로직에만 집중할 수 있다.


스프링 MVC 패턴

  • 스프링 MVC는 스프링이 제공하는 MVC패턴을 따르는 서블릿 기반의 프레임워크

    - HTTP 프로토콜로 들어오는 모든 요청을 Dispatcher Servlet이 받아 적합한 컨트롤러에 위임하는 프론트 컨트롤러의 역할을 한다.

4. 스프링 프레임워크(Spring Framework)

스프링 프레임워크(Spring Framework)란?

  • 자바 엔터프라이즈 개발을 위한 오픈 소스 애플리케이션 프레임워크

    - 애플리케이션 프레임워크 : 특정 계층이나, 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크이다. 즉, 애플리케이션 개발의 전 과정을 빠르고 편리하며 효율적으로 진행하는 데 목표를 둔다.
    - 경량급 오픈소스 : 기존의 무거운 EJB(Enterprise Java Bean)처럼 다루기 힘든 설정파일, 패키징, 서버 배치 등에 대한 부담을 없애고 해당 기능들을 쉽게 사용할 수 있다.

스프링 프레임워크의 특징

  • POJO(Plain Old Java Object) 기반의 구성
    - 이전에는 원하는 엔터프라이즈 기술에 대해 그 기술을 직접 사용하는 객체를 설계해 특정 기술과 환경에 종속되어 자바 코드가 가독성이 떨어지고 유지보수에 어려움이 생겼다.
    - 특정 라이브러리나 환경, 기술에 종속되지 않고, 평범한 Java 코드를 이용해 객체를 구성하는 방식이다.
    - 스프링 프레임워크는 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정 인터페이스를 구현하거나 상속받을 필요가 없어 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.

  • DI(Dependency Injection)를 통한 객체 간 관계 구성
    - 스프링은 의존성 주입(DI)를 도와주는 DI 컨테이너로서 강하게 결합된 클래스를 분리하고 객체 간 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보한다.
    - 의존성 주입이란, 객체 간 의존성(객체 간의 관계 맺음)을 외부에서 객체를 생성해서 넣어주는 방식이다.
    - 제어의 역행이 일어나는 것을 전제로 하여 스프링 내부의 객체들 간 관계를 만들어 줄 때 사용한다.

    	IoC 컨테이너란?
    	Bean 설정 소스로부터 Bean 정의를 읽어들이고, Bean을 구성하고 제공하는 역할
    	객체의 생성을 책임지고, 의존성을 관리하며 Bean들의 의존 관계를 설정해준다.
    	프로그램이 거대해짐에 따라 XML을 이용해 IoC 컨테이너를 설정하는 것이 어려워졌다.
    	따라서 Annotaion(@)을 이용해 코드에 메타데이터를 작성함으로써 직관적인 코딩이 가능하게 했다.
    
    	Bean이란?
    	 IoC Container가 관리하는 자바 객체
    	 Bean은 보통 Singleton으로 존재한다.
    • 스프링 빈(Bean)을 스프링 컨테이너에 등록하는 방법
      • 자바 코드로 직접 등록
        @Configuration : 스프링 IoC Container에게 해당 클래스를 Bean 구성 클래스임을 알려주는 어노테이션
        @Bean : 개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 등록할 때 사용
      • 컴포넌트 스캔과 자동 의존관계 설정
        @Component : 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션
        Component 어노테이션이 있으면 자동으로 스프링 빈이 등록된다. 또한, @Component를 포함하는 @Controller, @Service, @Repository 어노테이션도 스프링 빈으로 자동 등록된다.
    • 생성자 주입
      생성자를 통해 의존관계를 주입한다.
      생성자 호출 시점에 딱 1번만 호출되고, 생성자가 1개만 존재할 경우 @Autowired 생략이 가능하다
    • 필드 주입
      필드에 @Autowired를 붙여서 바로 주입한다.
      외부에서 변경이 불가능하고, 테스트를 진행하기 어렵다.
    • 수정자 주입
      Setter 메소드의 매개변수로 의존 객체를 주입하는 방법이다.
      set필드명 형식의 메소드로 의존관계를 주입하고, @Autowired를 필수적으로 입력해야 한다.

  • AOP(Aspect Oriented Programming) 지원
    - 관점 지향 프로그래밍의 약자로, 객체지향 프로그래밍으로 인해 독립적으로 분리하기 어려운 부가기능을 모듈화 하는 것
    - 부가 기능(횡단 관심사)을 모듈화하는 것을 Aspect라고 하며, 핵심 비즈니스 로직을 담고 있지는 않지만, 애플리케이션에 부가됨으로써 의미를 갖는 모듈이다.


    - 데이터베이스 연결, 로깅, 보안, 파일 입출력 등 모든 모듈에서 공통적으로 이루어지는 기능을 모듈화한다.

- **PSA(Portable Service Abstraction)** - PSA는 추상화 계층을 사용해 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해 주는 것 - 'Portable'은 비즈니스 로직의 수정없이 언제든지 변경할 수 있다는 것을 뜻한다. - JDBC가 대표적인 예로, JDBC Driver를 사용해 데이터베이스에 접근하지만, JDBC Driver가 어떻게 구현되어 있는지에 대해서는 관심이 없다. - 이러한 표준 스펙 덕분에 개발자는 사용하는 데이터베이스의 종류에 상관없이 공통된 방식으로 코드를 작성할 수 있다. - Transaction을 직접 구현하는 것이 아닌 @Transactional 어노테이션을 작성함으로써 사용한다.

참고

0개의 댓글