Study/Spring

    [Spring] Spring WebMvcTest 작성법

    [Spring] Spring WebMvcTest 작성법

    개요 Spring Boot의 WebMvcTest를 이용한 단위테스트를 작성하면서 헤매었던 부분들을 기록해보고자 합니다. 내용 1. API요청 방식에 따른 테스트 작성 방법 PathVariable ( 주소에 데이터를 입력 받는 방식 ) - 주로 @GetMapping 에서 사용되는 Path에 요청 값을 받는 방식입니다. 위처럼 PathVariable 방식의 입력이 있을 때에는 RestDocumentationRequestBuilders 를 추가해준뒤 actions을 작성해 주어야 합니다. RequestParam ( Param을 이용해서 입력을 받는 방식 ) - 적은 수( 1개 ~ 2개 정도? )의 데이터를 받을 때에 주로 사용하고 있는 RequestParam 방식입니다. 이전의 PathVariable 때의 R..

    [Spring] Spring rest docs generated-snippets adoc 안 생김 문제

    [Spring] Spring rest docs generated-snippets adoc 안 생김 문제

    개요 Spring rest docs 에서 테스트 코드를 작성한 뒤 테스트 케이스를 실행했는데 특정 케이스만 adoc이 생성되지 않는 상황이 발생했습니다. 따로 어떤 에러도 발생하지 않았기에 원인을 찾는데 조금의 시간을 소요했습니다. 해결 문제는 간단하게 해결되었습니다. 저의 경우 deleteUser() 요청의 adoc이 생성이 안되고 있었는데 천천히 살펴보니 테스트를 복사해서 수정하는 형식으로 작성을 할 때에 document 이름을 변경을 하지 않았기 때문이었습니다. 각 테스트 케이스마다 고유의 document 이름으로( 테스트 기능 이름과 같이 하면 될듯 합니다. ) 수정해주어 문제를 해결 했고, 이후 테스트를 실행하니 모든 adoc 들이 잘 생성이 되었습니다. 복사를 이용해서 개발을 할 때에는 조금 ..

    [Spring] @RequiredArgsConstructor 이란?

    @RequiredArgsConstructor 이란 무엇일까? Spring Boot를 이용한 프로젝트를 진행하면서 빈번하게 사용하는 어노테이션 중에 하나인 @RequiredArgsConstructor 가 있습니다. @RequiredArgsConstructor는 Lombok 이라는 java 라이브러리의 어노테이션 중 하나입니다. @RequiredArgsConstructor는 주로 생성자를 이용한 의존성 주입을 할 때 사용하는데 @RequiredArgsConstructor을 사용할 경우 생성자 생성코드를 대신해주어 깔끔한 코드를 작성하는데 도움을 줍니다. Before @Service public class ProductService { private final ProductRepository productRe..

    [Spring] null check 잊지 않기, 메모는 바로바로 하기

    [Spring] null check 잊지 않기, 메모는 바로바로 하기

    문제 발견 어제 프로젝트에서 테스트를 진행하던 중 계속해서 해결되지 않던 문제가 있었습니다. 데이터 save를 테스트 하고 있었는데 계속해서 데이터가 들어가지 않는 것 처럼 보이는 상황이었습니다. 그러나 DB를 살펴보니 데이터가 들어가 있었고 save 자체에는 문제가 없었습니다. 위의 과정들을 진행해가며 문제점이 save 자체가 아니라 최근에 변경한 UserResponse로 변환하는 과정에서 error가 발생하는 것으로 판단을 하고 확인을 하기 시작했습니다. 해결 과정 일단 정확한 문제 발생 지점을 찾기 위해서 해당 save 요청이 실행되는 과정을 모두 체크 하였고, 단계 단계 마다 System.out.println(); 을 이용하여 디버깅을 진행하였습니다. 그 결과 생성한 객체를 UserResponse..

    [Spring] Spring Boot NoUniqueBeanDefinitionException 문제

    [Spring] Spring Boot NoUniqueBeanDefinitionException 문제

    문제 발생 Github에서 다른 분들이 작업한 프로젝트를 보며 공부를 하던 중 Service를 interface로 만든 뒤 구현을 ServiceImpl로 만든 뒤 사용하는 것을 보게 되었습니다. 저는 Service를 바로 클래스로 구현을 해서 사용하는 중이기 때문에 왜 Service를 interface로 만들어서 사용하는지 궁금했습니다. 그래서 찾아보니 이는 예전부터 Spring을 사용해오던 사람들과 또는 그로부터 Spring을 배우게 된 분들이 주로 사용하게 되는데 예전에 Spring은 proxy를 생성할 때에 interface 타입만을 사용하여 proxy를 생성할 수 있었고 이를 주입받아서 사용해야 했습니다. 하지만 요즘은 class 타입을 이용하여도 proxy를 생성할 수 있고 이를 이용해서 주입받..

    [Spring] data.sql으로 입력된 데이터 9시간 차이 문제

    문제 발생 시간의 범위를 이용해서 데이터를 조회하는 기능을 만드는 도중에 문제점을 발견, 테스트가 실행 될 때에 입력되는 data.sql를 통해서 입력되는 데이터의 시간이 내가 입력한 값과는 다르게 9시간 이후의 시간으로 입력되는 것을 확인했습니다. 예를 들어 `2022-01-01T23:00:00` 으로 입력을 했다면 실제 DB에는 `2022-01-02T08:00:00` 의 시간으로 데이터가 입력되어 있던 상황이었습니다. 해결 과정 처음에는 시간이 이상하게 입력되었다는 사실만을 보았지만, 시간들을 살펴보니 일관성 있게 9시간의 시차가 존재하는 것을 발견 했습니다. 그래서 'Spring Boot mysql 9시간 시차' 같은 키워드로 검색을 해보았고, 간단한 해결 방법을 찾게 되었습니다. Spring Bo..

    [Spring] Spring Boot data.sql 적용 안됨 문제

    문제 발생 테스트 코드를 작성하며 테스트를 진행하고 있는데 여러개의 조회나, 조건을 이용한 조회를 이용할 때에 사용하기 위한 데이터를 먼저 넣어 놓으려고 data.sql 파일을 작성을 했지만, data.sql의 쿼리들이 실행되지 않는 문제가 발생하였습니다. 해결 과정 구글에 'Spring Boot data.sql not working' 을 검색해보니 저와 유사한 문제가 일어난 사람들이 많았습니다. 주된 답변으로는 Spring Boot 2.5x 버전 부터는 `spring.jpa.defer-datasource-initialization: true` 가 필요하다는 것 이었습니다. 저는 해당 코드를 추가했고, 그래도 여전히 data.sql은 실행되지 않고 있었습니다. 그래서 더 찾아보니 다른 답변 중에는 `sp..

    [Spring Security] Spring Security 500 error page ( "status" : 999 )

    [Spring Security] Spring Security 500 error page ( "status" : 999 )

    spring security를 공부하면서 예제를 따라하고 있는데, 올바른 권한(USER)을 가진 계정으로 로그인을 시도했을때 위와 같은 json 메시지가 나타나는 페이지로 이동되는 오류가 발생했다. 권한에 맞지 않는 계정의 페이지로 이동하면 아래와 같이 403 에러가 나타남으로 권한을 잘 이해하고 있는 것 같았다. 그래서 구글링해보니 stackoverflow.com/questions/61029340/spring-security-redirects-to-page-with-status-code-999/61029341 Spring security redirects to page with status code 999 After successful login spring redirects to /error page..