2019년 기술 회고 (2019, a year retrospect about tech)
목적
- 글의 단일 책임 원칙을 지키기 위함
- 올해 사용한 기술들을 정리하고 탄탄하게 다지기 위함
기준
- 프로젝트에 사용
- 학습
올해 거쳐간 기술 개요
Language
- Java
- JavaScript / TypeScript
- Python
Backend
- Spring / Spring Boot
- Spring Web MVC
- Spring Data JPA
- Hibernate
- Spring REST Docs
- Node
- Express.js
- Sequelize.js
- Flask / Django
- Test
- JUnit
- Rest-Assured
- WebTestClient
- Jest
- Mockito
Frontend
- Vue
- vuex
- vue-router
- React
- redux
- react-router-dom
- React Native
Common
- Cloud
- AWS EC2
- AWS S3
- AWS Cloudfront
- Infra
- Nginx
- Mysql / MariaDB
- Docker / Docker Compose
- Jenkins
- Git
- Design
- Domain Driven Design
- Atomic Design
기술 회고
Language
코딩 테스트 준비를 하면서 세웠던 코딩 테스트의 목표가 몇 문제가 나와도 모든 문제는 각기 다른 언어로 풀어서 제출한다는 것이었다. 큰 의미는 없지만 그냥 멋있어 보일 것 같아서 그런 목표를 세웠다. 하지만 우아한 테크코스 이전에 Java를 '상'이라고 생각했던 나는 우아한 테크코스에서 생활하면서 '하'라고 하기에도 부끄러운 수준이라는 것을 알게 되었고, 많은 언어를 대충 알기보다 한 언어라도 자세히 알아야겠다 라는 목표로 바꾸게 되었다.
아직도 잘은 모르지만 Java 8의 함수형 패러다임을 익히려고 노력했던 것 같다. 이를 통해, Node 나 React 로 프로젝트를 진행할 때 JavaScript에서도 함수형의 개념을 나름대로 사용할 수 있었던 것 같다.
파이썬은 동아리에서 스터디를 진행하면서 짧은 시간 공부하였다. 이 역시 Java 와 Javascript 에 대한 이해도를 통해 학습하니 예전에 처음 시도했을 때보다는 수월하게 이해할 수 있었던 것 같다. 하지만 파이썬은 가장 이해가 되지 않는 문법들로 구성되어 있어서 할 때마다 굳이 이런 언어를 사용해야 하나 라는 생각이 든다.
Backend
아무래도 우아한테크코스가 Spring Boot를 메인으로 채택한 교육이다 보니 가장 많은 시간 학습에 투자한 분야이다. Spring에서 제공하는 라이브러리나 프레임워크에 대하여 학습함과 동시에 Unit Test, Acceptance Test, Integration Test에 대하여 학습하였다.
WAS의 앞단에서 요청을 받고 응답을 하는 Container, 이를 구성하는 Dispatcher Servlet, Filter 그리고 이를 포괄하는 개념인 AOP에 대하여 학습하였다. 그리고 Spring의 Interceptor 나 Argument Resolver, Controller Advice 등을 알게 되었다.
Node 랑 비교하면 Spring 은 무지하게 복잡하다. Node 는 그냥 Filter 나 Interceptor 이런 거 필요 없이 미들웨어 함수, 메서드만 구현해서 추가하면 그만인데, 내가 아직 Node 쪽의 깊이가 얕아서 그렇게 느끼는 것 같기도 하다.
Flask는 Node 랑 유사하고 Django는 Spring과 유사했다. 두 그룹(Flask, Node vs Django, Spring)의 기본 목적이 조금씩 상이한데, 전자 그룹은 Api를 위해 설계되었고, 후자 그룹은 그렇지 않다. 주로 프로젝트를 Api 서버와 앱 혹은 SPA 구조로 진행했던 탓인지 전자 그룹에 매우 익숙했다. 이번 겨울 방학 때 동아리 홈페이지 리뉴얼을 하면서 Django에 더 친해질 기회가 생길 것 같다.
Frontend
테코브러리의 첫 번째 버전이 Vue, 현재 개발 중인 두 번째 버전이 React이다. 둘 다 Vitual DOM이라는 점, Vue는 MVVM의 VM의 역할을 Vue 가 수행하고 양방향 데이터 바인딩이 가능하다는 프레임워크, React는 단방향 데이터 바인딩을 하고 Jsx라는 문법을 사용하며 객체지향적인 컴포넌트 설계가 가능한 라이브러리라는 점만 안다.
근데 Vue 는
에반 유가 자유를 비하하는 듯한 트위터 글을 써서
더 이상 새로운 프로젝트에서 사용하지 않을 것이다. 차라리 내가 Vue를 모방한 자유를 존중하는 프레임워크를 만들어 배포할 것이다.
React는 우아한 테크 코스에서 배웠던 객체지향 패러다임에 좀 더 가까웠다. 컴포넌트 선언을 객체로 할 수 있고, 객체가 status를 가지며 (마치 클래스의 필드 같은 느낌으로), 생성자(<Component props={props}/>
)를 통해 초기화를 한다는 점이 비슷하여 테코브러리 버전2 를 개발하면서 매력을 느낄 수 있었다.
다만 아쉬웠던 점은 성능에 관심이 없고, 구현에만 집중했다는 점이다. 현재 개발 중인 테코브러리 버전 2는 새로운 데이터를 받아 화면을 re-render 할 때마다 깜빡거리는데 이런 부분들을 해결할 수 있는 공부도 해야 할 것 같다.
Common
Cloud는 올해 처음으로 AWS의 S3, AWS Cloudfront를 사용해 보았다. Cloudfront는 도메인 구입 없이 https로 접속할 수 있어서 사용했는데 알고 보니 CDN이라는 개념을 학습할 수 있게 도와줬고, S3는 static resource, SSR, CSR에 관련된 내용을 학습할 수 있게 해 줬다. 더 나아가 Web Server, Web Application Server에 대한 내용도 톺아볼 수 있는 실마리를 제공해 줬다. 내년에는 Multi Cloud 환경을 구축하는 것에 도전해보고 싶다.
Infra 부분에서는 Nginx, Docker, Jenkins를 처음 사용해보았다. Nginx는 테코브러리 서버의 Api Gateway 용도로 사용하고 있고, Docker 는 학습용으로 멋져서 사용하고 있다. Jenkins는 우테코 미션에서 있어서 사용해보았다. 아직 Nginx, Docker, Jenkins에 대한 세부적인 지식은 없다. 앞으로 습득해야 한다.
Git 은 올해 사용하면서 정말 놀라운 도구 중 하나였다. 개인 프로젝트를 진행하면서는 단순히 clone, push, pull 만 사용하였는데, 협업 경험을 하게 되면서 여러 상황을 마주하다 보니 상상도 하지 못했던 기능들을 알게 되었다. 무엇보다 이 분야는 우테코 크루 중 안돌9887 형님의 도움을 많이 받았다. 그의 아름다운 35분 테코톡 을 통해 많이 알게 되었고, 적극적으로 사용하고 있는 도구 중의 하나이다.
마지막으로 Design 측면에서는 유비쿼터스 언어와 개발 언어를 동일하게 사용하여 네트워크 비용을 줄일 수 있는 설계 기법 중 하나인 Domain Driven Design (DDD를 저런 문구로 수식한 이유는 내가 생각하기에 가장 큰 이점이라고 생각했기 때문이다.)과 프론트엔드에서 디자인 언어와 개발 언어를 동일하게 사용하는 Atomic Design에 대해 고민하고 프로젝트에 적용하기 위해 노력했다.
마무리
- 뭐가 정말 많았다. 그렇지만 내실이 부족하다.
- 새해에는 새로운 기술의 사용보다 사용했던 기술의 내실을 다지는 것에 집중할 것이다.
- 부족한 CS 지식을 위의 기술들을 사용했던 경험으로 하나씩 정복하고 싶다.
- 단순히 사용하는 것, 지식을 습득하는 것 외에 왜 사용해야 하는지, 사용하는 라이브러리나 프레임워크 보다 더 좋게 만들 순 없을지에 대한 고민도 끊임없이 시도할 것이다. (그러다가 Luffy Framework를 만들면 개이득? ㅎㅎ)