1. 웹프로그래밍이란?

2019. 5. 22. 16:08파이썬 웹프로그래밍

1.1. 인터넷과 웹 사이트

인터넷은 사전적 정의로 '전 세계에 걸쳐 원거리 접속이나 파일 전송, 전자 메일 등의 데이터 통신 서비스를 받을 수 있는, 컴퓨터 네트워크의 시스템' 이라는 뜻을 가지고 있습니다. 영어의 사전적 의미로 보아도 'Inter' + 'Network'로 구성된 단어로 여러 네트워크가 연결된 것을 의미하고 있음을 알 수 있습니다. 이런 뜻처럼 우리가 사용하는 인터넷은 전세계에 퍼져있는 수많은 컴퓨터들 사이에 데이터가 오고가는 연결망을 의미합니다. 우리는 그 안에서 정보를 접하고 전달하며 다양한 활동들을 하며 살아가고 있습니다.

인터넷의 최초 기원은 미국 정부가 핵 전쟁 상황에서도 커뮤니케이션이 가능하게 설계했던 시스템 '아파네(ARPAnet)'입니다. 첫 통신은 1969년 10월 29일에 캘리포니아대학교에서 스탠퍼드대학교로의 접속입니다. 이후 미국내 다양한 네트워크들이 하나로 연결되기 시작했고 다른 국가들도 자체적으로 네트워크를 만들기 시작했습니다. 하지만 각각 네트워크에서 사용되는 데이터 교환방식이 달랐기 때문에 국가간 통신에는 적용하기 힘들었습니다. 이 때문에 TCP/IP라는 공동 프로토콜이 만들어졌고 결국 국가간 네트워크도 연결될 수 있었습니다.

이렇게 전세계적으로 넓은 지역에 퍼져있는 컴퓨터들이 네트워크로 묶여 있으려면 어떻게 해야 할까요? 스마트폰으로 전화를 할 때는 전파를 잡아서 한다고 하고 이따금씩 와이파이를 쓰기도하니깐 연결 선이 없이도 전세계가 연결이 되어 있을까요? 그렇지 않습니다. 그럼 인터넷도 마찬가지겠죠? 인터넷은 국가와 국가 사이에 해저 케이블들로 연결이 되어 있습니다. 

최초의 해저 케이블은 1851년 영국 해협을 가로질러 매설 되었다고 알려져 있습니다. 결국에 인터넷은 네트워크간에 선이 연결되어 있어야 하기 때문에 물리적인 문제로 이따금씩 연결이 끊기는 경우가 생깁니다. 예전에 일본에 대지진이 발생했을 때 일부 네트워크 사업자를 사용하는 사람들은 외국 사이트 접속이 평소보다 현저히 느려지는 상황이 생기기도 했습니다. 물리적인 문제는 언젠가는 해결이 되겠지만 아직까지는 유선 통신이 무선보다 더 안정적이고 빠르기 때문에 유선 통신이 주를 이루고 있습니다.

이런 물리적 기반 위에서 동작하는 인터넷을 ㅌ총해 다양한 활동들을 할 수 있습니다. 네트워크 게임, 인터넷 쇼핑, 유튜브 류의 스트리밍 방송 시청 같은 일들을 하고 있습니다. 일상에서 하는 수많은 일들을 인터넷을 통해 하는데 기본적으로는 '웹 사이트'를 기반으로 하고 있습니다. 검색을 할 때는 구글이나 네이버에 접속해서 하고 쇼핑을 할 때도 쇼핑몰 사이트에 접속을 합니다. 게임을 할 때도 게임 사이트에 접속해 로그인을 하고 클라이언트를 실행하기도 합니다. 이처럼 우리가 하는 대부분의 인터넷 활동은 웹 사이트에 기반을 두고 있습니다. 그럼 웹 사이트란 무엇인지 가볍게 살펴볼까요?

