Spring

    [Spring] x-www-form-urlencoded 요청 JSON 으로 변환하여 받기

    [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 확장

    [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 공통 응답 예시 커스터마이징

    [Spring] Swagger 공통 응답 예시 커스터마이징

    SuccessResponse 를 @RestControllerAdvice 를 이용해 전역 처리 중이며 Swagger Example 커스터마이징을 하고 싶은 경우 이 글을 읽어주시면 도움이 될 것 입니다. 들어가며 Swagger 를 사용중이며, @RestControllerAdvice 를 사용해 전역 응답을 설정중인 경우 Swagger 응답 예시에서 wrapping 시켜주는 객체가 나타나지 않는다. 최근에는 springfox 공식 업데이트가 멈췄고 springdocs 를 많이 사용중이다. springfox 같은 경우 기본 설정으로 제네릭 클래스를 응답으로 선택할 수 있는데 springdocs 에서는 이를 지원해주지 않아 다른 방법을 사용해야 한다. SuccessResponseAdvice 예시 @Getter @..

    [Spring] spring-data-envers 를 이용한 엔티티 변경 이력 관리

    [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] 스프링 소셜 로그인 OIDC 방식으로 구현하기 (OAuth with OpenID Connect)

    [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)

    [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)

    [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 을 사용하기..

    [Spring] 스프링 500 에러 발생 시 Slack 알림 전송하기 (슬랙 봇)

    [Spring] 스프링 500 에러 발생 시 Slack 알림 전송하기 (슬랙 봇)

    지난 글에 이은, 본격적으로 500 내부 서버 에러 발생 시 슬랙으로 알림을 전송해주는 봇을 만들어보는 글이다. Slack API 를 활용하여 이러한 알림 서비스를 구현할 수 있다. ⚙️ Dependency implementation 'com.slack.api:slack-api-client:1.27.2' 다음과 같은 의존성을 build.gradle 에 추가해준다. 🚀 Slack API 사용하기 위한 설정 📝 SlackApiConfig @Configuration public class SlackApiConfig { @Value("${slack.webhook.token}") private String token; @Bean public MethodsClient getClient() { Slack slackC..