NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    기타 엔터프라이즈급 프로젝트를 운영하기 위한 기술 스택. (Tech Stack for running enterprise level …

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘 이야기할 내용은 제가 일하는 S사 프로젝트와 EES 솔루션 회사 그리고, 엔지엠소프트웨어에서 사용하고 있는 기술 스택(Tech Stack)에 대해 설명하고, 왜 이 기술들을 선택했는지에 대해 이야기 하려고 합니다. 이글에서 언급하는 내용들은 엔터프라이즈급 프로젝트 또는 소프트웨어에 적용하는거라서 중소규모 프로젝트에는 도입하기 어려운 부분이 존재합니다. 신생 회사라면 모르겠지만, 이미 사용하고 있는 관리 도구를 버리고 새로운 환경에 적응해야 하는 부담도 존재합니다.

    Qdw896m.png

     

     

    소프트웨어 형상 관리(SCM, Software Configuration Management)

    개발 및 유지보수 과정에서 발생하는 이슈와 소스 코드, 문서, 아키텍쳐, 인터페이스, 테스트, 정적 분석등등 모든 행위에 대해 형상을 만들고 이 형상에 대한 변경을 체계적으로 관리 및 제어하기 위한 시스템을 말합니다. SCM은 소프트웨어 개발에서 가장 넓은 의미의 관리 방법으로 다양한 도구들이 존재합니다. 대표적으로 원조격인 Jenkins가 있고, 이후로 체계적인 발전을 이루어 현재는 Microsoft의 TFS(Team Foundtation Server)와 Atlassian의 JIRA, Confluence가 있습니다. 요즘도 쓰고 있는지는 모르겠으나 IBM의 CC(Clear Case) / CQ (Clear Quest)도 있습니다.

     

    소스 코드 버전 관리(SCM, Source Code Management)

    보통 소스 코드 관리 또는 버전 관리 도구를 말합니다. 다양한 도구들이 존재하는데요. 요즘은 Git으로 정리가 되었습니다. 대부분의 소프트웨어 관리 도구들이 Git을 기본 탑재하고 있습니다. 이외에도 SVN(Subversion), CSV, SourceSafe가 있는데요. 아직도 SVN이나 CSV를 사용하는 곳이 있는지 잘 모르겠네요. 아무튼, DevOps 생태계에 편입하고자 한다면 Git을 권장합니다. 초기에는 버전 관리 도구로 SVN이나 CSV를 많이 사용했습니다. Git 초창기에는 도입 비용 문제(시스템 구축, 개발자 교육)로 현상태를 유지하는 회사가 많았습니다. 사실 Git을 적용하지 않는것은 버전 관리를 포기한다는 의미보다 Git으로 대변되는 DevOps 생태계 전체를 포기하는 것과 마찬가지입니다. 오픈 소스 진영의 최대 생태계인 GitHub, npm, yarn, Docker Hub, CI, CD이 Git을 기반으로 하고 있습니다. Git을 사용하지 않는다는것은 이런 기술 기반 활동들을 포기한다는 것과 동일하기 때문입니다. 개발자로 성장하기 위해 이런 시스템에 빨리 편입되는게 좋습니다.

     

    Git 클라우드 서비스

    Git은 소스 코드 관리를 위한 간단한(?) 도구일뿐입니다. 실질적으로 Git을 사용하게 되면 Git을 호스팅해주는 서비스를 선택해야 합니다. 일반적으로 검증된 Atlassian의 BitBucket을 사용합니다. 그다음 많이 사용하는 서비스는 MS의 Azure입니다. 그외에 개인적인 용도로 GitHub을 사용하고, 오픈소스인 GitLab을 직접 구축할수도 있습니다. 협업이 아닌 경우라도 로컬 커밋으로 Git을 사용하기를 권장합니다. 대부분의 Git 클라우드 서비스들이 소규모팀은 무제한 공간을 무료로 이용할 수 있도록 해줍니다. 저같은 경우에는 회사에서 Atlassian의 DevOps도구들을 사용하고, 엔지엠소프트웨어는 MS의 Azure DevOps를 사용하고 있습니다. 이전에는 리눅스 서버에 젠킨스로 CI/CD를 구축하고, Documentation과 SonarQube를 이용한 정적 분석 도구를 활용 했습니다.

    구분 GitHub GitLab BitBucket Azure
      특징

      오픈 소스 최대 허브로

      대부분의 타 서비스들과 연결

      오픈 소스   Atlassian의 서비스들과 연결   Microsoft의 서비스들과 연결

      Public

      Repository

      무료   무료   무료   무료

      Private

      Repository

    Free
    None

    Individuals
    $7/user/month

    Teams
    $9/user/month
    Starts at $25 / month and includes your first 5 users

    Enterprise
    $21/user/month
    Self-hosted or cloud / month and includes your first 5 users

    Free
    $0/user/month
    CI 2000 mins /group/month

    Bronze
    $4/user/month
    CI 2000 mins /group/month

    Silver
    $19/user/month
    CI 10,000 mins /group/month

    Gold
    $99/user/month
    CI 50,000 mins /group/month

    Free
    $0/user/month
    Up to 5 users
    CI 50 mins/month

    Standard
    $2/user/month
    Start at $10/month
    CI 500 mins/month

    Premium
    $5/user/month
    Start at $25/month
    CI 1000 mins/month

    Free

    $0/user/month

    Up to 5 users

    5 Users Over

    %5/user/month

    Test Plan

    $72/user/month

    Individual Services

    Azure Pipelines: Includes the free offer from 
    Azure Boards: Work item tracking and Kanban boards
    Azure Repos: Unlimited private Git repos
    Azure Artifacts: 2 GiB free per organisation

      Self   Hosted   Enterprise Plan
      $21/user/month
      Free   $10/up to 10 users
      $2500/up to 25  users
      $4500/up to 50  users
      $8300/up to 100  users
      $16,500/up to 250  users
      Free

     

    프로젝트와 회사는 BitBucket을 사용하고 있고, 엔지엠소프트웨어는 Azure를 사용중입니다. Git을 기반으로 두고 있기 때문에 크게 다른점은 없습니다. 지금까지 사용해본 도구들을 보면 서비스 비용이나 사용 방법들이 대동소이하기 때문에 변경에 대해 크게 부담은 없었습니다. 다만, 이미 구축된 시스템을 변경하는건 다른 이야기입니다. 프로젝트 또는 소프트웨어 및 팀의 규모에 맞게 선택하는게 중요합니다. 실질적으로 어떤 Git 클라우드 서비스를 선택해야 하는지는 각자 다를 수 있습니다.

     

    지속적인 통합(CI, Continuous Integration)과 지속적인 배포(CD, Continuous Delivery)

    DevOps 개발 환경과 더불어 CI/CD는 필수 사항입니다. Continuous를 "지속적"으로 해석했지만 CI 도구에서 제공하는 기능은 자동화에 가깝습니다. 개발자가 소스를 커밋하고 머지하면 서버는 자동으로 빌드하고 결과를 통보합니다. 물론, 배포도 자동으로 이루어지고 테스트 URL도 자동 통보가 되죠. 하지만, S사 프로젝트나 MES 또는 EES 솔루션과 같은 경우 CI/CD를 적용하기 어려운 부분도 존재합니다. 대용량 데이터를 핸들링하는 양산 환경에서는 아주 작은 실수도 엄청난 비용 손실을 발생시키기 때문입니다. 현재까지도 국내 최대 기업에서도 CI/CD가 도입되지 않은걸 보면 아직도 넘어야할 문제들이 많은걸로 알고 있습니다. 무료로 제공되는 서비스와 시스템을 감시할 수 있는 환경에서도 주의가 필요합니다. 회사 또는 개인적으로 사용한 경우는 Jenkins와 TFS입니다. 개발자가 소스 코드를 커밋하고 머지하면 자동으로 배포되고 릴리즈 됩니다. 이 때 빌드 머신에서 문제가 발생하거나 정상적으로 태깅한 소스로 빌드되고, 배포되면 관련자들에게 자동으로 이메일 또는 슬랙으로 메시지가 도착하게 됩니다.

     

    이전 IBM의 CC/CQ를 사용할때는 개발자가 직접 릴리즈룸에 들어가서 서버별로 하나씩 배포해야 하는 끔찍한 경험을 했었습니다. 웹서버, 데이타베이스등등 수십대의 서버에 스위치로 들어가서 하나씩 작업하는건 상당히 번거롭고 괴로운 일입니다. 지금 S사 프로젝트도 각각의 Application Server, Database Server, Web Server에 직접 배포 해야 합니다. 서버가 한두대도 아닌데 말이죠. 그래서 CI/CD를 도입해야 한다는 것입니다. 일반적으로 CI 서버가 소스를 받고 미리 설정된 스크립트를 실행하게 됩니다. 또는 특정 위치에 bash나 Shell, PowerShell등이 함께 배포됩니다. Java나 C#의 경우에는 Build 스크립트를 사용하게 됩니다. 또한, 빌드가 정상적으로 완료되면 특정 서버 또는 FTP에 자동으로 배포하게 되고 알람을 발생시킵니다. CI/CD는 TFS 또는 BitBucket의 Pipeline이나 Jenkins를 사용합니다. 당연한 이야기겠지만, 유료 서비스들은 빌드 스크립트에 소스가 포함됩니다. Jenkins는 직접 구성해야 합니다. BitBucket은 CI Bamboo를 사용하는데 유료임에도 Jenkins나 GitLab에 비해 딱히 장점이 없습니다.

     

    개인적으로 Jenkins를 추천하지는 않습니다. 생각보다 시스템 구축 및 환경을 갖추기가 어렵기 때문입니다. 물론, 수차례 경험이 쌓인다면 쉽게 쉽게 풀어나갈 수 있을겁니다. 스타트업이나 소호의 경우 이런 환경을 갖추는데 너무 많은 비용(시간)을 소비하는건 좋지 않습니다. 서비스 또는 제품을 만들고 출시하는데 전력을 기울여야 하기 때문입니다. 큰 회사에서 큰 프로젝트를 성공시켰던 개발자가 스타트업을 할 때 자주하는 실수가 이런 시스템을 갖추고 진행하면 더 잘 될거라는 확신이라는 것입니다. 대부분의 개발자가 이런 환경을 겪어보지 않았기 때문에 프로젝트는 지연되고, 실수로 인해 파생되는 다른 이슈들을 해결하기 위해 시간을 낭비하게 됩니다. 물론, 투자를 받아서 제대로 시작할 수 있다면 좋겠지만 이런 경우는 상당히 드물기 때문에 일단 시작하고, 천천히 준비하는게 좋습니다. 지극히 개인적인 의견이라서 반론도 있을테지만, 지금까지 경험으로 미루어볼 때 일단 코딩 한줄을 시작하는게 더 중요한거 같습니다.

     

    사내 인프라팀을 갖춘 규모가 있는 회사라면 Jenkins와 같은 Self Hosting은 사용하지 않습니다. 위에서도 언급했지만, 작은 팀에서 어느정도 준비가 된 상태라면 적극적으로 도입해볼만 합니다. 5명 이상 되는 팀이라면 DevOps와 SonarQube의 정적 분석을 통해 많은 도움을 받을 수 있기 때문입니다. 또한, QA팀이 없다면 더 좋은 선택이 될겁니다. 대부분의 회사에서 MS 또는 Atlassian의 서비스들을 이용하면서 Jenkins와 SonarQube를 병행하고 있습니다. 그만큼 CI/CD와 Documentation 그리고 정적 분석에 요구가 많습니다. 모든 언어를 지원하는건 아니지만, 충분히 가치가 있는 활동입니다.

     

    젠킨스에 대해 좀 더 이야기하자면 개인적으로 사용하는 도구로 상당히 강력한 성능을 보여줍니다. Java 오픈 소스로써 CI/CD에 있어서 초창기에 엄청난 발전을 이끈 장본인입니다. 실제로 젠킨스와 SonarQube(소나큐브)로 레거시 솔루션을 많이 개선했으며, 문서화도 빠르게 정리가 되었습니다. Git 클라우드 서비스 초창기에는 CI 기능이 없었습니다. 하지만, 젠킨스는 다양한 환경과 언어를 통합하고 빌드, 문서화, 정적 분석, 배포를 자동화 할 수 있었습니다. 유료 서비스를 이용하고 있음에도 여전히 많은 회사들이 젠킨스를 사용하고 있습니다. 역사가 오래된 만큼 사용 가치가 높은 플러그인도 많고, 예상하지 못한 상황에 대응할 수 있도록 커스터마이징도 가능하기 때문입니다. 하지만, 처음 시작하는 단계라면 적극 추천하지는 않습니다. 작은 팀이라면 유료 제품을 무료로 이용할 수 있는 선택지가 많기 때문입니다. 한가지 명심해야 하는 부분은 기술은 환경에 따라서 선택하는것이지 편의를 위해 선택하는건 아니라는 겁니다. 클라우드 서비스에서 제공하는 CI들은 단위 프로젝트에 초점이 맞춰져 있습니다. 프로젝트를 빌드하고 배포하는 인프라팀은 Kubernetes(쿠버네티스)등을 통해 Orchestration 기반으로 프로젝트가 아닌 인프라 자체를 배포하고 관리합니다. 인프라 단위 컨트롤에서는 젠킨스가 더 좋은 선택일겁니다.

    ※ 쿠버네티스: 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템입니다.

     

    언어와 프레임워크(Language & Framework)

    위에서도 잠깐 언급했듯이 기획 단계에서 어떤 언어를 사용할 것인가는 무엇을 만들지에 따라서 결정됩니다. 이 부분에서 경험적으로 수차례 실패를 목격했기 때문에 기존 인력의 러닝커브를 고려하더라도 제공하는 서비스에 따라서 결정해야 한다는겁니다. 웹서비스를 제공해야 하는데 기존에 C, C++ 개발자만 있다면 익숙하고 빠르게 개발할 수 있는 C언어를 사용해야 할까요? 또는 C#의 ASP.NET을 사용해야 할까요? 예전에는 러닝커브에 소요되는 비용보다 익숙한 언어로 빠르게 개발하고 서비스를 출시하는게 더 중요했습니다. 하지만, 지금에 와서는 웹 언어들의 눈부신(?) 발전으로 인해 많은 부분에 인식이 개선되어 왔습니다. C, C++, C#, Java 개발자도 쉽게 웹에 적응할 수 있는 환경이 되었기 때문입니다. 그리고 지금 개발자들은 새로운 언어에 대해 두려움이 없고, 빠르게 새로운 언어를 습득할 수 있는 능력을 기본 탑재하고 있습니다. 아무튼, 언어가 결정되면 서비스에 최적화된 프레임워크를 선택하게 되고, 이 프레임워크를 사용할 수 있는 언어로 자동 선택되어 집니다. 대부분 언어와 프레임워크를 선택할 때 크게 고려되는 사항은 생태계입니다. 아무리 좋은 프레임워크라도 학습과 예제를 쉽게 얻을 수 있는 커뮤니티와 플러그인, 모듈, 라이브러리등등... 공유 가능한 생태계입니다.

     

    생태계가 갖춰지지 않은 프레임워크는 오래 유지될 수 없고 선택 받을 확률이 낮아집니다. 사용자가 적으면 커뮤니티가 형성되지 못하고 결국은 시장에서 도태되는 결과를 가져옵니다. 그렇기에 대부분은 생태계가 잘 만들어져 있고, 관련 커뮤니티가 활발한 프레임워크를 선택하기 마련입니다. 이런 경우 지속적으로 업그레이드되고 새로운 환경에 유연하게 적응할 수 있는 토대를 마련할 수 있습니다. 사실, 웹은 node, typescript, angular등등으로 정리가 되가고 있는듯합니다. 서버는 java spring 또는 STS를 사용합니다. 모바일 서비스가 아닌 경우에 그렇죠. 모바일쪽은 어떻게 진행되고 있는지 잘 모르기 때문에 저도 궁금하긴 합니다. 이외에도 PHP나 JSP, ASP, ASP.NET등등... 많은 언어들이 있었으나 더이상 미래가 없어서 언급조차 안되고 있습니다. 특히 PHP와 ASP는 러닝커브가 낮은 언어라서 인기가 많았지만, 생산성이 좋은 언어는 아닙니다. 이 홈페이지도 PHP로 되어 있습니다. 특정 서비스 하나만을 위해서 사용하기에는 괜찮지만 지속적으로 확장하고 서비스를 늘려가야 한다면 노드로 전환하는게 더 좋은 판단이라고 생각합니다. 몇몇 IT 공룡들이 PHP 또는 Java를 사용하고 있지만, 이는 일부이기도 하고 더 많은 기업들이 노드로 전환하고 있습니다. 이런 추세는 가속화할 것으로 생각됩니다.

     

    서버쪽 프레임워크는 Node(JavaScript), Spring(Java, STS), Django(Python)등등... 몇가지 선택할 수 있습니다. 기술 스택을 결정하는데 도움을 주는 [ 스택쉐어 ]에서 서버 프레임워크를 비교해보면 노드가 압도적으로 많은걸 알 수 있습니다. 회사에서 스프링을 쓰고 있긴한데... 점점 외면 받는 기술이 되어 가고 있는듯해서 안타깝습니다.

    ※ 2021.05.05 기준

    qF9p0gl.png

     

     

    노드에 대해 가볍게 알아보시려면 [ 여기 ] 유튜브를 한번 보시기를 권해드립니다. 저같은 경우는 주로 CS 프로그램을 만들다보니 웹은 아주 오래된 기술에 멈춰있습니다. 대부분의 회사들이 전통적인 윈도우 CS 프로그램에서 웹으로 전환하기를 원합니다. 서비스를 제공받는 고객들의 요구도 많아졌습니다. 하지만, 기존 C, C++, C#, Java 개발자들을 학습시켜서 개발을 진행하기란 쉽지 않습니다. 특히나 금융이나 하이테크 제조쪽은 고인물들이 많아서 더욱더 어려운 도전 과제일겁니다. 그래서, 웹 인력을 충원하면서 기존 인력들을 정리하는 일들도 최근 빈번하게 발생하고 있습니다. 모든 회사가 그런건 아니지만요^^; 차근차근 새로운 기술과 트렌드에 적응하려고 노력한 개발자들은 여전히 남아있겠지만 그렇지 못한 개발자들은 새로운 인력 시장에 많이 나와있는 상태입니다. 갑자기 이상한 주제로 빠졌는데요. 아무튼~ 개발자는 공부를 멈추면 안된다는걸 말하고 싶었습니다.

     

    클라우드 서비스(Cloud Service)

    회사에서는 LG 클라우드 서비스를 사용하고 있습니다. 파견나온 S사는 AWS를 사용하고 있죠. 개인적으로는 Azure를 이용중입니다. 이렇다보니 깊이는 없고, 이것 저것 건드려봤다는 이력만 남게 되었습니다. 앞으로도 계속 이용하면서 어떤 서비스가 더 좋은지는 천천히 알아가야 할거 같습니다. 아무튼, 제 경우 경험 수준이므로 참고 용도로만 가볍게 읽어보시길 바랍니다. 비용 측면에서 대동소이하므로 러닝커브가 작은 서비스를 이용하는게 좋은 선택일겁니다. 하지만, 팀을 구성하는게 아닌 참여하는거라면 해당 팀에서 사용하는 기술 스택을 학습하기 위한 시간과 비용은 어쩔 수 없는 부분입니다. 어떤 서비스를 제공할지에 따라 Firebase와 AWS에서 선택해야 합니다. Firebase는 프로젝트 기반이고, AWS는 Service Blick 기반이기 때문입니다. 둘을 비교 대상으로 두기에는 무리가 있지만 서비스 범주에서 체크해야 할 내용이기도 합니다.

     

    데이터베이스(Database)

    데이터베이스는 어떤 한가지로 특정짖기가 참 애매한 부분입니다. 프로젝트 또는 솔루션에 따라 자동으로 결정되는 부분이기 때문입니다. 팀을 구성하는 단계라면 데이터베이스 라이센스도 아주 중요한 항목중에 하나입니다. 제가 일하는 산업군은 전통적으로 RDB(Relational DataBase)를 선호합니다. 그 이전에는 NoSQL을 매인으로 사용했고, DW를 통해 서비스를 제공했었습니다. 그러고보니... S사 데이터베이스(Oracle) 시험을 봐야 하는군요. 이 시험을 통과하지 못하면 운영 디비에 접근할 수 없어서 업무에 차질이 발생합니다. 개발자가 이런것도 해야 하나 싶은 생각이 들지만, 먹고 살려면 어쩔 수 없습니다. 이젠 더이상 오라는데도 없어서 일이 있다는 것만으로도 땡큐를 연발하며 남아 있어야 하니까요^^;

     

    이미 오래되었지만, 데이터베이스 개발도 트렌드가 계속 변화해오고 있습니다. 빅데이터라는 말은 이미 오래전부터 사용되어 왔고 현재는 데이터 홍수라고 불리는 시대에 살고 있습니다. 이런 트렌드에 맞게 전통적인 RDB에서 NoSQL로 넘어가는 시기입니다. 빅데이터를 분석함에 있어서 RDB는 한계를 가지고 있기 때문입니다. 그리고 핫한 화두중에 데이터 드리븐이 있습니다. 마케팅, 분석, UX, 의사결정등등... 데이터가 중요한 역할을 하고 이런 데이터들을 분석/가공해서 처리해야 합니다. 하지만, 하이테크 제조쪽과 같은 위험하고 큰 의사결정에 도입하기란 시기상조라고 판단하는 모양입니다. MES나 EES, YMS와 같은 거대한 시스템에서 변경하기란 쉽지 않습니다. 상당히 보수적으로 프로젝트가 진행되고 변경에 대해 거부감이 크기 때문입니다. 언젠가는 시대 흐름에 맞춰서 변화해 가겠지만요.

     

    오늘은 여기까지만 작성하고, 나머지 이야기들은 다음에 한번 더 다루도록 하겠습니다. 오늘은 어린이날이라 준비하고 나가야겠네요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.