layout: post
title: "웹을 지탱하는 기술 스터디 - Chapter5"
date: 2022-03-12T00:00:00-00:00
author: sangyeop
categories: Sproutt-2nd
웹은 각각의 리소스에 다른 리소스로 연결되는 링크가 들어있는 하이퍼 미디어 시스템이다. 이 링크가 끊어진다는 것은 하이퍼미디어 시스템이 동작하지 않는다는 것을 의미한다.
이러한 상황을 우려해 버너스-리는 'URI는 번혀자 않아야 한다. 변하지 않는 URI야말로 최고의 URI이다' 라는 주장을 했다
다음과 같은 URI가 있다고 가정해보자.
http://example.com/cgi-bin/login.pl
이 URI에서 cgi-bin
과 .pl
이라는 확장자는 구현에 의존적이라고 할 수 있다. 이러한 구조는 21세기에 들어서 성능 등의 문제로 인해 점차 보이지 않게 되었다.
이처럼 어떤 특정 언어에 의존하는 문자열을 URI에 포함시키면 그 언어를 변경하자마자 URI를 사용할 수 없게 된다.
다음과 같은 URI가 있다고 가정해보자.
메서드명 포함
리팩토링하여 메서드명이 바뀔 경우 바로 URI가 바뀌어 버려 사용할 수 없게 된다.
http://example.com/Login.do?action=showPage
세션ID 포함
로그인 할때마다 세션 ID는 바뀌므로, 이 URI는 시스템에 다시 로그인하면 변하게 된다
http://example.com/home.jsp?jsessionid=12345678
HTTP에서는 리소스에 대해서 특정 HTTP 메서드만을 적용한다. 그리고 어떤 리소스를 취득할지 갱신할지는 URI로 지정하는 것이 안리ㅏ, URI에 적용하는 HTTP 메서드로 결정해야한다. 따라서 URI는 전체적으로 명사가 되도록 설계해야 한다.
http://example.com/sample/people/123
심플한 URI는 사용성(Usability)를 향상 시켜준다
http://example.com/servlet/LoginServlet
http://example.com/login
URI가 심플하면 기억하는 것도 간단하기 때문에, 가능한 글자 수가 짧은 것이 중요하다. 또한 'servlet' 같은 경우 구현 의존적인 문자열이기 때문에, 개발자가 아닌 일반인들에게 친숙한 단어를 사용하는 것이 중요하다.
프레스 릴리스(보도자료)를 웹에 공개하는 경우를 보면 전 세계를 상대로 하는 기업에서는 복수의 언어로 기술하는 것이 일반적이다. 한국어와 영어로 기술 되어있다고 가정해보자.
콘텐트 네고시에이션
이 케이스에서 프레스 릴리스 리소스는 하나이고, 그 표현이 영어 또는 한국어라는 것으로 정리할 수 있다.
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
이전 프레스 릴리스 예제를 보고 프랑스어 페이지를 유추한다고 가정해보자
http://example.com/2010/05/01/press.fr
위와 같은 식으로 유추해 볼 수 있을 것이다. 그러나 이러한 리소스가 존재하지 않을 수도 있다.
이렇게 URI를 클라이언트 쪽에서 구성하거나 확장자로 리소스의 내용을 추단하거나 할 수 없는 특성을 'URI는 클라이언트 있어 불투명하다' 라고 한다.
URI는 다음과 같은 점에서 아주 중요하다
이런 관점에서 URI는 웹 서비스와 웹 API의 설계에 있어서 가장 중요시 해야 할 부분이라고 할 수 있다.