전체 글

전체 글

    [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 를 추가한다 ..

    [Spring] Redisson 분산락 AOP로 동시성 문제 해결하기 (트랜잭션 전파속성 NEVER 사용)

    [Spring] Redisson 분산락 AOP로 동시성 문제 해결하기 (트랜잭션 전파속성 NEVER 사용)

    🌱 들어가며 동시성 문제는 백엔드 개발자들이라면 반드시 한 번쯤은 겪어보는 문제이다. 서버 단에서 동시성의 가장 흔한 예로는 선착순, 이벤트 등의 상황에서 다수의 트래픽이 동시에 몰리는 상황 확인 버튼을 실수로 두 번 클릭을 해(따닥) 서버에 동시에 동일한 요청이 두 번 전송된 상황 어떤 사용자가 추천과 비추천, 취소를 순식간에 계속 눌렀는데 서버에 마침 부하가 걸려 이 요청들이 동시에 들어온 상황 이런 예시들을 생각해볼 수 있다. 자바는 기본적으로 멀티 쓰레드 환경에서 실행되기 때문에 이러한 경쟁상태(Race Condition)에 대해 처리를 해줄 필요가 있다. 결론부터 말하자면 Redis 의 구현체 중 하나인 Redisson Client 를 활용하여 이 문제를 해결했다. 이번 포스팅에서는 그 과정에..

    [YAPP] IT 연합동아리 YAPP 22기 백엔드 서류 / 면접 합격 후기

    [YAPP] IT 연합동아리 YAPP 22기 백엔드 서류 / 면접 합격 후기

    ✨ YAPP 연합 개발 동아리들 중 하나로, 기업형 IT 연합동아리라고 소개하고 있네요! 대학생과 현업자가 모두 참여할 수 있는 것이 특징 중 하나입니다. PM(기획자), 디자이너, 프론트엔드, 백엔드 네 개의 파트로 나누어 모집하고 있습니다. YAPP은 22기 기준 매주 토요일 정기 세션을 진행하고 기수 당 3회의 해커톤이 열립니다. 또한 스터디를 열거나 참여할 수도 있습니다. YAPP 에는 실력자 분들도 많고 네트워킹도 활발하다고 알고 있어서 지원할까 고민 중이었는데 결정적으로 지인이 YAPP 한 번 지원해보는 게 어떻냐고 꼬셔서 부랴부랴 포폴 정리하고 서류 준비해서 지원했네요 🥲 https://www.yapp.co.kr/ YAPP 작은 아이디어로 세상을 크게 변화시키는 IT동아리, YAPP www...

    [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 설정 애플..