웹 애플리케이션 프레임워크(Web Application Framework)

민준·2024년 12월 24일
0
post-thumbnail

웹 애플리케이션 프레임워크(Web Application Framework)

웹 애플리케이션 개발을 쉽게, 효율적으로, 그리고 구조적으로 도와주는 소프트웨어 플랫폼(여러 라이브러리와 기능을 묶어서 제공)
서버와 클라이언트 간 요청과 응답을 처리하고, 시스템의 안정성과 보안을 유지

웹 애플리케이션 프레임워크의 제공 기능

  • RequestMapping : 클라이언트가 서버로 보낸 요청(HTTP요청, GET, POST, PUT, DELETE)에 따라 어떤 메서드(함수 혹은 로직)을 수행할것인지 연결
// 클라이언트가 /users URL로 GET 요청을 보내면 사용자 목록을 반환하는 메서드를 실행
@GetMapping("/users")
public List<User> getUsers() {
    return userService.getAllUsers();
} 
//클라이언트가 /users URL로 POST 요청을 보내면 새로운 사용자를 생성하는 메서드를 실행.
@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.createUser(user);
}
  1. Thread 관리 : 요청을 처리하기 위한 서버는 여러 Thread 사용, 각 요청마다 별도의 스레드를 생성하거나 할당 및 관리, 동시에 여러 요청을 처리, 데이터베이스 접속을 위한 Thread 할당 및 관리, 백그라운드 작업에도 스레드 사용.

    WAS(Web Application Server), DB(Database), OS(Operating System) 모두 자체적으로 스레드를 생성하고 관리
    WAS Thread(여기선 이걸 말함): 클라이언트의 요청을 처리하는 애플리케이션 서버의 스레드.
    DB Thread: 데이터베이스 작업을 처리하기 위해 할당된 스레드.
    OS Thread: 운영 체제 수준에서 관리되는 스레드. WAS와 DB 스레드도 결국 OS 스레드 위에서 동작.

  2. 데이터베이스 동시성 제어 : 다수의 클라이언트 요청이 동시에 데이터베이스에 접근할 때, 데이터 충돌을 방지하기 위해 동시성을 제어.
    데이터베이스는 하나인데 여러 스레드가 동시에 접근하면 일관성 문제가 발생할 수 있음

  • 아무리 많은 서버를 둔다고 해도 데이터베이스는 한개이다.
  • 하나의 DB에 하나의 was를 통해 다수개의 Thread를 통해 접속 가능함.

    Isolation Level(격리 수준)
    데이터베이스 트랜잭션 간에 데이터를 겹치게 볼 수 있는지 결정.
    예) 두 사용자가 동시에 같은 데이터를 읽거나 수정하려는 경우 어떻게 처리할지 정의.

    격리 수준 : READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 등이 있음.

  1. Serialization(직렬화) / Deserialization(역직렬화) : 요청, 응답 시 어플리케이션의 객체와 클라이언트의 JSON 사이 변환

  2. Security : CORS 규칙 등에 대한 보안 관련 정의 및 처리

  3. Authentication(인증) / Authorization(인가) : 인증(사용자가 누구인지 확인), 인가(사용자가 어떤 사용 권한이 있는지 확인)

주요 구성 요소

  1. 라우팅: 클라이언트의 요청(URL 경로)에 따라 적절한 로직(메서드)을 호출.

  2. 템플릿 엔진: 동적인 HTML 생성.

  3. 데이터베이스 연동: ORM(Object-Relational Mapping) 또는 SQL 쿼리를 통해 데이터 처리.

  4. 보안: 인증, 인가, CORS, CSRF 보호.

  5. 세션 및 쿠키 관리: 사용자 상태 및 정보 유지.

웹 애플리케이션 프레임워크의 동작 방식(순서)

  1. HTTP 요청 수신: 클라이언트가 서버로 요청을 보냄.

  2. 라우팅 처리: 프레임워크가 URL과 요청 메서드(GET, POST 등)에 따라 적합한 메서드로 연결.

  3. 비즈니스 로직 처리: 개발자가 작성한 코드 실행.

  4. 데이터베이스 연동: 필요한 데이터를 읽거나 수정.

  5. 응답 생성: 동적으로 HTML 생성, 또는 JSON 데이터를 반환.

  6. HTTP 응답 전송: 처리 결과를 클라이언트에게 반환.

웹 어플리케이션 프레임워크 동작 원리

1). Package Manager : 라이브러리 버전 관리

  • 웹 어플리케이션 프레임워크는 아래의 2가지를 제공

  • 다수의 라이브러리 제공 : 개발 편의성을 위한 다양한 라이브러리 제공

  • 다수의 인터페이스 제공 : 개발을 위한 껍데기를 제공할뿐 필요한것은 직접 구현 혹은 라이브러리 교체

  • 즉, 많은 수의 라이브러리가 필요하기에 1. 어떤 라이브러리를 사용하고, 2. 어떤 버전을 사용할지 관리가 필요

    1. 어떤 라이브러리를 사용할지
    2. 어떤 버전을 사용할지
  • 결과적으로, 프레임워크 사용 시 라이브러리에 대한 버전 관리를 위한 Package Manager 가 필요

    • Javascript 는 npm 사용

      • Javascript 의 Package Manager 중 하나인 npm 예시 : 파일명 package.json
    • Python 은 pip 사용

    • Ruby 는 bundler 사용

    • Java 는 Maven 혹은 Gradle 사용

      • Java 의 Package Manager 중 하나인 Gradle 예시 : 파일명 build.gradle

