221019 백엔드 개발과 관련된 다양한 언어들

샨티(shanti)·2022년 10월 19일
0
post-thumbnail

하루를 마무리 하기 전, 오늘 있었던 일들을 잔잔히 되짚어봅니다.
성공과 실패의 모든 요소에서 '배울 점'을 찾아내어 기록하고,
더 성장하는 내일의 나를 위해 'action plan'을 세웁니다.

어제 다행히 성수 코딩도장 월주차가 등록이 되어서 마음 놓고 자동차를 끌고 다니게 되었다.
첫날 대중교통으로 1시간 30분이 걸리는 경험을 하고나니...
그리고 오늘 대중교통 시위 때문에 시간에 쫓기는 동료들을 보니 더더욱...ㅎㅎ
밀리지 않는 시간에 일찍 차로 오고가는 게 낫겠다는 생각이 확고해졌다.

아침 일찌기 알람을 듣고 한 번에 이불을 박차는 게 쉽지는 않은 듯. 사실 아이가 자고 있는 방에서 알람을 울리기가 좀 그래서 거의 두 달 넘게 거실 소파에서 잠을 자는 중이라 좀 찌뿌둥 한 건 있는데, 그래도 조금이라도 덜 밀리는 시간에 새벽을 깨우며 나오니 마음만큼은 뿌-듯하다. ㅎㅎ

일과시간이 되기 전까지 각종 언어들과 라이브러리, 프레임워크를 조사하는데 문득 그 생각이 들었다.
'어차피 자료 조사란 끝이 없고 인터넷으로만 공부하는 것은 한계가 있을터..
한 번은 정리를 하고 끝맺음을 지어야하지 않을까?'

그래서 코딩도장을 끝내고, 스크럼 독서 타임을 끝내고 오후부터는 기존에 조사해놓은 자료들만 가지고 기술스택을 정리하기 시작했다.

기술이라는 것은 각각의 장단점이 뚜렷할 것이고, 특출나게 모나거나 잘난 것이 없다면 결국에는 우열을 가리기 힘들 것이라는 생각이 들었다.
결국 이 과정에서 내가 배워야 할 것은 (1) 내가 사용할 기술에 대한 조사와 지식 습득, (2) 이 기술을 선택하려는 이유를 build하고 논리구조를 짜는 방법일 것이다.

지금은 논리를 좀 더 만들고 있는 중이지만 대략적으로 아래와 같이 윤곽을 잡았다.

백엔드: Java + Spring
프론트엔드: JavaScript + React
DB: PostgreSQL
기타
로그인 관련: 네이버&카카오 로그인 API
지도 관련: 카카오API(기술조사 추가 필요)
고민중인 점

  • 크롤링
  • 기본 데이터 source
  • 추천 알고리즘 관련(예. 텐서플로)

자료 조사를 아주 깊이있게 하지는 못했는데 이렇게 한 번 훑고나니
(1) 어떤 언어들이 존재하는지,
(2) 언어인 줄 알았는데 알고보니 라이브러리?! 프레임워크?!
(3) 언어를 선택하는 데 '성능'이라는 것이 절대적인 기준이 되는 것은 아니구나
(4) 나는 과연 내가 쓰는 언어를 '특장점'이 잘 살아나도록 사용하고 있는가? (장점을 살려주지 못해 미안해...ㅠㅠㅎ)
이런 생각들이 들었다.

그래도 주구장창 정보의 홍수 속에서 매몰되지 않고 한번은 끊고 가야겠다고 생각하고, 문서를 작성한 건 잘한 일인듯. 계속 늘어질 순 없으니!

간단하게 자바부터 정리하는데 '내가 백엔드 개발과 관련된 언어를 정한다고 하면서, 백엔드에 대해서 이해는 하고있나?'를 자문하니... 막상 대답이 나오질 않았다.
그렇게 또 부족한 부분을 발견하고 공부하고.

매번 강의를 듣고 강의를 인출했을 땐 알지 못했는데 포트폴리오를 준비하다 보니 내가 알고 모르는 점을 좀 더 면밀하게 살펴보게 되었다.
앞으로도 모르는 부분을 발견하거나 키워드에 대해 정의가 바로바로 떠오르지 않는다면 반드시 정리하고, 살펴보고, 또 외우고, 글로 써보고 지나가자.

백엔드 관련 언어를 찾아보니 Java, php, python, 루비와 같은 언어들이 있더라. 각 특징들과 함께 내가 이 언어를 선택한 이유에 대해 아래와 같이 정리해보았다.


백엔드 개발: Java + Spring

