우아한테크코스/레벨 2 - Spring8 [Spring] RestAssured, RestDocs로 API 문서 자동화 하기 with 공식문서 API 명세서는 애플리케이션의 동작, 소통을 위해 빠질 수 없는 부분이다. API 명세서(문서)를 통해 API의 기능, 사용방법, 제한사항 등을 명확하게 이해할 수 있다.여러 작업자가 함께 일한다면(ex. 프론트엔드 - 백엔드) API 문서를 통해 API를 올바르게 호출하고 필요한 데이터를 교환할 수 있다.제대로된 명세서가 있다면 빠른 소통이 가능해진다.그러나, 기능이 추가/변경될 때 API 명세서도 지속적으로 업데이트 되지 않는다면 제대로 된 소통이 어려워진다. 실제로 지금 구현하던 애플리케이션에서도 수정이 생겼을 때마다 명세서를 수정하다가, 어느순간 기능 구현만 신경쓰고 문서화를 놓치게 되었다. 그래서 문서화를 수동으로 작성하기 보다는 자동화하는 것이 낫겠다는 생각을 했다. 문서 자동화를 할 수 있는.. 2024. 6. 9. [Spring] RestClient, MockRestServiceServer로 단위 테스트하기 애플리케이션에 토스 결제 기능을 추가했다. (참고: 토스페이 결제 연동하기)현재 작성한 애플리케이션은 토스 결제 결과에 따라 로직이 다르게 수행된다.ex. 결제에 성공 -> 예약 성공 / 결제 실패 -> 예약 실패, 사용자 정의 예외 발생 코드를 작성했으니 (TDD 방식을 사용한다면 코드를 작성하기 전) 테스트 코드를 작성해보려고 했다. 그런데 이 과정에서 많은 에러가 발생했고, 코드도 여러번 갈아 엎었다. 😭 관련 자료들을 찾아봤을 때 MockRestServiceServer와 RestTemplate를 사용한 테스트는 많이 있었는데, RestClient를 사용한 테스트 정보는 찾기가 어려웠다.그나마 찾아봤던 내용이 깃헙에 있는 내용인데, 이 방식은 여러개의 RestClient를 생성하지 못한다는 문제가.. 2024. 6. 2. [Spring, JUnit5] 테스트 격리: DB 초기화 (InitializingBean, BeforeEachCallback) 테스트를 진행할 때, 테스트간에 영향을 주어서는 안된다.예를 들어, 삽입 테스트 이후 조회 테스트가 실행되더라도 이전 삽입 테스트 결과에 영향을 받지 않아야한다.그래서 우테코에서 처음 제공되었던 테스트 코드에는 @DirtiesContext가 설정되어있었다.(@DirtiesContext는 간단히 말하면 테스트마다 컨텍스트를 새로 로드하는 설정이다. 그래서 상대적으로 많은 시간이 소요된다.) 테스트 코드가 늘어날수록 테스트에 소요되는 시간이 늘어났고, 그 몇 초 조차 기다리기 싫어진 나는 @Sql을 사용해 테스트 데이터를 초기화하는 방법을 적용했었다.아래와 같은 방식으로 적용 가능한데, 해당 테스트 클래스를 실행할 때 reset_test_data.sql을 실행하겠다는 의미이다. 실행되는 옵션으로 BEFORE.. 2024. 5. 25. [JPA] @Embedded, @Embeddable 개념과 사용법 이번 미션에서는 기존에 JDBC를 통해 관리하던 테이블을 JPA로 전환하는 작업을 진행했다. 그 과정에서 '객체'를 필드로 갖는 엔티티를 테이블에 저장할 때,데이터를 어떻게 테이블에 넣을 수 있을지 고민했었는데, 그 과정을 기록해보려고한다. * JPA 자체에 대한 내용은 생략했다. 필요하면 아래 게시글을 참고하기를 바란다.JPA(Java Persistence API)엔티티간 연관관계 매핑Spring Data JPA(데이터 액세스 계층 구현) 내용을 정리하면서 과정을 좀 더 간단히 나타내기 위해 실제 코드가 아닌 예시 코드를 별도로 작성하였다. 1. Member 클래스 정의회원 정보를 담고 있는 Member 객체가 있다고 가정하자.회원의 고유 식별자, 이름, 이메일, 비밀번호, 주소를 필드로 갖는다.@En.. 2024. 5. 16. [Spring] HandlerMethodArgumentResolver 사용하기 사용자 요청을 처리할 때, 요청 데이터를 메서드의 매개변수로 받아와야하는 경우들이 있다.(특정 헤더를 객체로 변환하거나, 쿠키나 세션에서 사용자 정보를 가져오는 등) 이 때 사용 가능한 것이 HandlerMethodArgumentResolver이다.공식문서를 찾아보면 아래와 같이 설명하고 있다.Strategy interface for resolving method parameters into argument values in the context of a given request. 말그대로 요청에서 메서드 파라미터(데이터)를 인자값(Argument values)로 변환해주는 전략 인터페이스이다.우리가 원하는 값을 추출하기 위해 직접 커스텀해서 사용할 수 있다. 요청 쿠키에서 "token" 값을 찾아 메서.. 2024. 5. 9. [Spring] DTO 검증하고 결과 알려주기 with @Valid, @ExceptionHandler 사용자가 방탈출 게임 예약을 등록하는 웹 애플리케이션이 있다고 하자.사용자로부터 예약 데이터를 받아올 때, 올바른 내용(형태)인지 검증하는 과정이 필요하다. '검증'이란, 사전적 의미 그대로 검사하여 증명하는 것이다.만약 예약자 이름에 아무런 데이터가 들어있지 않다면? 날짜 데이터의 형태가 잘못되어있다면?어떤 게임(테마)을 선택했는지 내용이 없다면? 애플리케이션이 기대한대로 동작하지 않아야한다. 이를 위해서는 먼저, 잘못된 데이터임을 검증할 수 있어야 한다.그리고 잘못된 데이터가 입력되었다는 것을 사용자에게 알려주어야 한다.이번 글에서는 사용자로부터 요청을 받아온는 DTO를 검증하고, 검증에 실패했을 때 예외를 처리하는 과정을 남겨보고자 한다. DTO 검증하기 검증은 여러 단계에서 수행될 수 있다. D.. 2024. 5. 3. 이전 1 2 다음