스프링부트

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

    [Spring] 스프링 Slack 메세지 전송하기 (Incoming WebHooks 활용하여 슬랙봇 만들기)

    [Spring] 스프링 Slack 메세지 전송하기 (Incoming WebHooks 활용하여 슬랙봇 만들기)

    개발 중 로컬 서버에서 발생한 에러는 바로 탐지가 가능하지만, 배포 서버에서 실행 중일 때 발생한 에러는 바로 탐지가 어렵다. 그래서 에러 발생 시 메세지를 띄워주면 좋겠다고 누구나 한 번 쯤은 생각해보았을 것이다. Slack API 를 활용하여 알림을 보낸다면 이러한 알림 서비스를 구현하고 활용할 수 있다. 다만 이 파트에서는 에러 자동 탐지 알림 대신 사용자 편의를 의한 단순 메세지 발송에 대해서만 적었다. 500 서버 에러 탐지 알림은 아래 다른 게시글에 올려두었다. https://gengminy.tistory.com/53 [Spring] 스프링 500 에러 발생 시 Slack 알림 전송하기 (슬랙 봇) 지난 글에 이은, 본격적으로 500 내부 서버 에러 발생 시 슬랙으로 알림을 전송해주는 봇을 만..

    [Spring] 스프링 날짜 타입 JSON 변환 및 포맷팅하기 - @JsonFormat, @JacksonAnnotationsInside

    [Spring] 스프링 날짜 타입 JSON 변환 및 포맷팅하기 - @JsonFormat, @JacksonAnnotationsInside

    개발을 하다보면 좋든 싫든 항상 날짜에 대한 포맷팅을 마주하게 된다. 이 글에서는 그 과정에서 공부했던, @JsonFormat 을 활용하여 LocalDateTime 등 날짜에 대한 JSON 직렬화하기와 또 날짜 포맷팅, Jackson 을 활용한 커스텀 어노테이션까지 적어보았다. 💥 LocalDateTime 형식 { "name": "hello", "startAt": "2023-02-26T15:12:17.536Z", "endAt": "2023-02-26T15:12:17.536Z" } LocalDateTime 같은 경우에는 기본적으로 중간에 알파벳 등이 섞여있어 응답 시 같이 내보내게 된다. { "name": "hello", "startAt": "2023.03.20 12:00", "endAt": "2023.0..

    [Spring] 스프링 Enum Validator Reflection 으로 개선 및 구현하기

    [Spring] 스프링 Enum Validator Reflection 으로 개선 및 구현하기

    https://gengminy.tistory.com/47 [Spring] 스프링에서 Enum 클래스 Validation 추가하기 (Enum JSON parse error 해결) 스프링에서 일반적으로 RequestBody 의 값을 Validation 하는 방법 스프링 MVC 에서 @Valid 어노테이션을 명시해주면 컨트롤러에서 해당 값에 대해 미리 Validation 해줘서 값이 들어오게 된다. JAVAX 에서 @Not gengminy.tistory.com 앞서 작성한 스프링에서 Custom Enum Constraint Validator 구현하기 이 글에서 @Enum 이라는 커스텀 어노테이션을 만들었고 Request 필드에서 적용해보았다. @Schema(defaultValue = "OPEN", descri..

    [Spring] 스프링에서 Enum 클래스 Validation 구현하기 (Enum JSON parse error 해결)

    [Spring] 스프링에서 Enum 클래스 Validation 구현하기 (Enum JSON parse error 해결)

    스프링에서 일반적으로 RequestBody 의 값을 Validation 하는 방법 스프링 MVC 에서 @Valid 어노테이션을 명시해주면 컨트롤러에서 해당 값에 대해 미리 Validation 해줘서 값이 들어오게 된다. JAVAX 에서 @NotBlank, @NotNull, @Positive 등등 원시 타입에 대해서는 여러 가지 기본 검증을 지원한다. 하지만 Enum 클래스에 대한 Validation 은 기본으로 지원하지 않는다. 그러면 어떤 식으로 처리해야 할까? 📌 Enum Validation 처리를 하지 않았을 경우 Enum 필드에 대해 Validation 처리하지 않는다면 Enum 클래스에 속하지 않은 값이 Request 필드에 포함되면 JSON 값을 Enum 으로 올바르게 파싱하지 못하여 위 처럼..

    [Spring] 문자 인증 구현하기 (Redis + 네이버 클라우드 플랫폼 SMS API)

    [Spring] 문자 인증 구현하기 (Redis + 네이버 클라우드 플랫폼 SMS API)

    지금 하는 중인 프로젝트가 원래는 아이디 + 비밀번호 기반 로그인이여서 메일 기반 인증과 OAuth 를 준비중이었는데 다시 문자 인증 기반 로그인으로 기획이 변경되었다 문자 인증 같은 경우는 예전 프로젝트에서 네이버 SMS API를 통해 구현해 본 적이 있어서 그다지 어렵지는 않지만 마침 만드는 김에 복습하는 차원으로 구현하고 나서 글을 적어보기로 했다 ⚙️ Dependency //webflux implementation 'org.springframework.boot:spring-boot-starter-webflux' //redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' 서버 상에서 http 요청을 보내고 응답받기..