ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기혁이의 아장아장 백엔드 도전기] 3화, 언어와 프레임워크
    백엔드 도저언 2020. 12. 18. 14:28

    첫 번째 스텝으로 백엔드 직군의 역할은 무엇인지에 대하여 파악해야할 것이며

    두 번째 스텝으로 백엔드의 전체적인 구조에 대하여 알고 있어야 하며

    세 번째 스텝으로 어떤 언어들이 있고 각 언어, 프레임워크들이 어떤 특징을 갖고 있는지 알아야 하며

    마지막으로 내게 필요한 언어와 프레임워크를 통하여 실습하며 점점 고도화를 진행하면 좋을 것 같다.

     

     두 번째 스텝으로 백엔드의 전체적인 구조를 살펴보며, 백엔드에는 웹서버, WAS, 데이터베이스가 있다는 것을 알 수 있었다. 그렇다면, 백엔드 개발자가 되기 위해서는 어떤 언어들을 선택할 수 있으며 어떤 프레임워크를 다룰 수 있어야하는지 알아보자.

     

    프론트엔드의 언어 & 프레임워크


     프론트엔드는 언어가 매우 한정적이다. 웹 브라우저가 해석할 수 있는 언어는 Javascript에 한정 되기 때문이다. 물론, Typescript와 같은 JS의 단점을 보완하기 위한 언어도 있다. 대신, 프로젝트에서 자체적으로 TS를 JS로 컴파일 해야한다. 위와 같은 이유로 프론트엔드에서는 HTML, CSS 그리고, JS를 습득한다면 React, Vue, Angular와 같은 프레임워크를 선택하여 프론트엔드 개발자에 도전해볼 수 있다.

    또, React-Native(모바일), Electron(데스크탑)과 같은 프레임워크들을 통하여 웹 개발 환경과 비슷하게 모바일 앱, 데스크탑 앱 또한 만들 수 있다. 접근성이 낮은 것 같지만 빠르게 변화되고 있는 프론트에 맞추어 발전해야하고, 다른 디바이스에 대한 기술 스텍도 비슷하기에 여러가지를 다루어야하는 상황이 나올 수 있다. 언어와 개발 환경은 같지만 더 넓은 지식을 요구함은 분명하다.

     

    백엔드의 언어 & 프레임워크


     백엔드의 언어는 단순히 내 기억만 되짚어 보아도 자바, 파이썬, 루비, 자바스크립트, C, C++, C#, Go, PHP 등이 있고, 프레임워크로는 express, flask, spring, django, ruby on rails 등이 있다. 각각 장단점은 아직 모르겠지만 프론트엔드와 달리 언어에 선택지가 다양하다는 것을 알 수 있다.

     

    웹 서버


     2화에서 웹 서버에는 Nginx, Apache 등이 있다고 알 수 있었다. 그렇다면 이것을 다루기 위해서는 어떤 준비를 해야할까?

     

    Nginx(엔진x)

    어떤 웹페이지를 들어가다 오류가 나타날 때, 우리는 아래와 같은 에러 페이지를 본 적이 분명 있다. (그리고 그 밑에 nginx가 적혀 있었다.) 정확히 이 친구가 어떤일을 하는지 까지는 단순히 이론 공부에서 알기 힘드니. Nginx 예제를 검색하여 이 친구를 다루기 위해 어떤 일을 해야하는 지 알아보자.

    Niginx 특징

    • Nginx는 C언어로 만들어졌다.
    • Nginx는 아파치와 다르게 오픈소스 웹 서버이다.
    • 이벤트 기반으로 설계 되어 있다.

     

    Nginx는 설정 파일을 수정하여 이벤트를 설정하는 정도로 사용 된다. 그러므로 별도의 언어 학습은 필요 없다고 판단 되고, 그저 사용 경험이 있느냐에 따라 차이가 생길 것 같다.(물론, 내부 로직을 수정해야한다면 C언어를 학습해야겠지만 프레임워크를 손대는 것은 일반적인 개발자가 하는 일은 아니기 때문에 여기 까지만 알아보자.)

    server {
        location / {
            root /data/RyuK;
        }
     
        location /images/ {
            root /data;
        }
    }

    실제 nginx에 대한 키워드로 채용공고를 찾아보면, 경험 & 이해라는 것이 우대사항에 들어가있는 정도이다.

    • AWS 등 클라우드 서버와 웹서버에 대한 이해도가 높은 분(Apache/Nginx/Tomcat)
    • Nginx 사용 경험
    • nginx 또는 guniconrn 환경 개발 및 운영 경험

     

    Apache(아파치)

    nginx 에러페이지는 꽤나 받지만 nginx와 다르게 아파치 에러페이지는 기억이 없는 것 같다.

     

     

    Apache 특징

    • 아파치는 아파치 소프트웨어 재단에서 관리한다.
    • 2012년 부터 점유율은 꾸준히 하락해 왔다.
    • 하지만 오래된 역사가 보여주듯. 트러블슈팅에 관련 된 팁들이 많이 누적되어 있기 때문에 선호하는 사람이 많다.
    • C언어로 구성 되어있다.

     

    nginx와 마찬가지로 설정파일을 수정하는 방식으로 사용되기 때문에 언어에 대한 이해도 보다는 경험을 필요로 하는 것 같다.

     

    간단히 살펴 보는 둘의 차이점

    • Apache는 MPM(Multi-Process Module)방식으로 요청을 처리한다. 동시 접속 요청이 들어오면 CPU와 메모리 사용이 증가한다. (동시 접속 요청에 약점)
    • Nginx는 Event-Driven 방식으로 요청을 처리한다. 동시접속 요청이 늘어나도 비동기 방식으로 처리되기 때문에 추가적인 생성비용이 들어가지 않는다. (Apache와 다르게 동적 콘텐츠를 기본적으로 처리 할 수 없다.)
    • Apache는 Nginx에 비해 모듈이 다양하다.
    • Apache는 안정성, 확장성, 호환성에 강점이 있고, Nginx는 성능이 우세한 강점이 있다.
    • Apache는 동적인 콘텐츠를 기본적으로 다룰 수 있고, 다양한 모듈이 지원되기 때문에 동적인 콘텐츠를 다루는 웹 서버일 경우 강점을 갖는다.
    • Ngnix트래픽이 많은 정적 콘텐츠 및 미디어 스트림이 제공 되야하는 곳에 조금 더 어울린다.

     

    WAS(Web Application Server)


     백엔드의 주요 업무가 진행 되는 WAS의 기술 스텍은 어떻게 될까? 아래 스택오버플로우의 2020년 설문을 보면 프론트, 백엔드에 관계 없이 Web Frameworks 카테고리에 나타나있다. 참고해보자.

    아직 2020년이 다 가지는 않았지만 stackoverflow의 2020 survey

     

    언어

    • Java
    • Python
    • Scala
    • Node.js (Javascript)
    • Ruby
    • Go
    • C#
    • PHP

     

    프레임워크

    • Spring (Java)
    • Django (Python)
    • Flask (Python)
    • Express (Node.js)
    • Koa (Node.js)
    • Play Framework (Scala)
    • .Net Framework (C#)
    • Laravel (PHP)
    • Ruby On Rails (Ruby)
    • Revel (Go)
    • Gin (Go)

     이 외 더 다양한 프레임워크들이 존재한다. 채용 시장과 2020 Survey를 참고 했을 때, NodeJS와 Django가 조금 우세하다는 것을 알 수 있었다.

    이런 다양한 환경에 대하여 차이점을 운운하는 것을 적절하지 않다고 생각 된다. 자신이 선호하는 언어가 있다면 그에 따른 프레임워크를 선택하면 좋을 것 같고, 딱히 선호하는 언어가 없다면 취업시장에서 강세인 express, django 혹은 요즘 대세라고 불리우는 Go언어 관련 웹 프레임워크를 사용해도 좋을 것 같다.

     

    DataBase


     서버에 대하여 알아보았다면 서버를 통하여 데이터를 저장하는 데이터베이스에 대하여 알아보아야한다.

     

    stackoverflow의 2020 survey & stackoverflow의 2020 survey

     

     위 DB 트랜드에서 MySQL, MongoDB를 많이 들어보았던 것 같다. 각 DB에는 어떤 차이가 있을 까?

     

    MySQL

    • MySQL은 Oracle이 소유하고, 관리하는 관계형 데이터베이스(RDBMS)이다.
    • 데이터를 Table에 저장 한다.
    • SQL(Structured Query Language)을 이용하여 DB에 접근한다.
    • 데이터베이스 스키마를 먼저 정의해야하고, 테이블에 들어갈 필드들에 대한 규칙을 규정하여 사용한다.

     

    MongoDB (No SQL)

    • NoSQL로 JSON과 비슷한 형태의 document로 데이터를 저장한다.
    • documnet는 관련된 데이터를 한 번에 저장한다.
    • MQL(MongoDB Query Language)을 이용하여 DB에 접근한다.
    • document는 정해진 스키마를 사용하지 않기 때문에 각 필드는 항상 달라질 수 있다. 만약 스키마에 대한 검증이 필요하다면 Collection에 대한 데이터의 조건을 선택하여 추가할 수 있다.

     

    {
    	Name : "면봉",
    	Tags : ["생활용품"],
    	Price : 2000
    }
    {
    	Name : "다람쥐 인형",
    	Tags : ["ETC"],
    	Price : 15000
    }
    {
    	Name : "양말",
    	Tags : ["생활용품", "의류"],
    	Price : 2000
    }

     

    내 생각

     어떨 때 무엇을 쓰면 좋은지 짧게나마 알고 싶었는데. 아직 잘 모르겠다. MySQL과 모든 관계형 데이터 베이스의 태생적 약점인 확장성과 관련되서 MongoDB와 같은 NoSQL 형태의 DB과 관심을 받고 있다고 한다. (이마저도 수년 전의 글이지만) 하지만, 아직 까지 MySQL의 점유율이 굳건한 것은 트랜잭션 데이터는 행과 열로 구성 된 테이블 형태와 잘 맞기 때문이라고 한다. 하지만 MySQL, NoSQL에 대한 경험은 한 번씩 사이좋게 쌓아보는 것이 내 인생에 도움이 될 것 같다.

    댓글

Developer RyuK