목록Java & Spring (9)
DS's TechBlog
이미지를 파일 시스템에 저장하고 관련 정보를 DB에 저장할 때, 이미지 파일과 DB 간의 일관성을 유지하는 방법 2편입니다. (https://dsjo.tistory.com/12) 2편은 @TransactionEventListener 를 중심으로 작성하였습니다. 아직 남은 문제 @Override @Transactional public void updateBoardImage(Long activityId, Long boardId, MultipartFile boardImageFile) { Board board = boardService.getBoardWithImageAndUser(activityId, boardId); User loggedInUser = securityS..

이미지를 파일 시스템에 저장하고 관련 정보를 DB에 저장할 때, 이미지 파일과 DB 간의 일관성을 유지하는 방법에 대해서 알아보겠습니다. 1편은 외래키 제약조건에 따른 SQL 순서 최적화를 중심으로 작성하였습니다.배경프로젝트의 요구사항은 아래와 같습니다.게시판의 대표 이미지는 파일 시스템에 저장하고, 파일의 정보는 DB에 저장합니다.대표 이미지 업데이트 시에 기존의 이미지 파일은 삭제되어야 합니다.이러한 요구사항에서는 이미지 파일과 DB 간의 일관성이 중요하다는 생각을 했습니다.board_image 테이블이 존재하지 않는 파일의 정보를 담고 있으면 안 되기 때문입니다. 기존 이미지 업데이트 방식의 문제점 @Override @Transactional public void updateBoar..

배경웹 프로젝트에서 이미지를 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") ..

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