전체 글(164)
-
NAT Gateway를 NAT Instance로 대체하자
출시를 목표로 프로젝트를 진행 중인 학생으로서, 그동안 대학 사업단의 지원을 받아 AWS 관련 비용을 충당해 왔습니다. 하지만 이제 팀원 대부분이 졸업을 앞두고 있어, AWS 비용이 큰 부담으로 다가오고 있습니다. 이에 따라 AWS 인프라를 재구성하기로 결정했으며, 목표는 비용을 최소화하는 것입니다. 이를 위해 첫 번째로 시도한 방법은 NAT Gateway를 NAT Instance로 대체하는 것이었습니다. NAT Gateway AWS에서는 Private Subent 내의 인스턴스가 VPC 외부의 서비스(인터넷)에 연결할 수 있도록 하게 해주는 NAT Gateway 서비스를 제공해주고 있습니다. https://aws.amazon.com/ko/vpc/pricing/ 논리적으로 격리된 가상 네트워크 - Am..
2024.11.25 -
왜 Private Subnet이 필요한가? (feat : 보안 그룹)
프로젝트를 진행하며 팀원들에게 이런 질문을 받은 적이 있습니다."Private Subnet을 사용하는 이유가 뭐야? 보안은 보안 그룹으로 설정하면 되지 않나?"이 질문에 명확히 답변하지 못했던 경험이 있어, 이번 기회에 Private Subnet과 보안 그룹의 차이와 필요성을 정리해보려 합니다.Private Subnet과 보안 그룹이란? Private Subnet은 인터넷 게이트웨이와 연결되지 않아 외부에서 접근이 불가능한 서브넷입니다. Private Subnet에 속한 리소스는 인터넷에 직접 노출되지 않고, 내부 네트워크에서만 접근 가능합니다. 반면, 보안 그룹은 AWS 리소스(예: EC2, RDS 등)의 인바운드와 아웃바운드 트래픽을 제어하는 가상 방화벽입니다. 특정 IP, 포트, 프로토콜 규칙을 기..
2024.11.18 -
Swagger 403 에러 해결
프로젝트를 진행 중에 Swagger API 에서 요청에 대한 응답으로 403 에러가 반환되고 있다는 것을 발견했습니다. 위 에러를 마주하였을 때 가장 먼저 의심한 것은 CORS 에러였습니다. 다만, 조금 더 고민해보니 앞뒤가 맞지 않는 추론이었습니다. 왜냐하면, Swagger의 Origin과 서버의 Origin은 동일한 Origin이기 때문입니다. Same Origin Policy 왜 동일한 Origin인데 CORS에러가 아니라고 생각했냐 라고 묻는다면 CORS 에러가 나온 이유를 생각해보면 당연합니다.웹 어플리케이션은 기본적으로 동일한 출처의 리소스만 공유할 수 있습니다.다만, 동일한 출처의 리소스만 공유할 수 있으면 웹 어플리케이션을 사용하는 데 너무 번거롭기 때문에 편의성을 위해 몇몇 출처를 허용해..
2024.11.12 -
Cipher 클래스에서 암호화·복호화 지연 이슈 해결
EATceed 서비스에서는 사용자가 이메일 인증을 시도할 때 인증 코드를 사용합니다. 이 과정에서 보안을 위해 인증 코드를 암호화/복호화하고 있는데, 여기서 지연 문제가 발생했습니다. 암호화/복호화를 할 때마다 시간이 너무 오래 걸리고, CPU 부하가 크게 증가하는 것이었습니다. 문제를 분석한 결과, 원인은 Cipher 클래스를 사용하는 방식에 있었습니다. 본격적인 해결 방법을 설명하기 전에, 먼저 Cipher 클래스에 대해 간단히 소개하겠습니다. Cipher 클래스란? Cipher 클래스는 데이터를 암호화하거나 복호화하는 Java에서 제공하는 주요 클래스입니다. 이 클래스는 다양한 암호화 알고리즘과 작동 모드, 그리고 패딩 방식을 제공하여 다양한 보안 요구사항을 충족할 수 있도록 설계되었습니다. 하지만..
2024.09.25 -
캐싱을 통한 API 성능 개선
EATceed의 핵심 기능 중 하나는 사용자 개개인의 신체 정보와 식단 기록을 기반으로, 매일 목표에 도달했는지를 월별 캘린더 형식으로 시각화하는 것입니다. 하지만 기존 API 구조는 모든 데이터를 실시간으로 계산하여 비효율적이라는 문제가 있었습니다. 이번 포스팅에서는 이러한 API를 개선한 과정을 상세히 설명하려고 합니다. 기존 방식 기존에는 모든 요청에 대해 월 단위로 데이터를 실시간으로 계산하고 분석 결과를 반환하는 방식이었습니다. 즉, 과거, 현재, 미래의 데이터를 모두 동일하게 처리하면서 불필요한 쿼리 요청이 발생하는 비효율적인 구조였습니다.그러나 과거 데이터는 변하지 않는다는 점에 착안해, 다음과 같이 로직을 개선했습니다. 예시 코드@Servicepublic class GetMonthlyAn..
2024.09.24 -
예외가 발생해도 이벤트 발행 후 처리하기
EATceed 프로젝트를 진행하며, 회원가입 API에 아래와 같은 요구사항이 추가되었습니다. 이메일 인증을 하지 않은 회원이 회원가입 하였을 경우에 "이메일 인증을 해주세요" 라는 응답과 함께 딥링크(with 인증코드)가 담긴 메일을 발송하라 이메인 인증 미완료시 이메일 재발송하기 EATceed에서는 이메일 인증을 완료하지 않은 사용자가 회원가입을 다시 시도할 경우, 이메일을 재전송하고, "이미 존재하는 이메일입니다. 이메일 인증을 해주세요"와 같은 응답을 반환해야합니다. 이메일 재전송 API를 만들 수도 있었지만 사용자 경험 저하 및 AOS 측 이메일 저장 문제로 인해 회원가입 API에서 "이메일 재전송"을 추가하기로 하였습니다. 이벤트를 사용해서 해결하기기존에 AlreadyEmailException..
2024.09.11