목록2025/06 (11)
개발지식 먹는 하마 님의 블로그

내일 배움 캠프에서 2차 모의 면접을 진행하였다.나는 업무를 하다가 1차 신청을 놓쳤기 때문에 2차 모의 면접을 입문 단계로 신청했다.주어진 사전 질문은 4개이다.1. 객체지향 프로그래밍의 4가지 특징을 설명해 주세요.캡슐화는 객체의 속성을 보호하기 위해 다른 객체와 소통할 때 필요한 정보만을 추상적으로 노출시킵니다. 추상화는 다른 객체와의 상호작용에 꼭 필요한 핵심 기능이나 공통된 기능들을 모아 상위 타입으로 만듭니다. 상속은 이러한 추상화된 상위 타입을 기반으로, 기능을 추가하거나 재정의하여 새로운 클래스를 정의합니다. 마지막으로 다형성은 공통된 인터페이스를 상속받은 객체의 기능이 여러 타입으로 표현될 수 있는 성질을 말합니다. 1-1) 4가지 원칙을 준수해서 프로젝트에 적용하거나 리팩터링 한 경험이..
AWS SES도입메일 발송 방식으로 AWS SES를 도입하기로 하였다.AWS SES는 아마존에서 제공하는 메일 발송 서비스이다. 도입 이유이전 테스트에서도 확인한 단점이지만 Gmail-SMTP는 연결을 재사용하지 않기 때문에 성능이 좋은 편은 아니기 때문이다.메일 발송 개수가 100만 개까지 크게 증가한다면 결국 비동기를 도입했다 하더라도 여전히 발송에 오래 걸리기 때문이다. SES는 연결을 재사용하기 때문에 대용량 메일 발송에 적합하다!+ SendGrid 같은 다른 서비스들과 비교를 해보았을 때비용이 그나마 가성비 있었다. (자동차 보험 중 캐럿 같은 느낌 - 쓴 만큼만 낸다!) ✅ 구현 및 테스트 SDK V1은 지원이 종료된다고 하기에 SDK V2 기반으로 구현하였다.private final Spr..
메일 발송 개선이 어느 정도 완료된 후, 그동안 QA를 거치면서 발견된 또 다른 문제점들을 기반으로2차 리팩토링에 들어갔다.1) 모놀리식에서 멀티모듈💸변경 이유서버 유지 비용 때문이다.AWS 프리티어를 이용 중이고 실제 유저에게 배포 중인 상황이 아님에도요금이 꽤나 부과될 정도로 인스턴스가 사용되고 있었다.그 중 주요 원인이 바로 무거운 프로젝트 무게 때문이었다.우리는 내부 논의 끝에 CS 문제를 메일로 보내는 Batch 부분을 별도의 모듈로 분리하기로 하였다.문제 발송은 하루에 1번만 하면 됨메일 발송에 쓰이는 배치 모듈을 필요할 때 잠깐만 켜고 나머지 시간에는 꺼놓자! ✅ 변경 결과그 결과 아래의 이미지와 같이 바뀌었다.Batch와 백엔드 부분이 분리되며 프로그램이 조금 가벼워졌다.공통적으로 사용되..

트러블 슈팅 - 일부 메일 발송 실패100개의 메일 발송에 대해 비동기로 테스트 했을 때,100개 중 일부인 5개의 메일에 대해서 발송이 실패하는 현상이 발생하였다.(이럴 때 쓰라고 있는게 메일 로그지!)실패 원인을 파악하기 위해 저장된 메일 로그를 확인하였다. 아니 AccessKey랑 SecretKey도 잘 입력되어있고, 그래서 다른 95개의 메일은 잘 발송되었는데어째서 저 5개만 Authentication failed라는 예외가 발생한단 말인가?!Authentication failed 예외 발생 원인원인은 사용 중인 외부 메일 서버의 스로틀(Throttle) 정책에 의해 발생한 것이었다.💡 Throttle이란?이벤트 핸들러가 너무 자주 실행되지 않도록 조절하는 기법이다.서버에 과도한 요청이 몰리는 ..

MVP 개발로 인해 구조 개선이 필요했던 부분에 대한 리팩토링을 마쳤으니이제 이전에 측정했던 성능 테스트 결과를 기반으로 개선을 해야 했다.이전 테스트에서 이메일 발송 요청에서 병목 현상이 발생하였다.https://devhippo.tistory.com/126 [내일배움캠프 76일차] 문제 풀이 링크 발송 테스트MVP 방식 기반 1차 개발 완료MVP 기반으로 진행되는 프로젝트 개발 일정에 따라,이메일 발송 기능에 대한 초기 구현을 마쳤다.이제는 여러 부분을 테스트해 본 후, 성능 개선을 목적으로 2차 개발devhippo.tistory.com 따라서, 이메일 발송 처리에 단계에서 비동기를 적용하는 작업이 필요하였다.💡비동기 처리 도입ThreadPoolExecutor 설정 및 적용ThreadPoolExecu..