웹 사이트란 '도메인 이름이나 IP 주소, 루트 경로만으로 이루어진 일반 URL을 통하여 보이는 웹 페이지들의 의미 있는 묶음이다.' 라는 사전적 의미를 가지고 있습니다. 흔히 홈페이지라고 부르는 것들은 다 웹 사이트라고 할 수 있습니다. 조금 더 쉡게 설명하면 웹 브라우저를 통해 사이트 주소를 입력해서 접속하는 모든 페이지들을 웹 사이트라고 부를 수 있습니다. 웹 사이트에 접속할 때 인터넷 초창기에는 102.142.133.111 같은 IP 주소를 사용했습니다. IP 주소는 숫자로만 구성되어 있기 때문에 외워 쓰기 힘들다는 단점이 있었습니다. 그래서 도메인 주소라는 개념이 만들어집니다. 흔히 말하는 웹 사이트 주소 www.google.com과 같은 형태를 도메인 주소라고 합니다. 웹 브라우저에 도메인 주소를 입력하면 도메인 주소와 연결되어 있는 IP주소를 찾아서 해당 IP주소를 가진 컴퓨터로 접속합니다. 이 순서를 따라 웹 사이트에 접속하게 되기 때문에 도메인 주소와 IP주소를 연결시켜주는 전화번호부 같은 개념이 필요합니다. 이 전화번호부를 도메인 네임 시스템(Domain Name System, DNS)라고 합니다. 어떤 도메인이 어떤 IP와 연결되어야 하는지를 기록해두고, 사용자의 요청이 있을 때 알려주는 것이 주로 하는 일인데, 이를 이용해 우리는 IP 대신 이해하거나 외우기 쉬운 인터넷 주소를 사용할 수 있게 된 것입니다.

웹 프라우저에 주소만 입력하고 엔터키를 눌렀을 뿐인데 여러가지 일들이 일어나고 해저 케이블까지 통과해가면서 정보를 받아보고 있다는 사실이 놀랍지 않으신가요? 이제 웹 브라우저를 이용해 웹 사이트에 접속했을 때 우리가 눈으로 보게되는 웹헤이지들이 어떻게 구성되는지 살펴봅시다.

 

1.2. 웹 프로그래밍의 세계

웹 프로그래밍은 웹사이트 혹은 웹 페이지를 만드는 과정을 말합니다. 웹 사이트에 접속했을 때 보이는 화면을 구성하는 것들을 만들어 내는 작업. 이 작업은 다양한 언어를 사용해 진행합니다. 웹 프로그래밍을 할 때는 HTML, CSS, JavaScript 같은 웹 브라우저 단에서 동작하는 코드와 Python, Ruby, PHP, Java 등 서버 컴퓨터쪽에서 동작하는 코드를 작성합니다. 다양한 언어로 화면을 구성하거나 화면을 구성할 내용을 만들어 내기 때문에 정확히 어디서부터 어디까지 어떤 언어로 일을 처리할 것이냐를 이해하고 있어야만 합니다. 먼저 브라우저 단에서 동작하는 코드를 작성하는 것을 프론트 엔드 프로그래밍이라고 합니다. 클라이언트 사이드 프로그래밍이라고도 할 수 있습니다. 프론트엔드에서는 HTML, CSS, JavaScript를 이용합니다. 대부분 화면을 구성하는 코드를 작성하기 때문에 퍼블리싱이라고 부르는 경우도 있습니다만 실무에서 퍼블리셔와 프론트엔드 프로그래머가 하는 일은 어느정도 분리가 되어있습니다.

언어 용도
HTML 페이지의 구성, 벼대를 담당
CSS HTML 요소에 색상, 크기 등 디자인적인 요소를 적용
JavaScript 이미 만들어진 페이지의 내용을 변경하거나 페이지 구성물들에 움직임을 부여하는 등 종적인 일을 처리

위의 표처럼 세가지 언어들은 역할이 명확하게 분리되어 있습니다. 예전에는 CSS가 할 일을 HTML에서 직접해주기도 했었습니다. 하지만 세 언어의 역할이 명확히 분리되지 않을 경우 유지보수가 점점 어려워지기 때문에 현대 웹 프로그래밍에서는 최대한 역할을 분리하는 추세입니다.