백엔드(Back-End)란?

  • 웹사이트, 웹 애플리케이션, 모바일 솔루션의 프로세스와 관련된 서버 측(Server-side)과 데이터베이스를 관리해주는 테크놀로지
  • 서버 측 개발 분야로서 백엔드에서는 데이터 저장, 관리, 웹사이트의 클라이언트 측(Client-side)에서 모든 것이 매끄럽게 작동할 수 있도록 해 줌
  • 프론트엔드에 있는 사용자들이 취하는 행동을 처리하며, 백엔드 개발에는 사용자 인터페이스가 없는 시스템 컴포넌트 작업, API 작성, 라이브러리 생성, 데이터베이스 통합 등 다양한 활동이 포함
  • 주 사용 언어로 PHP, Java, Python, 루비 등

언어별 특징

하나. Java

  • 객체 지향 프로그래밍 언어
  • 한국에서 가장 많이 사용되는 언어로 정부기관 뿐만 아니라 기업용 웹, 안드로이드 어플을 개발하려는 기업에서도 자주 사용
  • 20여 년 이상 많은 사람들이 사용했다는 점의 강점이 분명히 있을 것
  • 레퍼런스가 많음 => 즉 찾아보고 참고할 수 있는 자료의 양과 자료 뎁스가 깊다고 할 수 있음
  • 우리나라에서 사용율이 높다는 것은 구인이 용이함 => 추후 서비스 확장 시 인력충원 용이. 실제로 구인사이트에서 개발자 채용 공고 검색 시 '자바' 관련 경력 요구도가 타 언어에 비해 월등히 높은 것을 볼 수 있음
  • 다른 언어에 비해 비교적 높은 안정성 => 왜 이런 평가를 받는지는 추가로 확인 필요
  • 다양한 운영체제, 기기에 동일한 소프트웨어를 호환할 때 운영체제 별로 프로그램을 따로 만들지 않아도 되는 장점(JVM(Java Virtual Machine)이 이를 가능하게 해 줌)
  • 러닝커브는 높은 편

둘. Python

  • 객체 지향 프로그래밍 언어
  • 스크립트 언어이므로 자바(컴파일)에 비해 속도 측면에서 불리
  • 코드 작성 시 변수의 데이터 유형을 정해야 하는 자바에 비해 데이터 타입이 런타임에 자동으로 정의되며, 해당 타입은 프로그램 수명 동안 변경될 수 있음(동적 타이핑)
  • 러닝커브는 낮은 편(자바에 비해 복잡한 프로그래밍 구조를 따르지 않으며 strict하지 않은 편. 따라서 학습이나 사용이 쉽다고 여겨짐)
  • 주 활용분야
    데이터 과학, 데이터 분석, 머신러닝 관련 분야에서 활발하게 사용되고 있음
    관련된 라이브러리로는 판다스, 싸이파이, 넘파이, 텐서플로 등(물론 자바도 관련하여 Weka 3, 아파치 스파크, 자바 머신러닝, 딥러닝4j 등이 있음)

셋. PHP(Hypertest Preprocessor)

  • 탄생 시점부터 객체지향적 언어는 아니었으나, php5부터 객체지향적 부분을 지원한다고는 함
  • 동적 웹페이지를 만들기 위해 설계되었으며 PHP로 작성한 코드를 HTML 문서 안에 넣으면 PHP 처리 기능이 있는 웹 서버에서 코드를 인식하여 인터프리터를 통해 해석. 즉 컴파일이 필요 없는 스크립트 언어
  • 동적 웹페이지를 만들기 위해 설계된 만큼 기본적으로 웹 관련 함수들이 많아 생산성이 높다는 평(일례. PHP로 개발된 위키피디아)
  • Python과 마찬가지로 타입이 없는 서버사이드 스크립트 언어로 비교적 자유롭고 러닝커브 역시 낮은 편
  • 자유로움에 수반되는 단점: 내장함수, 인자 이름 규칙에 일관성이 부족하고 규칙이 없어 대형 웹사이트 제작에는 적합하지 않다는 평
  • 오픈소스. 개발자들에게 접근성이 높으며 특히 미국에서 높은 비율로 사용됨
  • 안정성이 약하다는 평 => 어렴풋이 알 것 같지만 정확한 정보는 추가로 커버.
  • 로직-뷰의 결합으로 인해 관심사의 분리가 어렵다는 단점. 말 그대로 HTML(view) 문서 안에 PHP 코드(로직) 존재. => 관심사의 분리가 구현되기 어렵다는 것은 결국 서비스가 커지고 변동사항이 생겼을 때 유지 보수가 어렵다는 말과 일맥상통하다고 생각한다.

