이 글은 대학생들을 위한 글이다. 

안드로이드폰은 어떻게 개발하는데, 서버개발을 시작하려니 막막한 사람들 대상이다. 

안드로이드 폰개발은 화면부터 시작하기 때문에 개념잡기가 쉽다.

하지만, 서버는 화면이 없어서 개념잡기가 어렵다. 

우선 서버란 무엇인지 개념부터 잡아보자.


서버란 무엇일까?

Server Computer(사진 : Pixabay)


Server란 네트워크에서 정보를 제공하는 컴퓨터를 말한다. 

반대로 정보를 받아가는 컴퓨터를 Client 라고 부른다. 

이 개념은 네트워크가 등장하면서 생겼다.

컴퓨터가 네트워크를 통해 일을 나누어 처리하면서 “분산처리 컴퓨팅”이 생겼다.


점원과 고객이 비유한 것은 재미있는 생각 같다. 

정보를 저장하고 나르고 받아가는 걸 가게에 비유한 것이다.


요즘에는 개념이 얽혀 있지만, 처음에는 확실히 구분되었다. 

중앙 컴퓨터는 24시간 켜져 있었고, 사무실 컴퓨터는 필요할 때만 켜졌다.


기술이 발전하면서 좀 복잡해졌다. 

컴퓨터 내부의 프로그램들이 서버이면서 클라이언트가 되었다. 

하드웨어가 아니라 소프트웨어 단위에서 구분 짓게 되었다. 

어렵게는 "물리적 서버", "논리적 서버"라고 부르기도 한다.


이제는 24시간 데이터를 보내주는 프로그램을 “서버”라고 부른다. 

정확히는 “서버 프로그램”이다. 

그런데, 그 프로그램이 실행되는 컴퓨터도 “서버”라고 부른다. 

정확히는 “서버 컴퓨터”이다. 

현장에서는 통상적으로 아무렇게나 부르기 때문에 상황에 맞추어 이해를 한다.


하드웨어는 어떻게 다를까?


(1) 무장애성 강화


서버 컴퓨터는 기본적으로 일년내내 켜져 있다. 

메모리나 디스크 상에 에러가 발생해도 다운되면 안된다.


그래서 서버 컴퓨터는 무장애 특징이 강화되어 있다. 

전원을 켜둔채로 하드 디스크를 교체할 수도 있다. 

또는 실시간으로 디스크를 백업해도 느려지지 않는다. 

이런 복잡한 기능들이 많다. 

물론 그렇다고 모든 서버가 100점 짜리라는 뜻은 아니다.


(2) 멀티 유저, 멀티 태스킹


그리고, 서버 컴퓨터는 “Multi User Multi Tasking”을 기본으로 설계된다. 

참고로 일반 컴퓨터는 “1 User Multi Tasking”으로 설계된다. 

계정이 여러개인 것과는 별개다. 

서버 컴퓨터는 여러 명이 동시에 접속해도 느려지지 않는다.


즉, OS가 다른 유저의 메모리나 CPU 사용을 간섭하지 않도록 지원한다. 

이 차이는 매우 중요한데 자세한 건 다음에 다루어 볼 예정이다. 

오늘은 일단 여기까지만.


옛날에는 전용 서버와 Unix 가 꼭 필요했다.

요즘은 빠른 컴퓨터에 리눅스만 깔아도 초보적인 서버를 만들 수 있다. 

세상이 좋아졌다.


서버개발은 왜 필요할까?


스마트폰 정보를 PC로 보거나, 친구들끼리 공동달력을 쓰려한다.

그러면 내 스마트폰, PC가 아니라 인터넷 상의 어떤 공간에 데이터를 함께 저장해야 한다.


그런데, 데이터를 보고 수정하는 것은 공통된 기능이다.

하나의 프로그램으로 작성하고 관리하는 것이 유리하다. 

그래서 보통 이 기능을 스마트폰이 아니라, 서버에서 동작하도록 만든다.


이런 프로그램들을 “서버 프로그램”이라고 한다. 

그래서 “서버를 개발한다”고 말하면 일반적으로 “서버 프로그램”을 만든다는 걸 의미한다.


그런데, 보통 서버를 만들 때는 꽤 많은 기능들을 만들게 된다. 

여러 개의 서버 프로그램이 하나의 시스템처럼 작동해야 한다. 

이런 경우를 “서버 시스템”이라고 한다.


일반적으로 현장에서 “서버를 개발한다” 라고 하면, 십중팔구 “서버 시스템 개발”을 지칭한다. 

현장에서는 굳이 구분해서 이야기하지 않는다. 

뚜렷이 구분해야 할 일들이 잘 없기 때문이다.


서버개발은 무엇이 다를까?


