개발지식 먹는 하마 님의 블로그
[내일배움캠프 80일차] 2차 리팩토링 - 멀티모듈, 쿼리 노출 보안 본문
메일 발송 개선이 어느 정도 완료된 후, 그동안 QA를 거치면서 발견된 또 다른 문제점들을 기반으로
2차 리팩토링에 들어갔다.
1) 모놀리식에서 멀티모듈
💸변경 이유
서버 유지 비용 때문이다.
AWS 프리티어를 이용 중이고 실제 유저에게 배포 중인 상황이 아님에도
요금이 꽤나 부과될 정도로 인스턴스가 사용되고 있었다.
그 중 주요 원인이 바로 무거운 프로젝트 무게 때문이었다.
우리는 내부 논의 끝에 CS 문제를 메일로 보내는 Batch 부분을 별도의 모듈로 분리하기로 하였다.
- 문제 발송은 하루에 1번만 하면 됨
- 메일 발송에 쓰이는 배치 모듈을 필요할 때 잠깐만 켜고 나머지 시간에는 꺼놓자!
✅ 변경 결과
그 결과 아래의 이미지와 같이 바뀌었다.
Batch와 백엔드 부분이 분리되며 프로그램이 조금 가벼워졌다.
공통적으로 사용되는 것은 Global로, 엔티티 관련된 요소는 Common로 분리하였다.
주요 비즈니스 로직은 Service와 문제 발송은 Batch로 분리되고
대신 공통적으로 사용되는 Global과 Common을 주입받도록 하였다.
아쉬운 점
메일 발송 기능이 인증 코드와 겹치면서 약간의 중복된 기능이 존재하는데 시간 관계상 이 부분을 분리하지 못한 것이 아쉬웠다.
이왕 바꾸는 거 MSA도 도전해보면 좋았겠지만 이 역시 남은 시간과 이미 개발이 완료된 부분의 구조를 바꾸는 것이 쉽지 않아
해보지 못한 것이 아쉬웠다.
저렇게 줄여도 사용 중인 다른 기능들로 인해 비용은 여전히 부담스럽게 나오긴 한다.
(그래도 저거라도 절약한게 어디인가 싶다 ㅠㅠ)
2) 쿼리 파라미터 노출
개발이 거의 완료되어가는 시점, 배포 직전 여러 사항을 점검하다가
쿼리 파라미터가 노출되는 부분을 확인할 수 있었다.
우리는 유저의 더욱 간편한 접근 및 사용성을 위해 회원가입을 하지 않아도 메일로 문제를 받아볼 수 있도록 하였다.
대신 누가 어떤 문제를 풀었는지 알아야 했기 때문에
우리는 메일에 첨부되는 링크에 구독자의 Id와 출제된 문제의 Id를 그대로 입력하였다.
https://cs25.co.kr/todayQuiz?subscriptionId=1&quizId=1
이런 식으로 말이다.
🔒변경 이유
- 유저가 자신의 ID가 뭔지 쉽게 파악이 가능하다.
(우리가 어떤 방식으로 ID를 생성하는지도 알기 쉽다.) - 보안 이슈! - 다른 사람 계정으로 문제를 풀거나 임의로 다른 문제를 풀고자 할 수 있다.
그래서 이 부분을 개선하고자 했다.
💡선정 방법
먼저 팀원끼리 해결 방법을 논의해보았다.
그 결과 2가지 방법이 건의되었다.
1. 암호화 복호화하기
2. UUID 쓰기
의견이 분분했는데 실무자 관점에서는 어떨 지 궁금해서 피드백을 받으러 다녀보았다.
그 결과, 암호화/복호화까지는 너무 복잡하게 간 것 같고 UUID만으로도 충분할 것 같다는 피드백을 받았다.
✅ 변경 결과
기존 Subscription과 quiz 엔티티에 UUID 컬럼을 추가했다.
그리고 외부에 값이 노출될 수 있는 부분을 전부 UUID를 사용하도록 변경하였다.
그 결과 현재 URL은 다음과 같다.
https://cs25.co.kr/todayQuiz?subscriptionId=a5318c72-017e...&quizId=3bb327c7-68e6...
'내일배움캠프 (CS25)' 카테고리의 다른 글
[내일배움캠프] 모의 면접 (입문) 복기 (0) | 2025.06.26 |
---|---|
[내일배움캠프 82일차] AWS SES 서버 기반 메일 발송 (0) | 2025.06.19 |
[내일배움캠프 79일차] 트러블 슈팅 Throttle 예외 - RateLimiter 적용 (0) | 2025.06.16 |
[내일배움캠프 78일차] 이메일 발송 흐름 성능 개선(비동기) (0) | 2025.06.13 |
[내일배움캠프 77일차] 이메일 발송 흐름 리팩토링 (0) | 2025.06.13 |