서버 개발자와 서버엔지니어는 뭐가 다른건가요 ?
서버 개발자랑 서버 엔지니어를 굉장히 헷갈려하시는 분들이 많고 어떤 차이점이 있는지 얘기하려고 합니다
일단은 서버 개발자분하고 서버 엔지니어를 하는 사람들이 하는
역할에 대해서 정답부터 말씀을 좀 드려보면 일단 서버 개발자는 우리가 주로 얘기를 할 때 자바나 파이썬을 하는 경우가 굉장히 많아요
꼭 그렇지는 않지만 자바프로그램이 파이썬 프로그램을 많이 하죠
왜? 서버에 기능을 만들어야 되니까 결제기능 회원 로그인 기능
여러가지 그런 기능들을 개발해주고 프론트엔드에서 원하는 API를 제공해주는
그런 프로그래밍들을 많이 하게 되죠
그런 분들이 서버 개발자라고 볼 수가 있는 거고요
서버엔지니어분들은 서버를 관리하고 그리고 또 서버에 이 프로그램들이
배포가 될 수 있도록 그러니까 예를 들어서 자바개발자가 스프링을 통해서 웹서버프로그램을 만들었으면요
프로그램이 그냥 돌 수 있는 게 아니거든요
앞단에 nginx라든지 서버 같이 있어야 되는 경우들도 있고
그리고 또 프로그램 하나만 있으면 죽을 수가 있기 때문에
도커, 쿠버네티스를 써서 이 부분들이 좀 컨테이너 단위로 복제본이 관리가 되고 죽지 않도록 그리고 서버 에 대해서 구축을 해서 로드 밸런싱을 하는 부분이라든지 이런 식으로 서버에 있어서 전반적으로 운영과 배포
또 관리 뭐 이런 것들을 전반적으로 하는 것
성능을 또 최적화시키는 부분들 이런 부분들을 관리하는 것들을 서버엔지니어계열이라고 볼 수 있어요
서버엔지니어같은 경우에는요 굉장히 동의어가 좀 많은 편입니다
물론 각각 명칭들마다 차이점들은 있기는 해요
근데 조금 큰 범위로 봤을 때 서버엔지니어라는 말과 시스템 엔지니어 그리고
DevOps엔지니어,리눅스 엔지니어라는 말도 있고 그리고 요즘에는 SRE엔지니어로도 부르죠
근데 물론 각각마다의 차이점이 있는 건 맞는데 맥락은 좀 비슷한 맥락이거든요
그래서 이런 부분들이 인프라 엔지니어이런 것들도 있죠
물론 이제 네트워크 엔지니어라든지 이런 분들은 조금 더 하드웨어적인 거나
네트워크에 더 특화된 부분들이 더 있기 때문에 비슷한 계열이라고 보기는 조금 어렵고요
여기까지 약간 좀 포괄적으로 봤을 때 비슷한 계열이라고 볼 수 있습니다
그런데 이제 각각 마다에 조금씩 차이점이 있겠지만
어쨌든 서버엔지니어와 서버개발자는 완전히 역할이 달라요
그래서 그 부분을 정확하게 일단은 알고 계시는 게 좋은데
일단 차근차근 한번 좀 설명을 들으며 들어가는게 좋겠죠
일단 서버부터 한번 얘기를 해보도록 하겠습니다
저는 서버라는 것 자체가 뭔지 모르겠어요
서버 자체가 이제 명확하게 설명이 안 됩니다
누군가가 서버가 뭐예요? 라고 물어봤을 때
답변을 못하겠습니다 라고 한다면 이 설명을 꼭 정리를 해 보세요
서버라는 건 사실은 서버 역할을 하는 게 굉장히 중요해요
"이게 꼭 리눅스 해야 된다" 그런 필요는 없습니다
이걸 꼭 클라우드,Asure,GCP 이런걸 써야지만 서버다?! 절대 아닙니다
내 노트북도 서버가 될 수 있고요 내 집에 있는 컴퓨터
심지어는 내 모바일도 서버 역할을 할 수 있어요
서버 역할을 하는 게 중요한 거지 이게 꼭 리눅스여야 되는 것도 아니고
윈도우여야 되는 것도 아니고 어딘가에 어떤 디바이스의 종속되는 것은 아닙니다
그래서 그런 부분들도 생각을 해줘야 돼요
서버 역할 이라는 게 도대체 뭐냐 이 서버 역할이라는게
우리가 개발을 할 때는 개발 환경에 클라이언트와 서버 역할을 하는
두 가지 프로그램을 동시에 돌리는 경우들도 많이 있고
실제로 배포 할 때는 그렇게 하지는 않죠
실제로 배포 했을 때는 클라이언트프로그램들은 주로 브라우저 그리고 모바일웹, 하드웨어적으로 본다면 뭐 자율주행차라든지 선박이든지 여러가지가 있을 수 있어요
그러면 클라이언트프로그램들이 각자의 역할에 맞춰서 뭔가를 돌아가겠죠
예를 들어서 이제 브라우저같은 경우에는 HTML,CSS, 자바 스크립트, 이미지파일 것들을 받아서 그리지요
화면에다가 뭔가를 출력을 합니다
근데 그 파일들을 제공받는 게 웹 서버로부터 받는 거예요
그래서 서버역할을 해주는 친구가 여러 가지 데이터를 제공해주고 HTML,CSS,자바 스크립트, 이미지파일 파일을 제공해주고 이런 역할들을 하죠
그리고 로그인 이라든지 결제라든지 이런 백단에서 필요한 부분들이 서버역할이라고 하는 거라고 봅니다
그러면은 우리 입장에서는 유저입장에서는 브라우저라든지 모바일 앱이라든지 이제 우리가 눈으로 볼 수 있는 것들은대부분 이제 클라이언트 프로그램이라고 보시면 되겠고프로그램이 구동됨에 있어서 특히 결제,로그인 그리고 또 데이터를 가져오는 것들 영상을 스트리밍해오는 것들 이런 부분들은 다 서버로부터 뭔가를 제공받는다 라고 보시면 돼요
그래서 카카오톡 메시지를 주고받을 수 있는 이유도 모바일앱만 설치한 게 아니라 서버가 있기 때문에 우리가 서로가 통신이 가능하게 되는거죠
그래서 기본적인 부분이긴 하지만 이 부분을 말씀을 드려봤고요
서버라고 하는게 내부적으로 보게 되면은 이런 역할들을 하게 되는데
내부적으로 뭔가 구축된 걸로 봤을 때
예를 들면 이런 nginx, gunicorn,django 대신에 spring framework
flask여러가지 프레임워크를 통해서 어플리케이션을 만들 수 있겠죠
그리고 데이터베이스가 연결되고 약간 대략적으로 이런 구조가 될 수가 있어요
그런데 이런 소프트웨어 들을 구축하고 그리고 또 이런 것들이 배포가 될 수 있고
예를 들어서 nginx의 설정이라든지 뭔가 문제가 생긴 것을 트러블 슈팅 해야 될수 도 있고 고객이 접속하려고 하는데 갑자기 웹 서버가 다운이 될 수도 있는 거잖아요
그리고 고객이 많이 접속을 할 수도 있는 일인거고 그랬을 때 서버를 더 이제 복제본을 만들어서 관리가 될 수 있도록 하는 것들 이런 모든 것들이 결국 서버엔지니어계열의 있는 분들이 해야 될 일들인거죠
아까 말씀드렸던 DevOps엔지니어, 인프라 엔지니어,리눅스 엔지니어 ,시스템 엔지니어이런 분들이 하시는 일들이 결국에는 이런 일들 입니다.
그런데 이게 간단해 보이지만 절대 그렇지가 않아요
서비스가 대규모 서비스 일수록 이런 부분들도 굉장히 중요한 부분들이고 굉장히 어려운 일들이 많이 벌어질 수가 있어요 그리고 또 리눅스 라고 하는 걸 기준으로 보통 서버 운영 체제가 구동이 되기 때문에 리눅스를 좀 잘 알아야 되는 경우들도 많이 있죠
뜬금없이 갑자기 고객이 몰려서 다운이 되는 경우도 이런 것들은 오토스케일링이런걸 통해서 갑자기 서버를 늘리거나 이런 걸로 대책이 없거든요
그런 것들은 어쨌든 초반부터 문제 해결을 하기 위한 여러가지 진단과 분석들이
필요할 수 있어요. 그러다 보면 자연스럽게 리눅스 에 대한 이해도가 굉장히 높아야 되는 상황들이 많이 벌어지게 되죠
그래서 쉘 스크립트, 리눅스 명령어 그리고 시스템에 대한 이해 그리고 또 이런 프로그램들을 배포를 해야 되기 때문에 이런 배포 라든지 운영관리 그리고 또 더 나아가서는 컨테이너 단위로 배포 할 수 있기 때문에 도커, 쿠버네티스 그리고 또 서버 환경을 이렇게 물리적으로도 구축할 수 있지만 클라우드 환경으로 구축할 수도 있기 때문에 Asure라든지 AWS, GCP이런 것들에 대한 기능을 잘 알고 있는 것들도 필요할 수가 있죠
그러면 서버 개발자는 뭐를 하는거냐?
서버 개발자는 엄밀히 말해서요 여기 보이는 django 있잖아요
django를 쓰으면 파이썬을 할 거고요 스프링 같은걸 하면은 자바 언어 같은 걸 쓸 수 있겠죠 그걸 통해서 내부에 코딩을 하는 거예요 기능을 만드는거죠
로그인이 될 수 있도록 결제가 될 수 있도록 여러가지 유저스페이스에서
그러니까 클라이언트쪽에서 필요한 데이터를 제공하기 위한 API를 이쪽에서 만든다던가 약간 제이슨 같은 거를 리턴해준다던가 데이터를 제공해 준다든가 약간 이런 기능을 프로그래밍하는거죠
그래서 좀 쉽게 얘기해서 서버 개발자는 그냥 자바프로그래밍을 하는 사람
자바 프로그램을 하면 안드로이드 앱을 만들 수도 있는 거 아닙니까?
그렇죠 그렇긴 해요
그래서 Language만으로는 사실 말할 수는 없지만 현실적으로 봤을 때 우리 주변에 서버 개발자하는 사람들이 도대체 뭘 하냐 라고 보면은 자바코딩하는거죠
파이썬 코딩하는 거고 물론 다른 언어를 할 수도 있죠
SWIFT 다른 언어들도 GO언어라든지 이런 것들도 서버
랭귀지로써 서버 역할을 하는 기능을 개발할 수 있습니다
뭐 고틀린 이라든지 여러가지 그렇죠
그렇기 때문에 랭귀지 로만 종속될 수는 없지만 현실적으로 봤을 때
서버 개발자분들이 주로 다루는 랭귀지가 파이썬이나 자바가 많기 때문에
그것을 예시를 들어서 말씀을 드린 거예요 아시겠죠?
그래서 프로그래밍을 많이 하죠
그래서 그 부분으로 우리가 생각을 해봤을때 서버엔지니어를 역할을
준비하는 사람들이 프로그래밍을 알 필요가 있느냐?
물론 기본적인 것은 아는 게 중요해요 필요는 할 수 있습니다
왜냐하면 서버를 운영하다 보면 여러 가지 문제 해결 이라든지 추가적인 프로그램들이 필요할 수 있겠고 그런 상황에서 소스를 컴파일에서 써야 되는 경우들도 있을 수 있거든요 그렇기 때문에 이제 기본적인 프로그래밍 랭귀지에 대한 부분들에 이해도가 있는 게 당연히 도움이 당연히 되지만 직접적인 건 아니에요
엄밀히 말해서 왜 그러냐면 프로그래밍을 하는 것에 직접적인 사람들은 개발자들인거죠 그러니까 서버 개발자입장에서는 자바코딩을 해서 아예 기능을 만들어야 하기 때문에 랭귀지를 못하면 전혀 못해요 알 수가 없어요
꼭 자바가 아니더라고 하더라도 서버 역할을 해주는 기능 자체를 프로그래밍해서 개발해야 되기 때문에 이런 분들은 알고리즘이런거하고 당연히 직접적으로 연결이 될 수 있죠
근데 서버엔지니어를 하는 사람이 알고리즘을 공부 한다
물론 도움이 안 된다 라고 볼 수는 없지만 그 부분이 직접적인 거라고 보기에는 어려워요 그렇죠 왜냐하면 우리가 알고리즘을 한다는 건 코딩을 하는 거고
코딩이주 업무는 아니니까 이해가 되시겠어요?
그래서 그렇게 좀 생각을 하는 게 굉장히 중요합니다
지금 우리는 차이점을 알아야 되기 때문에 그 부분을 조금 더 설명을 하고 있어요
근데 이제 우리가 서버 라는 게 이제 구축이 어떻게 될까 라고 생각을 해보면
주로 우리 리눅스서버를 많이 하게 되고요 근데 이제 리눅스 서버를 어떻게 구축할까 이게 이제 아주 전통적인 거는 이렇게 랙을 사고 우리가 이제 서버 컴퓨터가 있어요
근데 아까 말씀드렸다시피 데스크탑이라든지 노트북 심지어는 모바일이라고 하더라도 서버 역할을 하는 프로그램을 그곳에서 구동을 시키고
서버 역할을 하게 만들면 이게 서버 입니다
그게 모든 근데 주로 서버 역할을 하는 하드웨어가 되는 서버컴퓨터는
그렇게 좀 비실비실한 하드웨어로는 안 돼요
금방 죽어버린단 말이에요
그래서 네트워크 대역폭도 좀 더 많이 처리할 수 있고 CPU,메모리라든지 이런 스택들도 조금 더 넉넉해야지 여러 클라이언트들이 붙었을 때도 안정적으로 구동이 될 수가 있겠죠 그래서 보통 서버 컴퓨터에 해당되는 하드웨어는 조금 더 스택들이 좋은 편 입니다
그리고 이렇게 랙을 통해서 여러 컴퓨터를 연결해서 관리하게 되죠 이거 사진은요실제로 구글에서 서비스를 할 때 예전에 첫번째로 만든 서버 컴퓨터를 랙이예요그래서 그게 이제 전시가 되어 있는 거를 사진으로 찍은 거고요
우리가 하드웨어적으로 이렇게 구축하는 경우들도 있고 내가 취업한 회사가 이렇게 하드웨어
구축이 되어 있는 경우들도 있어요 하지만 요즘에는 대부분 이런 것들을 클라우드로 대체가 되어 있습니다 그래서 이렇게 직접적으로 하드웨어적으로 서버를 구축하기 보다는 이렇게 아마존이라든지 뭐 마이크로소프트에 있는 Asure라든지 구글에 있는 GCP라든지 이런 곳에서 물리적으로 대규모 서버 컴퓨터들을 데이터 센터에다가 딱 구축을 해놓고요
여기에 일부를 빌려다 쓰는 형식으로 사용을 하고 있는 게 그게 바로 클라우드 입니다 그래서 서버 컴퓨터를 쓰는 것은 똑같아요 하지만 그거를 빌려다가 그냥 쓰느냐 아니면 하드웨어적으로 우리가 구축을 하느냐 이런 차이점이 있겠고요
아무래도 이제 회사들마다 의 특징이 좀 있기 때문에 아예 이렇게 클라우드만 쓰는 회사들도 있고요
안 그러면은 어느 정도의 그 부분은 서버 컴퓨터를 두고 어느 정도의 부분은 또 클라우드를 두고 이렇게 둘 다 병행하는 경우들도 있어요 그래서 회사들마다 좀 차이가 있다라는 거 그런데 좀 차이가 있다면은 이렇게 하드웨어적으로 구축을 하는 곳은 말 그대로 하드웨어적인 인프라에 대해서 관리를 해야 되는 사람들이 필요하겠고요
그래서 조금 더 네트워크도 네트워크 엔지니어분들이 많이 필요할 수 있고
또 네트워크에 대한 어떤 랜선부터 시작을 해가지고 여러가지 물리적인 이슈에 대해서도 대응을 할 수가 있어야 되거든요 그래서 조금 더 이런 경우에는 서버엔지니어역할을 하는 분들이 하드웨어적인 부분들까지도 조금 더 케어를 해야 되는 경우들이 생겨날 수가 있어요
그래서 그런 부분들도 있고 그 다음에 이제 클라우드를 쓰게 되면 아무래도 그런 부분들이 많이 줄어들게 되죠근데 좀 아이러니하게도 서버 개발자가 클라우드 때문에 편해졌다고도 볼 수 있지만 어떤 면에서는 조금 더 일이 많아졌다고도 볼 수 있습니다
왜 그런가요? 왜 그러냐면요
더 이상 이렇게 뭔가 하드웨어를 구입하고 뭐 랜선 다 연결해가지고
네트워크 구축하고 이런걸 할 필요가 없는 거예요
왜? 여기서 그냥 빌려다 쓰면 되니까 그러니까 좀 더 편해지긴 했지만
실제로 리눅스 서버를 구축하고 운영하는 인프라 엔지니어역할 서버엔지니어역할은 여전히 필요하거든요
왜냐하면 이렇게 구축을 한다고 하더라도 여기서도 나름대로의 어떤 로드 밸런싱 이라든지 서버를 몇개까지 어떻게 구축을 해야 되고 복제본을 얼마나 유지를 할 것이며 얼마나 성능을 효율적으로 만들 것인지 여러가지 서버 엔진이 운영에 있어서 역할을 해야 될 것들이 굉장히 많습니다
여전히 많아요 그런데 이 부분들이 소프트웨어 적으로 처리할 수 있는 여지들이 많이 생긴거죠
클라우드 시스템 때문에 클라우드에서 접속해 가지고 마우스 클릭하면서 여러가지 제어할 수 있는 것들이 많이 있고 AWS,Asure라든지 이런데서 제공하는 API
이런 것들이 있기 때문에 편하게 뭔가를 제공,컨트롤할 수는 있지만
이게 소프트웨어적인 걸로 올라왔기 때문에 아이러니하게도 그냥
서버 개발자한테 그 역할을 또 같이 시키는 경우들도 있어요
그러면은 이 서버 개발자가 같이 하는 거죠
서버엔지니어역할도 하면서도 서버 개발자역할도 하면서도 옛날 같았으면 아예 하드웨어로 이렇게 떨어져 있기 때문에 소프트웨어를 하는 사람과 하드웨어를 하는 사람이 아예 구분이 될 수밖에 없는 이렇게 약간 구조가 있어서
어떻게 보면 오히려 더 예전이 소프트웨어에 더 집중할 수 있는 환경이었다 라고 본다면 지금은 오히려 이런 클라우드라는 좋은 시스템이 있어서 더 일이 많아진 듯한 느낌도 있죠
사실은 그런 것들이 있어요
그래서 어떻게 보면 풀스택개발자라고 하는 게 말이 좋아서 개발자이지 여러가지 일을 해야 되는 이런 상황들도 있습니다
그래서 요즘 같은 경우에는 더 서버 개발자와 엔지니어때문에 좀 헷갈려하는 경우들도 많이 있으신것 같아요
그리고 또 서버 개발자가 뭔가 더 어려운 것 같고 하니까 나도 뭔가 프로그래밍을 해야 될까 이런 생각을 하는 경우들도 있는데 내가 만약에 서버엔지니어쪽을 생각을 한다면 리눅스 명령어라도 더 하나 쳐보고 스크립트 라도 더 짜보고 운영을 더 해보고 여러가지 트러블 슈팅도 해보고 시스템에 대한 이해도도 갖춰보고 어떻게 운영하는지 이런 것들을 공부하는 게 더 중요하거든요
도커라든지 쿠버네티스를 더 한번 다뤄보고 경험해보고 이런 게 훨씬 더 중요합니다 근데 쓸데없이 자바,파이썬 프로그램이 하느라고 시간을 너무 많이 투자한다 물론 그게 전혀 필요 없는 건 아니지만 이거는 부가적 이라는 거
이런 것들 좀 잘 이해하시는 게 굉장히 중요합니다
그래서 여기까지 우리가 서버엔지니어랑 서버개발자의 차이점을 알아보았습니다.