전체 글 70

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

EC2 인바운드 규칙 미설정으로 인한 접속 불가 문제

이번 글에서는 실전 프로젝트에서 생긴 트러블 슈팅 중 하나를 설명해 볼 것이다. AWS EC2 인스턴스를 실행한 후, 로컬에서 테스트했을 땐 잘 작동하던 서버가 브라우저나 포스트맨을 통해 외부에서 접속이 되지 않는 문제가 발생했다.EC2에서 실행 중인 벡엔드 서버는 정상적으로 작동 중이었고, 포트번호도 8080으로 열려 있는 상태였지만 무한로딩이 되는 상황이었다. 🚀 원인 분석문제를 찾아본 결과, AWS EC2 인스턴스의 보안 그룹 설정에서 인바운드 규칙이 제대로 구성되지 않았다는 것을 발견했다.💡 보안 그룹이란?AWS에서 EC2 인스턴스를 보호하는 방화벽 역할을 하는 구성 요소로, 인바운드(들어오는 트래픽)와 아웃바운드(나가는 트래픽)를 제한할 수 있다. EC2 인스턴스의 보안 그룹 인바운드 규칙..

Spring 2025.05.27

실전 프로젝트 - 도서 관리 앱 만들기

짧다면 짧고, 길다면 길 수 있는 약 2주간의 강의(AWS, Docker, 스프링 심화)를 들은 뒤, 곧바로 실전 프로젝트에 들어가게 되었다.실전 프로젝트가 끝나면 바로 최종 프로젝트로 이어지기 때문에, 강의 시간에 배운 내용들을 최대한 활용해보자는 마음가짐으로 진행했다.이번 프로젝트를 마지막 학습 기회라 생각하고, 최대한 스스로 설계하고 구현해보는 데 집중했다. 📚 도서 관리 앱 와이어프레임 ERD 각자 도메인별로 기능을 맡으며 진행하였고, 나는 Book 도메인 기능을 맡게되었다.Book Entity@Entity@Table(name = "book")@NoArgsConstructor@Getterpublic class Book extends TimeStamped { @Id @GeneratedV..

Spring 2025.05.20

Spring AOP란?

Spring 프레임워크를 공부하며, AOP(Aspect-Oriented Programming)가 뭐지? 이게 왜 필요한지? 필터랑 다른 게 뭔지?라는 궁금점이 생겼다. 오늘은 AOP에 대해 개념이랑 적용 방법에 대해 공유해 보려 한다. AOP란?AOP(관점 지향 프로그래밍)는 공통 관심 사항(부가 기능)을 핵심 로직과 분리해서 한 곳에서 관리하도록 해주는 프로그래밍 기법이다. 📌 왜 AOP가 필요한가?프로그램을 개발하다 보면 반복적으로 사용되는 코드나 가독성이 떨어지는 로직들을 자주 마주하게 되는 것을 볼 수 있다.AOP는 이러한 반복되는 코드들을 비즈니스 로직과 분리함으로써 중복을 줄이고, 코드의 유지보수성을 향상시키는 데 큰 도움을 준다. 예시)public class UserService {..

Spring 2025.05.15