백엔드 프로그래밍은 서버쪽에서 실행되는 코드를 작성하는 것을 말합니다. 서버 사이드 프로그래밍이라고도 합니다. 백엔드 프로그래밍은 프론트와 다르게 수없이 많은 언어를 사용할 수 있습니다. 컴퓨터에서 실행할 수 있는 코드를 작성할 수 있는 언어라면 대부분 백엔드 프로그래밍에 사용할 수 있기 때문에 현존하는 대부분의 언어로 백엔드 프로그램이이 가능하다라고 말할 수 있습니다.

최근 많이 사용되고 있는 언오로는 Python, Javam C#, Ruby, PHP 등이 있습니다. 그런데 이런 언어들을 사용해서 웹 서비스를 만드는 과정에서 언어만 그냥 사용하고 있는 것이 아니라 프레임워크라는 것을 사용하기도 합니다. 요즘은 프레임워크 사용률이 상당히 높아져가고 있습니다. 왜냐하면 언어 자체로 웹 프로그래밍을 하는 것은 꽤나 반복적이고 지루한 작업을 많이 해야 하는데 이 빈도와 양이 상당한데 이런 비효율을 해결하기 위해 만들어진 도구가 프레임워크이기 때문입니다.

Java는 Spring을 JS는 Node.js를 Ruby는 Ruby on Rails라는 프레임워크를 사용하고 PHP도 Laravel이라는 프레임워크를 사용하게 되면서 언어단의 점유율 싸움이 아니라 이제는 프레임워크간의 점유율 싸움인 것 같다는 생각마저 들게 되는 실정입니다. 일일이 열거하기에는 너무 많은 프레임워크가 있습니다. 그래서 프레임워크의 종류를 알기보다는 큰 분류를 알아 두는 것이 좋겠습니다.

웹 프레임워크는 크게 풀스택 프레임워크와 마이크로 프레임워크가 있습니다. 풀스택 프레임워크는 웹 서비스를 만드는데 필요한 다양한 기능(데이터베이스, 인증, 템플릿 엔진 등)을 모두 포함하고 한꺼번에 설치하는 형태입니다. 이 때문에 프레임워크를 설치하자마자 기본적인 웹 서비스를 할 수 있을 정도로 편리합니다. 다만 기본 기능들이 하나로 똘똘 뭉쳐있기 때문에 커스터마이징이 비교적 어렵다는 점과 함게 설치되는 코드의 양이 많기 때문에 상대적으로 느리다는 단점이 있습니다. 마이크로 프레임워크는 적은 코드가 초기에 설치되고 많은 기능을 갖고 있지 않기 때문에 가볍고 빠르다는 장점과 커스터마이징 하기에 좋다는 장점을 갖고 있습니다. 반대로는 기능 개발에 비교적 시간이 오래 걸릴 수 있다는 점입니다. 

 

1.3. 웹 서버와 웹 애플리케이션 서버

이렇게 프레임워크를 활용하거나 언어 자체로 웹 서비스를 만들면 인터넷 공간 어딘가에 컴퓨터를 준비해 두고 그 컴퓨터 안에 웹 애플리케이션이 동작하고 있어야만 사람들이 이용할 수 있습니다. 이 때 사용하는 컴퓨터가 바로 웹 서버입니다. 실상 웹 서버 프로그램이라고 불러야 맞는 이야기겠지만 기본적으로는 컴퓨터 단위를 말하기 때문에 여기서도 컴퓨터라 부르겠습니다. 웹 서버는 다양한 기능을 하는 각각의 소프트웨어가 동작할 수 있는 환경이 되는 컴퓨터를 말합니다. 그리고 그 중에서도 웹 서버 프로그램은 사용자가 브라우저를 통해 서버 컴퓨터에 적속했을 때 요청을 정리하고 웹 애플리케이션으로 전달하는 역할을 하는 프로그램입니다. 웹 애플리케이션 서버란 웹 서비스 자체가 돌아가는 서버를 이야기합니다. 여기서도 다시 웹 애플리케이션 서버 프로그램이라고 부르도록 하겠습니다.

