이 블로그 카테고리에서는 개인 프로젝트에 대한 글을 남길 것이고 그전에 진행한 이유와 과정들을 우선 서술해보려 합니다.
저와 비슷한 상황의 대학생, 주니어, 신입, 취준생 백엔드 개발자분들에게 조금의 도움이라도 될까 싶어 적는 개인적/주관적인 생각이 많이 담긴 글입니다.
우선 이 해결 방법으로 취업에 성공한 것은 아니고 반영하여 얼마 전에 이력서, 포폴을 마무리하여 지원을 하고 있는 중이지만
프로젝트 진행 전, 중, 후 계속하여 나름 이름 있는 회사의 개발자분들께 직접 커피챗을 요청해 피드백을 받으며 진행하였기 때문에 조금은 도움 되는 부분이 있을 것이라 생각합니다! :]
지금까지 프로젝트를 진행하면서 문제를 찾아 해결하고 왜? 문제가 발생했고, 왜? 이 방법으로 해결했는지를 기록하며 취업을 준비했다. 하지만 요즘 신입 백엔드 개발자 채용 공고를 보면 대규모 트래픽, 대용량 데이터에 대한 경험을 묻는 것을 알 수 있고 나 또한 면접에서 관련 질문을 받은 경험이 있다. 하지만 나 같은 대학생이 진행하는 프로젝트에서 경험하기는 사실상 쉽지 않았고, 고민을 하던 중 나름의 해결 방법을 찾아 개인 프로젝트를 진행하였다.
의욕만 앞섰던 초반
면접에서 대규모 트래픽 처리에 대한 방법을 물어봤을 때 시원하게 대답하지 못했다고 생각해서 경험을 해봐야겠다고 결심했다. 하지만 현재 진행하고 있는 프로젝트에서 많은 트래픽을 받는 경험을 당장 할 수 없다고 판단하였고 대규모 트래픽이 발생했다는 상황을 가정해서 해결하는 개인 프로젝트를 진행하기로 했다.
무작정 프로젝트를 시작하려다 보니 막막한 것이 너무 많았다. "어떤 기술을 사용해야 하지?", "몇 개의 데이터를 갖고 해야 대용량이지?"를 고민하다가 일단 우당탕탕 시작을 하였고, Nosql과 RDBMS 역정규화의 방법을 고민하다 즐겨 사용하는 오픈 채팅방에 질문을 우당탕탕 해보았다. 그 결과 현직자분들의 날카로운 피드백을 받을 수 있었고 간단하게 정리해 보자면 아래와 같았다.
- Nosql과 RDBMS 역정규화를 해야 하는 문제 상황이 왜 생겼는지?
- DB 아키텍처에서 문제를 해결하기 전에 cache, redis, index등과 같은 방법은 적용해보았는지?
- 면접에서 "Nosql을 사용해 본적이 있다." 같이 기술을 그저 사용해본 경험만으로는 매력적이지 않다.
- 추가로 기술을 도입하는 것은 비용과 직접적인 연결이 있기 때문에 여러 방법들을 생각해봐야 한다. (2번 피드백과 연관)
실제로는 더 많은 피드백을 많은 분들이 감사하게 열정적으로 해주셨다. 이 당시에는 사실 "깨갱... 다 맞는 말인데 접어야 하나.."라고 생각하며 고민을 했지만 하루 쉬고 다음 날 생각 정리를 하고 따로 현직자분께 커피챗을 요청해 추가적인 피드백을 받고 나서 결론을 낼 수 있었다.
현재 상황의 문제점 & 개선한 결과
내가 블로그를 운영하던 이유, 이력서를 쓸 때 중점적으로 어필하고 싶었던 부분은 아래와 같았다.
- 문제가 발생한 것을 인지해서 원인을 찾는다.
- 현재 상황에서 해결할 수 있는 방안을 찾는다.
- 유의미한 결과를 만든다. (속도 개선, 복잡도 개선 등등~)
이 부분과 피드백을 종합해서 나만의 결론을 도출해 냈다.
"대규모 트래픽 상황을 꾸며내야 한다." + "문제 상황이 명확해야 한다." + "기술을 선택한 이유가 있어야 한다."
=> "상황을 가정할 때 구체적인 상황과 현재 조건을 설정한다." + "적용한 기술의 이점, 추후 문제가 될 수 있는 부분을 생각한다."
피드백을 받고 이 생각을 하기 전까지는 스스로 되돌아봐도 "그냥 유행하는 기술 사용해 보기! 멋있는 기술 사용해 보기!" 였다고 생각한다. 하지만 생각을 정리한 후에 다시 공부를 하다 보니 자연스레 더 깊게 공부하게 되었고, 이후에 발생할 수 있는 문제와 현재 방법의 단점까지 깊게 생각하게 되었다.
기존의 문제점을 해결하는 과정에서 커피챗을 진행했던 개발자분께서 추천해 주신 AS-IS / TO-BE 형태를 생각하니 프로젝트를 진행하기 한결 수월했다! 또한 다른 개발자분께 이러한 방식에 대해 의견을 물었을 때도 "이전에 왜? 문제가 발생했고 어떻게 해결했는지를 기록했던 것처럼 같은 방식으로 이 프로젝트도 진행하면 좋을 것 같다"라는 의견을 주셨고 시간을 갖고 천천히 정리해 나갔다. 결과적으로 진행했던 프로젝트의 예시를 간단하게 확인해 보면 조금 더 이해하기 쉬울 것이다.
기존 문제 상황
1. 주문 도메인 서비스에서 주문 발행, 주문 내역 조회의 행동이 일어난다.
2. 주문 내역 조회 시 많은 테이블로 인한 JOIN 연산으로 조회 성능이 저하된다.
3. 약 3000만 건의 데이터를 갖고 있고 추가적인 주문 발행으로 늘어날 가능성이 높다.
해결 방법
1. INDEX 처리를 통한 조회 성능 ??% 개선 -> 별도의 인프라를 추가적으로 구축하지 않아도 된다(장점), 주문 발행이 폭발적으로 일어나면 인덱스에 의한 쓰기 성능 저하가 발생 가능하다(단점), 모놀로식 구조로 단일 장애 발생 지점이 존재한다. (단점)
2. (1에서 나온 단점 해결 방안...) -> 이에 대한 성과, 장점/단점 분석
구체적인 상황을 구체적으로 가정하고 -> 당장의 조건에서 해결 가능한 솔루션을 적용하고 -> 해당 솔루션의 성과와 장점, 한계를 생각해보고 -> 다음 솔루션 적용 -> ,,,,,,, 이 절차를 적용하다 보니 더 깊게 생각을 할 수 있었고 더 많은 상황에 마주할 수 있었다!
(기존 문제 상황에서 xxxxTPS가 발생하자 에러가 생겼다. 와 같이 조금 더 구체적인 상황을 가정하면 좋을 것 같다.)
추가 꿀팁
여기까지만 봤을 때도 막막할 수 있을 것 같다. 그래서 내가 정말 유용하게 사용했던 방법을 추가로 소개하자면 "빅테크 기업의 개발 세미나"를 많이 보는 것이다. 네카라쿠배와 같은 회사의 컨퍼런스? 세미나?의 세션 발표 영상을 요즘은 유튜브로 쉽게 볼 수 있다. 여기서는 현직 개발자분들이 직면했던 문제, 해결과정을 친절하게 설명해 주신다.(직접 가서 듣고 싶은데 항상 다 떨어진다)
물론 처음 보면 전체의 30% 정도 겨우 이해하게 된다. 70%로는 따로 찾아보고 영상을 다시 보고 반복해야 한다. 하지만 벌써 이 과정에서 현업에서 생길 수 있는 문제를 해결할 솔루션들을 스스로 공부하게 된다. 또한 해당 내용들을 참고해서 구현을 해보려 하면 풀리지 않은 궁금증이 234353개여서 다시 자연스럽게 공부하게 된다.. 그래도 몇 번 반복한 후에는 다른 영상들도 점점 수월하게 들을 수 있게 된다!
하나 더 추가해 보자면 아래의 책을 읽어 보는 것을 추천한다.
https://www.yes24.com/product/goods/102819435
물론 나도 아직 반 정도밖에 읽지 못했고 이것 역시 내용을 한 번에 100% 이해할 수 없다. 하지만 전체적인 흐름을 읽기 정말 좋고 나름 면접 꿀팁도 사이사이 껴있기 때문에 시간이 있다면 매우 추천한다.
내가 이 책을 면접 전에 천천히 읽어 봤다면 실제 있었던 아래의 상황에서 다음과 같이 답변을 시작했을 것 같다.
- 면접관님 : ~~~ 상황에서 대규모 트래픽이 발생하고 갖고 있는 데이터도 1억 개가 넘어간다면 지금과 무엇이 바뀌어야 할까요??
- 나 : 해결해야 하는 상황이 임계 TPS를 초과해서 WAS에서 문제가 일어난 것일까요, DB 쪽에서 Time Out, DeadLock, Connection Pool과 같은 문제가 생긴 것일까요? ->라고 우선 대답하고 추가적으로 질문을 했다면 대답을 조금 더 잘했을 수도..
마무리
프로젝트 진행도 새로운 기술들을 사용하느라 오래 걸렸지만 위와 같은 사전 준비 과정도 생각보다 오래 걸렸다. 하지만 많은 피드백을 받고 , 생각을 하며 진행하였더니 나름 결과물은 만족스러웠다. 앞으로의 글은 내가 가정했던 상황과 해결 방법을 소개하는 글을 작성할 예정이다.
이 글을 빌어 아낌없이 피드백해주신 모든 분들께 진심으로 감사드립니다 🙏🙏
https://github.com/Te-H0/high_traffic_lab