Django (Web Programming)

✌ Web Programming

  • HTTP(S) Protocol 로 통신하는 Client-server development.
  • web-client : Internet explorer, chrome, firefox 등 (이미 개발된 web-browser 를 사용하는게 일반적이나, 직접 만들어서 사용하는 경우도 존재함)

  1. Web-browser
  2. Linux “curl” command
  3. Telnet
  4. 직접 만든 Client

🙊 HTTP Protocol

  • Web-server 와 Web-client 사이의 데이터를 주고받기 위해 사용하는 통신 방식 (규약) 으로, TCP/IP Protocol 위에서 동작. 즉, server와 client 는 TCP/IP 동작에 필수적인 IP 주소를 가져야 함.

  • ex) Request message (No body)
GET /book/shakespeare HTTP/1.1
Host: www.example.com:8080
  • Start Line (Request line or State line)

Request Method + Request URL + Protocol version

  •  Header

Name : Value 표현, 여러 줄도 가능.

GET <http://www.example.com:8080/book/shakespeare> HTTP/1.1
// URL에 Host를 표시하면 Host header 생략 가능

ex) State message

HTTP/1.1 200 OK
Content-Type: application/xhtml+xml; charset=utf-8

<html>
...
<html>
  • State Line

Protocol version + State code + State text

  • Header

이 메시지는 바디를 갖고 있기 때문에 헤더와 바디를 빈 줄로 구분하고 있음.

  • URI vs URL
    URI (Uniform Resource Indentifier) 의 약자로 URL (Uniform Resource Locator) + URN (Uniform Resource Name) 인 넓은 의미의 표현이지만 Web programming 에서는 동일한 의미로 사용됨.

🙅 HTTP 처리 방식

  1. HTTP method 를 통해서 client가 원하는 처리 방식을 server에 알려줌.
  • HTTP Method
Method name Meaning CRUD mapping
GET 리소스 취득 Read(조회)
POST 리소스 생성, 리소스 데이터 추가 Create(생성)
PUT 리소스 변경 Update(변경)
DELETE 리소스 삭제 Delete(삭제)
HEAD 리소스의 헤더(메타데이터) 취득  
OPTIONS 리소스가 서포트하는 메소드 취득  
TRACE 루프백 시험에 사용  
CONNECT 프록시 동작의 터널 접속으로 변경  

 

  • 주요 HTTP Method

1. GET

URL 정보를 가져오는 method로, Web browser를 이용하여 서버로부터 웹 페이지, 이미지, 동영상 등을 가져오려고 할 때 사용됨.

URL 부분의 ? 뒤에 이름=값 쌍으로 이어붙여 보냄.

GET <http://docs.djangoproject.com/search/?q=forms&release=1> HTTP/1.1

→ Parameter를 보내는 방식의 차이로 인해 많은 양의 데이터를 보내기 어려움. (URL의 길이 제한)

→ 전달되는 사용자의 데이터가 웹 브라우저 주소창에 노출된다는 단점으로 인한 보안 이슈.

 

2.POST

블로그에 글을 등록하는 경우가 이에 해당됨. (리소스 생성)

URL에 포함시켰던 parameter들을 요청 메시지의 바디에 넣음

POST <http://docs.djangoproject.com/search/> HTTP/1.1
Content-Type: application/x-www-form-urlencoded

q=forms&release=1

→ 폼을 사용하거나 추가적인 Parameter를 서버로 보내는 경우 이 방식을 더 사용함.

3. PUT

블로그에서 글을 업로드한 작성자를 변경하거나 글의 내용을 업데이트하는 경우

4. DELETE

리소스 삭제, Body를 반환하지 않음.

  • State code (상태 코드)

Server 에서의 처리 결과를 알 수 있는 코드.

세 자리 숫자로 되어 있는데, 첫 번째 숫자는 HTTP 응답의 종류를 구분하는데 사용하고, 나머지 두 개의 숫자는 세부적인 응답 내용의 구분을 위한 번호.

  • State code 분류
Method name Meaning CRUD mapping
1xx informational (정보 제공) 임시적인 응답으로, 현재 클라이언트의 요청까지 처리되었으니 계속 진행하라는 의미.
2xx Success(성공) 클라이언트의 요청이 서버에서 성공적으로 처리되었다는 의미.
3xx Redirection 완전한 처리를 위해서 추가적인 동작을 필요로 하는 경우. 주로 서버의 주소 또는 요청한 URI의 웹 문서가 이동되었으니 그 주소로 다시 시도해보라는 의미.
4xx Client Error 없는 페이지를 요청하는 것처럼 클라이언트의 요청 메시지가 잘못된 경우
5xx Server Error 서버 측 사정에 의해서 메시지 처리에 문제가 발생한 경우. 서버의 부하, DB 처리 과정 오류, 서버에서 익셉션이 발생하는 경우가 이에 해당됨.
  • 자주 사용되는 상태 코드
