📡 백엔드/🌱 Spring Boot
[Spring] x-www-form-urlencoded 요청 JSON 으로 변환하여 받기
들어가며 스프링을 사용한 프로젝트에서 NHN KCP 결제 시스템을 연동하는 요구사항이 있었다. 우리 서버에서는 객체 필드명에 카멜 케이스를 사용하는데, 결제 서버에서는 스네이크 케이스로 보내주는 상황. 이를 @JsonProperty 로 매핑시키려고 했으나 해당 결제 서버에서 보내는 콜백 요청은 x-www-form-urlencded 를 사용 중이었다 따라서 Jackson 이 아닌 다른 컨버터가 사용되어 @JsonProperty 가 먹히지 않았다. 이를 커스텀 컨버터를 등록하여 JSON 으로 매핑시키도록 하여 해결해보자. 인코딩 application/x-www-form-urlencoded HTML 의 form 태그에서 서버에 전송할 때 주로 사용되는 방식이다. 말 그대로 데이터를 서버에 전송하기 전에 URL..
[Spring] Jackson Module 을 이용한 Jackson 확장
Custom Serializer / Deserializer 를 만들어 Jackson Module 에 등록하고, 이를 통해 Jackson 을 확장하여 기본 JSON 처리 방식을 변경하는 방법에 대한 글입니다. 들어가며 Java Spring 서버를 개발하다보면 Jackson 이라는 라이브러리를 많이 들어봤을 것이다. Jackson 은 Java 진영에서 JSON 처리를 담당하는 라이브러리이다. Java 객체를 JSON 으로 직렬화, 혹은 반대로 역직렬화할 수 있는 데이터 바인딩 기능을 제공한다. 현재 REST API 처리 방식에 JSON 요청, 응답을 가장 많이 사용하기 때문에 중요한 라이브러리라 할 수 있다. 그래서인지 현재 스프링 프레임워크에도 Jackson 이 기본적으로 탑재되어 있기도 하다. Jacks..
[Spring] Swagger 공통 응답 예시 커스터마이징
SuccessResponse 를 @RestControllerAdvice 를 이용해 전역 처리 중이며 Swagger Example 커스터마이징을 하고 싶은 경우 이 글을 읽어주시면 도움이 될 것 입니다. 들어가며 Swagger 를 사용중이며, @RestControllerAdvice 를 사용해 전역 응답을 설정중인 경우 Swagger 응답 예시에서 wrapping 시켜주는 객체가 나타나지 않는다. 최근에는 springfox 공식 업데이트가 멈췄고 springdocs 를 많이 사용중이다. springfox 같은 경우 기본 설정으로 제네릭 클래스를 응답으로 선택할 수 있는데 springdocs 에서는 이를 지원해주지 않아 다른 방법을 사용해야 한다. SuccessResponseAdvice 예시 @Getter @..
[Spring] spring-data-envers 를 이용한 엔티티 변경 이력 관리
들어가며시스템 운영 단계에서 중요 데이터의 변경 이력을 저장하고 관리해야 하는 경우가 있다. 보통 history 테이블을 따로 만들어 이것들을 관리하곤 하는데JPA 를 사용중이라면 spring-data-envers 를 통해 이를 편리하게 설정하고 관리할 수 있다. spring-data-envers 는 hibernate-envers 의 wrapping 프로젝트로envers 를 편리하게 사용할 수 있는 기능(RevisionRepository, 메타데이터 조회)을 제공한다. 1. Dependency (gradle)implementation("org.springframework.data:spring-data-envers")2. Auditing 활성화감사를 진행할 엔티티에 @Audited 를 추가한다@Getter..
[Spring] Redisson 분산락 AOP로 동시성 문제 해결하기 (트랜잭션 전파속성 NEVER 사용)
🌱 들어가며 동시성 문제는 백엔드 개발자들이라면 반드시 한 번쯤은 겪어보는 문제이다. 서버 단에서 동시성의 가장 흔한 예로는 선착순, 이벤트 등의 상황에서 다수의 트래픽이 동시에 몰리는 상황 확인 버튼을 실수로 두 번 클릭을 해(따닥) 서버에 동시에 동일한 요청이 두 번 전송된 상황 어떤 사용자가 추천과 비추천, 취소를 순식간에 계속 눌렀는데 서버에 마침 부하가 걸려 이 요청들이 동시에 들어온 상황 이런 예시들을 생각해볼 수 있다. 자바는 기본적으로 멀티 쓰레드 환경에서 실행되기 때문에 이러한 경쟁상태(Race Condition)에 대해 처리를 해줄 필요가 있다. 결론부터 말하자면 Redis 의 구현체 중 하나인 Redisson Client 를 활용하여 이 문제를 해결했다. 이번 포스팅에서는 그 과정에..
[Spring] 스프링 소셜 로그인 OIDC 방식으로 구현하기 (OAuth with OpenID Connect)
📌 OpenID Connect (OIDC) 는 무엇인가? OAuth 2.0 프로토콜을 기반으로 한 사용자 인증 프로토콜 accessToken 이외에도 id_token을 사용하여 토큰으로 사용자가 누구인지 확인할 수도 있다. OIDC는 표준 프로토콜(스펙)이기 때문에 다른 OAuth 공급자와 호환된다. 보통 소셜 로그인 요청 시 scope 에 `open id` 를 추가해주면 엑세스 토큰과 리프레시 토큰 이외에 id token 을 추가로 응답해준다. 🔗 공개 키 가져오기 각 OAuth Provider 들은 공개키 목록의 JSON 파일을 제공한다. 구글, 카카오, 애플의 공개키 목록 url 은 다음과 같다. 📌 Google https://www.googleapis.com/oauth2/v3/certs 📌 Kak..
[Spring] 스프링 애플 로그인 구현하기 (Sign in with Apple OIDC)
악명이 높기로 소문난 애플 로그인 구현하기 공식 Docs 도 너무 불친절하고 자료도 별로 없어서 애먹었지만 무한한 삽질을 통해 입맛에 맞게 완성시켜 보았다. 엑세스 토큰이 아닌, OIDC(Open ID Connect)의 id_token 방식을 사용하여 구현했다. id_token 방식의 경우 이슈어와 앱키 등의 정보가 들어있어 검증 및 로그인 세션을 유지할 수 있게 도와준다. 특히 이는 회원 가입시 OAuth 에서 제공하지 않는 정보의 추가 기입이 필요할 때 유용하게 사용할 수 있다. 📚 Dependency implementation 'com.nimbusds:nimbus-jose-jwt:3.10' client secret 을 생성하기 위한 jwt 관련 라이브러리 📌 Apple Developers 설정 애플..
[Spring] 스프링 Feign Client 적용하기 (Spring Cloud OpenFeign)
📌 Feign Client 란? 본래 Netflix (그 넷플릭스 맞음) 에서 오픈 소스 일부로 개발되어 사용중인 경량 REST 클라이언트 현재는 Spring Cloud 프레임워크의 일부가 되었다. 인터페이스로 정의된 API를 기반으로 RESTful 서비스를 호출한다. 이를 통해 코드 가독성과 유지 보수성이 늘어남을 기대할 수 있다. 📚 Dependency implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '3.1.1' implementation 'io.github.openfeign:feign-jackson:12.1' 🔨 @EnableFeignClient Feign 을 사용하기..