이전에는 웹 서버 프로그램이 웹 애플리케이션에 요청을 전달하거나 처리된 결과를 받아오기 위해 CGI(Common Gateway Interface)라는 방식을 사용했습니다. 쉡게 말해서 정해진 양식을 사용해 요청하고 결과를 받아오는 방식입니다. 그런데 이 방식은 상당히 느리고 비효율적이었습니다. 그래서 아파치 웹 서버 같은 경우 fast_cgi나 기타 모듈 방식으로 발전을 하게 됩니다. 이후 점점 성능을 높이려는 시도를 통해 웹 애플리케이션 서버 방식으로까지 발전하였습니다. Java의 경우 톰캣이라는 웹 애플리케이션 서버를 사용하고 파이껀 장고나 루비 레일즈 같은 경우 Gunicorn 같은 방식의 미들웨어 서버 방식으로 사용하고 있습니다. CGI 방식에 비해 어떤 점이 좋아졌는지 대표적인 것 하나만 꼽자면 포크(Fork) 방식으로 요청이 있을 때마다 프로그램을 별도로 실행해서 메모리를 잡아먹는 대신 웹 애플리케이션 서버를 통해 요청을 한곳에 전달해 메모리를 절약할 수 있게 효율화 되었다는 것입니다.

 

1.4. 장고

장고는 WSGI라는 미들웨어 방식으로 웹 애플리케이션 서버를 구동해 적은 리소스로 노ㅠ은 효율성을 내기 위해 발전해가고 있습니다. 실전 예제를 만들 때에는 실제로 WSGI를 이용한 방식으로 배포를 해보게 될 것입니다.

 

1.5. 인프라라 불리우는 것들에 대해서

웹 서버와 웹 애플리케이션 서버가 동작하려면 컴퓨터가 필요합니다. 그런데 웹 서비스를 하려면 한 대의 컴퓨터만 가지고 일하지는 않습니다. 사용자 접속량에 따라 수백대 이상의 서버를 사용해 웹 애플리케이션을 종작시키고 데이터베이스 서버, 파일 이미지 서버 등이 별도로 동작하고 이메일 서버 로그인 서버 등을 따로 운영하기도 합니다. 이런 다양한 종류의 서버 컴퓨터들이 동작하는 환경과 이 환경의 형태를 인프라라고 부릅니다. 요즘은 클라우드 컴퓨팅이라고 해서 이런 인프라를 가상화를 통해 구성하기도 합니다. 가상화가 실제 물리적 컴퓨터를 활용한 방식보다 확장이나 관리면에서 편리하긴 하지만 구성방식은 대동소이 합니다.

간단한 인프라를 예를 들자면 CDN-로드밸런서-웹 서버-(캐시,데이터베이스,파일) 서버 들이 하나로 뭉쳐있는 형태입니다. 한가지씩 설명 드리겠습니다.

CDN은 Content Delivery Network라고 불리는 서비스로 전세계 곳곳에 노드 컴퓨터를 두고 사용자가 필요한 데이터를 미리 저장해 놓거나 요청받은 이후에 다음 사용자를 위해 저장해 놓는 형태로 서버와 사용자간 물리적 거리로 인한 응답 시간 증가를 최소화하기 위한 서비스입니다. 에어비앤비나 직방같은 고화질 이미지를 전송해야 하는 서비스나 유튜브처럼 전세계에 대용량 데이터를 전송해야 하는 서비스들이 이 CDN을 통해 서비스 효율화를 추구하고 있습니다.

로드밸런서는 웹 서버와 관련이 있습니다. 한 대의 웹 서버가 동시 접속자 100명을 감당한다고 생각해 봅시다. 동시 접속자가 300명이 되려면 어떻게 해야할까요? 컴퓨터를 3대로 늘리거나 한대의 웹 서버 사양을 높이는 방식을 취해야 합니다. 전자를 아웃 스케일링 후자를 업 스케일링 한다고 하는데 아웃 스케일링을 하려면 여러 컴퓨터가 하나로 묶여있어야 사용자들이 불편함 없이 서비스에 접속할 수 있습니다. 이 때 사용하는 것이 로드밸런서입니다. 사용자들이 어떤 URL을 이용해 접속할 때 IP가 필요하ㄴ다는 것을 설명드렸었습니다. 로드 밸런서를 사용하는 인프라 환경에서는 URL을 통해 얻는 IP가 로드밸런서의 IP입니다. 그래서 사용자는 결국에 로드밸런서로 접속하고 로드밸런서는 접속한 사용자의 요청을 어떤 웹 서버 컴퓨터로 전달하는 역할을 수행합니다. 클라우드 컴퓨팅 인프라에서는 이 로드밸런서도 내부적으로 아웃 스케일링을 통해 사용자 증가를 감당하고 있습니다.

