2025/06 7

Spring - AWS SES를 활용한 이메일 알림 기능 구현

이번에는 AWS SES(Amazon Simple Email Service)를 활용해, 회원가입 시 이메일 알림 기능을 적용해봤다.사용자가 회원가입을 완료하면, 등록한 이메일 주소로 성공 안내 메일이 자동으로 발송된다.이메일 본문에는 회원가입 성공 메시지와 함께 간단한 안내 사항 및 환영 인사를 함께 담아봤다.현재는 회원가입 완료 시에만 이 기능을 적용했지만, 앞으로는 예약 완료, 비밀번호 변경 등 다양한 사용자 활동에도 이메일 알림을 확장해볼 계획이다. 왜 AWS SES를 선택했을까? 최종프로젝트를 하면서 초기 개발 단계에서는 카카오톡 알림톡 기능을 적용하기로했다.카카오 알림톡은 빠르고 직관적인 메시지 전달에 강점이 있지만, 비즈니스 인증 절차가 까다롭고 비용 부담도 있었기에 다른 알림 메세지 기능들을 ..

Spring 2025.06.27

AWS Route 53으로 도메인 연결하기

저번 글에서 포스팅한 내용을 이어서 내가 배포한 서버는 EC2의 퍼블릭 IP 주소를 통해 접근할 수 있지만, 숫자로만 이루어진 이 IP 주소는 사용자들이 기억하기 매우 어렵다. 예를 들어 13.125.48.42 같은 주소는 매번 입력하기도 번거롭고, 사용자 친화적이지 않다.이런 불편함을 해결하기 위해 우리는 도메인을 사용한다✅ 그렇다면 도메인 연결, 어떻게 할까?이때 활용하는 AWS 서비스가 바로 Route 53이다.AWS Route 53은 도메인을 등록하고, 해당 도메인을 우리가 운영 중인 EC2나 S3 같은 AWS 리소스와 연결해 주는 DNS 서비스다. 쉽게 말해, 우리가 구매한 도메인을 EC2와 연결해주는 “전화번호부 역할”을 한다.이번 포스팅에서는 Route 53을 이용해 직접 도메인을 생성..

Spring 2025.06.24

EC2 인스턴스 + Docker 컨테이너 배포

오늘은 AWS EC2 인스턴스를 생성하고, Docker 컨테이너를 배포하여 외부에서 접근 가능하도록 설정하는 방법을 정리해보려고 한다. 이 글에서는 AWS EC2에서 Docker를 활용한 애플리케이션 배포부터 네트워크 보안 설정까지, 가장 간단하고 효율적인 방법을 소개할 예정이다.💡 배포 목표: AWS EC2 (t2.medium)와 Route 53을 이용한 Docker 컨테이너 배포하기배포 순서EC2 인스턴스(t2.medium) 생성 및 보안설정Docker 및 Docker Compose 설치Docker Compose를 이용한 웹 애플리케이션 컨테이너 배포Route 53을 사용한 도메인 연결(nest-dev.click) 및 외부 접속 설정 먼저 AWS 콘솔에서 로그인 후 ec2 인스턴스를 시작하여 생성해..

Spring 2025.06.23

Spring - 엔티티를 직접 Response로 반환할 경우

문제 현상REST API에서 DTO 없이 엔티티(Entity)를 직접 Response로 반환할 경우, 서로의 연관 관계가 계속 참조를 일으켜 무한 순환 참조 문제가 발생한다.결과적으로 API 응답 시 무한 로딩 현상 및 StackOverflowError가 발생하게 된다.📌 원인 분석 순환 참조란?두 엔티티가 서로를 참조하면서 객체 직렬화 과정에서 무한히 서로를 호출하는 상황. Profile 엔티티와 연관된 Keyword 엔티티를 직접 반환하면, 다음과 같은 순환 구조가 형성될 수 있다:💡 Profile → ProfileKeyword → Keyword → ProfileKeyword → Profile → … (무한 반복)🔸 문제 예시 코드// Entity를 그대로 반환하는 잘못된 예시@Entitypub..

Spring 2025.06.20

Spring Boot + Redis + Docker 연결 문제 트러블 슈팅

오늘은 Spring Boot 애플리케이션에서 Redis를 사용할 때, 로컬에서 실행할 때와 Docker Compose 환경에서 실행할 때 설정 방식이 다르기 때문에 자주 겪는 트러블에 대해 정리했다. ✅ 문제 상황로컬 환경에서 Redis 연결은 잘 되는데, Docker 컨테이너로 배포하면 아래와 같은 에러가 발생했다:spring.data.redis.host=localhostspring.data.redis.port=6379 즉, 도커 컨테이너 환경에서도 Redis를 localhost로 접근하는 문제가 발생한 것이다.✅ 원인 추론로컬 머신과 Docker 컨테이너에서의 Redis 접근 방법이 다르기 때문이다.로컬 환경Redis는 내 컴퓨터에 직접 설치되어 실행되므로, localhost:6379로 접근한다...

Spring 2025.06.20

인기 검색어에 Redis 캐싱과 TTL적용

지난 글에서는 인메모리 캐싱 처리에 대해 정리했었다.이번에는 팀원들과 함께 Redis를 활용한 캐싱 전략을 도입할 기능에 대해 논의했다. 그 결과, 도서 목록에서의 인기 검색어(Top 5) 기능에 Redis를 적용하기로 결정했다.실무에서도 일반적으로 모든 검색 키워드 데이터를 전부 집계하여 인기 검색어를 보여주기보다는,TTL(Time To Live)을 설정하여 최근 하루 기준의 데이터만을 집계하는 방식이 자주 사용된다.이를 반영하여, 우리도 하루 동안 사용자가 많이 검색한 도서 키워드를 기준으로 인기 검색어를 선정하고,Redis에 24시간 TTL을 적용해 매일 자동으로 초기화되도록 구현하기로 했다.이를 통해 매일 최신의 인기 도서 키워드를 캐시로 빠르게 제공할 수 있게 되었다. ✅ QueryDSL 쿼..

Spring 2025.06.12

15만권 도서 검색 서비스에 캐시 적용하기

도서 키워드 검색 캐싱 처리 이유 도서 데이터가 약 15만개 정도 있는 데이터베이스에서, 사용자가 입력한 키워드로 도서를 검색할 때마다 데이터베이스에 직접 접근하게 되면 여러 요청이 반복될수록 응답 속도가 느려지고, 서버의 과부하가 발생하게 된다.이를 해결하기 위해 검색 결과에 대한 캐싱 전략을 적용했고, 적용 전/후 성능 차이를 정리해보았다. 성능 테스트 환경성능 테스트 툴: Apache JMeter테스트 조건Thread (동시 사용자): 1000 usersRamp-Up Period: 5 secondsLoop Count: 1동일 키워드로 1000회 반복 요청평가 지표: 캐싱 적용 전/후 평균 응답 시간 비교캐싱 적용 전(도서 키워드 검색 메서드)// 캐시 xpublic Page searchByTitle..

Spring 2025.06.09