-
[실시간 채팅 서비스#0] 타임라인개발 일지 2024. 9. 20. 15:01
이번엔 다소 느슨하게 프로젝트를 진행할 예정이었던지라 타임라인을 올릴 생각이 없었지만, 지난 1달간 생각 이상으로 꾸준히 진행한 것이 뿌듯하여 업로드를 한다.
1차적인 기능은 완성되었으나 API-Gateyway를 통한 인증/인가와 코드 리팩터링, 테스트 범위 확대 등 해야할 것들이 많이 남았다.
개인적으로 타임라인은 계속 갱신하겠지만, 이 글이 갱신될지는 앞으로의 내 부지런함에 달렸다...
08.19
- 주제 선정
- 프로젝트 초기 구상도
- 기능 목록 설계
- 기능 마인드맵
- ERD 설계
- 유저 플로우 차트 설계
08.20
- WebSocket, STOMP, Pub/Sub 기술 이해
- WebSocket 통신 구조 학습 및 설계
- 프로젝트 구조화
08.21
- API 다이어그램 설계(1/3)
- Member-Service 회원가입 API 구현
08.22
- API 다이어그램 설계(2/3)
- R2DBC 학습
08.23 - 코딩 테스트 준비
08.24 - 코딩 테스트 준비 및 응시
08.25 - 휴식08.26
- API 다이어그램 설계(3/3)
- Member-Service 회원가입 테스트 구현
- Lombok 고장 문제 해결
- Spring Initialize로 Lombok 의존성을 추가하면 Implement로 추가된다.
- 이 경우 Lombok 어노테이션들은 사용이 가능하지만, 실행시에 제대로 동작하지 않는다.
- annotationProcessor와 compileOnly로 Lombok을 추가하니 정상적으로 실행됐다.
08.27
- Member-ServiceRepository 테스트 구현
- R2DBC 에러 해결 + 추가 학습
- R2DBC는 TestContainer를 사용하기 위해서 추가적인 의존성이 필요했다.
- testImplementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.33'
- R2DBC는 JPA, MongoDB와 다르게 클래스를 읽어 자동으로 스키마를 생성하지 않는다.
- 때문에 직접 쿼리를 통해 테이블을 생성해야 한다.
- 위 조건 때문에 TestContainer를 사용하는데 제약이 생겼다.
- 해결 방법으로 Container 시작시에 DatabaseClient를 사용하여 생성 쿼리를 직접 보내는 것으로 해결했다.
- R2DBC는 TestContainer를 사용하기 위해서 추가적인 의존성이 필요했다.
- R2DBC 관련 ContextLoad 문제
- @DataR2dbcTest 어노테이션을 사용해도 repository 빈을 가져올 수 없었다.
- 해당 어노테이션은 내장 H2 DB를 사용해 테스트한다는 이야기가 있는데, 조사가 필요함.
- @Import로 추가해도 역시 설정 에러가 나왔다.
- @DataR2dbcTest를 제거하고 @SpringBootTest를 사용해도 repository 빈을 불러올 수 없었다.
- @SpringBootTest(classes = Application.class) 를 하고서야 repository 빈을 인식했다.
- 다른 DB에 비해 더욱 복잡해진 Cotainer 설정을 마치고 테스트에는 성공했으나, 테스트가 종료되지 않는 문제가 발생했다.
- 테스트가 Application.class를 실행시켰지만, 종료하지는 않는 문제라고 판단했다.
- Application을 종료하는 구문을 추가했으나, 해결하지 못했다.
- 결국 통합테스트 자체를 보류하는 방향을 선택했다.
- @DataR2dbcTest 어노테이션을 사용해도 repository 빈을 가져올 수 없었다.
08.28
- Reactive 프로그램의 Jwt 토큰 방식에 대한 학습과 적용
- 기존에 사용하던 Jwt 토큰 클래스를 Reactive 객체로 수정
08.29
- 회원가입, 로그인 API 구현 및 테스트 코드 작성
08.30
- Member Update, Delete API 구현 및 테스트 코드 작성
09.01
- 블로그 설계 파트 업로드
- Member 상세 조회 API 구현
- 친구 요청 API 구현
09.02
- 친구 요청 API 테스트
- 친구 목록 조회 API 및 테스트 구현
09.03
- 친구 요청 승인 API 및 테스트 구현
09.04
- ReactiveTransaction 고민과 적용
- ChatRoom-Service 구조화
- 채팅방 생성 API 구현
09.05
- 1:1 채팅방 생성 API 구현
- MSA에서의 인증/인가 고민
- 모든 마이크로서비스에서 구현하는 방법
- API-Gateway를 통해 인증/인가를 중앙집중형으로 관리하는 방법
- Member-Service에 의존하는 방법
- 3개의 선택지에서 API-Gateway를 사용하는 방법이 합리적이라고 판단했으며, 인증/인가 로직을 제외한 채로 1차 개발 완료 후, API-Gateway 적용 예정
09.06
- 그룹 채팅방, 1:1 채팅방 테스트 구현
- 채팅방 입장 API 구현
09.07
- 채팅방 입장 테스트 구현
- 채팅방 초대 API 및 테스트 구현
09.08
- 채팅방 초대 승인 API 및 테스트 구현
- 채팅방 초대 목록 조회 API 구현
- 채팅방 초대 승인/거절 API 구현
- 채팅방 초대 로직 수정과 에러 발견
09.09
- 채팅방 초대 에러 해결
- 비동기 체인 메서드에 대한 이해가 부족해 발생한 에러.
- 예로 들면 음식을 미리 만들어 놓고 손님(구독자)를 기다리는 형태로 실행 됨.
- 구독자의 결과가 Mono.empty()가 아니어도 swithIfEmtpy() 내부의 로직이 평가 되는 이유.
- Mono.defer() 를 사용해 내부 로직의 평가를 실제 사용 시점으로 지연하여 해결했음.
- 에러의 원인은 switchIfEmtpy 내부의 로직이 조기 평가 되면서 의도치 않게 chatRoom 객체를 반환해 버렸고, 이후에 .flatMap 이 실행 되면서 의도했던 participation이 아닌 chatRoom 객체를 사용하다 보니 NullPointException이 발생한 것.
- 일반적으로는 swithIfEmtpy 의 내부 로직은 에러를 발생시키지만, 해당 기능과 같이 에러가 아닌 정상 동작일 때는 주의해야 할 필요가 있을 듯.
- 채팅방 초대 로직 리팩터링
09.10
- 채팅방 정보 조회 API
- 채팅방 상세(채팅방 정보 + 참여자 ID 목록) 조회 API 및 테스트
- 채팅창 목록 조회 API
- Chat-Service 구조화
09.11
- RedisConfig, WebSocketConfig, StompHandler 구현
09.12
- SubScriber, Publisher 구현
09.13
- SubScriber, Publisher Test 구현
09.14
- 휴식
09.15
- Chat-Service Controller Test 구현
09.16
- Pub/Sub을 Reactive 방식으로 전환
- Topic과 Subscription 정보를 영속적으로 관리하는 방법 고민
- ReactiveRedis 관련 설정 충돌 에러 해결과 올바른 설정 법 학습
- ReactiveRedisTemplate만 사용한다면 다를것이 없었으나, ReactiveMessageListenerContainer와 메세지 처리 방식에서 차이가 있었다.
09.17
- WebSocketStompClient를 사용한 테스트에서 ExecutionException 발생.
- RabbitMQ를 사용해 ChatRoom 생성 시 Topic 생성 이벤트 처리
- TopicManager에서는 roomId의 토픽이 존재한다고 말하고 있으나, Publihser에서는 토픽이 null이라고 말하고 있음...
09.18 ~ 09.19
- WebSocket 통합 테스트를 통과하기 위한 수정 작업.
- WebSocketConfig의 registry 경로에 맞게 session 경로 수정
- WebSocket으로 전송된 메시지를 역직렬화 하기 위한 MappingJackson2MessageConverter 설정
- 비동기 처리로 인한 실행 순서 에러 방지를 위한 대기 시간 설정
- BlockingQueue를 사용해 subscribe에서 handleFrame 메서드 실행 시 메시지를 저장하고 이후 검증 단계에서 사용.
'개발 일지' 카테고리의 다른 글
[실시간 채팅 서비스#4] API-Gateway (0) 2024.10.17 [실시간 채팅 서비스#3] WebSocket + STOMP + Pub/Sub으로 실시간 채팅 구현 (0) 2024.10.07 [실시간 채팅 서비스#2] 설계 (1) 2024.09.01 [실시간 채팅 서비스#1] 개인 프로젝트 시작 (0) 2024.08.21 [배달 중계 서비스#6] Zipkin과 OpenTracing (0) 2024.07.20