2). Database : 데이터 조회 및 조작

CRUD = 데이터 조회 및 조작 : Create, Read, Update, Delete

  • 동적 데이터를 저장하는 저장소이기에 데이터를 식별할때는 무조건 ID 를 사용할 것
    • 동적 데이터이기에 데이터는 매번 바뀐다. 데이터가 바뀌더라도 고유의 ID 로 일관적인 조회 가능
      • 데이터 식별을 이름 으로 하였다면, Aaron 이 Baron 으로 개명되었을때 조회 실패
      • 데이터 식별을 ID 로 하였다면, Aaron 이 Baron 으로 개명되어도 여전히 ID 1번으로 조회 성공
  • 생성 방식 심화 : 고유 식별자로 일반적으로는 숫자로 구성된 ID 를 쓰지만, UUID(GUID), CUID 가 필요할때가 있다.

    • Auto Increment ID : 2가지 문제가 있다

      • 개수 제한 : 최대 Long 을 넘어서는 개수 표현 불가
      • 추적 가능 : 해커와 같은 악의적 유저가 ID 숫자를 기반으로 다른 자원들에 대한 추론/접근 가능
      • 성능 : 작은 앱에서는 충분한 성능으로 채택할만한 ID 채번 방식이다
    • UUID (Universally/Globally Unique Identifier) - int float 등 숫자가 제한됨

      • 개수 제한 : 128bit 로 사실상 무한 개수 표현 가능 (string으로 만드는것)
      • 순서 비보장 : 키 그 자체로 의미(Semantic)을 갖지 못함 “이게 크니까 저거보다 나중에 생성됐네”
      • 길이 : 너무 길고, 순서보장이 되어있지 않아 해당 키값 기반으로 인덱싱을 할때 어려움을 겪을수있다
      • 충돌(Collision Resistance) : 유사난수(Pseudo-Random)로 키 생성 시 충돌 가능성 매우 낮다
    • CUID (Collision-Resistant Unique Identifier) : 분산 시스템에서 적당한 옵션

      • 순서 보장(Monotonically Increasing)
      • 길이 : UUID 보다 짧아졌다
    • NanoID : 순서 보장이 굳이 필요없지만, CUID 보다 더 짧은 아이디를 원하는 경우

  • 심화 : ID GeneratorSnowflake

    • Snowflake란? 전 세계적으로 고유하고 순서가 있는 ID를 생성하는 데 중점을 둔 시스템입니다.
    • Snowflake ID Generator는 대규모의 데이터 생성 및 관리가 필요한 시스템에서 사용되는 고유 ID 생성 방식입니다.
      트위터와 같은 대량의 코멘트, 라인과 같은 대량 메세지에 적합
      • 라인 세미나 : 메신저의 액티브 유저는 2억명이고, 하루 40억개의 메시지가 발행된다
      • 글로벌 유니크 + 선형으로 커지는 ID (순서보장, Monotonically Increasing) + 개별 백엔드에서 ID 생성
        • 단, 시스템 시간에 의존하는 위험 | 분산 시스템 내 모든 인스턴스가 같은 시스템 시간이 보장되어야
      • 메시지가 발행될땐 ID 가 없고, 서버에서 메시지를 받았을 때 ID 채번, 그 ID 를 다시 클라이언트에게 전송

3). Transaction : 대량 트래픽이나, 다수 요청이 데이터베이스에 접근 → DB 동시성 제어, 충돌방지

  • 다수의 웹 서버에서 (대량 트래픽) → 단일 데이터베이스에 접속 시, 충돌 (서로 데이터베이스 쓰겠다고 싸움)
  • 하나의 웹 서버에서 다수의 요청이 → 단일 데이터베이스에 접속 시, 충돌 (서로 데이터베이스 쓰겠다고 싸움)
  • Transaction 이란? 단일 데이터베이스에 다수 접근이 충돌나지 않게 번호표를 주고, 순서대로 처리 -> 요청 간 순서 제어를 통해 데이터 무결성을 보장.

언어별 주요 웹 애플리케이션 프레임워크

  • Java
    Spring Framework: 강력한 확장성과 다양한 기능을 제공하는 대표적인 Java 기반 웹 프레임워크.
    Struts: 오래된 Java 프레임워크로, MVC 아키텍처 기반.

  • Python
    Django: "배터리 포함" 철학으로, 웹 개발에 필요한 모든 기능을 내장.
    Flask: 간단하고 경량화된 Python 기반 프레임워크.

  • JavaScript:
    Express.js: Node.js 기반의 경량 웹 프레임워크.
    Next.js: React와 통합된 서버사이드 렌더링(SSR) 지원 프레임워크.

  • Ruby:
    Ruby on Rails: 개발 생산성을 극대화하는 Ruby 기반 프레임워크

  • PHP:
    Laravel: 직관적이고 아름다운 코드로 유명한 PHP 프레임워크.

0개의 댓글