웹 서버는 실제 요청을 처리하는 컴퓨터입니다. 웹 서버 프로그램과 웹 애플리케이션 프로그램이 보통 한 컴퓨터에서 실행되도록 만드는데 이 웹 서버 자체의 구성 방법도 다양합니다. 하지만 기본적으로는 아파치나 Ngnix같은 웹 서버 프로그램이 동작하고 있는 컴퓨터를 지칭합니다.

캐시 서버는 CDN과 비슷한 역할을 하는데 들어온 요청에 대한 응답을 미리 파일이나 메모리 캐시로 저장해 두는 컴퓨터를 말합니다. Redis나 Memcached 같은 것들이 대표적입니다. 한 번 요청이 들어오면 웹 서버가 이 요청을 받고 웹 애플리케이션에 요청을 전달합니다. 그리고 자료가 필요하면 데이터베이스에 접근해 데이터를 얻어와서 요청을 가공하고 웹서버에 전달하면 웹 서버가 이 완성된 자료를 사용자에게 전달하는 방식으로 웹 서비스가 동작하는데 캐시는 이과정을 생략하기 위해서 동작합니다. 웹 서버가 어떤 요청을 받으면 해당 요청과 똑같은 요청이 있었는지 캐시에서 확인하고 있었다면 그걸 바로 내어주는 형태입니다.

데이터베이스는 컴퓨터에서 사용하는 엑셀과 비슷한 역할을 합니다. 웹 서비스는 수많은 데이터를 저장하고 가공해야합니다. 컴퓨터를 가무용도로 사용할 때는 데이터 관리를 위해 엑셀 같은 프로그램을 사용하는데 이 때 파일에 데이터를 저장합니다. 이렇게 파일에 저장하는 방식은 느린 편에 속합니다. 그래서 웹 서비스에서 다루는 높은 빈도의 데이터 처리에는 적합하지 않습니다. 데이터베이스를 그러한 단점을 해결하기 위해서 나온 데이터 관리 전용 서비스입니다. 데이터를 빠르게 저장하고 검색하는 용도로 웹 서비스가 요구하는 높은 성능을 보여줍니다. MySQL, MS-SQL, Oracle DB 같이 많은 회사에서 다양한 형태로 만들어서 판매하고 있습니다. 또 RDS와 No-SQL라 불리우는 형태도 나뉘기도합니다. RDS는 흔히 말하는 SQL 쿼리문을 사용하는 관계형 데이터베이스를 말하고 No-SQL은 SQL 사용하지 않고 문서형태로 관리하는 데이터베이스를 말합니다. 하지만 웹 서비스를 구성할 때 한가지 데이터베이스만 사용하는 것이 아니라 기능이나 데이터 종류에 따라 다양한 데이터 베이스를 조합해서 사용하기도 합니다.

마지막으로 파일 서버 같은 경우 사용자가 업로드한 파일을 여러 사용자가 함게 봐야하는 경우 대표적으로 인스타그램같은 서비스에서 활용하는 서버입니다. 사용자가 파일을 업로드했다면 보통 한곳의 웹서버를 통해 업로드 합니다. 그럼 다른 웹 서버들에 이 파일을 동기화해야하는데 이 동기화 기법도 여러 가지 방법이 있고 효율도 다릅니다. 하지만 한 곳에 업로드한 후 여러곳에 동기화 하는 방법은 아무리 노력해도 동기화가 완벽히 되지 않는 경우가 발생할 수 밖에 없습니다. 그래서 사용하는 방식이 중앙에 하나의 이미지 서버를 준비해두고 이 곳을 통해 이미지를 공유하는 방식입니다. 이런 방식을 사용하면 네트워크가 단절되지 않는 한 이미지를 여러 웹 서버에서 동시에 접근할 수 있습니다.

