목록전체 글 (8)
DS's TechBlog
배경웹 프로젝트에서 이미지를 AWS S3에 저장하기로 했습니다. Spring Boot 3과 함께 AWS S3를 사용하는 법에 대해서 구글링 해봤지만, 오래된 버전에 대한 내용만 나와있어서 글을 작성하게 되었습니다.AWS IAM, AWS S3 버킷은 생성했다고 가정합니다.종속성 추가https://github.com/awspring/spring-cloud-aws?tab=readme-ov-file GitHub - awspring/spring-cloud-aws: The New Home for Spring Cloud AWSThe New Home for Spring Cloud AWS. Contribute to awspring/spring-cloud-aws development by creating an accoun..
Spring Security로 인증/인가를 구현하였는데, 문제가 생겼습니다.특정 엔드포인트의 권한이 제대로 설정되지 않았습니다.문제 상황 http .authorizeHttpRequests((auth) -> auth .requestMatchers("/login", "/", "/join/**", "/reissue", "/swagger-ui/**", "/v3/api-docs/**", "/users/**").permitAll() .requestMatchers("/admin/**", "/users/inactive").hasAnyRole("WEB_MASTER", "ADMIN") ..
기능 추가/변경 시 자동으로 프로젝트를 빌드하여 Docker Hub에 이미지를 올리는 방법에 대해서 알아보겠습니다.배경프론트엔드 개발자와의 기존 협업 방식이 번거로워 도입하게 되었습니다. 기존 방식에 대해서 먼저 설명드리겠습니다. 백엔드 기능이 완성되면 프로젝트를 build 하고, jar 파일을 프론트엔드 개발자에게 넘겨줍니다.프론트엔드 개발자는 docker-compose.yml, Dockerfile.yml와 함께 docker-compose up --build 명령어로 이미지를 생성하고, 도커 컨테이너를 띄웁니다.백엔드 API를 로컬에서 테스트할 수 있게 됩니다.비용문제로 개발 서버를 따로 두지 않고, Docker를 이용해 로컬에서 백엔드 API를 테스트하도록 했습니다.하지만, 이 방식에는 크게 3가지..
[Spring] Swagger 공통 응답 코드 처리 및 Enum으로 정의한 응답 코드 사용하기Swagger로 API 문서를 작성하는 데 몇 가지 문제가 있었습니다.1. 공통 응답 코드는 Swagger-ui에 표시되지 않습니다.2. Enum으로 정의한 응답 코드와 메시지를 @ApiResponse에서 사용할 수 없습니다.문제 코dsjo.tistory.comSwagger 공통 응답 코드를 처리하기 위해, 위 글에서 커스텀 어노테이션을 적용하였습니다.하지만, 설정하지 않은 200번 응답이 default로 보이게 되는 문제가 생겼습니다.문제가 생긴 원인과 해결 방법에 대해서 알아보겠습니다.문제점 @ApiSuccessCodeExample(SuccessCode.JOIN_SUCCESS) @ApiErrorCo..
Swagger로 API 문서를 작성하는 데 몇 가지 문제가 있었습니다.1. 공통 응답 코드는 Swagger-ui에 표시되지 않습니다.2. Enum으로 정의한 응답 코드와 메시지를 @ApiResponse에서 사용할 수 없습니다.문제 코드문제 상황위와 같이, 중복 응답 코드에 대해서는 먼저 작성한 구문에 대해서만 동작하는 것을 볼 수 있습니다.해결 방법https://leeeeeyeon-dev.tistory.com/92#google_vignette [Packy] Swagger @ApiResponses를 커스텀 어노테이션으로 대체하기1. @ApiResponses의 한계 Swagger에서 정상 응답값과 함께 에러 응답값도 명시해주어야 클라이언트 단에서도 에러 응답값에 대한 예외 처리를 할 수 있다. Swagger..
Spring Security를 활용하여 JWT 로그인을 구현하고 있습니다.Filter에서 발생하는 예외를 처리하기 위해 @ControllerAdvice와 @ExceptionHandler를 사용하였지만, 핸들링이 되지 않는 문제가 발생하였습니다. 원인과 해결법을 알아보겠습니다.문제 코드@RestControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public ResponseEntity handleBusinessException(BusinessException e) { ErrorCode errorCode = e.getErrorCode(); ..
SpringSecuriry를 활용해서 JWT 로그인을 구현했습니다. 그런데 2가지 문제가 생겼습니다. userId를 username으로 받아야 한다.- 진행 중인 프로젝트에서 user Entity에 id와 name 필드가 모두 존재합니다. 하지만, SpringSecurity에서는 id를 username 필드로 전달해 주기 때문에, 두 필드가 서로 헷갈리는 문제가 발생하였습니다. form-data 형식으로 입력을 받아야 한다.- Json 기반의 API 서버를 만들고 있는데, 로그인만 form-data 로 입력을 받는 것은 일관성 부분에서 문제가 있습니다. 이러한 문제를 해결해보겠습니다. 기존코드 @RequiredArgsConstructor public class LoginFilter extends User..
JPA의 findById로 User 엔티티를 가져오려 할 때, 아래와 같은 에러가 발생했습니다. User user = userRepository.findById(id); "Incompatible types. Found: 'java.util.Optional', required: 'com.haedal.haedalweb.domain.User'" Optional 타입으로 받아야 하는데, User 타입으로 받아서 문제가 생겼다고 합니다. 그럼, Optional은 무엇이며, 왜 Optional로 반환해야 하는지 알아보겠습니다. Optional이란? A container object which may or may not contain a non-null value. If a value is present, isPre..