1. 들어가며패키는 온라인 상으로 선물박스를 만들고 '주고받는' 서비스이다. 패키에서는 선물박스를 접하는 입장에서 유저를 보내는 유저(Sender), 받는 유저(Receiver), 둘 다 아닌 유저(Stranger) 3가지로 구분할 수 있다. 그렇기 때문에 대부분의 기능에 대해 3가지 입장을 모두 고려하여 로직을 설계해야 한다. 그러다보니 하나의 메서드에서 if문이 늘어나고, 이는 한 메서드의 책임이 너무 커지는 문제를 초래하며 가독성도 같이 떨어진다. 이번 포스트에서는 '선물박스 삭제하기' 로직을 대표로 예시를 들어 설명하겠다. 아래는 리팩토링을 진행하기 전 코드이다.if문이 너무 많이 중첩되어 있어 주석 없이 코드를 이해하는데 오랜 시간이 소요된다..public String deleteGiftBox(..
1. 문제 상황진행 중인 프로젝트의 테스트 코드의 가독성이 (작성자인 나에게조차...) 가독성이 좋지 않은 것 같아 테스트 코드를 전반적으로 리팩토링하고 있다. 그 중 진행중인 작업 중 하나가 Test Fixture를 클래스로 관리하는 것이다.현재 프로젝트는 각 계층의 의존성을 분리하기 위해 멀티 모듈을 사용하고 있다. Controller와 Service는 api 모듈, Entity와 DAO는 domain 모듈에서 관리하고 있다. 그렇기 때문에 DTO를 반환하는 Fixture 클래스는 api 모듈, 엔티티를 반환하는 Fixture 클래스는 domain 모듈에서 관리하기로 결정하였다. 하지만 아래 사진처럼 api 모듈에서 domain 모듈에 있는 Fixture을 불러올 수 없는 문제가 발생하였다. 2. 문..
1. 들어가며 진행하고 있는 프로젝트는 멀티 모듈로 운영하고 있는데, jacoco 테스트 리포트를 만들면 모듈마다 build 패키지에 리포트가 생성되어 하나로 확인하기 어렵다. Gradle 7.4부터 지원하는 jacoco-report-aggregation 플러그인을 사용하면 여러 모듈에 걸친 테스트 리포트를 하나로 통합하여 관리할 수 있다. 2. rootProject - build.gradle 루트 프로젝트의 build.gradle에 아래와 같이 코드를 추가해준다. 주석으로 위에 jacoco라고 적은 부분이 jacoco 연동을 위해 추가된 코드이다. 이제 모든 하위 모듈에 jacoco 플러그인이 추가되었고, ./gradlew testCodeCoverageReport 명령어로 테스트 리포트를 만들 수 있다..
1. @ApiResponses의 한계 Swagger에서 정상 응답값과 함께 에러 응답값도 명시해주어야 클라이언트 단에서도 에러 응답값에 대한 예외 처리를 할 수 있다. Swagger에서는 기본적으로 아래와 같이 @ApiResponses와 @ApiResponse 어노테이션을 사용할 수 있다. @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "로그인 성공"), @ApiResponse(responseCode = "400", description = "로그인 실패") }) 하지만 @ApiResponses를 사용하며 여러모로 불편함을 느꼈다. 1. responseCode, description을 수작업으로 적어주어야 한다. [Pac..
1. 들어가며 이번에 만들고 있는 서비스에서 유튜브 영상을 임베드할 수 있는 기능을 제공한다. iOS에서 지금 사용하는 라이브러리에서는 유효하지 않은 빈 동영상 링크를 삽입해도 빈 동영상으로 나옴 유튜브 API 할당량을 아끼기 위해 URL 캐싱 위 두 가지 이유 때문에 유튜브 영상의 유효성 검사를 서버 단에서 진행하기로 결정하였다. 이번 포스트에서는 Youtube API를 연동하여 유튜브 영상의 정보를 가져오고 유효성을 검사하는 로직을 만들어보자. 2. 유효성 검증 로직에 대해 알아보자 1. 유튜브 URL에 정규 표현식을 사용하여 Video ID 추출 2. Video ID를 유튜브 API에게 전달하여 Video 정보를 가져옴 3. Embeddable, PrivacyStatus 여부를 확인하여 유효한 영상..
이번 포스트에서는 AWS S3 파일 업로드 방식 중 MultipartFile을 사용한 방식과 Presigned URL을 사용한 방식에 대해 알아보고, Presigned URL로 S3에 파일을 업로드하는 방식을 코드로 직접 구현해본다. 1. MultipartFile을 사용한 기존 S3 파일 업로드 Spring Boot에서 S3 파일 업로드를 구현할 때 가장 많이 사용하는 방법이 MultipartFile을 사용하는 방법이다. MultipartFile은 스피링에서 제공하는 인터페이스로, 파일 업로드를 손쉽게 다룰 수 있도록 기능을 제공한다. 클라이언트에서 파일을 업로드했을 때 WAS가 임시 디렉토리에 파일을 저장한다. 파일은 컨테이너가 실행되고 있는 서버 디스크에 저장되고, 요청 처리가 끝나면 임시 저장된 파..