Java 개발자 입장에서 지극히 주관적으로 작성했고 반대의견은 언제나 환영입니다. 참고자료에는 제가 사용해본 또는 공부예정이었던 기술스텍만 적었는데 외에 엄청나게 많은 기술스택들이 있으니 오해없으시길 바랍니다.
[참고자료(우측 컨트롤 UI)]
공통적인 특징이 Java를 쓰면 Kotlin은 기본적으로 딸려오는 것 같습니다.
아무래도 Kotlin이 코드 간결성, null 안정성이 뛰어나고 무엇보다도 기업이라면 무시할 수 없는 라이선스 문제도 있는 것 같네요.
예전에 Kotlin + SpringBoot를 이용한 개인프로젝트를 잠깐 한적있었는데 거기서 느낀점은 참고자료가 아직은 많이 부족하다는 것을 느꼈습니다.
그러나 빅테크 기업이라 내부적으로 기술지식 공유가 잘되어서 그런지 컨퍼런스나 세미나를 통해서 참고자료가 부족한 점을 극복하지 않았을까 싶습니다.
결론적으로 레거시 또는 이미 구축된 프로그램은 Java로 유지보수 하되 고도화 및 신규 구축은 Kotlin을 사용 할 것 같습니다.
javascript는 말할것도 없네요. 너무 유명하고 인기많은 언어이기도하고 Vue나 React의 근간이 되는 언어이니 당연하게 쓰는 것 같습니다. 제가 다니던 곳에서는 vanilla JS(어떠한 라이브러리 없이 JS만 사용)으로 개발했는데 유명한거와는 별개로 언어가 너무 자유분방해서ㅋㅋㅋㅋ typescript, Vue, React 없이 사용하기엔 위험하지 않나 싶습니다. 그래서 빅테크기업도 typescript, Vue, React이 중 하나는 꼭 가져가는 것 같네요.
명불허전 Spring입니다. python을 해본입장에서 도대체 왜 한국이 Java와 Spring을 밀어줄까 생각해봤는데 현업에서 Java + Spring을 사용해본 결과 개발자의 실수를 줄여주는게 진짜 엄청 큰 것 같습니다.
Java + Spring을 이용해서 프로그램을 짜면 정말 정해진 길과 틀안에서 안정적으로 개발 할 수 있습니다. 안좋게 말하자면 자율성이 없다는 건데 제가 만약 개발기업을 운영하는 입장이라도 여기저기서 이게좋다 저게좋다면서 이것저것 짜놓은 코드보다는 획일적인 코드가 차라리 나을 것 같고 애초에 프레임워크가 꽉 잡아주니 엇나가는 코드들이 비교적 적지 않을까 하는게 저의 생각입니다.
Hibernate는 아마 JPA 일 것 같은데 JPA 이거 정말 미치도록 좋은 기술입니다. 근데 MYSQL의 AUTO_INCREAMENT 테이블은 BATCH 기능이 적용되지 않음, 설정이 복잡함, 직관적으로 이해되지않는 연관관계 설정, QUERY DSL이라는 라이브러리가 있긴하지만 여전히 복잡한 SQL QUERY를 작성하는데 어려움 등등... 아직은 모든 부분에서 사용하기에는 문제점이 많다고 생각이 듭니다. 그래서인지 아래 참고자료에 배민 기술스택을 보면 Mybatis가 있는데 위 단점들을 보완하고자 섞어 사용하는 것이지 않나 싶습니다.
RabbitMQ가 여기 끼어있는게 조금 의아하긴한데 메세지 큐의 일종으로 IOT에 주로 사용되는 기술인데 센서, 비콘이 발산하는 신호에 담긴 데이터를 수집하고 큐잉하는 목적으로 많이 사용되는걸로 알고있습니다. 카카오나 배민이 사용하는데 배민은 추측하기로 배달하는 중에는 GPS로 추적하고 배달하는 사람이 업체에 도착하면 업체에있는 배민 기기가 배달자를 인식해서 뭔가 하는 용도로 사용하지 않을까 예상해봅니다. Kafka는 주키퍼 앙상블, 카프카 다중화가 기본 구조라서 대규모 인프라에 적합하지 소규모 인프라 구조에는 적합하지 않아서 메세지큐를 적용해야하는데 간단하게 사용가능한 RabbitMQ가 사용되지 않았나 생각해봅니다.
마지막으로 API 문서관련 기술스택으로 쿠팡에서 쓰는 Swagger가 있는데 제가 일하는 곳은 Postman과 Swager를 같이 썼습니다. 일단 UI가 이쁜것에서는 합격인데 기능적인 측면에서 Postman이 좀 더 많은 것을 지원해주고 좋았던 것 같습니다. Swager는 모듈과 함께 올릴 수 있다는 점과 프론트엔드가 좀 더 쉽게 접근 할 수 있다는 장점이 있고 Postman은 백엔드가 테스트하기 좋다는 느낌을 받았네요.
역시나 React가 주를 이루고 있는데 컴포넌트 상태관리를 도와주는 Redux도 많이 보입니다. 백엔드 관점에서 관심이가는 부분은 바로 GraphQL입니다. GraphQL역시 일하면서 동료 개발자가 쓰는 것을 봤는데 백엔드 초기 구성이 상당히 힘들어보였습니다. 그럼에도 쓰는 이유는 프론트에서 REST API를 연동하면 불필요한 응답 정보를 받게 되는데 GraphQL은 프론트가 직접 요청정보를 쿼리형식으로 작성(SQL과 느낌이 비슷함)하여 요청 후 요청에 맞는 응답 데이터들만 받기 때문에 필요한 정보만 쏙쏙 받을 수 있다는 장점이 있는 것 같습니다.
그러나 하나의 엔드포인트로 모든 정보를 조회 할 수 있다는 것이 보안상 좋은지는 잘 모르겠습니다. 개인적인 평을 하자면 데이터 중요도가 높지 않은 부분에서는 사용하면 분명 REST API보다 좋은 효율을 낼 수 있지만 모든 곳에서 적용하여 쓰는 것은 조금 위험해 보입니다.
일단 CSR 페이지는 클라이언트 단에서 https 프로토콜도 지켜주지 못하는 개발자 도구로 보면 어떤 정보를 주고 받았는지 다 보입니다. 그래서 사실 보안을 제대로 신경쓸거면 Next.js, JSP, Thymleaf 같은 SSR 방식으로 구성 해야한다고 생각해서 REST API나 GraphQL이나 거기서 거기 아닌가 싶기도 합니다.
개인적으로 TDD에 대한 가치관은 핵심 기술 부분만 하자는게 저의 생각이긴합니다. 일단 FULL TDD는 생산성이 너무 안좋다고 생각해서 그런건데 그래도 한가지 확실한건 B2C를 하는 업체는 오류 발생 시 매출과 직결 될 수 있기 때문에 빌드할때 오류를 발견할 수 있다는 장점이 꽤 커서 할 수 있으면 하는게 좋은 것 같습니다.
Mockito, Junit은 Spring에서 테스트 코드 짤때 사용하는 것 같고 Sonarqube는 코드분석 툴로 알고 있는데 메모리 누수방지나 클린코드 작성에 좋은 걸로 알고있습니다. SI 업체나 일반적인 중소기업은 사실상 테스트코드를 짠다는 행위 자체가 물밀듯이 들어오는 프로젝트 감당도 안되는 상황에서는 엄청난 시간낭비이기 때문에 하고싶어도 잘하지 못하니 혹시 신입분들 있으면 참고하시면 될 것 같습니다.(물론 빅테크 기업도 중요로직 위주로 하는 편이고 모든 로직에 대해서 테스트 코드짜두는 곳은 잘 없다고 알고있습니다.)
MySQL은 원래 짱짱했고 PostgreSQL이 많이 치고 올라오는게 보이네요. Redis, ElasticSearch, MongoDB, InfluxDB 모두 속도가 빠르고 오픈소스 DB들인것으로 보아 처리속도 및 비용에 중점을 두었다는게 눈에 보입니다. PostgreSQL은 써보지 못했지만 검색해보니 PostgreSQL이 MYSQL에 비해 단순 읽기는 비교적 느리지만 복잡한 쿼리, 대규모 데이터 처리, 데이터 분석 작업에 좋다는 말이 있는거보니 역시 처리 속도가 핵심이지 않을까 싶네요.
여담으로 2000년대나 2010년대 초반 개발을 배우신분이 본다면 ORACLE이 이렇게 없다고? 하시는 분들 있을 수 있는데 개발자 입장에서 ORACLE은 정말정말 불편한 DB입니다. 언어로 치자면 C언어와 같다고 할까요. ORACLE이 물론 기능도 많고 제어 할 수 있는 것도 많지만 굉장히 난잡하고 복잡하다는 생각을 지울 수 없습니다. 단적인 예로 AUTO_INCREAMENT를 구현하려면 시퀀스에 트리거 덕지덕지 만들어야하고 빈 값이 IS NULL로 검색되기도 하고.. LIMIT 기능은 BETWEEN과 같은 문법으로 구현해야해서 상당히 장황해집니다. 그럼에도 불구하고 큰 기업에서 여전히 ORACLE을 많이 쓰는 이유는 엔지니어 호출과 같은 유료기능이 있기 때문에 돈만 내면 신경을 DB 구성에 안써도되고 책임소재 잘잘못 따지기에도 좋다는게 크지 않을까 싶네요.
Kafka 너무 유명한 기술이죠 위에 백엔드에서 적었다싶이 대규모 인프라 구성에 적합한 메세지큐라고 생각합니다. 빅테크 기업들이라 그런지 많이들 쓰네요.
프로젝트 할때 한번 써봤는데 생각보다 백엔드 초기 구성이 쉽지 않더라고요. 그냥 단순히 데이터 받고싶으면 컨슘하고 전달하고 싶으면 프로듀스 하면 끝 아냐? 라고 하시면.. 맞긴합니다. 그러나 데이터 컨슘 후 실패처리에 대해서 깊게 고민해봐야하고 더구나 덮어놓고 컨슘해서 비동기적으로 처리하게되면 모든 리소스가 해당 처리에만 집중되는 현상이 발생할 수 있기 때문에 스레드풀도 관리해줘야하며 스레드 풀이 꽉차면 잠시 컨슘을 막아주는것 등등.. 딥하게 들어가면 고려할 것이 굉장이 많습니다. 단순 개인 토이프로젝트로만으로는 공부하기 힘든 기술스택 1순위이지 않을까 싶습니다.(Jmeter나 Postman으로 대규모 데이터 입출력 구현은 가능함)
Grafana, Prometheus는 호스트 서버 모니터링 용도로만 사용해봤는데 아무래도 Docker 기반 기술이 많아지다보니 컨테이너 모니터링 기법도 상당히 중요 할 것 같습니다.
이젠 정말 Docker를 안쓰는 곳이 없네요. 제가 처음 개발할때만해도 서버 살 돈이 없어서 VMWare나 VirtualBOX로 가상 서버를 띄우고 거기서 프로그램 돌려보고 그랬는데 지금은 Docker만 띄우면 되니 너무 좋은 것 같습니다. Docker라는게 딴거 없고 원래는 windows에서 구성한 인프라는 linux에 적용하려면 변형하거나 고쳐야하고 그 반대도 마찬가지인데 docker는 linux에서 만들든 windows에서 만들던 간에 일단 구축해놓으면 git hub처럼 repository에 컨테이너 이미지 라는 걸 올려서 어디서든 내려받아 동일한 인프라 구성하는게 가능합니다. 즉 OS에 구속 받지않는 거죠. 사실 이건 이상적으로 그렇다는거고 windows에서 쓸때는 조금 불편한 감이 있긴합니다.(잔버그들이 좀 있어서..)
Kubernetes는 사용해본적이 없긴한데 이 기술부터 데브옵스와 일반 개발자를 나누는 경계선에 있는 툴이 아닐까 생각해봅니다. Docker 컨테이너들을 효율적으로 관리해주는 툴 정도로만 알고 있는데 한번쯤은 공부해보고 싶어지는 기술입니다.
데브옵스 기술스택 리뷰 마지막으로 Jenkins와 GithubActions이 남았는데 개인적으로 Jenkins 나쁘지 않다고 생각합니다. Jenkins는 원할때 배포 할 수 있지만 전용 서버를 두어야한다는게 단점이라고 생각합니다. GithubActions은 GitHub와 연계되어 특정 작업에 트리거를 걸 수 있어서 진짜 자동 배포 느낌이 나서 좋지만 특정 트리거가 되는 행위를 하지 않으면 할 수 없다는 것과 Jenkins처럼 원할 때 배포하려면 좀 뭔가.. 복잡해지고 직관적이지가 않은 것 같습니다. 그리고 GithubActions를 이용해서 서버에 접속해서 뭔가 하려고하면 Git Server에서 브루트포스 공격마냥 접근합니다..(이거 때문에 네이버 클라우드 경고 엄청떠서 당황했던적이 있네요) 그래서 GithubActions를 구축할거면 Git 서버에서 SSH 접근하게해서 뭔가 실행하려 하지말고 Watchtower로 Docker Repo 업데이트 감지해서 sh 파일이나 Docker 이미지 재배포 방식으로 하는게 좋은 것 같습니다.
저의 경우 이 글을 쓰면서 내린 결정은 kotlin, Mockito, Junit, GithubActions, GitLab, MongoDB, InfluxDB, PostgreSQL를 공부해보려고 합니다. kotlin과 GitLab을 제외하면 이미 현업에서 써봤지만 익숙치않거나 건드린지 오래되어서 추가하였습니다. 선정한 이유는 기술 스택들을 쭉 봐오면서 느껴진게 비용, 데이터 처리 속도, 안정성 이 세가지 였는데 지금 적은 이 기술들이 밀접한 관련이 있어보였고 또 말도 많이 나오는 기술이라 선정하였습니다.