서언
안녕하세요. 최근에 서버 개발 공부의 필요성을 많이 느껴서, 그 필요성을 공유하고, 서버 기술 스택 채택 과정과 학습 방법을 정리하고자 글을 씁니다. 오늘은 가벼운 마음으로, 가볍게 글을 씁니다.
서버를 공부하는 이유
프론트엔드 엔지니어를 넘어서, 소프트웨어 엔지니어가 되기 위해서
소프트웨어 엔지니어가 되고 싶은 이유
- 나는 비즈니스 문제를 푸는 사람이 되고 싶다. 그러려면 시야를 넓혀야 한다. 문제를 프론트엔드 기술로만 푸는게 아니라, 서버/데이터/기획/디자인 무엇으로든 풀 수 있어야 한다. 그 관점에서, 먼저 프론트엔드 개발자에서 벗어나서 소프트웨어 엔지니어가 되어야 한다.
- DB 에 대한 이해가 없으니, 팀의 DB 설계 토론에 참여하지 못 하니, 비즈니스 적으로 적절한 제안을 할 수 없다. 그냥 팔로워가 될 뿐이다.
- DB 구조를 모르고, SQL을 모르니, 데이터를 직접 조회하기 어렵다. 필요한 데이터를 내가 직접 얻을 수 있다면, 더 많은 인사이트를 가질 수 있을 것 같다.
- 요악하자면, 의사결정을 더 잘하는 사람이 되기 위해서.
- 현실적으로는, 해외에서 개발자로 일 하고 싶은데, 찾아보니 소프트웨어 엔지니어 직종으로 많이 뽑고, 프론트엔드/백엔드를 많이 구분하지 않는 것을 알았다.
무슨 언어/프레임워크를 사용할 것인가?
- 서버의 개괄적인 동작, 개념들을 익히고 싶다. 그리고 최대한 빠르게 서비스를 만들 수 있는 수준까지 다다르고 싶다. 그래서 익숙한 JavaScript(node.js)로 학습할 것이다. 근본적으로 node냐 Java냐 하는 것은 중요하지 않을 것이다. 언어는 기술을 구현하기 위한 도구에 불과하다. “비동기” 라는 기술이 있고, 그것을 다루는 각각의 구현체들이 node, Java에 들어가 있는 것이다. 그러므로 하나의 구현체를 이해하고 사용할 수 있다면, 다른 것들 형식만 바꾼 것에 불과한 것이다.
- node로 하기로 마음을 먹었고, 프레임워크로는 일단 가장 기본적인 express로 학습할 것이다. nest.js 는 express를 확장성 있게/유지보수 하기 좋게 짤 수 있도록 하는 프레임워크이다보니, express를 모르고 nest.js 패턴을 채택하는 것은 적절하지 않아 보인다. (express, nest 둘 다 조금 학습해보고 든 생각) 내 목적을 이루기에는 express로 충분하고, 구조에 대한 필요성을 느낀다면, nest.js 도 학습해볼 것이다.
학습 방법
내가 새로운 기술을 익히는 방법이 있다. 가장 빠르게, 기본적인 기능을 만들어보는 것이다. 프론트엔드/백엔드의 경우, 가장 빠르게 Todo List를 만들어보는 것이다. 그것을 만들기 위한 배경지식은 전혀 중요하지 않고, 정상적으로 동작하는 기능을 빠르게 따라 만들어보는 것이 중요하다. 그러면 기본적으로 재미가 있고, 자신감이 생긴다. 생각보다 별 것 없음을 깨닫는다.
같은 선상에서 더 얘기해보자면, 처음 학습할 때 불필요한 것들을 파고드는 것을 크게 지양한다. 초급자가 DB의 종류에 대해서 심도있게 학습하는 것이 그 예이다. 갑자기 SQL, NoSQL 을 학습하고, 그 중에서도 어떤 것을 택할지 계속 찾아보는 것이다. 이것은 중요하지 않은 것 같다. 그리고 학습의 흥미를 떨어뜨릴 수 있다. 그냥 가장 많이 쓰이고, 간편한, 혹은 많이 들어본 것을 사용하는 것이다. Todo List를 구현하는 데 무엇이 중요하겠는가.
내가 이번에 학습하면서 Chat GPT에게 많이 한 질문의 흐름은 다음과 같다
- 나 : A 어떻게 구현해?
- GPT : A 는, B, C, D 등의 라이브러리를 활용하여 구현할 수 있습니다.
- 나 : 그 중에서 가장 쉽고 많이 쓰이는 라이브러리가 무엇이니?
- GPT : B 입니다.
- 나 : B를 써보려고 하는데, 간단한 가이드라인을 제시해줘
그래서 별 생각 없이, DB(MongoDB), 로그(winston, morgan), 유효성 검사(express-validator) 를 골라서 학습했다.
다시 돌아와서, 나는 기본적인 기능들인 Todo List, 유저/게시판/댓글 기능을 빠르게 만들어보는 것을 목표로 학습했다. 한 두세시간만에 프로젝트 첫 세팅부터 Todo List CRUD 까지 만들어본 것 같다.
Todo List를 먼저 구현하고, 지식을 일부 보강하고, 게시판을 구현하고, 지식을 일부 보강하고, 댓글을 구현하는 식으로 학습했다. 게시물을 구현하다보니, 유효성 검사/response 단일화/로깅 등에 대한 필요성이 생겨서 이것들을 보강하고 리팩터링 한 후에, 댓글에 적용해보는 식으로 학습하였다.
https://github.com/euijinkk/express-practice-log
Chat GPT
GPT와 함께 학습하다보니, 학습속도가 5배는 빠른 것 같다. 궁금증을 10초만에 해결할 수 있다. 처음 공부하는 사람 입장에서는 사실 모든게 궁금하다.
- app.use 랑 router.use 뭐가 다르지?
- router paramter랑 query paramter 가 뭐가 다른지?
- populate는 무엇인지? join 은 무엇인지?
- 미들웨어의 실행순서는 어떻게 되는지?
등등을 검색하여 좋은 블로그 글을 골라서 읽을 필요 없이, 매우 도움되는 답변을 매우 빠르게 얻을 수 있었다.
1뎁스 지식을 빠르고 능동적으로 공부하기에 정말 좋은 것 같다.
마무리
이제 간단한 CRUD 류 서비스는 만들 수 있을 것 같다. 서버라는 것이 학습할 양이 아주 방대하겠지만, 좋은 스타트를 했고, 앞으로 꾸준히 학습해볼 것이다. 여담이지만, 프론트엔드 기술을 공부하는 데도 여러모로 도움이 될 것 같다. 가령, node의 테스트툴로 jest는, 프론트엔드 개발에서도 많이 활용된다. 서버 코드를 짜다보니, 테스트 하기 쉬운 코드를 짜기 위해서 책임 분리가 중요하다는 말이 무슨 말인지 이해할 수 있게 되었다.
그리고 우리팀 서버개발자들의 고민/개발 과정을 조금이라도 이해할 수 있게 되었다. “아, 이래서 이 API에 이 필드를 추가하는 것을 망설였던 것이군” 라는 생각이 들었다.
'Tech > Sofeware Development' 카테고리의 다른 글
React CleanCode #2. UI Variation에 유연하게 대응하기 (3) | 2024.01.28 |
---|---|
ErrorBoundary 가 포착할 수 없는 에러와 그 이론적 원리 분석 (3) | 2023.12.10 |
React CleanCode #1, 합성으로 관심사를 분리하기 (12) | 2023.05.16 |
혹시 무분별하게 Suspense 를 사용하고 계신가요? (react-query) (15) | 2022.10.20 |
A use case of Function Overloading in TypeScript (useRef, remove null/undefined) (7) | 2022.10.03 |