2부. URI
chapter04. URI의 스펙
URI는 Uniform Resource Identifier의 약자로 리소스를 통일적으로 식별하는 ID를 의미합니다. 이 URI를 통해서 해당 리소스를 간단하게 접근 가능합니다. 하지만 URI를 잘못 설계하면 이후 시간이 지나서 해당 리소스를 접근하지 못하는 경우가 발생할 수 있기 때문에 처음부터 잘 설계하는 것이 중요합니다.
http://blog.example.com/entries/1
위와 같은 URI이 있을 때 URI 구성하는 파트는 다음과 같습니다.
- URI Scheme : http
- 호스트명 : blog.example.com
- 패스 : /entries/1
URI는 URI 스키마로 시작이 되는데 위를 보면 http로 접근할 수 있다는 것을 나타냅니다. 전 URI에서 Schema부분을 저렇게 딱 분리되어 생각해보지 않았었는데요. 우리가 흔히 보던 https 뿐만 아니라 telnet, ftp 도 URI로 포함되고 그것들이 스키마의 한 종류라는 것을 알게되었습니다. URI 스키마의 공식적인 목록은 IANA(Integer Assigned Numbers Authority)에서 찾을 수 있습니다.
그리고 호스트명은 DNS(Domain Name System)로 등록되어 전세계의 하나 밖에 없는 이름으로 가지게 됩니다. 뒤의 패스는 파일 시스템과 같은 계층구조를 가지고 다음 리소스들과 겹치지 않게끔 해줍니다. 패스에서 살펴볼 것이 상대경로, 절대경로가 있는데요. /(루트)부터 적어주는 절대 경로와 달리 상대 경로는 기준이 되는 URI로 .. 또는 .를 통해 접근하기 때문에 그 기준을 설정하는 것이 중요합니다. 보통 해당 리소스를 기준으로 판단을 하지만 명시적으로 지정할 수도 있습니다. 그 방법은 HTML의 요소 안에
<head>
<title>test web page</title>
<base href = "http://example.com/"/>
</head>
하지만 해당 리소스나 Base URI로부터 경로를 파악해야 하는 불편한 점 때문에 /(루트)부터 모두다 기입하는 절대경로로 통일하여 대부분 작성합니다.
그럼 만약 URI에 한글을 포함하고 싶다면 어떻게 할까요?
URI는 기본적으올 ASCII 문자 밖에 허용이 안되지만 한글을 입력하기 위해선 %인코딩이라는 방식이 필요합니다. http://ko.wikipedia.org/wiki/가
라는 URI이 있습니다. '가'는 UTF8로 '0xEA 0xB0 0x80'으로 나타낼 수 있는데요. 사실 내부적으로 http://ko.wikipedia.org/wiki/%EA&B0%80
을 통해서 작동하고 있는 것입니다.
chapter05. URI의 설계
웹을 발명하였던 팀 버너스-리는 'Cool URIs don't change'라는 제목으로 발표한 적이 있는데요. Cool한 URI는 무엇을 의미하는 걸까요? 저는 초기에 인터넷이 막 보급되었을 때 보관해두었던 URI가 이후에 제대로 작동하지 않는 경험을 많이 해보았는데요. 그때는 URI에 대한 설계가 명확하지 않았기 때문에 URI가 자꾸 바뀌게 되면서 발생하였던 문제였습니다. 그렇다면 어떻게 설계해야 좀처럼 변하지 않는 URI로 만들 수 있을까요? 지금은 사실 프레임워크에서 대부분 처리해주지만 알아두면 좋을 것 같습니다.
프로그래밍 언어에 의존적인 확장자와 경로를 포함하지 않는다
- 해당 언어가 바뀔 수도 있고 해당 프로그래밍 언어에서 표현하는 문법도 언어마다 다 다를 수 있기 때문에 의존적이지 않는 경로로 만드는 것이 중요합니다.
메서드명과 세션ID는 포함하지 않는다
- 메서드명을 변경하거나 세션ID가 다음 로그인에서 바뀌게 되면 문제가 발생하겟죠?
URI는 리소스를 표현하는 명사로 한다
- 어떤 리소스에 대한 표현은 URI이 아니라 GET, POST와 같은 HTTP 메서드로 결정하는 것입니다.
- 따라서 show과 같은 표현을 URI로 넣는 것은 적절하지 않습니다.
이전에 계속 사용되고 있는 URI를 피치못하게 변경해야 할 경우가 있습니다. 이때는 기존의 사용자가 있기 때문에 Redirect를 통해서 다시 새로운 URI로 접근할 수 있게끔 할 수 있습니다. Redirect는 301코드와 302코드가 있는데 이제부터 영원히 새로운 URI로 접근하게 하려면 301(Moved Permanently)를 사용하여 다음부터는 클라이언트에서 바로 새로운 URI로 접근할 수 있게끔 할 수 있습니다. 301과 302코드의 차이점은 따로 확인해보시길 바랍니다.
다만 위에서 URI에서 의존적인 확장자를 갖지 않는 것이 좋다고 했는데요. 상황에 따라 의존적인 확장자가 좋을 때도 있습니다. 하나의 콘텐츠에 대해 다양한 언어로 제공할 때인데요. 이 경우는 .ko 또는 .en과 같은 확장자를 가지는 것이 더 좋은 설계라고 하네요.
'Book > programming' 카테고리의 다른 글
웹을 지탱하는 기술1 - 웹 개론 (0) | 2019.02.07 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 08장. 프록시와 연관관계 관리 (0) | 2019.01.02 |
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초3 (0) | 2018.12.27 |
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초2 (0) | 2018.12.26 |
[자바 ORM 표준 JPA 프로그래밍] 05장. 연관관계 매핑 기초 (0) | 2018.12.26 |