전체 글 106

[쇼핑몰 프로젝트] Spring Cloud Gateway와 OpenFeign을 같이 사용하면 발생하는 문제

0. 개요쇼핑몰 프로젝트를 혼자 다시 구현하면서, 이전과는 달리 refresh token과 블랙리스트 기능을 새롭게 추가하게 되면서 gateway 로직을 다시 짜게 되었다.Gateway는 클라이언트 요청의 Authorization 헤더에 담긴 JWT를 검증하고, 인증 API에 요청을 보내서 해당 토큰이 블랙리스트에 등록된 것인지 확인한 후, 토큰 안에 담긴 사용자 정보를 파싱해 다음을 헤더에 추가해서 백엔드 API에 전달한다.X-MEMBER-ID: 사용자 식별자X-MEMBER-ROLES: 사용자 권한처음에는 인증 서버와 통신하기 위해 Spring Cloud OpenFeign을 사용했지만, Spring Cloud Gateway는 Spring WebFlux 기반의 비동기 논블로킹 환경에서 동작하기 때문에, ..

[쇼핑몰 프로젝트] Spring JWT 재발급 로직에서 Interceptor 대신 Filter를 선택한 이유 (+Spring Cloud OpenFeign, Spring MVC)

0. 개요쇼핑몰 프로젝트를 혼자 다시 구현하면서, 이전에 구현하지 못했던 Refresh Token 기반의 재발급 로직과 블랙리스트 기능을 새롭게 추가했다. Access Token이 만료됐을 때, 쿠키에 담긴 Refresh Token을 활용해 Auth 서버가 Redis에서 해당 토큰의 존재 여부를 확인하고, 유효한 경우 Access Token을 자동으로 재발급하는 구조를 구현했다. 로그인 후 발급되는 Access/Refresh Token은 모두 HttpOnly 쿠키로 설정되며, 이후 모든 요청에 함께 전달된다. 이 점을 활용해, 로그인한 사용자의 요청을 서버에서 선처리하고, Refresh Token은 존재하지만 Access Token이 없거나 만료된 경우 Auth 서버로 재발급 요청을 보내도록 설계했다. ..

[쇼핑몰 프로젝트] Spring Boot 민감 정보 보호와 배포 자동화: GitHub Actions secrets & .env 활용

0. 개요쇼핑몰 프로젝트를 혼자 다시 구현하던 중, 민감 정보(DB 계정, 비밀번호 등)의 보호 방법에 대해 고민하게 되었다.기존 팀 프로젝트에서는 NHN Cloud의 Key Manager 서비스를 활용했지만, 이번 개인 프로젝트에서는 이를 사용할 수 없어 GitHub Actions Secrets와 .env 파일을 활용한 새로운 방법을 적용하게 되었다.1. env 파일을 활용하여 로컬에서 민감 정보 관리하기Spring Boot 2.4 이상에서는 spring.config.import 기능을 사용하여 외부 설정 파일 (.env, .yml 등)을 로드하고, 이를 application.properties에서 사용할 수 있다. (1) 프로젝트 루트 디렉토리에 env 파일 생성.chokchok-api/.env.en..

[Spring Error] Error creating bean with name 'jpaAuditingHandler':

0. 개요@WebMvcTest를 활용해서 컨트롤러에 대한 테스트 코드를 작성하고 실행 중, 아래와 같은 오류가 발생했다.이번 포스팅에서는 이 오류의 원인과 해결 방법을 공유하려고 한다.Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument1. 문제해당 오류는 jpaAuditingHandler 빈을 생성하는 동안 jpaMappingContext 빈을 찾을 수 없다는 BeanCreationException이다. 이 문제는 Spring Data JPA에서 발생하며, 보통 @EnableJpaAuditing을 활성화하지 ..

Spring 2025.05.01

[개발환경 설정] SSH로 서버 접속하기: RSA 키 생성 및 등록 방법

0. 개요EC2 서버를 생성하고 애플리케이션을 배포하기 위해 사용자 계정을 만든 후, 해당 계정에 다른 사람들도 안전하게 접근할 수 있도록 설정한다. SSH를 사용하여 서버에 접속하고, RSA 공개키 기반의 인증 방식을 활용하여 보안을 강화한다. SSH(Secure Shell)원격 서버에 안전하게 접속할 수 있는 프로토콜이다. SSH를 통해 서버와 클라이언트 간의 암호화된 통신을 할 수 있다.RSA비대칭 암호화 방식두 개의 키를 사용하여 데이터를 암호화하고 복호화하는 방식 (public key / private key)장점: 보안성, 1대1연결 - 공개키를 서버에 저장해서 사용하고 해당 키로 암호화된 데이터는 오직 대응되는 개인키로만 복호화 가능하다.+) Ubuntu 서버에서 새로운 사용자 계정 생성, ..

개발환경 설정 2025.04.20

[개발환경 설정] Ubuntu 서버에 Nginx 설치 및 설정 (+ SSL 인증)

