전체 글

이 글은 디스코드 블로그의 'How Discord Scaled Elixir to 5,000,000 Concurrent Users?'를 읽고 정리한 글입니다. 저의 이해를 위해 원문에는 없는 추가적인 내용이 포함되어 있으며, 잘못 해석한 부분이 있을 수 있습니다. 0. 들어가기에 앞서디스코드란?실시간 채팅 애플리케이션. 음성 채팅, 텍스트 채팅 등이 가능높은 동시성이 필요한 실시간 시스템 → Elixir와 Erlang VM을 선택Elixir와 Erlang VM이란?Elixir(엘릭서): 프로그래밍 언어의 일종으로, 대용량 분산 시스템을 만드는 데 적합하다.Elixir는 동시성을 지원하며, 오류가 발생해도 시스템이 멈추지 않고 동작한다.Java가 JVM 위에서 실행되는 것처럼, Elixir는 Erlang V..
1. 이전 설계컨트롤러에서 memberId를 받아와야 할 경우, 메서드 파라미터 앞에 @Auth 어노테이션 추가ArgumentResolver가 요청 헤더의 Authorization 값을 추출Authorization 헤더 값이 null인 경우@Auth(required=true)이면 예외 반환@Auth(required=false)이면 컨트롤러 파라미터에 null값을 넘겨줌ArgumentResolver가 헤더에 담긴 JWT를 검증하고, 유효하지 않으면 예외 반환 굳이 이렇게 설계한 건 우리 프로젝트에 회원 여부에 따라 다른 정보를 보여주는 공용 API가 있었기 때문이다. 일반적이지 않고 이해하기 어려운 설계라 1년동안 고치고 싶다고 생각했는데... 다행히도 올해가 가기 전에 노트북 앞에 다시 앉았다👀 2. ..
쪼오끔 늦었지만... 어찌저찌 마무리하고 작성하는 3주차 후기4주차는 언제 쓰지😂 1. 당첨 통계를 어떻게 관리해야 할까?원래는 당첨 통계를 List로 관리할 생각이었다. 그러니까 1등 1개, 2등 3개가 당첨되었다면 List에 원소가 4개 추가되는 식이었다.하지만 이런 방식은 각 등수별 개수를 세기 위해 매번 루프를 돌아야 한다는 문제가 있었다🥲 그래서 조금 더 빠르게 접근할 수 있는 방법이 없을까 고민하던 중, EnumMap이 있다는 걸 알게되었다. EnumMap은 Enum을 key로 갖기 때문에 O(1)만에 해당 등수에 몇번 당첨되었는지 알 수 있다는 사실..! 😲💡 지난주에 배운 일급 컬렉션 개념을 이용하기도 했다. 당첨 통계를 바탕으로 총 당첨금을 계산하기 등 당첨 통계를 이용한 행동이 ..
프리코스 2주차가 지나갔다. 이번 주차에는 테스트 코드까지 작성해야 해서 조금 힘들었지만 그만큼 좋은 경험이었다. 리팩토링까지 끝마친 결과는 아래와 같다. 지난 주차에 비해 클래스의 수가 많아진게 눈에 띈다😂 그럼 이번 주차 회고도 시작~! ᕕ( ᐛ )ᕗ  1. 랜덤값 테스트는 어떻게 해야할까?2주차 미션에서 가장 어려웠던 점이었다. 0~9 사이의 수를 무작위로 뽑아 4 이상이면 차가 전진하는 방식이었는데, 요구사항에 테스트 코드 구현까지 있었다🥹 랜덤값은 컨트롤할 수 없는 부분이라 테스트를 어떻게 구현해야 하나 고민했는데, 결국 Car.move() 메서드에서 랜덤 함수를 직접 호출하지 않고 파라미터로 값을 전달받는 형식으로 단위 테스트를 진행했다.public Car { public void m..
우테코 프리코스 2주차 미션의 학습 목표는 테스트 코드 작성이었다. 학습 자료로 Junit 5와 AssertJ 관련 문서가 주어졌는데, 테스트 코드를 작성하기 전에 필수로 알아야 할 부분이기에 문서를 읽고 내용을 간략하게 정리해보았다. 1. Junit 5와 AsserJ란?Junit 5는 자바에서 테스트의 구조를 제공하고 실행을 지원한다. 테스트는 기본적으로 given(준비) - when(실행) - then(검증)의 세 단계로 구성되는데, AssertJ는 다양하고 가독성이 높은 검증 기능을 제공한다. 그러니까 전체적인 구조는 Junit이, 검증 파트는 AssertJ가 지원한다는 것이다. 두 라이브러리를 함께 쓰는 경우가 많지만 Junit만 사용해도 된다는 점! Junit 5는 이전 버전과 달리 세 개의 하..
우테코 프리코스 1주차 미션이 종료되었다. 1주차는 너무 바빠서 코드 개선에 많은 신경을 쓰지 못했는데, 다른 분들의 제출물을 보니 초라해지는 내 과제...🥹 1주차에 가장 인상깊었던 부분을 잊어버리기 전에 빠르게 정리해봤다. 1. 첫 번째 설계 - 책에서 하란 대로 했는데🥹 이런 과제를 받아보는게 너무 오랜만이라 설레는 마음에 그만... 요구사항을 후다닥 정리하고 구현에 들어갔다. 객체지향의 사실과 오해에서 배운 방법을 적용해볼 날만 기다려왔던지라 마음만 앞서서 빠르게 설계를 시작했다.프롬프트: 사용자와의 상호작용을 담당한다.계산기: 계산을 담당한다.문자열 파싱기: 문자열을 파싱한다. 👇그리고 이 내용을 코드로 구현한 결과 분명 책에서 하란대로 했는데 저자님꺼는 작고 소중한 클래스고 내꺼는 책임을 먹고..
gorapaduckoo
진화의 돌