State code State Text 응답 문구 서버 측면에서의 의미
2xx Success 성공 클라이언트가 요청한 동작을 수신하여 이해했고, 승낙했으며 성공적으로 처리함.
200 OK 성공 서버가 요청을 성공적으로 처리했다.
201 Created 생성됨 요청이 처리되어서 새로운 리소스가 생성되었음. 응답 헤더 Location에 새로운 리소스의 절대 URL 기록.
202 Accpeted 허용됨 요청은 접수했지만 처리가 완료되지 않음. 클라이언트는 응답 헤더의 Location, Retry-After 를 참고하여 다시 요청을 보냄.
3xx Redirection 리다이렉션 클라이언트는 요청을 마치기 위해 추가적인 동작을 취해야 한다.
301 Moved Permanently 영구 이동 지정한 리소스가 새로운 URL로 이동.
이동할 곳의 새로운 URL은 응답 헤더 Location에 기록.
303 See Other 다른 위치 보기 다른 위치로 요청하라. 요청에 대한 처리 결과를 응답 헤더 Location에 표시된 URI에서 GET으로 취득할 수 있음. 브라우저의 폼 요청을 POST로 처리하고 그 결과 화면으로 리다이렉트시킬 때, 자주 사용하는 응답 코드.
307 Temporary Redirect 임시 리다이렉션 임시로 리다이렉션 요청이 필요하다.
4xx Client Error 클라이언트 에러 클라이언트의 요청에 오류가 있다.
400 Bad Request 잘못된 요청 요청의 구문이 잘못되었다.
401 Unauthorized 권한 없음 지정한 리소스에 대한 엑세스 권한이 없다.
403 Forbidden 금지됨 지정한 리소스에 대한 액세스가 금지되었다.
404 Not Found 찾을 수 없음 지정한 리소스를 찾을 수 없다.
5xx Server Error 서버 에러 클라이언트의 요청은 유효한데, 서버가 처리에 실패했다.
500 Internal Server Error 내부 서버 오류 서버쪽에서 에러 발생.
502 Bad Gateway 불량 게이트웨이 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 잘못된 응답을 받았다.
503 Service Unavailable 서비스 제공불가 현재 서버에서 서비스를 제공할 수 없다.

👍 URL 설계

  • 웹 서버 로직 설계의 첫걸음으로, 사용자 또는 웹 클라이언트에게 웹 서버가 가지고 있는 기능을 명시해주는 중요한 단계.

  • URL 스킴 : URL에 사용된 프로토콜
  • 호스트명 : 웹 서버의 호스트명으로, 도메인명 또는 IP 주소로 표현.
  • 포트번호 : 웹 서버 내의 서비스 포트번호로 생략 시에는 Default 포트번호로 http는 80, https는 443 사용됨.
  • 경로 : 파일이나 애플리케이션 경로
  • 쿼리스트링 : 질의 문자열로, &로 구분된 이름=값 쌍 형식으로 표현됨.
  • 프라그먼트 : 문서 내의 앵커 등 조각을 지정

👀 URL을 바라보는 측면

Web-Client 에서 호출한다는 시점으로 보면 웹 서버에 존재하는 애플리케이션에 대한 API (Application Programming Interface) 라고 할 수 있음. API의 명명 규칙을 정하는 방법은 두 가지로 분류 가능함.

 

1. RPC (Remote Procedure Call)

  • 클라이언트가 네트워크상에서 원격에 있는 서버가 제공하는 API 함수를 호출하는 방식으로, 두 설계를 동일하게 고려하여 URL의 경로를 API의 함수명으로, 쿼리 파라미터를 함수의 인자로 간주하여 인식.
  • 자바의 일반적인 함수나 메소드명이 동사인 것처럼 URL 경로의 대부분이 동사가 됨.
  • 그러나, REST 방식이 나오면서 점차 사용빈도가 줄어들고 있음.
<http://blog.example.com/search?q=test&debug=true>

 

2. REST (Representational State Transfer)

  • 서버에 존재하는 요소들을 모두 리소스라고 정의하고, URL을 통해 웹 서버의 특정 리소스를 표현한다는 개념.
  • 이 리소스는 시간에 따라 상태가 변할 수 있기 때문에, 클라이언트와 서버 간의 데이터의 교환을 리소스 상태의 교환으로 간주하고 있음. 여기서 중요한 점은 리소스에 대한 조작을 GET, POST, PUT, DELETE 등의 HTTP 메소드로 구분한다는 것임.
<http://blog.example.com/search/test> 

