[새싹] 웹을 지탱하는 기술 Chapter05

채상엽·2022년 5월 10일
0

Sproutt 2nd - Spring Study

목록 보기
17/32

layout: post
title: "웹을 지탱하는 기술 스터디 - Chapter5"
date: 2022-03-12T00:00:00-00:00
author: sangyeop
categories: Sproutt-2nd


새싹 개발 서적 스터디 - 웹을 지탱하는 기술 Chapter05

Chapter 05. URI의 설계

쿨한 URI는 변하지 않는다

웹은 각각의 리소스에 다른 리소스로 연결되는 링크가 들어있는 하이퍼 미디어 시스템이다. 이 링크가 끊어진다는 것은 하이퍼미디어 시스템이 동작하지 않는다는 것을 의미한다.

이러한 상황을 우려해 버너스-리는 'URI는 번혀자 않아야 한다. 변하지 않는 URI야말로 최고의 URI이다' 라는 주장을 했다

좀처럼 변하지 않는 URI를 만들기 위해서는

프로그래밍 언어에 의존적인 확장자와 경로를 포함하지 않는다

다음과 같은 URI가 있다고 가정해보자.

http://example.com/cgi-bin/login.pl

이 URI에서 cgi-bin.pl이라는 확장자는 구현에 의존적이라고 할 수 있다. 이러한 구조는 21세기에 들어서 성능 등의 문제로 인해 점차 보이지 않게 되었다.

이처럼 어떤 특정 언어에 의존하는 문자열을 URI에 포함시키면 그 언어를 변경하자마자 URI를 사용할 수 없게 된다.

메서드명과 세션ID를 포함하지 않는다

다음과 같은 URI가 있다고 가정해보자.

  • 메서드명 포함

    리팩토링하여 메서드명이 바뀔 경우 바로 URI가 바뀌어 버려 사용할 수 없게 된다.

http://example.com/Login.do?action=showPage
  • 세션ID 포함

    로그인 할때마다 세션 ID는 바뀌므로, 이 URI는 시스템에 다시 로그인하면 변하게 된다

http://example.com/home.jsp?jsessionid=12345678

URI는 리소스를 표현하는 명사로 한다

HTTP에서는 리소스에 대해서 특정 HTTP 메서드만을 적용한다. 그리고 어떤 리소스를 취득할지 갱신할지는 URI로 지정하는 것이 안리ㅏ, URI에 적용하는 HTTP 메서드로 결정해야한다. 따라서 URI는 전체적으로 명사가 되도록 설계해야 한다.

http://example.com/sample/people/123

URI 설계지침

  • URI에 프로그래밍 언어에 의존적인 확장자를 이용하지 않는다.
  • URI에 구현에 의존적인 경로명을 이용하지 않는다.
  • URI에 프로그래밍 언어의 메서드명을 이용하지 않는다.
  • URI에 세션ID를 포함하지 않는다.
  • URI는 해당 리소스를 표현하는 명사이다.

URI 사용성

심플한 URI는 사용성(Usability)를 향상 시켜준다

  • 복잡한 URI
http://example.com/servlet/LoginServlet
  • 심플한 URI
http://example.com/login

URI가 심플하면 기억하는 것도 간단하기 때문에, 가능한 글자 수가 짧은 것이 중요하다. 또한 'servlet' 같은 경우 구현 의존적인 문자열이기 때문에, 개발자가 아닌 일반인들에게 친숙한 단어를 사용하는 것이 중요하다.

URI 설계의 테크닉

확장자로 표현을 지정한다

프레스 릴리스(보도자료)를 웹에 공개하는 경우를 보면 전 세계를 상대로 하는 기업에서는 복수의 언어로 기술하는 것이 일반적이다. 한국어와 영어로 기술 되어있다고 가정해보자.

  • 콘텐트 네고시에이션

    이 케이스에서 프레스 릴리스 리소스는 하나이고, 그 표현이 영어 또는 한국어라는 것으로 정리할 수 있다.

    http://example.com/2010/05/01/press

    HTTP에는 콘텐트 네고시에이션이라는 편리한 기능이 있어서 OS에 따라 언어를 맞춰서 반환해준다.

    GET /2010/05/01/press HTTP/1.1
    Host: example.com
    Accpet-Language: ko.en_us:q=0.7,en:q=0.3 // 언어의 우선순위를 표현
  • 언어를 지정하는 확장자

    • 한국어
    http://example.com/2010/05/01/press.ko
    • 영어
    http://example.com/2010/05/01/press.en

    이처럼 확장자를 사용하는것은 나쁜것이 아니다. 리소스를 HTML과 텍스트와 JSON으로 표현할 수 있는 경우는 각각 .html, .txt, .json이라는 확장자를 붙여 각각의 표현으로 나누는 것이 좋다.

  • 매트릭스 URI

    URI는 슬래시(/)를 이용해 계층을 표현할 수 있다. 그러나 모든 정보를 계층으로 표현할 수 있는 것은 아니기 때문에, 여러 파라미터 조합으로 표현하는 리소스에는 매트릭스 URI를 사용한다.

    여기서는 계층구조를 표현하는 대신 파라미터를 세미콜론(;)으로 구분해 리소스를 표현한다. 위도와 경도를 사용하려면 다음과 같이 사용할 수 있다.

    http://example.com/map/lat=35.705471;lng=139.751898

URI의 불투명성

이전 프레스 릴리스 예제를 보고 프랑스어 페이지를 유추한다고 가정해보자

http://example.com/2010/05/01/press.fr

위와 같은 식으로 유추해 볼 수 있을 것이다. 그러나 이러한 리소스가 존재하지 않을 수도 있다.

이렇게 URI를 클라이언트 쪽에서 구성하거나 확장자로 리소스의 내용을 추단하거나 할 수 없는 특성을 'URI는 클라이언트 있어 불투명하다' 라고 한다.

URI를 강하게 의식하기

URI는 다음과 같은 점에서 아주 중요하다

  • URI는 리소스 이름이다.
  • URI는 수명이 길다.
  • URI는 브라우저가 어드레스 란에 표시한다.

이런 관점에서 URI는 웹 서비스와 웹 API의 설계에 있어서 가장 중요시 해야 할 부분이라고 할 수 있다.

profile
프로게이머 연습생 출신 주니어 서버 개발자 채상엽입니다.

0개의 댓글