본문 바로가기

Spring Boot

(10)
Bucket4j 개요현대의 웹 서비스와 API는 대규모 트래픽을 처리해야 하며, 이러한 상황에서 안정성과 성능을 유지하는 것이 중요합니다. 특히, API를 사용할 때 과도한 요청이 서버에 들어오면 시스템 성능 저하 및 다운타임이 발생할 수 있습니다. 이를 방지하기 위해 API 속도 제한(rate limiting) 기법이 자주 사용됩니다. 이 글에서는 자바 기반의 API 속도 제한을 구현하는 데 유용한 라이브러리인 Bucket4j에 대해 다루고, 이를 사용하는 방법과 기본 설정 방법을 설명합니다. API 속도 제한 하는 이유앞서 설명한것과 더불어 다음과 같은 이유가 있습니다. 서버 보호: 과도한 요청으로 인해 서버 자원이 고갈되거나, 서버가 다운되는 것을 방지할 수 있습니다.공정한 사용 보장: 모든 사용자에게 공정한 AP..
[Spring Boot] Swagger 사용하기 개요프론트엔드와 백엔드간 협업을 하기 위해 백엔드에서 구축한 API 스펙을 문서화 하여 프론트엔드에게 보여줘야한다.이때 API 문서를 효과적으로 만들기 위해 사용할 수 있는 라이브러리를 찾아 보았고, swagger 라는 라이브러리를 알게 되었다.    Swagger 란?- Swagger는 API를 문서화하고 테스트할 수 있는 오픈 소스 프레임워크이다. - 어노테이션을 통해 간편하게 API 문서를 자동으로 만들 수 있다. - 자체적으로 사용자 친화적인 UI도 제공해주고 있기 때문에 문서를 쉽게 읽고 테스트할 수 있다.  문서화에 사용되는 어노테이션이 프로덕션 코드에 존재하기에 가독성을 떨어뜨리는 단점도 존재한다. API 스펙이 변했을 때 어노테이션 메타 데이터를 적절하게 바꿔주지 않으면 잘못된 정보를 전달..
Error creating bean with name 'entityManagerFactory' defined in class path resource 에러 해결방법: Gradle 클린후 라이브러리 새로 받기 Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: net/bytebuddy/NamingStrategy$SuffixingRandom$BaseNameResolver 갑자기 잘되던 프로젝트에서 이러한 에러가 등장하였다. 보통 entityManagerFactory 에러는 어디부분에서 어떤 에러가 나왔다 정도로는 알려줬던거 같은데 이번 에러는 이름을 만드는데 실패했나? 무튼 도통 감이 잡히질 않았다. 그래서 chat g..
Spring Boot + Spring Security 로 JWT 로그인 방식 구현 목차 1. 개요 2. 개발환경 3. 전체 구조 4. 라이브러리 및 properties 설정 5. 코드 구현 6. 테스트 개요 사이드 프로젝트를 Rest API 로 설계하게 되어 로그인 방식을 고민하던 중 토큰 인증 방식을 알게 되었고, JWT 를 이용하여 프론트엔드와 백엔드 사이 인증을 구현해 보았습니다. 여기에서는 JWT에 관한 내용은 다루지 않고, 오직 구현에만 집중적으로 다룰 것입니다. 전체적인 흐름은 아래와 같습니다. 1. 회원가입 2. 로그인 -> 토큰 발행 3. 토큰을 이용하여 권한 확인 개발환경 언어 : JDK 17 프레임워크 : Spring Boot 3.1.3 빌드툴 : Gradle 인증/인가 : Spring Security 6.1.3 데이터베이스 : Postgresql & JPA API ..
Spring Security + Spring Boot / Rest API Login 구현 목차 1. 개요 2. 개발환경 3. 주요 클래스 4. Config 설정 5. 동작 흐름 6. 동작 결과 7. 참조 개요 Rest API 를 적용한 상태에서 JWT 방식에서 Session 방식으로 인증, 인가를 변경해야 했고, 스프링 시큐리티의 기본 설정인 Form 인증 방식을 Rest API 에 맞게 변경했던 방법을 공유하고자 포스팅을 하게 됐습니다. 개발환경 JDK 17 Spring Boot 3.1.3 Spring Security 6.1.3 DB Postgresql JPA 테스트 - Postman 주요 클래스 필터 관련 클래스 1. CustomAuthenticationFilter import lombok.Data; import com.fasterxml.jackson.databind.ObjectMappe..
Spring boot 로 구글 클라우드 저장소(GCS) 에 파일 업로드 하기 목차 1. 프로젝트 생성 2. 버킷생성 3. 사용자계정 생성 4. json 키 생성 5. 스프링부트 프로젝트에 설정 6. 코드 구현 7. 동작 및 확인 프로젝트 생성 먼저 구글 클라우드 플랫폼으로 접속하셔서 다음과 같이 진행합니다. 프로젝트 이름을 입력하시고 만들기 클릭! 그럼 맨처음 클릭했던 프로젝트 선택을 누르시면 다음과 같이 생성된 것을 확인하실 수 있습니다. 버킷생성 버킷에 관한 문서 https://cloud.google.com/storage/docs/buckets?hl=ko 더보기 버킷 이란? 버킷은 데이터를 담는 기본 컨테이너입니다. Cloud Storage에 저장하는 모든 컨테이너가 버킷에 포함되어야 합니다. 버킷을 사용하여 데이터를 구성하고 데이터 액세스를 제어할 수 있지만 디렉터리와 폴더..
스프링 시큐리티 적용하기 먼저 스프링 부트 프로젝트를 생성해줍니다. start.spring.io 에서 생성하셔도 되고, IDE를 통해서 바로 생성해 주셔도 됩니다. 저는 인텔리제이를 사용하고 있으므로 인텔리제이를 이용하여 프로젝트를 생성하겠습니다. JDK 는 Java 17 빌드 툴은 Gradle 을 사용하겠습니다. 이후 Next 스프링 부트 는 3.1.5 버전을 사용하고 원래 여기서 스프링 시큐리티 의존성을 추가해도 되지만, 기존 프로젝트에 스프링 시큐리티를 적용해야하는 상황을 주기위해 프로젝트 생성 후 추가하도록 하겠습니다. create 눌러 프로젝트를 생성합니다. build.gradle 에 스프링 시큐리티 의존성을 추가합니다. implementation 'org.springframework.boot:spring-boot-st..
controller 호출 전 Request body 값 읽기 상황 모든 api 요청에 대한 로그를 남겨야 한다. 이때 파라미터 값, 즉 body 에 들어있는 값도 저장해야한다. 문제 filter 나 interceptor 로 request 객체의 body 에 접근하여 데이터를 읽어 오려고 하였다. 이때 getReader 나 getInputStream 을 사용하여 body 의 데이터를 읽어왔는데 java.lang.IllegalStateException: getReader() has already been called for this request 와 같이 이미 읽은 데이터라는 에러가 등장하였다. 에러의 원인은 getReader를 사용하면 request body 를 읽기 위한 스트림을 반환하고, 읽는 동안 내부적으로 포인트를 사용하여 읽은 위치를 기억하고, 두번째 부터..