웹 기초 복습

dradra·2024년 11월 3일
post-thumbnail

해당 포스팅의 개념 및 자료는 ASAC 웹 풀스택 교육과정에서 참고하였습니다.

웹 개발에서의 백엔드 == API

(=클라이언트가 필요한 데이터를 반환한다.)

백엔드 웹 개발에서는 클라이언트가 요청하는 다양한 데이터를 어떻게 효과적으로 반환할 것인지가 핵심이다. 클라이언트가 원하는 데이터를 제공하기 위해 백엔드는 REST API, GraphQL, WebSocket, SSE 등의 다양한 통신 방식을 사용할 수 있다.

REST API

HTTP 프로토콜을 기반으로 클라이언트가 서버에 요청을 보내고, 서버가 필요한 데이터를 반환하는 구조

각 요청은 GET, POST, PUT, DELETE 등의 HTTP 메서드를 통해 CRUD(Create, Read, Update, Delete) 작업을 수행한다.
웹 서비스 개발에서 가장 많이 사용되는 방식으로, 요청-응답의 형태가 명확하고 이해하기 쉽다. 하지만, 대량의 데이터를 요청해야 할 때는 비효율적일 수 있다.

GraphQL

Facebook에서 만든 데이터 쿼리 언어로, 클라이언트가 필요한 데이터만 요청할 수 있게 해준다.

REST API와 달리, 단일 엔드포인트에서 여러 유형의 데이터를 한 번에 받아올 수 있다. 클라이언트는 필요한 필드와 구조를 지정할 수 있어서, 오버페칭(over-fetching)과 언더페칭(under-fetching) 문제를 해결할 수 있다. 이로 인해 모바일 앱이나 대규모 데이터 조회가 필요한 경우에 적합하다.

WebSocket

클라이언트와 서버 간 양방향 통신을 지원하는 프로토콜

연결이 맺어진 후에는 클라이언트와 서버가 데이터를 자유롭게 주고받을 수 있어, 실시간 데이터가 필요한 애플리케이션에서 유용하다. 채팅, 게임, 주식 가격 등의 실시간 업데이트가 필요한 경우에 많이 사용된다. HTTP와 달리 상태를 유지할 수 있어, 연결이 지속적으로 열려 있는 상태로 데이터를 교환할 수 있다.

SSE

서버에서 클라이언트로 일방향 스트리밍 데이터를 보내는 방식

SSE를 사용하면 클라이언트가 서버와 연결을 맺은 후, 서버는 클라이언트가 요청을 보내지 않아도 데이터를 지속적으로 전송할 수 있다. 주로 알림, 실시간 대시보드와 같은 주기적 업데이트에 유용하다. 하지만 WebSocket과 달리 양방향 통신을 지원하지 않고, 클라이언트에서 서버로 보내는 데이터는 별도의 요청으로 처리해야 한다.

데이터 관리

백엔드 웹 개발에서는 클라이언트가 요청하는 다양한 데이터를 어떻게 효과적으로 반환할 것인지가 핵심이라고 하였다.

데이터를 잘 반환하기 위해서는 응답 속도가 중요하며, 이를 위해 쿼리 효율성을 높이는 방법이 필요하다. DB에서 데이터를 조회하는 데 소요되는 시간을 줄이기 위해 쿼리를 최적화하는 방법을 사용하는 것이 그 예시이다. 또한, 글로벌 캐시를 도입해 반복적인 데이터 조회 요청 시, 데이터베이스에 직접 접근하지 않고 캐시에 저장된 데이터를 반환함으로써 응답 속도를 더욱 향상시킬 수 있다.

대규모 트래픽 상황에서도 여러 사용자의 요청을 동시에 처리할 수 있도록, 동시성 관리 또한 중요하다. 다수의 클라이언트가 동시에 동일한 데이터에 접근할 때 이를 안전하게 관리해야 하며, 이를 위해 백엔드는 동시성을 고려한 처리를 설계한다.

직렬화(Serialization)와 역직렬화(Deserialization)

직렬화와 역직렬화는 외부에서 데이터를 JSON 형태로 주고받으면서, 내부에서는 프로그래밍 언어에서 사용할 수 있는 객체 형태로 변환하는 과정을 의미한다.

요청 (Request): 클라이언트 JSON → 서버에서 역직렬화 → Java 객체
처리: 서버에서 내부 로직 처리
응답 (Response): Java 객체 → 서버에서 직렬화 → 클라이언트 JSON

외부와 내부의 데이터 변환

