Newbie BackEnd Developer Study GuideLine
요즘 많은 회사에서 신입을 뽑고 있는 시기이다보니 나한테 백엔드 관련 내용을 물어보는 사람이 꽤 많다. 사실 나도 요즘 유행하는 백엔드의 경력은 얼마 되지 않기에 잘 모르지만… 게임 서버 취직하는법 알려달라고 했을때 더 잘 알려줄 수 있을텐데.
일단 한국에서 신입이 백엔드 개발자로 취업하기엔 Java + Spring 이 가장 편하다.
Java + Spring 기반 개발 생태계가 오래 되다 보니 이젠 Java 가 아니면 대규모 백엔드 팀을 꾸리는 것 자체가 극히 어렵다. 몇명정도야 구할 수 있겠지만 … 2022년 현 시점에서 내가 Java를 처음 공부했을때 유행햇던 J2EE, Struts, WebLogic 등의 키워드는 구경도 하기 힘들어지고 Spring(Boot) + Tomcat 으로 통일되다 시피 한 것이 현실이다
그래서 이미 갖춰진 큰 기업이거나, 아니면 투자를 많이 받아 빠르게 팀을 구축하기 위한 회사들(= 즉 신입들이 선호하는 회사들) 에 취업을 하기 위해선 Java를 배우는게 가장 유리하다.
또 나중에 이직을 고민 할 시, Spring 를 사용하는 회사는 아무리 실력이 좋아도 관련 경력이 적으면 뽑지 않을 가능성이 높다. 경험자 만으로도 충분한 인력 풀을 확보 할 수 있을 가능성이 높기 때문에, 적응 기간이 추가로 필요한 인원을 궂이 뽑는 리스크를 감수하지 않아도 되기 때문이다.
하지만 다른 플랫폼을 쓰는 회사면 거의 대부분 플랫폼 경험이 아니라 공용 지식 위주로 보게 된다 이유는 위와 반대로, 해당 플랫폼 경험자로만 팀을 꾸리는것은 불가능에 가깝기 때문이다. 따라서 더더욱 취업 준비를 할 때 Java + Spring 을 최우선으로 공부 하지 않을 이유가 없다고 할 수 있겠다.
그럼 아예 배경 지식이 없는 상태에서 취업을 하기위한, 내가 개인적으로 생각하는 순서에 대해 알아보자
- 기본적인 Java 언어 능력 습득
- 당연하겠지만, 기본이 되는 언어를 아예 할줄 모른다면 얘기 자체가 성립하지 않는다. 한문을 모르면서 한시를 쓸 수 없는것 처럼…
- git 의 습득
- 요즘 특수한 경우가 아니면 git 외의 저장소를 쓰는 경우가 아예 없다고 할 수 있다. 회사에서도 git 사용 가능 여부에 대해서는 당연하게 생각 하는 편
- RDB / SQL 의 습득
- DB에 대한 기본적인 지식. 특히 Key, Index, Normalization, Transaction, Lock 에 대한 이해는 필수적이다. 사실 요즘 많은 프로젝트에서 서버는 퍼포먼스에 별로 신경을 쓸 필요가 없다. 그냥 필요한만큼 늘리는 것이 일반적이라.. 그래서 고성능의 Native 언어가 특수한 경우를 제외하면 쓰이지 않는 것이다.
- 환경에 따라 다르지만, 적어도 내가 보았을때 가장 메이저한 Java + SpringBoot + Spring JPA 환경은 SQL 을 전혀 몰라도 개발을 할만한 환경이 아니다. 가능하지 않을까 라고 생각되는 플랫폼도 물론 있지만… 특히 백엔드는 상황에 따라 DB를 상당히 전문적으로 써야 하는 경우도 있고 그 경우 JPA 으로는 해결을 할 수 없는 경우가 꽤 생기는 편이라서 SQL 은 어느정도 할줄 아는게 좋겠다. 어떤 DB를 기준으로 배우냐는 상황에 따라 다르겠지만, 요즘은 무료로 쓸수있는 mariadb의 점유율이 아주 높으므로 그걸 기준으로 배우는게 취직하기 편하다.
- ORM의 습득
- 공공기관 / 기업 SI를 하거나, 아주 레거시한 프로젝트를 하지 않는이상, 2022년 현재 기준 대부분의 경우 ORM 을 사용하여 DB를 다루게 된다. 여기선 Java 를 기준으로 하니 JPA 를 익히는 것이 기본이 되겠다
- JPA의 경우 플랫폼별 메이저 ORM 중 가장 기능이 형편 없는 편이다. ibatis 같은 Query Mapper 보다 쬐금 나은 편이랄까…(뭐 그만큼 JPA의 원본인 hibernate가 일찍 나왔으니 그러려니 하자. 개인적으로는 가장 좋아하는 ORM 두개를 꼽으라면 EntityFramework와 ActvieRecord를 꼽는다. EF는 EF가 좋다기보단 Linq가 좋은거지만…) 그래서 그걸 보강해줄 헬퍼 라이브러리의 도입이 거의 필수적이다. 가장 메이저하게 쓰이는 것으론 QueryDSL 이 있다. JPA를 사용 하는 경우 매우 높은 확률로 QueryDSL을 같이 사용하니 같이 배워두자
- REST 에 대한 이해
- 요즘 백엔드는 하나의 서버에서 Desktop, Mobile, Web 모두를 커버하는 경우가 일반적이다. 요즘들어선 Desktop 개발을 할 일은 거의 없어서 제외한다 쳐도… Web 을 지원하는 이상 이상 통신 방법이 극히 제한되며, 그 중 가장 메이저하게 사용하는 방법이 JSON을 이용한 REST 스타일의 통신이라 할 수 있다.
- Spring Framework 에 대한 이해
- 한국에선 Java 로 BackEnd 개발을 한다 하면 99% Spring 혹은 SpringBoot를 사용 하게 될 것이다. 이 Spring Framework 를 한마디로 설명하자면 현존하는 Framework 중 가장 극단적으로 설정과 사전지식에 의존하는 Framework 라 할 수 있다. 따라서 프로젝트를 시작하기 까지 알아야 하는 지식이 많은편이고, 남들이 일반적으로 하지 않는 작업을 하려면 난이도가 확 올라가는 편이다.
- 추가적으로 Java는 언어의 기능이 극단적으로 모자란 편이라 프로그래밍 하기가 많이 부족한 편이다. 특히 Spring 이 요구하는 Bean 스펙에 맞추기 위해선 상당한 노가다가 들어간다. 따라서 그것을 커버해주는 Lombok 은 거의 필수적으로 함께 쓰이는 편이다.
- TestCode 작성법
- 난 개인적으로 TDD는 아무 의미가 없다고 생각한다. 발생 할 오류를 예측하여 고쳐나가는 식으로 작업을 하는경우, 예측한 부분에선 이미 자신이 인지 하고 있기 떄문에 실수를 할 확률이 극히 적다. 그 외의 부분에서 보통 문제가 생기지… Web BackEnd라고 하면 테스트 코드 자체는 도움이 되는 경우가 그럭저럭 있다. 특히나 Web은 테스트 라이브러리가 잘 갖추어져 있고, 외부 요인에 의한 변화가 적기 때문에 특히나 효율이 높은 편이다.또한 각종 회사에서 강조하는 경우도 많기 때문에 익혀 두는것이 좋다. 어떤 테스트 프레임워크를 사용하느냐에 따라 사용 방법이 매우 다르므로 취향에 맞게 사용 하면 되겠다. 많이 사용 하는 것으로는 가장 많이 사용되는 JUnit와 개인적으로 좋아하는 Spock 등이 있다
여기까지 공부했으면 일단 기본적으로 취직해서 신입 프로그래머로 프로젝트를 진행 하는데 문제가 없을 것이다. 그럼 신입사원으로서 더 알면 좋을것들을 알아보자
- Docker
- 요즘은 많은 경우 컨테이너로 배포를 하며, 컨테이너 중 가장 메이저하게 쓰이는 것은 역시 Docker 이다. 알아두면 매우 유용하다
- Redis
- 가장 메이저하게 쓰이는 메모리 캐시이다. Zookeeper 가 몰락한 이후 점점 사용처가 늘어 가는 편이니 알아두면 좋다
- Kafka
- 역시 가장 메이저하게 쓰이는 Message Queue 이다. 예전에는 RabbitMQ 나 ZeroMQ도 많이 썻던 것 같은데 요즘은 거의 Kafka로 통일되어 가는 느낌이다
- Java 고급
- Java + Spring 의 경우 초보를 벗어날 경우 코드를 만드는 것에는 금방 고수들과 차이가 없어지는 편이다. 다른 플랫폼에 비해 할수 있는것에 제약이 심하고 패턴화 되어있다보니 누가 만들던 코드가 비슷 해지는 경향이 심한편이다. 하지만 고급 기술을 익혀두면 만약의 경우 큰 도움이 된다.
- Java Dump 분석
- 로그로 원인을 찾을 수 없는경우, 최후의 수단은 Dump 분석 밖에 남지 않는 경우가 많다.
- Reflection 의 이해
- 리플렉션을 익히면 상당히 노가다가 심한 작업을 쉽개 해결할 수 있는 경우가 많다. 적어도 Dependancy Injection 을 구현할 수 있을 정도 수준의 Reflection 지식은 익혀 두자
- Annotation Processor 의 이해
- Java는 부족한 언어의 기능을 Annotation Processor를 이용한 라이브러리 레벨에서의 기능 확장으로 버텨온 부분이 매우 많다. 당장 위에서 설명했던 Lombok 도 그런 케이스이다. 직접 만들 일이 그리 많지는 않지만, 익혀두면 어려운 작업을 쉽게 할 수 있는 케이스가 많다.
- Aop 에 대한 이해
- Java는 부족한 언어의 기능을 Aspect 에 의한 라이브러리 레벨에서의 기능 확장으로 버텨온 부분 역시 매우 많다. 예를 들자면 Spring Framework의 @Transactional 같은 케이스이다. Aop 역시 직접 사용할일이 그리 많지는 않지만, 익혀두면 반복적인 작업을 아주 쉽게 해결할 수 있는 경우가 많다
- Java Dump 분석
- Java + Spring 의 경우 초보를 벗어날 경우 코드를 만드는 것에는 금방 고수들과 차이가 없어지는 편이다. 다른 플랫폼에 비해 할수 있는것에 제약이 심하고 패턴화 되어있다보니 누가 만들던 코드가 비슷 해지는 경향이 심한편이다. 하지만 고급 기술을 익혀두면 만약의 경우 큰 도움이 된다.
- ElasticSearch
- 로그 분석에 가장 메이저 하게 쓰이는 검색엔진이다. 고급 사용법을 익혀두면 많은 도움이 된다.
- HTML + Javascript(TypeScript) + React(or Vue), Android 등의 FrontEnd 개발 지식
- 개발 중인 기능을 확인하거나, 아니면 백엔드 팀 내부에서만 사용할 개발도구 등을 만들 경우는 거의 반드시 생긴다고 할 수 있다. 그럴때 지식이 있으면 유용한 도구를 쉽게 만들 수 있어 생산성에 도움이 된다.
- JVM 계열 외의 다른 언어
- 한국에서 예전에 가장 메이저 했던 C++ 프로그래머, 요즘 많은 Java 프로그래머의 공통적인 단점이라 할 수 있는 부분이 한 언어만 계속 쓰다보니 발상의 범위가 굉장히 좁다는 것이다. 다른 스타일의 언어를 이것저것 공부 해 보면 무엇인가를 프로그래밍 할 때 더 편한 방법을 생각해 낼 수 있는 경우가 많다.
이외에도 알면 더 좋은것들이 있겠지만 이 이상을 원하는 사람이라면, 아마 이미 뉴비가 아니거나 뉴비라 하더라도 가이드가 필요한 사람은 아닐거라 예상되니, 여기서 줄인다. 다들 취업 화이팅