자, 간단한 인프라를 구성하려고 해도 이렇게 다양한 서버들이 필요합니다. 앞으로 여러분이 능력있는 웹 서비스 개발자가 되려면 다양한 인프라 구성 방식에 대해 알아야 하고 각 인프라에 대한 접근 방법 API가 있다면 그 API를 이용하는 방법도 익혀두셔야 합니다. 물리적 인프라는 별도로하고 클라우드 같은 경우에도 국내에 SK, KT가 서비스하는 클라우드부터 해외에는 Google, Amazon, MS가 서비스하는 굵직한 클라우드 서비스들이 있습니다. 모든 클라우스 서비스를 익히려 하는 것은 비효율적이겠지만 한 곳만 고집하는 것 또한 부족합니다. 일하는 회사에 따라 한 인프라에서 다른 인프라로 옮겨가는 경우도 있으니 꾸준히 관심을 갖고 관련 커뮤니티 글이나 뉴스레터를 구독하면서 정보를 얻어 두시는 것이 좋겠습니다.

 

1.6. 파이썬과 장고

파이썬은 이 시대 최고의 입문용 언어이며 정말 많은 영역에서 사용되고 있는 범용 언어입니다. 1991년에 출시된 생각보다 오래된 언어이지만 모던 프로그래밍 트렌드를 선도하는 언어이기도 합니다. 귀도 반 로섬이 발표하였고 현재는 파이썬 소프트웨어 재단에서 관리하고 있습니다. 필자는 파이썬을 장고를 통해 접하게 되었습니다. 많은 사람들이 파이썬과 장고를 알고는 있는데 어떻게 이런 폭발적인 인기를 얻게 되었는지는 잘 모르실 겁니다. 장고는 파이썬으로 만들어졌으니 당연히 파이썬 보다 늦게 출시되었습니다. 2005년에 처음 출시되었는데 로렌스 저널 월드 신문사에서 2003년에 시작된 프로젝트입니다. 우선 신문사 사이트를 만들고 사용성이 검증되자 2005년에 오픈 소스로 공개하게 됩니다.

장고가 유명해지게된 계기는 구글 앱 엔진에서 장고를 채용한 일입니다. 구글 앱 엔진은 지금은 구글 클라우드 내에서 서비스 되고 있지만 구글 클라우드가 출시되기 전부터 여러 가지 언어로 웹 애플리케이션을 만들어 구글 인프라 안에서 구동할 수 있게 해주는 서비스였습니다. 근런데 파이썬으로 웹 애플리케이션을 만드는데 장고를 채용하면서 장고가 빠르게 유명세를 타기 시작했습니다. 그리고 덕분에 파이썬도 함께 유명해지기 시작했습니다.

장고는 파이썬 언어로 프로그래밍하는 웹 프레임워크입니다. 웹 프레임워크 중에서도 장고는 가장 빠른 시간내에 웹 서비스를 구현할 수 있는 프레임워크입니다. 생산성이 좋다고 말할 수 있습니다. 장고가 생상성이 좋은 이유는 웹 서비스를 만들 때 필요한 대부분의 기능들을 미리 정형화된 형태로 준비해뒀기 때문입니다.

설치하자마자 회원 관리 기능과 관리자 페이지를 사용할 수 있습니다. 그리고 데이터베이스와의 통신을 위한 다양한 드라이버를 지원하고 ORM 방식을 통해 데이터베이스를 다룰 수 있기 때문에 프로그래머는 SQL을 몰라도 데이터베이스를 편하게 다룰 수 있습니다. 또 CRUD라고 부르는 기본 기능들을 제네릭 뷰라는 형태로 미리 만들어뒀기 때문에 이 뷰를 상속 받기만 해도 바로 기능을 구현할 수 있습니다.

또 다양한 기본 미들웨어를 사용해 웹 애플리케이션 보안성이 높습니다. 그리고 설정파일을 개발 환경과 배포 환경을 구분해서 사용할 수 있기 때문에 편리하고 유명한 프레임워크니 만큼 대다수의 클라우드 서비스에서 자동 배포를 활용할 수 있습니다.