넷. 루비(Ruby)

  • 순수 객체 지향의 스크립트 프로그래밍 언어로서 단순함과 생산성에 중점을 둔 언어
  • 정수, 문자열 등을 포함한 데이터 형식 등 모든 것이 ‘객체'
  • 파이썬과 유사한점이 많으며, 파이썬이 정형화된 들여쓰기를 요구하는 반면에 루비는 정형화된 서식을 요구하지는 않음 => 유연성 높음

Java를 선택하려는 이유

  • 사용도가 높고 커뮤니티가 크다는 점: 참고자료, 즉 레퍼런스가 많다는 것을 의미. 자료의 양 뿐만 아니라 뎁스있는 자료를 찾는 것도 비교적 용이
  • 추후 서비스가 확장되고 커졌을 때 자바 언어를 사용한다면 구인이 용이할 것(서비스 규모에 따라 인력 충원을 고려할 경우를 대비)
  • 자바 + spring을 이용해서 미니 프로젝트를 진행한 경험이 있음(현재 상황에서 새로운 언어를 공부하고 서비스를 개발하는 것 보다는 기본 지식을 갖춘 언어를 활용하여 불필요한 로드를 줄이는 것이 좋다고 생각함) => TODO. 프로젝트에서 Java 언어를 활용해 무엇을 구현했고 어떤 점을 배웠는지 기록하기
  • 기획자나 QA가 없는 상황에서 개발자 1인 체제로 서비스를 개발하려는 상황. 자바 언어 사용 시 테스트코드를 작성하는 기초적인 지식을 갖추고 있으므로 테스트를 통해 기본적인 예외상황 및 각종 버그에 대비할 수 있음
  • 만들고자 하는 서비스는 데이터 분석이나 머신러닝이 딥하게 필요하지 않으므로 파이썬의 주요 라이브러리를 활용할 가능성이 낮으며, 파이썬을 선택하여 극대화 할 수 있는 긍정적 효과가 자바에 비하면 미미하다고 판단됨
  • php의 경우 해외에서는 많이 사용될지 모르겠으나 우리나라에서 특히 백엔드 영역에서는 자바 사용률이 압도적으로 높은 편. 유지 보수 측면과 안정성 측면에서는 관심사의 분리를 효과적으로 구현할 수 있는 객체지향 언어를 선택하는 것이 적합하다고 사료됨(물론 PHP 경우에도 ‘라라벨'이라는 프레임워크를 통해 MVC 아키텍쳐 패턴을 구현할 수 있고 라라벨 안에 포함된 객체지향 라이브러리도 활용할 수 있음. 다만 이러한 추가적인 프레임워크, 라이브러리를 활용하는 것이 과연 자바와 스프링의 결합보다 강력한 점이 무엇인지 확신할 수 없음)
  • 루비의 가장 큰 약점이라면 위에서 언급한 언어들에 비해 점유율이 높지 않다는 점이라고 생각함. 즉 국내 사용률이 저조한 편이라 레퍼런스나 참고자료가 타 언어에 비해 부족할 것임. 또한 일본인이 만든 언어로 API나 레퍼런스는 대체로 일본어로 작성되어 있어 이를 번역하는데 드는 시간과 그를 통한 이득이 타 언어 대비 클지 의문

역시 나의 생각과 주장을 정리하는 것이 쉽지만은 않다. 하지만 이번 기회로 다양한 언어들을 찍먹(?)처럼 맛보기 할 수 있었고 각각의 언어들마다 가진 고유한 특성들을 얕게나마 알게된 것 같다.

오늘은 스프링과 프론트 쪽을 좀 더 정리해보고 내일부터는 지도와 관련된 추가 조사, 기술 명세서를 작성해보려 한다.

요즘 스크럼 책을 읽으면서 한편으로는 위안(?)을 느끼는 점이...
바로 '경험주의적'인 부분에 대한 지지이다.

나는 '짬바(짬에서 나오는 바이브)'를 굉장히 중요하게 생각하면서도 한편으론 '경험주의'라는 것이 굉장히 근거가 부족한, 뭔가 모래성같은 느낌이 들어 신뢰하지 못했다.

하지만 스크럼 책에서 잊을만 하면 나오는 '경험'에 대한 지지, 그리고 그에 대해 가중치를 두는 듯한 내용을 보면서 지금의 학습, 성공, 그리고 실수와 실패의 경험이 또다른 성장의 발판이 될 수 있겠구나 하는 생각을 한다. 그리고 '경험 기반'이라는 것에 대한 불신의 눈초리도 점점 거두어가는 중.

아직은 포트폴리오에 대한 구체적인 윤곽이 잡히지 않아 불안한 마음도 있지만!! ㅎㅎ. 오늘의 경험이 나의 성장을 견인할 것이라는 점을 믿으며.

오늘도 잘 마무리해보자.

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글