개요 개인 프로젝트에서 multipart/form-data를 받는 수정 API 요청 메서드를 만들었고, 이를 테스트하는 과정에서 예상과 달리 405 Error가 발생해 테스트에 실패하였다. 왜 이런 문제가 생겼는지 알아보았고, 어떻게 해결하였는지 작성하려고 한다. 문제 발생 @PutMapping(path = "/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public CategoryResponse update(@PathVariable Long id, @RequestParam(required = false) String name, @RequestPart(required = false) MultipartFile iconFile) { ... return c..
Spring
개요 개인 프로젝트에 이미지 파일을 포함한 데이터를 전달하는 multipart/form-data 요청을 적용하였다. 이 기능을 테스트 하는 방법을 처음 알게되었고, 이 부분을 정리하려고 한다. multipart/form-data 적용 먼저, Spring에서 multipart/form-data 요청을 적용하는 방법을 알아보자. 아래의 코드는 현재 프로젝트에서 카테고리 저장 api 요청을 전달받는 controller의 메소드이다. @ResponseStatus(HttpStatus.CREATED) @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public CategoryResponse save(@RequestParam String name, @Req..
개요 Spring REST Docs로 API 문서화를 적용하던 중 http-request와 response 형식을 마음대로 설정할 수 없을까 고민하였고, 알아낸 방법을 글로 정리해보았다. 적용 현재 프로젝트에서 인가가 필요한 API의 경우, access token을 Authorization header에 담아서 보내야 한다. MockMvc를 이용해 이런 API 요청을 문서화할 경우, 별도의 설정이 없다면 http-request.adoc에 access token이 그대로 보여지게 되는 문제가 발생한다. 이런 문제를 해결하기 위해서는 아래와 같이 별도의 설정을 추가해야 한다. ResultActions response = mockMvc.perform(delete("/api/liked-vouchers/{vouc..
개요 개인 프로젝트에서 JWT를 적용하던 중, 클라이언트에서 유효기한이 만료된 access token 때문에 생기는 예외를 servlet filter에서 처리할 수 있는 방법을 찾아 이 글을 작성하게 되었다. ExpiredJwtException Java에서 JWT를 도입하기 위해서는 io.jsonwebtoken 라이브러리를 사용해야 한다. 여기서, token을 parsing 할때 사용되는 JwtParser라는 인터페이스는 parseClaimsJws 메소드를 가지고 있고, 이 메소드는 매개변수로 받은 token에 이상이 있을 경우 여러 JWT 관련 예외들을 던진다. 그 중에서 ExpiredJwtException은 token의 유효기한이 만료되었을 경우 던져지는 예외이다. 현재 진행 중인 프로젝트를 예시로 ..
개요 개인 프로젝트에서 AWS S3를 사용해야 하는 상황이 생겼고, Spring과 S3를 연결하기 전에 테스트를 하는 방법을 찾아보고 이 글을 작성하게 되었다. 적용 @Profile("test") @TestConfiguration public class S3MockConfig { @Bean public S3Mock s3Mock() { return new S3Mock.Builder().build(); } @Bean @Primary @DependsOn("s3Mock") public S3Client s3Client() throws URISyntaxException { return S3Client.builder() .region(Region.AP_NORTHEAST_2) .credentialsProvider(An..
개요 현재 진행 중인 개인 프로젝트에서 사용자가 저장한 이미지를 보여주는 개인 갤러리를 구현했다. 여기서 pagination을 적용해야 했고, Spring Data JPA로 어렵지 않게 구현할 수 있다는 것을 알게되었다. 프로젝트에 적용하면서 학습한 것을 여기에 정리하려고 한다. Pagination 이란? 사용자가 요청했을 때 데이터베이스에 있는 수천, 수만, 수백만 줄의 데이터를 모두 한번에 조회하여 제공한다면 서버의 부하가 굉장히 클 것이다. 이를 방지하기 위해서 대부분의 서비스에서는 데이터를 일정 길이로 잘라 그 일부분만을 사용자에게 제공하는 방식을 사용한다. 사용자는 현재 보고 있는 데이터의 다음, 이전 구간 혹은 특정 구간의 데이터를 요청하고, 전달한 구간에 해당하는 데이터를 제공받는다. 이 기..