Web의 기본 동작

2ㅣ2ㅣ·2024년 4월 24일

Web

목록 보기
1/5
post-thumbnail

웹 개발자를 준비하는 개발자호소인이라면 상대의 기술을 잘 알아야한다. 예컨데 프론트개발자라면 백개발자의 큰그림을 이해해야 하고, 반대의 경우도 마찬가지다. 그러기 위해선 내가 개발하는 웹의 기본적인 동작 원리부터 알아야할 것이다! 😅

웹 개요

웹의 본질은 주고(response) 받는(request) 것이다.
요청-반환의 주체는 브라우저서버 단 2개다!
요청과 반환에는 기본적으로 REST API를 사용하고 예외적으로 GraphQL도 사용한다.

  • 웹 브라우저 - 웹 서버: Front 요청Back이 데이터 및 웹 페이지를 반환함으로써 응답한다.
  • 웹 서버 - 웹 서버: MSA를 사용하는 경우처럼 각자 담당한 서비스를 갖는 수많은 서버 간 교환이 필요할때 사용한다.

MSA ❓

위의 설명으로 MSA가 서버를 여러 개 둔 방식이라는 것을 짐작했을것이다. 규모가 크지 않은 프로젝트를 할때는 대개 모놀리딕 방식을 사용했을 것이다.

  • Monolithic: 하나의 서버가 모든 서비스를 관장
  • MSA(Microservice Architchture): 하나의 서버는 하나의 서비스만 관장

    MSA 방식을 사용하면 하나의 서비스에 장애가 다른 서비스에까지 전달되지 않아 안전성이 보장된다. 서버를 다중화하는것이다. 이를 SPOF를 방지했다고 한다.

SPOF(단일 장애 지점) ❓

시스템의 한 부분이 고장 났을 때 전체 시스템의 작동을 멈추게 하는 위험을 의미한다.

  • Monolithic: 모든 기능이 하나의 대규모 코드 베이스에 통합되어 있어 초기에는 관리가 용이하지만, 시스템이 커질수록 업데이트와 유지보수가 어려워지며 SPOF 위험이 증가한다.
  • MSA: 각 서비스가 독립적으로 작동하여 하나의 서비스에 문제가 발생해도 전체 시스템에 영향을 주지 않아 더 높은 안정성을 제공하며, 시스템 확장이나 새로운 기술 도입에도 유연합니다.

이러한 차이점을 고려하여 프로젝트의 규모와 요구에 맞는 아키텍처를 선택해야 한다.

REST API

앞에서 언급했든 웹은 REST API를 기반으로 동작한다.
HTTP 메서드, URL, 헤더, 그리고 선택적으로 본문을 포함하는 HTTP 요청을 사용하여 데이터를 주고받는 방식으로 구성되어있는데 이 포스팅에서는 Method + URL 이라는 2가지 요소로만 간단하게 정리하겠다.

  • URL: 어떤 자원(Resorce)에 대해
    • URL, Location : https://aaron.com = 장소
    • URI, Indicator : https://aaron.com/users/aaron/favorite-things = 장소 내 지정
  • Method: 어떤 행위를 할 것인지
    • GET, POST, PUT, FETCH, DELETE

CRUD를 구현한 간단한 스프링 예제 코드를 보자.

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.PathVariable;

@RestController // 이 클래스가 RESTful 서비스를 위한 컨트롤러임을 나타냄
public class SimpleController {
    // GET 요청 처리: 모든 사용자 데이터를 조회할 때 사용
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public String getUsers() {
        return "모든 사용자 정보 반환";
    }

    // GET 요청 처리: 특정 사용자의 데이터를 조회할 때 사용
    @RequestMapping(value = "/users/{userId}", method = RequestMethod.GET)
    public String getUserById(@PathVariable String userId) {
        return "사용자 ID " + userId + "에 해당하는 정보 반환";
    }

    // POST 요청 처리: 새로운 데이터를 생성할 때 사용
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    public String addUser(@RequestParam String name) {
        return "새 사용자 " + name + " 추가";
    }

    // PUT 요청 처리: 기존 데이터를 수정할 때 사용
    @RequestMapping(value = "/users/{userId}", method = RequestMethod.PUT)
    public String updateUser(@PathVariable String userId, @RequestParam String newName) {
        return "사용자 ID " + userId + "의 이름을 " + newName + "으로 수정";
    }

    // DELETE 요청 처리: 데이터를 삭제할 때 사용
    @RequestMapping(value = "/users/{userId}", method = RequestMethod.DELETE)
    public String deleteUser(@PathVariable String userId) {
        return "사용자 ID " + userId + " 삭제";
    }
}

이처럼 서버에서 클라이언트로 데이터를 주고받을 때 특정 형식에 맞게 특정 주소로 데이터를 요청하고 응답받는다. 각 요청이 독립적이고, URL로 어떤 데이터를 요청하는지 명확히해서 쉽고 직관적이게 사용 가능하다.

GraphQL(Query Language)

문장마다 메서드를 만드는 REST API와는 달리, 문장을 하나의 쿼리로 준다. 클라이언트가 필요한 데이터를 정확히 지정해서 서버에 요청한다. 이렇게 하면 서버는 요청받은 데이터만 처리해서 보내줘서 오버페칭이나 언더페칭을 줄일 수 있어 통신이 더 효율적이다. REST API보다 더 유연하게 데이터를 다룰 수 있는 장점이 있지만, 구현이 조금 복잡하고 각 비즈니스 도메인마다 API를 일일이 만들어야 해서 번거롭다.


출처
SPoF 란?
GraphQL 이란?

profile
https://sususoo.tistory.com/

0개의 댓글