프로젝트 중 맡은 부분을 비롯해서 연관된 흐름을 한 번 점검하면서개선이 필요한 점을 찾아 리팩토링 하였다. 1. JOB 분리하기역할 분리추후 확장성배포 시, 유연한 실행기존에는 1개의 Job에서 producer, consumer를 모두 수행하고 있었다.위와 같은 부분을 고려하여 mailProducerJob, mailConsumerJob, mailRetryJob 이렇게 3개의 Job으로 분리하였다. 2. 데이터 정합성 보장큐에 들어간 데이터에 대해서, 큐에서 빼서 쓸 때 해당 발송이 여전히 유효한지에 대한데이터 정합성을 보장하기 위한 로직을 추가해주어야 했다.발송이 유효하지 않게 되는 상황큐에 들어간 데이터가 꺼내져서 실제 발송되기 전에유저가 받고 싶은 문제의 카테고리가 변경되는 경우메일 발송 요일이 변경..

MVP 방식 기반 1차 개발 완료MVP 기반으로 진행되는 프로젝트 개발 일정에 따라,이메일 발송 기능에 대한 초기 구현을 마쳤다.이제는 여러 부분을 테스트해 본 후, 성능 개선을 목적으로 2차 개발을 진행해야 하였다.실제 개선에 앞서 현재 어디서 병목 현상이 발생하고, 원인은 무엇이며 어떻게 개선하면 좋을지 확인하기 위해 테스트를 진행하였다. 💡 잘 동작하는가? 문제 출제부터 이메일 발송까지 프로젝트의 일부 흐름을 테스트하기 위해부분 통합 테스트로 테스트 코드를 작성하였다.@TestConfigurationpublic class TestMailConfig { @Bean public JavaMailSender mailSender() { JavaMailSender mockSender..

MessageQueue란?메시지 지향 미들웨어로 임시로 데이터를 저장하는 큐 형태의 버퍼 역할을 한다.프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법이다.Queue에 데이터를 입력하는 주체를 Producer, 소비하는 주체를 Consumer라고 한다. 메일 발송에 MessageQueue를 도입해야 하는 이유지난 글에서 잠시 언급했던 것에 이어서 좀 더 설명을 보충하고자 한다.💡프로젝트에 적합하다.Message Queue는 바로 처리되지 않더라도 언젠가 처리되어야 할 작업들에 적용할 수 있다.문제풀이 링크 메일 발송은 정해진 시간에 딱 맞춰 빠르게 보내지는 것보다는 몇 분 늦더라도 정확하게 도착하는 것이 중요하기 때문에 적합하다고 판단하였다. 💡신뢰도 보완현재까지 구현된 알고리즘은 ..

인증코드 발송 구현을 마쳤으니 이제 프로젝트 구독자에게 발송할 문제풀이 링크를 구현해야 했다.프로젝트 기획 기반 문제풀이 링크 설정CS25 프로젝트와 다른 프로젝트의 차별점은 회원가입을 좋아하지 않는 유저들의 접근성을 위해로그인을 하지 않아도 문제를 풀 수 있도록 했다는 것이다.대신 로그인한 유저에게는 마이페이지 기반 취약점 분석 등의 부가 기능을 제공한다.따라서, 사용자 정보는 비로그인 유저와 로그인 유저 모두를 관리하는 Subscription과로그인 유저를 관리하는 User 두 개의 테이블로 관리한다.비로그인 유저 식별하기위와 같은 기획대로 로그인하지 않은 유저가 메일로 받은 문제풀이 링크를 통해문제풀이 페이지에 접근하여 문제를 푼 기록을 남길 때, 어떤 사람이 풀었는지를 어떻게 식별할 것인가?를 구..

Spring에서 이메일 발송하기이메일 발송을 구현하기에 앞서 관련된 원리를 먼저 알아보았다. 📨이메일 프로토콜 이메일과 관련된 프로토콜에는 3가지가 있다.그중 POP3와 IMAP 메일 수신용이고 SMTP는 발신용 프로토콜이다. ✅ SMTP 프로토콜 기반 메일 시스템Mail User Agent (MUA) : 이메일을 작성하거나 열람하는 클라이언트 Mail Transfer Agent (MTA) : MUA로부터 메일을 전달받아서 외부로 전달, 받은 메일을 MDA로 메일을 전달 Mail Delivery Agent (MDA) : 사용자의 메일함에 메일을 저장이메일이 발송되는 과정은 다음과 같다.MUA에서 메일을 작성하고 발송 요청을 보내면 이를 MTA가 실제로 발송한다.발송된 메일은 메일을 받는 사람이 사용하는..