사수 없는 개발자로 고군분투한지, 9개월차 됐다. 주 업무는 벡엔드로, 기타 프론트 잡무들도 처리하는 편이다. 오랜만에 벡엔드 개발자 로드맵 보면서, 현재 내 수준이 어떤지 생각해보기로 한다.
먼저 초반 부분들은 인터넷의 작동원리, 웹이 어떻게 돌아가는지에 대한 전반적인 지식들을 요구하고 있다. 요 부분은 사실 나도 기초가 부족한 편이라, 자세히는 알지 못한다. 하나하나 깊게 파기에는 너무 분야가 막대하기도 하고, 다만 http 완벽 가이드라는 책을 통해서 부족한 기본기를 겨우 매꾼 편이라고 해야되나.
http://www.yes24.com/Product/Goods/15381085
사실 이 부분은 깊게 공부하기보다, 개념을 알고 구분할 수 있냐가 중요한 부분이라고 생각한다. 일단 현재 내가 일하는 작업에 있어서는 방해 되지 않는 선으로 습득은 했다고 자부한다.
그 다음은 OS에 대한 전반적인 지식을 요구한다. 터미널 사용법, OS의 작동원리, 프로세스 관리, 스레드와 동시성, 네크워크 기본개념 등등... 학부생때 배웠던 개념들이 다 여기에 녹아들어 가 있다.
사실 이 부분도 정확한 내용들은 별로 기억이 안 난다. ㅎ , 지금 내게 남아있는 건, 간단한 리눅스 명령어 몇개들 정도.. 이 부분은 개발을 하면 할 수록 중요성이 부각되는 측면이 있어서, 언제 한 번 날잡고 공부를 다시 해야 될 필요성을 절실히 느끼곤 있긴 한다.
그리고 다음으로 넘어가서 언어. 언어는 배운 거야 많다. python, php, c, c++ c#... 등 학부생 시절에 궁금해서 배우거나, 교양과목으로 찍어먹는 정도로 살펴본 것들은 아주 많지만, 제대로 쓸 줄 안다라고 말하는 정도는 현재 내가 주로 쓰는 JAVA, 그 다음 빈도로 자주 쓰는 JAVASCRIPT 정도가 기억에 남는다. 특히 JAVA는 이런 말하면 부끄럽긴 하지만, 나 정도 연차에 꽤나 깊게 코어지식까지 파보았다고 생각을 한다. 물론 진짜배기 개발자들에 비하면 형편없는 수준이긴 하겠지만,
현재 근무하는 회사에서 체계적인 GIT-FLOW 전략이 전혀 없다. (나름 있긴 있는 것 같은데, 지키는 사람이 거의 없다) 애초에 개발자 수도 적기도 해서, 주먹구구식으로, 프로젝트 하나 따가지고, GIT을 통해 협업해나가는 식인데, 한 번 쯤 제대로 공부해보고 싶은 생각은 있다. GIT의 기본 명령어들 정도는 익숙한 편이고, 다만 여러명이서 협업할 때에 있어서 어떤 호스팅 서비스 (gitlab, github...) 등을 통한, 협업 툴 전략 같은 건, 제대로 써본 적이 없다보니, 부족하다고 느끼는 편이다.
RDB만 많이 써봤다. 관계형 데이터베이스에 대한 전문적인 지식은 떨어진다. 예를 들어 인덱스 구조라든지 대규모 트래픽 상황에서 DB를 어떻게 최적할시킬지 (커넥션 풀 설정 같은 거...) 생각해 본 적 없다. 데이터베이스 정규화나 ACID, 트랜잭션에 대한 개념을 이해하고 있고, N+1 문제에 대해 고민을 해본적은 있다. 회사에서는 SQL MAPPER인 MYBATIS를 주로 쓰고 있고, ORM은 개인 프로젝트나 신규 프로젝트를 할 때 JPA를 사용해봤다. 애초에 JPA를 사용할 때는 대부분 JPQL를 통해 해결하기 때문에, 네이티브 쿼리에 대해서 깊게 공부를 해보지는 않았고, Mybatis 같은 SQL Mapper를 사용할 때도 최대한 DB쪽 연산을 배제하고 어플리케이션 단에서 해결할려고 노력했다. 물론 레거시 코드를 만날 때, 복잡한 쿼리와 프로시저 범벅을 안 만날 수는 없는 노릇이었다. 더 깊은 지식이 필요하다. JPA는 몇 번의 삽질 끝에 어느정도 노하우를 습득했다고 생각하지만 1순위는 DB쪽 지식이다. 극단적인 상황이 닥칠 시 언제나 JPA에 DB를 맞추는 게 아니라, DB에 JPA를 맞춰야 된다. 여기서 PostgreSql은 한 번도 접해본적 없다. NOSQL 같은 경우는 사실 생소하다. 그나마 안드로이드 깔짝 공부할 때 파이어베이스 손대본적이 있는데 몽고DB기반이라 하더라, 마치 JSON 같이 key - value로 이루어진 DB구조가 생소하다. 데이터 무결성을 생각하지 않는 DB라니 얼마나 간편하고 직관적인가.. 잘은 납득은 안 가지만, 비정형 대규모 데이터를 다룰 때 꽤나 효과적이라고 생각한다. 그나마 좀 손대본게 JWT 정보 관리할 때 Redis 같은 인 메모리 기반 DB(NOSQL? 이라고 해야되겠지?)를 다뤄본 적은 있다. 데이터 레플리케이션, 샤딩 전략, CAP 이론 같은 것은 들어나 본 수준에 그친다.
HATEOAS 첨 들어봤다. 뭐하는 놈이지? Swagger는 써본적은 없다. 회사환경에서는 그저 POSTMAN Collection 만들어서 주면 문서 담당자가 그거 보고 API 문서 만들어준다. 다만 개인 프로젝트할 때 Restdoc로 testcode 사용해서 API 문서 자동으로 만들어본적은 있다. 웹 개발할 때는 거의 JSON 규격으로 통신을 하는 편이고, 가끔 하드웨어 관련 소프트웨어와 통신할때 소켓으로 비트단위 프로토콜이나 생전 처음 보는 프로토콜로 통신을 해야될 때가 있는데, 그럴 때마다 JSON 이 녀석 참 고마운 녀석이라는 생각을 한다. 내가 개발하는 API 서버는 거의 REST 형식이다. SOAP는 이름만 들어봤고, gRPC는 처음 뵙는 분이다. 인증 관련해서는 JSP 작업할 때는 거의 세션 쓰는 거 같고, 물론 로드밸런싱 환경에서 여러개의 동일한 WAS에서 세션 공유 같은 문제를 고민해 본 적은 없다. 내가 작업한 게 거의 단일 WAS 수준이니까. 그 외 리액트 같은 프론트 서버나 안드로이드 같은 모바일 플랫폼과 인증처리할 때는 JWT Bearer 인증방식을 사용한다. 헤더에 담아서 보낼 때도 있고, 쿠키로 감싸서 보내기도 한다. Oauth 연동같은 경우도 회사에서는 해 본 적 없고 개인 프로젝트에서 해 본적은 있다.
CDN을 써 본 적이야 있고, Redis를 쓴 적, 스프링에서 추상화된 캐싱기능을 사용해본적은 있다는 수준이지. 막 내가 다뤄본다고 말할 수 있는 수준은 아니다.
정처기를 딸 때 암호화 이론 같은 것들은 다 공부해본 적은 있지만, 머릿속에 남는 건 RSA 정도 뿐이다. 보안위험성 같은 것들.. SQL 인젝션이나, XSS, CSRF등을 필터를 통해 막으려고 구현을 해봤고, CORS 같은 것도 스프링 시큐리티를 사용해 선택적으로 접근 허용해주었다. 콘텐츠 보안 정책이나, OWASP 보안 취약점은 처음 들어보는 단어이고, SSL HTTPS 도 원리 같은 것은 전혀 모른 채 그냥, 검색해서 적용하는 정도?
자바 개발자다보니 JUNIT으로 단위테스트를 한다. 사실 레이어마다 꼼꼼히 테스트코드를 작성해야 하는데, 귀찮아서 잘 안한다. 그나마 통합 테스트 같은 경우는, was 배포하기 전, 잘 되는지 테스트하기 위해 작성하는 편이다. 아무래도 SI 개발을 하다보니, 테스트코드 작성에 소홀할 수 밖에 없는 것 같다. 아무도 안 하는데, 나만 하면 뭔가 시간낭비 같은 개념이랄까? 물론 큰 규모의 프로젝트는 Testing code를 짜는 게 훨씬 안정성 있고 효율적이겠지만, 작은 프로젝트는 여기서까지 test code를 짜는 게 뭔가 시간이 아깝다는 생각이 든다. 그냥 프로세스 띄우고 확인해보고 말지. 다만 언제나 Testcode를 짜기 쉽게 개발코드를 모듈별로 잘게 쪼개는 건 신경을 쓰는 편이다.
젠킨스를 셋팅해보고 간단한 배포 배치 스크립트를 돌린 적 있다. 이게 끝. 이중화에 대한 고민도, 배포자동화에 대한 것도 X, 클라우드서버와 연동된 CI/CD 인프라를 구축하는 것에 있어서 늘 관심은 가지지만, 시간이 없어서 막 파고들어서 공부를 해 볼 수는 없었다. 앞으로도 한동안은 이 부분은 공백으로 놔둬지지 않을까.
GOF 디자인 패턴을 공부해보고 적용해보려고 노력해봤다. 도메인 주도 설계나, 테스트 주도 개발에 대한 개념을 알고 있다. SOLID 하게 어플리케이션을 짤려고 노력하는 편이며, 나름 위의 개념들에 대해서 잘 적용해보려고 시도는 해보지만, 항상 어설프게 끝나는 것 같다. 전통적인 레이어드 아키텍처에 익숙한 편이며, 이상한 글들은 많이 봐서, 아키텍처에 대한 요상한 지식은 많이 있다. 뭐 내가 설계를 할 수준까지는 아니니까. KISS, YACNI, DRY 는 처음 뵙는 분들입니다.
아무래도 겪어본 게 모놀리틱 아키텍처 뿐이고, MSA에 대해 항상 관심은 많고, 스프링 클라우드 모듈을 끄적거리곤 해봤지만 아무래도 실제로 사용해볼 환경이 조성이 안 되니, 지식이 쌓이지 않는 느낌이다. 그 외 SOA, CORS 이벤트 소싱, 서버리스 같은 거 관심만 있는 수준.
elasticsearch 진짜 이름만 들어봤다.
mqtt 모듈을 써본 적은 있다. kafka 예제로 한 번 끄적여본 적 있다. 딱 여기서 끝.
Docker 기본적인 명령어들을 안다. 도커파일 (Docker compose)을 만들어서 배포자동화를 시도해본 적 있다. 이미지 구워서 허브에 올린 적 있다. 딱 요 정도? 그냥 로컬에서 무거운 모듈들 설치하기 짜증날때, 대신 Docker Process로 띄우는 용도로만 주로 써봤다.
한 번 공부해볼려다 잘 안 되서 그만뒀다.
처음 뵙는 분이다.
양방향 통신할때는 웹 소켓, 서버에서 클라이언트로 단방향 통신할 때는 SSE 써봤다. 세부적인 프로토콜 기반 지식은 없다.
apache, nginx 설정파일을 건들어 본 적은 있다. 요번에 nginx에 대해서 조금 다룰 수 있는 수준까지 공부를 해 볼 생각이다.
.... 역시나 너무 부족한 점이 많다. 어느정도 수준까지는 다 습득을 해야되지 않을까? 그래도 대화가 통할려면?