스마트폰 앱에서는 "이 버튼을 누르면 어떻게 동작한다." 여기서부터 출발한다. 

하지만, 서버는 "어떤 기능을 스마트폰에 놓고, 어떤 기능을 서버에 배치할 것인가?"부터 고민해야 한다.


더구나 "A 가 “좋아요”를 누르면 어떻게 “B”가 알게 할 것인가?

A 가 B를 차단하면 A 의 글이 B에게는 안 보이지만, 다른 사람들은 볼 수 있어야 한다.

이런 고민들도 해야 한다.


앱개발은 기본적으로 나 혼자 쓰는 기능을 구현한다.

그래서 많은 기능들을 보기 좋고 사용하기 편하도록 개발한다.


하지만, 서버개발은 유저간 영향도까지 신경써야 한다.

여러 사람의 관계를 정의하고, 질서가 유지되도록 적절히 통제해야 한다. 

코드의 문제이기도 하고 설계의 문제이기도 하다. 

서버 프로그램이 하드웨어 상에서 어떻게 동작할지 고민해야 한다.


산업별로 깊이와 강약의 차이가 있지만, 서버 개발은 대부분 저렇게 눈에 보이지 않는 곳까지 신경을 써야 한다.

그런데, 이런 “체계”는 눈에 보이지 않기 때문에 시나리오를 아무리 상세히 만들어도 모두 살필 수는 없다.

그리고 어떻게 해야 하는지 연구 사례도 없다.


경험적으로 보면 서버 개발은 눈에 보이는 기능개발이 40%, 저런 안 보이는 기능개발이 60% 정도 된다.

시나리오가 단순하면 눈에 안 보이는 부분이 급격히 줄겠지만, 반대라면 급격히 늘기도 한다.


그래서 “서버 개발”은 다소 인문학이 섞여 있는 “공학”이다. 

하지만, 그런 내용들을 어떻게 코드에 반영해야 하는지는 알려진 바가 없다. 

오직 베테랑들의 경험에만 의존하고 있을 뿐이다.


앱개발이 "한 사람의 행동"에 집중한다면, 서버는 "다자간 행동"에 대해 주목한다.


어떻게 시작하면 될까?

구글링부터 시작하면 된다.

예제를 하나 다운받아서 연습하면 된다.


웹서버 설치, DB 설계, 코드 작업은 정말 기술적인 부분들이다. 

기술문서와 구글링을 통해서 하나씩 문제를 해결할 수 있다. 


실력을 키우는 방법도 다분히 정형화되어 있다.

좋은 코드를 보고 기능들을 많이 구현해 본다. 


결코 어렵지 않다. 예제 몇 번 짜보면 이해가 된다.

연습하면 연습할수록 실력은 늘어난다.

궁금한 것은 계속해서 질문하고 토의 하면 된다.


고수들은 어떻게 다를까?

하지만, 잘하게 되는 건 혼자서 안된다.

시스템이 커지면 코드를 잘 짜는 것만으로 어렵다. 


성능과 구조문제가 개입되기 때문이다.

각 시스템의 구조와 역할을 어떻게 나눌지 고민해야 한다. 

다양한 장애를 직접 겪으며, 어떻게 대응할지 고민해야 한다.


이 고민들이 프로그램을 짤 때 반영해야 한다. 

그런데 이런 건 “가이드북”이 없다. 

현장 경험을 통해 쌓을 수 밖에 없다.

서비스마다 달라서 정형화된 정답도 없다.


돈버는 개발자는 사업에 대한 이해도가 높다.

정보를 어디까지 개방할 것인가? 

어떤 기능을 먼저 개발할 것인가? 

이런 건 사업적 선택에 따라 액션이 달라진다.

서버 개발의 우선순위를 직접 결정한다.


특히 시스템의 완성도를 높이는 중요한 고민이기도 하다.

그런데, 이런 건 “경험”을 통해서도 배우기 힘들다.

개발자의 가치관이나 철학에 따라 달라지기 때문이다.


요약

프로그래밍은 구글링으로 시작할 수 있다.

하지만 좋은 개발자가 되려면 좋은 시스템을 많이 만들어봐야 한다. 

그리고 그런 시스템을 오래 운영해봐야 한다.

 

시작한다면 기술부터 집중하자.

그리고, 개발하고 운영까지 꼭꼭 경험해보자.

특히 데이터에 살을 붙이고, 재창조하는 일까지 꼭꼭 직접 해보자.


그 외, 재개발과 변경개발을 줄이려면 사업현장을 잘 이해할 필요가 있다.

가볍게 시도하는 일에 죽자고 달려들어 시간을 쓰지 말자.


끝.

  1. 2018.06.17 17:01

    비밀댓글입니다

+ 최신글

+ 많이 본 글