본문 바로가기

Spring61

[Spring] Redis 세션 로그아웃, 만료시 관련 처리 작업하기 ✏️ 배경 프로젝트 진행 중 Redis 세션 로그아웃과 만료시 로그를 저장해야 하는 작업이 있었다. Redis 세션 로그아웃과 만료 관련 처리 작업을 하면서 알게 된 ApplicationListener과 Event를 활용해 처리하는 방법에 대해 공유하고자 한다. 📌 필수 등록 Session 관련 작업을 수행하기 위해서 pom.xml에 해당 Session Dependency를 추가해주어야 한다. org.springframework.session spring-session-data-redis 🔎 로그아웃 로그아웃할 때 무언가 처리해야 된다고 생각하면 일반적으로 Security의 LogoutHandler 또는 LogoutSuccessHandler를 구현하고 Security 설정 파일에 등록해서 사용할 것으로 .. 2023. 4. 16.
Spring Boot 3.0 QueryDsl Maven 설정하기 ✏️ 배경 토이 프로젝트에서는 최신 환경으로 해보고 싶어서 Spring Boot 3.0 버전과 Spring Framework 6을 사용해서 개발을 진행하고 있었는데, 복잡한 동적 쿼리를 해결하기 위해 Querydsl 도입하기 위해 적용하는 시점에 설정 후 컴파일에 계속해서 실패하는 상황이 발생했다. 스프링 부트 3.0 Maven 환경에서 Querydsl을 적용하는 방법에 대해서 간단히 공유하고자 한다. Gradle 환경이라면 다른 포스트를 찾아보는 걸 권장한다. 🔎 AS-IS 보통 Querydsl 설정을 검색해서 보면 아래와 같은 설정을 하라는 글을 많이 접하게 된다. com.querydsl querydsl-apt 5.0.0 provided com.querydsl querydsl-jpa 5.0.0 com.. 2023. 4. 9.
Spring Redis Session 설정, 특징, 데이터 조회 ✏️ 배경 현재 진행 중인 프로젝트는 운영 중인 서버에서 세션을 별도 레디스를 설치해서 관리하고 있다. 업무 수행 중 Spring Redis Session에 접근해서 세션 별로 분류해서 어떤 작업을 할 필요가 생기게 되었다. 그래서 Spring Redis Session 데이터를 조회하는 방법을 찾게 되었고 해당 과정을 통해서 어떻게 접근하고 데이터를 가지고 오는지 알게 되어 해당 내용을 공유해 본다. 😀 🔎 Redis Session 설정 org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis 세션을 레디스로 관리하기 위해서는 spring-session-data-re.. 2023. 4. 8.
[Spring] 데이터와 연관된 파일 데이터(multipart)를 목록으로 받기 프로젝트 진행 중에 '하나의 데이터 정보'와 연관된 '여러 파일 데이터 정보'를 조합한 '묶음 데이터'를 리스트로 받아야 하는 경우가 있었다. 파일 데이터 전송을 위해 FormData 전송 형식을 선택하게 되었고, Spring 서버에서 어떻게 해당 데이터 형식을 받을 수 있을지 고민하고 여러 방식을 시도했다. 😾 그래서 해당 포스팅에는 데이터와 연관된 파일 데이터를 목록으로 받는 방법과 Postman으로 수동 테스트 하는 방법에 대해 공유한다. 👊 위의 이미지처럼 하나의 데이터 당 여러 개의 첨부 파일을 가질 수 있는 형태의 목록을 서버에서 받아야 하는 상황이다. 데이터와 파일들은 서로 연관이 있는 데이터들이므로 특정 파일들이 특정 데이터와 연관되어 있다는 걸 서버에서 확인할 수 있어야 하고, 이를 목록.. 2023. 4. 2.
Spring으로 네이버 비로그인 방식 오픈 API 사용해보기 네이버에서는 비로그인 방식 오픈 API를 제공하고 있다. 🐱 네이버에서는 비로그인 방식 오픈 API는 HTTP 헤더에 클라이언트 아이디와 클라이언트 시크릿 값만 전송해서 사용할 수 있는 간단한 API이다. 별도의 토큰 인증이 필요 없는 만큼 간단한 인증 방식을 갖추고 있다. 해당 포스팅에서는 로컬에서 스프링으로 네이버 비로그인 방식 오픈 API를 사용하는 방법에 대해 공유하고자 한다. 1. 애플리케이션 등록 1. 사용할 애플리케이션과 사용할 API를 선택한다. 2. 환경은 WEB 설정을 선택하고 주소는 http://localhost:port/** 형식으로 작성한다. (그냥 http://localhost:port 형식으로 등록해도 잘 된다.) 2. 애플리케이션 정보 확인하기 생성한 애플리케이션 정보를 확인.. 2023. 3. 26.
[Spring] Filter에서 ExceptionHandler 예외 메시지 전달하기 일반적인 개발 프로젝트에서는 클라이언트에게 전체 예외 메시지가 아닌 특정 형태를 갖춘 메시지를 반환한다. 현재 개발 중인 프로젝트에서도 @RestControllerAdvice와 @ExceptionHandler를 활용해서 애플리케이션 전역에서 발생하는 예외를 특정 형태로 맞춰서 클라이언트에게 반환하도록 설정되어 있었고 그동안 잘 사용하고 있었다. [GlobalExceptionHandler] @RestControllerAdvice @Slf4j public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity h.. 2023. 3. 26.
[Spring] ServiceLocatorFactoryBean을 활용하여 분기 처리하기 🤜 문제점 개발하다 보면 분기 처리를 통해 특정한 경우에 따라 다르게 처리해야 하는 경우가 굉장히 많다. 🤔 예를 들면, 서비스 기획자가 이러한 요청을 한다. " Color가 BLACK이라면 A 시바견을, Color가 WHITE 라면 B 시바견을, Color가 YELLOW 라면 C 시바견을, 그 외에는 D 시바견을 활용해서 처리해 주세요! " 이런 요청을 일반적인 조건문을 사용한 분기 처리를 통해 해결하면 다음과 같을 것이다. (실제로 프로젝트에 이런 코드가 많이 존재한다.) public class ShibaService { public void shibaTalk(Color color) { if(color == Color.BLACK) { new ShibaA().talk(); } else if(color .. 2023. 2. 19.
JPA 동일 트랜잭션에서 update와 insert 동시에 수행할 때 문제 해결하기 (쿼리 실행 순서 문제) unique 제약이 걸린 필드를 '동일한 트랜잭션' 내에서 수정하고 저장해야 하는 경우가 있었다. 그래서 필드를 먼저 수정(update)하고 새롭게 저장(insert)하면 순서대로 처리되지 않을까? 예상하며 코드를 작성했다. 하지만 예상과 다르게 예외가 발생하며 실패했고, 이후 원인을 찾아서 해결하게 되었다. 이 문제를 해결했던 내용을 비슷한 상황을 재현한 간단한 테스트 코드를 활용해 공유하고자 한다. 🐕 테스트 환경 Shiba.java (엔티티 내용 중 일부) ... @Column(unique = true) private String identification; public void updateIdentification(String identification) { this.identification =.. 2023. 2. 5.