2월의 시작과 함께 스파르타코딩클럽에서 15주 동안의 시간은 정말 금방 지나갔다. Spring Data JPA, QueryDSL, Postgres, JWT 등 한 떄 열심히 공부한 내용들을 다시 복습하는 시간과 함께 Eureka Server Clinet, Redisson, Kafka, Grafana, Prometheus, k6, DDD, Code Review 등 수많은 새로운 내용을 짧게나마 학습하면서 전체 기간의 절반 이상인 9~10주 동안은 교육 과정에 참여한 160여명이 되는 인원들 사이에서 4~5명으로 팀을 이루어 3개의 프로젝트에 참여하였고 모두 성공적으로 구현 및 고도화를 마치면서 수료하였다.
다시 돌이켜서 생각해보면 정말 많은 것들을 깨닫고 배울 수 있는 시간이여서 참여하기를 잘했다고 생각이 든다. 사실, 첫 시작부터 나는 온라인 교육 과정이기 때문에 강의만 틀어두고 내가 계획해둔 학업 방향대로 공부하는 것을 생각했지만, 교육 참가자들과 끊임없는 프로젝트 진행과 기술적인 대화로 인해서 15주 동안 온전히 교육 과정에 집중할 수 밖에 없었다. 의도와 다르게 아침부터 새벽까지 열심히 참여하면서 기대한 것과 다르게 크게 성장할 수 있는 시간을 보내게 되어 기쁘다 :)
지난 몇 년 전부터 MSA는 IT 분야에서 크게 주목 받는 여러 독립적인 서비스로 구성된 분산 시스템 구조로, 여러 기업에서 MSA로의 전환은 금방 찾아볼 수 있을만큼 반드시 공부해야 할 영역으로 생각만을 갖고 공부는 뒤로 미루고 있었다. 하지만 이번 교육 과정을 통해서 몇 년 동안 미루었던 MSA 공부를 반강제로..!? 하게 되었고, 두 개의 MSA 구조의 프로젝트를 여러 참가자들과 함께 진행하면서 많은 생각을 함께 나누고 고민하면서 기술적인 성장 뿐만 아니라 실무적인 관점에서 고려해야 할 시야가 넓어지게 되었다. 지금까지 모놀리식으로만 개발을 하면서 전혀 생각하지도 못할 것들을 말이다.
장애 전파, 게이트웨이, 다양한 시스템 아키텍처, 멀티 모듈, 병목 현상 등은 모놀리식에서는 경험하기 어려운 내용이다. 예를 들어 한 개의 서버를 모놀리식으로 운용하다고 가정해보자. 수많은 사용자가 오늘의 쿠폰을 발급 받기 위해 쿠폰 서비스에 수많은 트래픽이 몰리면서 서버에 장애가 발생하게 된다면, 쿠폰 서비스만 죽는 것이 아니라 모놀리식 특성에 의해 전체 서버가 죽어버리는 최악의 상황에 직면하게 된다. 네카라쿠배 급의 배달의 민족의 경우도 초창기에는 모놀리식 구조로 구성되어 있었다. 그러나 유명한 치킨 디도스 사건으로 인해 치킨 쿠폰을 발급 받으려는 수많은 사용자들로 인해 이벤트 시작과 함께 서버가 죽어버린 일화가 있다. 그래서 MSA는 단순히 기술 공부를 넘어서 생존의 문제 해결을 위한 수단으로 생각하면서 공부를 했던 기억이 떠오른다 .
교육 과정 안에서 Eureka Server Client, Redis, Kafka를 배우고 프로젝트에서 사용했지만, 아직은 완벽하게 학습된 것은 절대로 아니다. 어쩌면 당연한 것일지도 모른다. 구글에 당장 MSA 도입 실패 사례를 검색만 하더라도 금방 찾아볼 수 있듯이 MSA 도입은 기술적으로 상당히 복잡하고 많은 시간과 노력을 들여야 하는 과정이 필수적이며 아무리 뛰어난 개발 실력을 갖고 있다고 하더라도 개인 혼자서 감당할 수 있는 영역도 아니다. 넷플릭스 또한 7년의 시간을 거치고 비로소 완전한 MAS 구조의 탈바꿈을 했었다. 이렇게 어렵고 복잡한 MSA 환경에서 어떻게 해야 개발을 잘 할 수 있을까를 많이 고민하게 되었다.
고민의 끝은 기본기였다. RabbitMQ와 kafka 그리고 Reddison 혹은 Lua Script를 활용하여 대용량 트래픽 처리를 수행하는 것을 완벽하게 이해하기 위해서는 반드시 자바 스레드부터 이해를 해야 한다고 생각이 들었다. 흔히 동시성 문제로 인해 정합성을 보장하지 못하기 때문에 위에 언급한 기술들을 채택하게 되는데, 자바는 1.0부터 동시성을 고려해서 등장한 언어이다. Thread, Runnable와 같은 객체를 통해 스레드의 생명 주기를 쉽게 관리할 수 있고, volatile, synchronized, Lock, ReentrantLock, Condition, CAS, AtomicXXX, ExcutorService 등 다양한 동시성 문제를 해결할 수 있는 대안을 제시하고 있다. 최신 기술들이 오늘날 자바에서 내부적으로 언급된 키워드를 통해 구현되어 있기 때문에, 어떻게 동작하는지를 이해하기 위해서는 필수적으로 기본기를 공부해야만 알 수 있다. 그래서 추가적으로 컴퓨터 구조와 운영체제를 책으로 공부하면서 지난 프로젝트에서 겪은 캐시 메모리에 대한 고민과 스레드에 대해 더 깊이 있는 공부를 하고 있는 중이다.
개인 프로젝트도 반드시해야만 한다. 지금까지 3개의 프로젝트를 진행하면서 혼자 스스로 처음부터 끝까지 모든 전 과정을 개발하면서 회고하는 시간을 개인 프로젝트로 녹여내는 방향이 공부에도 큰 도움이 되고 부족한 부분을 다시 잘 채웠는지 확인할 수 있는 시간이라고 생각했다. 그러나 당장은 진행하지 않고, 5월 중순부터 시작할 예정이다. 지금은 자바 스레드, 리플렉션, 애너테이션, 컬렉션 프레임워크와 운영체제와 컴퓨터 구조 그리고 네트워크 이론을 책으로 5월 중순까지 공부 및 정리할 생각이다.
어쩌면 예정보다 더 스프링 부트 공부가 늦어지면서 불안한 마음도 크지만 기본만큼은 계속 미루면 마치 MSA 실패 사례와 같이 큰 실수를 하게 될 것 같다. 사람마다 모두 앞으로 나아가는 속도가 다르기 때문에 너무 크게 연연하지 말고 묵묵히 오늘도 열심히 공부하자. 속도는 안날지언정 누가 봐도 열심히 공부한다고 느껴질 정도로 고민하고, 해결하고, 복습을 열심히 말이다! 간략하게 정리하자면 5월 이후의 당장의 목표는 다음과 같다.
자바
- 람다
- 함수형 인터페이스
- 스트림 API
- Optional
- 함수형 프로그래밍
- I/O
- 네트워크
- 리플렉션
- 애노테이션
- 채팅 프로그램
- 웹 애플리케이션 서버
- 멀티스레드
- 동시성
- 스레드 풀과 Executor 프레임워크
- 프로세스와 스레드, 스케줄링, 컨텍스트 스위칭
프로젝트에서 부딪힌 고민 해결을 위한 CS 공부(단순 암기 이론 CS 공부 방식 X)
- 혼자 공부하는 컴퓨터 구조와 운영체제 | 한빛미디어
- 혼자 공부하는 네트워크 | 한빛미디어
스프링, 스프링부트, JPA, QueryDSL, AWS, Postgres, MySQL, Redis, Docker, Github Action (CI/CD)
- 5월 말 혹은 6월 초 진행 예정
코딩테스트 대비
- 5월 11일 (일요일)부터 시작
'회고🐜' 카테고리의 다른 글
5월 계획표 (1) | 2025.05.09 |
---|---|
티스토리는 회고, 깃허브는 공부 정리 (0) | 2025.04.12 |
어느덧 벌써 3월 (3) | 2025.03.09 |
1차 팀 프로젝트 마지막 전 날 (0) | 2025.02.24 |
앞으로 매일마다 작성해야 되는 포스팅 (0) | 2025.02.19 |
댓글