전체 글

전체 글

    [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] RefreshToken + Redis 사용해서 자동 로그인 + 로그아웃 구현하기

    [Spring] RefreshToken + Redis 사용해서 자동 로그인 + 로그아웃 구현하기

    모바일 어플리케이션 또는 일부 웹 앱을 사용하다 보면 보통 자동 로그인 체크 옵션이 있다. 또는 이런 옵션이 없어도 앱을 키면 이미 로그인 되어있는 경우가 많다. 카카오톡, 토스 등등 과연 어떻게 구현하는 것일까? 세션 방식과 토큰 방식에서 물론 차이가 있지만 내가 선호하는 방법인 토큰 방식으로 구현을 해보았다. 이 포스팅은 Spring Security, JWT, Redis 관련 세팅이 이미 되어있다고 가정하고 코드를 작성했습니다. 📌 자동 로그인 인증 과정 1) 유저가 성공적으로 로그인 했을 경우 리프레시 토큰과 엑세스 토큰을 응답받는다. 2) 유저는 이를 보관하고 사용하다가, 엑세스 토큰이 만료되는 시점이 올 것이다. 3) 유저의 서버 API 요청시 401 응답을 받으면 reissue 요청을 시도해야..

    [Spring] 스프링 스케쥴러 사용해서 일정 주기로 메소드 실행하기 (Scheduler)

    [Spring] 스프링 스케쥴러 사용해서 일정 주기로 메소드 실행하기 (Scheduler)

    프로젝트 개발 중 엔티티를 생성한지 3일 이후에 자동으로 해당 엔티티 필드를 갱신해 만료 상태로 만드는 로직이 필요했다 PostgreSQL 에서는 내장 스케쥴러가 없다는 말도 있고 스케쥴러 사용하는 법이 까다로워서 로깅도 같이 하기 위해 그냥 스프링 내장 스케쥴러를 사용하기로 했다 ⚙️ Dependency @Scheduler 는 Spring Boot Starter 에서 기본으로 제공하는 어노테이션이다 🔨 전역 설정 📝 MyApplication @EnableScheduling //scheduler 사용 @EnableJpaAuditing //jpa entity 자동 감시 @SpringBootApplication public class MyApplication { public static void main(S..

    [Spring/Nginx] MultipartFile 최대 용량 설정하기 (MaxUploadSizeExceededException / Request Entity Too Large)

    [Spring/Nginx] MultipartFile 최대 용량 설정하기 (MaxUploadSizeExceededException / Request Entity Too Large)

    ❌ 에러 상황 org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field multipartFiles exceeds its maximum permitted size of 1048576 bytes. AWS S3 파일 업로드 중 발생한 문제 MaxUploadSizeExceededException AWS S3 와 연동해서 파일을 업로드 할 때 http 41..

    [Spring] JPA + Lombok 사용할 때 @OneToOne 에서 발생하는 StackOverflowError 해결

    [Spring] JPA + Lombok 사용할 때 @OneToOne 에서 발생하는 StackOverflowError 해결

    JPA 와 Lombok 을 같이 사용중이라면 발생할 수 있는 에러 ❌ 원인 @OneToOne 또는 @OneToMany 를 통해 연관관계를 정의했고 이후 데이터를 꺼내올 때 hashCode 또는 toString 을 호출하면서 무한 순환 참조에 의해 스택 오버플로우가 발생하는 에러이다 java.lang.StackOverflowError: null at com.tikitaka.naechinso.domain.member.entity.Member.toString(Member.java:21) ~[main/:na] at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453) ~[na:na] at com.tikitaka.naechinso..

    [AWS] Elastic Beanstalk + Github Actions 사용해서 Spring boot CI/CD 파이프라인 구축하기

    [AWS] Elastic Beanstalk + Github Actions 사용해서 Spring boot CI/CD 파이프라인 구축하기

    동아리 스터디의 일환으로 시작된 Beanstalk 으로 CI/CD 파이프라인 구축하기 처음 써보는거라 확실히 어렵지만 EC2 생성하고 RDS 생성하고 https 설정해주고... 하던 시절과 비교하면 확실히 배포 속도가 엄청 빠르긴 하다 물론 그 과정에서 삽질을 엄청나게 하긴 했지만... 하지만 결론적으로는 빌드 시간이 많이 오래 걸리기도 하고 배포서버와 개발서버 그리고 혹시 모르지만 웹까지 하나의 EC2 환경에서 배포하고 싶어서 JAR 환경에서 Docker 환경으로 이동할 것이다 JAR 이나 WAR 로 배포하는 것은 물론 좋지만 여러 EC2 인스턴스를 사용하기엔 돈이 모자란 ^^.... 가난한 대학생에겐 하나의 EC2에서 멀티 컨테이너로 돌리는게 더 나을 것이라는 판단이다 그래도 공부한게 아까우니까 까먹..

    [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 요청을 보내고 응답받기..

    [Spring] 스프링 시큐리티 + JWT로 카카오 로그인 구현하기, 프론트엔드와 연결

    [Spring] 스프링 시큐리티 + JWT로 카카오 로그인 구현하기, 프론트엔드와 연결

    지난 번에 DefaultOAuth2Service 를 상속하여 스프링 시큐리티에 등록하는 방식으로 카카오 로그인을 구현해보았다 하지만 이런 식으로 하게 되면 스프링 내장 함수을 이용하면서 편리하게 구현을 할 수는 있지만 구조가 너무 추상적이고 컨트롤러에서 통제하기가 어려웠다 그래서 이번에는 OAuth 인증 과정의 본질을 뜯어보면서 하나하나 구현해보았다 💾 이전 글 (DefaultOAuth2Service 이용) https://gengminy.tistory.com/39 [Spring] OAuth2Service + 스프링 시큐리티 + JWT로 카카오 로그인 구현하기 📌 OAuth "OpenID Authorization"의 약자 비밀번호를 제공하지 않으면서 웹사이트나 어플리케이션 접근 권한을 부여할 수 있는 로그..