0. 개요이 글에서는 Ubuntu 서버에 Nginx를 설치하고, 로드 밸런싱을 설정한 후, Let's Encrypt를 사용해 SSL 인증서를 적용하는 방법을 설명한다. 이를 통해 여러 서버 간에 트래픽을 분배하고, 보안된 HTTPS 서버를 구축할 수 있다.1. Nginx 설치sudo apt install nginx * Nginx 명령어와 파일 구조 설명 더보기(1) Nginx 관련 명령어# 상태 보기sudo systemctl status nginx# 시작sudo systemctl start nginx# 종료sudo systemctl stop nginx# 재시작sudo systemctl restart nginx# 리로드 (변경된 설정을 적용하는 경우 사용. 기존 연결을 끊지 않음.)sudo systemc..

개발환경 설정 2025.04.20

[개발환경 설정] Ubuntu(리눅스)에 Java 설치 및 환경변수 설정하기

0. 개요Java 개발을 시작하려면 Java Development Kit (JDK)를 시스템에 설치하고, 이를 원활히 사용하기 위한 환경변수 설정이 필요하다.이 글에서는 AWS EC2에 Ubuntu 24.04 LTS를 기반으로 Java를 설치하고, 환경변수를 설정하는 방법에 대해 단계별로 설명한다.1. AWS EC2 인스턴스 생성하기아래 글 참조2025.09.21 - [개발환경 설정] - [AWS] AWS EC2 서버 구축 [AWS] AWS EC2 서버 구축1. EC2 인스턴스 생성AWS Region 설정우측 상단의 Region을 현재 지역으로 바꿔준다.EC2 서비스 접속EC2 인스턴스 생성AMI 설정원하는 OS를 선택한다.인스턴스 설정프리 티어를 위한 t2.micro를 사용했다.키lightningtec..

개발환경 설정 2025.04.20

[쇼핑몰 프로젝트] Spring MVC 구조 - 단위 테스트 코드 작성하기

0. 개요쇼핑몰 프로젝트의 코드는 MVC 구조로 작성했다.Controller - Service - Repository 이렇게 크게 3가지의 구조인데, 각각의 단위 테스트를 어떻게 했는지 공유하려고 한다. 처음에는 @SpringBootTest를 사용해서 통합 테스트를 진행했지만, 애플리케이션의 설정과 모든 빈을 로드하는 과정에서 시간이 오래 걸렸다. 코드가 점점 복잡해지면서 테스트가 느려졌기 때문에, 최종적으로는 단위 테스트로 방향을 바꿔 진행하기로 했다. 테스트 코드는 when - given - then 형식으로 작성해야 한다.1. 의존성 추가: spring-boot-starter-testJUnit 5, AssertJ, Mockito, JsonPath ...와 같은 유용한 라이브러리를 제공한다. o..

[서버] 프록시 서버? 리버스 프록시 서버?

1. 프록시 서버란?프록시 서버는 클라이언트와 서버 사이의 중개 역할을 하는 서버다.클라이언트가 원래의 서버와 직접 통신하는 대신, 프록시 서버를 통해 요청을 보낸다. 이때 프록시 서버는 요청을 받아서 적절한 서버로 전달하거나, 서버에서 응답을 받아 클라이언트에게 전달하는 역할을 한다.2. 프록시 서버의 종류프록시 서버의 종류로 크게 2가지가 있는데, 네트워크 상 위치로 프록시 서버와 리버스 프록시 서버로 분류된다. (1) 프록시 서버 (Proxy Server)클라이언트 시스템 그룹 앞에 위치하는 서버.클라이언트 측에서 원본 서버와의 연결을 대신하는 역할학교, 회사, 정부 등에서 외부 인터넷 접속을 제한하거나, 특정 웹 사이트를 필터링 할 때 사용한다.(2) 리버스 프록시 서버 (Reverse Proxy..

서버&네트워크 2025.03.25

[쇼핑몰 프로젝트] 분산 환경에서 데이터 캐싱 - Redis

0. 개요장바구니 로직을 설계하던 중, 사용자가 장바구니를 이용할 때마다 DB에서 매번 데이터를 넣고 가져오는 방식은 비효율적이라 생각했다. 그래서 장바구니 데이터를 세션으로 관리하고, 특정 시점(세션 종료, 로그아웃)에만 DB에 백업하여 저장하는 방식으로 설계를 진행했다.1. 문제서버 이중화 환경에서, 세션 통해 장바구니를 관리하면 세션 불일치 문제가 발생했다.서버가 이중화된 환경에서 사용자가 장바구니 세션이 없는 다른 서버로 요청이 가면 장바구니 기능이 제대로 동작하지 않는 문제가 발생했다.사용자가 많을 경우, 서버 메모리의 부담이 커진다.장바구니는 사용자가 자주 또 많이 이용하는 기능이다. 이는 서버의 메모리 사용량을 크게 증가시켜, 서버의 성능 저하로 인해 서비스의 품질에 영향이 갈 것이라 생각했..