4월 16일 금요일 역수직구조팀 팀원분들과 개발/취업에 관한 이야기를 나누었습니다. 재미있는 내용이 있었지만 썰과 프라이빗한 내용이 담겨서 질문 위주로 기록해두었습니다. 앞으로도 궁금한 것들이 있다면 편하게 질문해주시고 갹자의 경험을 공유하는 시간을 자주 가졌으면 좋겠습니다. - ZETTA -
1. 서비스 DB 설계 구체화 정도는 어느 정도로 작성해야 좋을지 궁금합니다.
실무에서는 적어도 ERD를 개발 전 미리 작성합니다. 서비스 DB는 사용자에 매우 밀접하게 관련이 있어 세심히 설계되어야 합니다. 실무에서 병목은 주로 웹서버가 아니라 DB때문에 발생합니다.
- 우선 제공하고자 하는 기능 (프론트)의 요구사항을 받고
- API에서 어떤 기능을 사용하는지 정리해보고
- 이 기능을 위해서, 그리고 성능을 만족하기 위해서는 어떤 데이터베이스를 사용할지 / 어떤 구조로 짤지를 정합니다.
- 3에서 RDB냐 NoSQL에 따라서 많이 달라지기는 하는데 "데이터 모델링/디자인"을 조금 공부해보시면 좋을 것 같습니다. 사이드프로젝트에서는 ERD 작성 정도면 충분하다고 생각합니다.
2. 실제 현업이나 사이드프로젝트에서 Redis를 캐시로 사용하는 사례가 많은지 궁금합니다.
- "현업에서는 Redis 캐시를 매우 많이 사용합니다. 매우 안정적인 오픈소스입니다."
- 사이드프로젝트에서는 Redis를 쓰는 경우는 많이 없을 것 같습니다. (물론 개발자가 좋아하면 넣겠지만...) 사이드프로젝트는 사용자 수가 서비스 DB/API에 영향을 미칠 만큼 많지 않기 때문에 캐시를 넣는 요구사항이 필요한 상황이 적기 때문이죠. 서버 리소스도 추가로 필요하구요. 필요하지 않는데 기술을 넣는 것은 오버엔지니어링이 될 수 있습니다.
3. 다양한 IT 기업들의 백엔드/서버 모집 요강을 보면, 필수 항목으로 Spring Boot 개발 경험/API 개발경험 등 여러가지 항목이있는데 이에 대한 경험의 수준은 어느 정도를 요구하는지 궁금합니다(신입기준). 단순하게 토이프로젝트 수준인건지? 그렇지 않으면 회사에서 직접 진행한 프로젝트경험을 말하는건지 궁금합니다.
- "신입 채용시 회사에서 요구하는 프레임워크 경험 수준은 당연히 높지 않습니다." 그런데 아이러니하지만... 최근 신입 입사하시는 분들을 보면 신입이지만 1-2년 이내 경력으로 신입을 지원해서 입사하시는 분들이 많습니다. Production 서비스를 운영해 봤으면서 사용자가 많으면 많을수록 좋다고 생각하죠. (그런데 이런 신입이 과연 존재할까요...?)
- 백엔드는 "어느정도 큰 트래픽을 받아봤고 그 트래픽을 견딜 수 있도록 만들어 보았는가" 가 중요하기 때문입니다.
- 회사에 입사하지 않고는 이런 경험을 하기는 어렵지만, 비슷한 상황을 성능 테스트로 충분히 만들어 낼 수는 있습니다. JMeter 등등...
- 냉정하게 토이 프로젝트 경험 vs Production 서비스 경험 을 따져보면 당연히 후자를 선호하는 건 맞지만, 그것만 본다면 신입 채용이 아니죠 ㅎㅎ.
- 토이 프로젝트도 그 나름대로 회사 프로젝트보다 더 큰 경쟁력을 가질 수도 있습니다.
- 프로젝트 관련된 내용을 얼마나 고민해보았는지 많이 보는 것 같습니다. ex) 토이 프로젝트를 진행했으면 어떤 부분을 고민했고 어찌/얼만큼 개선했는지 그런 이야기들은 토이프로젝트에서도 충분히 풀어낼 수 있습니다.
- 마지막으로 백엔드 중 API 서버 개발을 한다면 Spring 개발 경험이 중요하지만 직무는 생각보다 다양합니다. 본인이 가고자 하는 커리어에 따라서 어떤 기술을 학습할 지 결정해 보는게 어떨까요?
4. 이번 프로젝트는 프론트엔드(Reactjs)와 백엔드(Nodejs) 협업을 진행하게 되었습니다. 그리고 REST API를 이용해서 하게 됩니다. 로컬환경에서의 서버 연결 관계는 이해됩니다. 그러나 배포 환경일 시, 프론트서버와 백 서버, REST API 서버 등 서버 연결 관계가 영 감이 잡히지 않습니다 (NGINX 포함 등..?). 배포 시, 서버 연결에 대해 이해하고 싶습니다!
- 대략 큰 구조는 DNS, CDN, Web Server(nginx, apache), API(Flask, Django, Rails, Spring, Express), Cache(Redis, Memcache), RDB(MySQL, Oracle) or NoSQL(MongoDB) 요런 애들이 많이 사용되지 않나 싶네요.
- 로컬과 프로덕션 환경의 차이는 아무래도 장애에 견디기 위하여 이중화, 클러스터링 요런 부분, 엔드포인트(도메인), 환경(Development Environment)에서 차이가 있지 않나 싶습니다. "3tier web application" 키워드로 찾아보시면 어떨까요?
- "Github Student"에 가입하시면 Educative 서비스가 6개월동안 무료로 제공되는데 아래 강의를 들어보는 것도 추천드립니다.
- https://www.educative.io/courses/web-application-software-architecture-101
5. 오픈소스를 활용한 api 경험 개발이 있으신지 궁금합니다.
- 회사에서 여러가지 오픈소스를 사용합니다. 백엔드 프레임워크인 Django, Spring, Rails 모두 각자의 언어 진영에서 유명한 오픈소스죠. 실무에서도 많이 쓰기도 하고, 저도 많이 쓰고 있습니다. 특히 Spring, Django!
- 이번 회사에서는 백엔드/프론트엔드를 통합하려고 Nest.js를 새 프로젝트에 도입해서 사용하려고 합니다. (백오피스 용도)
- 회사에서는 상당히 많은 오픈소스를 사용하기도 하고, Fork떠서 필요한 부분을 수정하여 사용하기도 합니다.
6. 백엔드 파트에서 TDD를 적용해보기 위해 가장 쉽게 시작해볼 만한 것이 있을까요?
-
제가 TDD에 깊은 조예가 없어, 답변드리기는 어렵지만 우선 시작은 UNIT Test부터 잘 짜는 연습을 하는게 중요한 것 같습니다. 또한 테스트는 왜 해야하고, 어떤 기법들이 있는지 알아간 후에 만들고자 하는 프로젝트에서 TDD가 적합한지? 생각해보는게 좋을 것 같습니다.
-
CleanCode (저자: 로버트 C. 마틴)의 UNIT Test 파트가 있는데 한 번 읽어보시면 좋을 것 같습니다. 그런데 이 책은 원론적인 이야기를 많이 다루어서 실제 프로젝트에 적용하기는 어려운데요, 실전에 도입은 사용하시는 언어에 맞는 강의나 책을 하나 보시기를 추천드립니다. Java는 Real World Software Development(저자: 리처드 워버턴)책, Javascript는 후기가 좋은 강의를 하나 들어보심이 어떨까요?
7. 캐시 서버, 메시징 서버, 비동기 서버를 경험해보고 싶은데, 어떤 것부터 시작해보면 좋을까요?
- 캐시 서버 (Redis, Memcached), 메시징 서버 (kafka, rabbitmq), 비동기 서버(netty, node.js)
- 다양한 선택지와 오픈소스가 있는데요, 그냥 써보고 싶다면 2가지 선택지가 있습니다.
- 서버에 직접 올려서 소스 빌드/컴파일 or 바이너리 다운받아 실행 후 단일 노드나 클러스터 구축
- Managed Service (AWS ElasticCache, GCP Memorystore)
- 실무에서는 많은 경우 2를 사용하지만, 공부할때에는 1을 해보는 것도 좋다고 생각합니다. 어떤 방법이던 프로젝트의 어떤 부분에 끼워 넣을 것인지 왜 그 오픈소스를 선택했는지, 각각의 서버를 나누는 것이 왜 필요한지 고민해보고 도입하면 더 좋을 것 같습니다.