클라이언트와 서버 간의 데이터는 JSON과 같은 문자열 형태로 전송된다. 외부로 전송되는 모든 데이터는 문자열(JSON)로 표현되며, 서버에서는 이 데이터를 직렬화하거나 역직렬화하여 내부에서 객체로 다룬다.

직렬화(Serialization)

서버 내부에서 다루는 Java 객체(2차원 데이터)를 외부로 내보낼 때, 직렬화 과정을 통해 JSON(1차원, 문자열)으로 변환한다.

  • 예를 들어, 서버가 클라이언트에 응답할 때 Java 객체를 JSON으로 변환하여 클라이언트가 이해할 수 있는 형태로 전달한다.

역직렬화(Deserialization)

클라이언트가 보낸 JSON 요청을 서버가 받을 때, 역직렬화를 통해 JSON을 Java 객체로 변환하여 내부적으로 처리할 수 있는 형태로 만든다.

  • 예를 들어, 클라이언트가 데이터를 전송할 때 JSON 형태로 보내면, 서버에서는 이를 객체로 변환하여 내부 비즈니스 로직에 맞게 처리한다.

웹 애플리케이션 프레임워크의 등장 배경과 필요성

웹 애플리케이션 프레임워크는 웹 서버 개발을 더욱 간단하게 만들기 위해 등장했다. 우리가 흔히 사용하는 프로그래밍 언어인 Java, C#, Python, Ruby 등은 애플리케이션 개발에 적합하게 설계되었지만, 웹 서버 개발에 필요한 다양한 기능을 직접 제공하지 않는다.

웹의 초창기에는 정적인 리소스만 반환할 수 있었지만, 웹이 발전하면서 동적인 웹 페이지와 데이터 처리가 필요해졌다. 사용자의 요청에 따라 다르게 응답할 수 있어야 하고, 대량의 데이터를 효율적으로 관리하기 위해서는 더 많은 기능과 자동화가 필요하게 되었다. 이에 따라, 웹 애플리케이션 서버 프레임워크가 개발되어, 웹 개발자가 필요한 기능을 보다 쉽게 사용할 수 있게 되었다.

Java에서는 Servlet이나 JSP 같은 기술을 사용하여 웹 애플리케이션을 개발할 수 있으며, Python은 Django, Java는 Spring, C#은 ASP.NET, Ruby는 Ruby-on-Rails 등, 각 언어마다 웹 애플리케이션 개발을 돕는 표준 프레임워크가 존재하게 되었다.

웹 애플리케이션 프레임워크가 제공하는 주요 기능

1. Request Mapping

클라이언트가 보낸 요청을 처리할 메서드를 자동으로 매핑해주는 기능이다. 어떤 요청이 들어왔을 때 어떤 메서드를 실행할지 지정해준다.

2. Thread 관리

요청을 처리하기 위한 쓰레드를 생성하고 관리하는 기능을 제공한다. 동시에 많은 사용자가 접속할 경우, 쓰레드 관리는 서버 성능에 중요한 요소이다.

3. 데이터베이스 동시성 제어

대규모 트래픽 발생 시 여러 사용자가 데이터베이스에 동시에 접근해도 문제없도록 동시성 제어를 제공한다.

4. 직렬화 / 역직렬화

서버 내부의 객체 데이터를 JSON 등 외부에서 사용 가능한 형태로 변환하거나, 외부 데이터를 객체로 변환하는 과정을 자동화해준다.

5. Security

CORS(Cross-Origin Resource Sharing) 등 보안 설정을 쉽게 할 수 있는 기능을 제공한다.

6. Authentication / Authorization

인증과 권한 관리 기능을 내장하여, 사용자가 누구인지 확인하고, 권한에 맞는 요청만 처리할 수 있도록 돕는다.

✅ 정적 서버와 동적 서버
정적 서버는 고정된 콘텐츠를 제공하는 서버로, HTML, CSS, 이미지 파일 등 미리 작성된 파일을 그대로 클라이언트에게 전송한다.
동적 서버는 요청에 따라 변화하는 콘텐츠를 생성하여 제공한다. 동적 서버는 사용자의 요청이나 상태에 따라 데이터를 조회하고 가공하여 응답을 만든다. 예를 들어, 로그인 후 사용자별로 맞춤화된 정보를 보여주는 페이지나 게시판 글 목록이 동적으로 변경되는 웹 페이지는 동적 서버가 필요하다. 동적 서버는 보통 데이터베이스와 연동하여 실시간으로 데이터를 가져와 처리한다.

0개의 댓글