✨ 간편 URL

  • REST 방식을 기반으로 간단하면서 사용자에게 친숙하게 표현하려고 생겨남.
  • 쿼리스트링 없이 경로만 가진 간단한 구조의 URL.

 

😂 파이썬 URL

  • 간편 URL 방식을 도입하였고, URL을 정의하기 위해 정규표현식을 추가적으로 사용 가능함.
urlpatterns = [
		path('articles/2023/', views.special_case_2003),
		re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
		re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})$', views_month_archive),
		re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[w-]+)/$', views_article_detail),
		
		]

😒 Web Application Server (SW 측면에서의 서버 프로그램)

구분 역할 프로그램 명
웹 서버 웹 클라이언트의 요청을 받아서 요청을 처리하고, 그 결과를 웹 클라이언트에 응답한다. 주로 정적 페이지인 HTML, 이미지, CSS, Javascript 파일을 웹 클라이언트에 제공할 때 웹 서버를 사용함. 만일 동적 페이지 처리가 필요하다면 웹 애플리케이션 서버에 처리를 넘김. Apache httpd, Nginx, lighttpd, IIS 등
웹 애플리케이션 서버 웹 서버로부터 동적 페이지 요청을 받아서 요청을 처리하고, 그 결과를 웹 서버로 반환함. 주로 동적 페이지 생성을 위한 프로그램 실행과 데이터베이스 연동 기능을 처리함. Apache Tomcat, JBoss, WebLogic, WebSphere, Jetty, Jeus 등
  • 정적 페이지 vs 동적 페이지

1. 정적 페이지

  • 누가, 언제 요구하더라도 항상 같은 내용을 표시하는 웹 페이지
  • 제공자가 사전에 준비하여 서버 측에 배치함
  • 동일한 리소스의 요청에 대해서 항상 동일한 내용의 페이지 반환
  • HTML, Javascript, CSS, Image 만으로 이루어진 페이지

2. 동적 페이지

  • 동일한 리소스의 요청이라도 누가, 언제, 어떻게 요구했는지에 따라 각각 다른 내용이 반환되는 페이지
  • 예를 들어, 현재 시각을 보여주는 페이지나 온라인 쇼핑 사이트에서 사용자마자 다른 카트 내용을 보여주는 페이지

 

💁 CGI (Common Gateway Interface) 방식

  • 별도의 프로그램과 웹 서버 사이의 정보를 주고받는 규칙
  • 웹 서버와 독립적인 프로그램(프로세스) 사이의 정보를 주고받는 규격으로, 이 규격만 준수하면 어떤 언어를 사용해도 CGI Program 개발 가능

  1. 단점

각각의 클라이언트 요청에 대해서 독립적인 별도의 프로세스가 생성되어 요청이 많아질수록 프로세스가 많아지고, 비례하여 메모리 요구량이 커져 시스템에 많은 부하를 준다.

🙊 CGI 방식 대안 기술

  1. 별도의 애플리케이션을 스크립트 언어로 작성하고, 스크립트 처리하는 엔진을 웹 서버에 내장시켜 별도의 프로세스를 실행시키는 오버헤드를 줄이는 방식.
  2. 애플리케이션을 처리하는 프로세스를 미리 데몬으로 실행시켜놓은 후, 웹 서버의 요청을 데몬에서 처리하는 방식.

→ 데몬 방식에서 객체 지향 기술이 반영되어 애플리케이션 서버 방식으로 발전됨.

 

😆 애플리케이션 서버 방식

 

웹 애플리케이션 서버 방식을 통해서 간접적으로 웹 애플리케이션 프로그램을 실행

웹 서버와 웹 애플리케이션 서버를 분리하여 서로의 역할을 구분하여 사용하는 것이 좋음

→ 정적 페이지를 처리하는 경우에 비해 동적 페이지를 처리하는 경우가 많은 메모리를 소비하기 때문.

→ 정적 페이지에 특화된 웹 서버는 정적 페이지만 처리하고, 동적 페이지에 특화된 웹 애플리케이션 서버는 동적 페이지만 처리할 수 있도록 분리하는 것이 더 많은 요청을 처리할 수 있음.

  • 캐시 기능, 프록시 기능 등의 추가적인 기능을 제공

😆Web Application Server Box (HW 측면에서의 프로그램)

  • 서비스 운용 관리 측면에서 하나의 HW 박스에 구성하는 것이 좀 더 간편한 방식
  • HW 박스를 분리하여 구성해서 메모리 효율을 높임

→ 각각 페이지를 처리하는 메모리 사이즈 비율을 조절할 수 있기 때문임.

 

 

'Back-end > Django' 카테고리의 다른 글

Django 기본 요소 (URL과 View, Model)  (1) 2024.12.29
Django 개발 준비  (1) 2024.12.26
Django CSS  (3) 2024.10.22
Django HTML  (3) 2024.10.09