springboot

    단위 테스트 - Controller (feat. 추가적인 단위 테스트의 방향성)

    [사용 스택]- Spring Boot 3.x- Java 17- Spring data JPA- H2- Junit 5- mockito  이번 글에서는 Controller의 단위테스트를 작성한 방법을 소개하겠습니다.들어가기에 앞서서,저는 Rest Controller를 사용하여 REST API를 만들었습니다. Controller컨트롤러의 역할은 HTTP 요청에 대한 비즈니스 로직 호출과 적절한 응답을 해주는 것입니다.저는 RestControllerAdvice를 사용해서 전역에서 발생된 예외에 맞게 응답 데이터를 생성해 주도록 했습니다.따라서, 제가 작성한 컨트롤러에서는 성공적인 응답만을 반환해줍니다.또한, 통일된 응답 데이터를 만들기 위해서 ResponseDTO 를 만들어 두었습니다.@AllArgsConstru..

    단위 테스트 - Service (feat. 테스트 더블)

    [사용 스택]- Spring Boot 3.x- Java 17- Spring data JPA- H2- Junit 5- mockito 레포지토리 테스트에 이어서 서비스에서 단위 테스트를 작성한 방법을 소개하겠습니다. Service서비스의 역할은 레포지토리를 사용하여 데이터를 요청하고 가져온 데이터로 비즈니스 로직을 수행하는 것입니다.서비스를 테스트하기 위해서는 레포지토리를 주입받아야 하는데,이 레포지토리가 실제 의존성을 주입받아 사용된다면,서비스를 테스트하는 단위 테스트라고 말하기 어렵습니다.(오히려 서비스와 레포지토리 모두를 한 번에 테스트하는 통합 테스트라고 생각합니다.)그렇기 때문에 레포지토리의 의존성을 줄여줄 필요가 있습니다.이를 위해 테스트 더블(Test Double)을 사용할 것입니다!! 테스트 ..

    단위 테스트 - Repository (feat. 테스트 픽스쳐)

    [사용 스택]- Spring Boot 3.x- Java 17- Spring data JPA- H2- Junit 5- mockito  기존에 진행했던 프로젝트를 혼자서 리팩터링 하기로 했습니다.리팩터링을 진행하면서 기존의 비즈니스 로직을 헤치는 일이 생기지 않도록테스트 코드를 작성할 필요가 있었습니다.또한, SpringBootTest를 사용하는 것은 전체를 부팅하면서 시간이 오래 걸린다는 단점이 있어서 단위 테스트에는 적합하지 않다고 생각하고 다른 것들로 대체해서 사용했습니다.테스트 코드를 작성하는 순서는 다른 클래스들과의 의존성이 가장 낮은 레포지토리부터서비스, 컨트롤러 순으로 했습니다. Repository레포지토리 테스트는 @DataJpaTest 를 사용했습니다.이를 사용하면 Jpa 테스트에 필요한 빈..

    RestControllerAdvice로 전역에서 발생된 예외 처리하기.

    기존에 진행하는 프로젝트에서는 Spring Boot로 REST API를 구현하면서 Service들에서 발생하는 여러 예외를 Controller의 메서드들에서 try/catch 문을 만들어 처리해 줬습니다이렇게 만들어두니 Controller는 복잡해지고 중복되는 코드들이 생겼으며,예외가 발생될 때마다 해당 예외에 대한 자세한 메시지를 작성해주어야 해서 관리가 어려웠습니다.이렇게 예외에 따른 처리를 Spring Boot에서 @RestControllerAdvice를 활용해 처리해 주는 방법을 정리해보고자 합니다! 기존 코드@RestController@RequestMapping("/api/v1/posts")@RequiredArgsConstructorpublic class PostController { pr..

    [Spring Boot] API Docs를 자동으로 만들어보자!

    많은 분들이 그렇겠지만 저는 지금까지 FE 팀원들과 소통하기 위해서 Notion에 API Docs를 만들어서 사용했습니다. 이렇게 만들면 귀찮아서 하기 싫고... 코드에 수정이 발생하면 이것도 수정해야하고... 오타 검수도 힘들고.... 너무 불편해서 찾아봤더니 Swagger라는 툴을 주로 사용한다고 해서 저도! 사용해보고자 합니다. ㅎㅎ 왜 Swagger? 다른 문서화 도구도 있지만 Swagger는 특히 적용하기 쉽습니다! 정말 몇 줄의 코드만으로 만들 수 있어요! 그리고 테스트를 할 수 있는 UI를 제공해줘서 Swagger 문서 화면에서 API를 바로 테스트할 수도 있습니다! 저는 지금까지 Postman을 사용해서 API를 테스트했는데, Postman에서 API를 문서화하면... Notion이랑 다를..

    [SpringBoot] SpringBoot에 MongoDB 연결

    만들어둔 MongoDB 데이터베이스를 SpringBoot 프로젝트에 연결해보려고 합니다. 목표 데이터베이스에 이름과 나이를 저장하고 확인하는 테스트 코드를 작성해 봅시다. 데이터베이스 이름 : test 컬렉션 이름 : Info 의존성 추가 implementation ("org.springframework.boot:spring-boot-starter-data-mongodb") 연결 설정 저는 MongoDB Altas로 데이터베이스를 생성해서 해당 URI를 가져와 설정해 주었습니다. Overview에서 본인의 클러스터의 Connect를 클릭합니다. 여기서 Drivers를 선택해 줍니다. 3번에 있는 윗줄을 복사해 주시고 다음과 같이 맞춰줍니다. spring.data.mongodb.uri=mongodb+srv..

    [Spring Boot] JPA - MySQL

    Mybatis vs JPA MySQL 데이터베이스를 연결하는 방법으로 두 가지 중 어떤 방법을 선택할지 고민했습니다. Mybatis는 직접 쿼리를 작성한 후 XML 또는 어노테이션을 사용해서 데이터 맵핑을 하는 방법이고, JPA는 객체와 관계형 데이터베이스 간의 매핑을 제공해주어서 쿼리를 작성할 필요가 없습니다. Mybatis를 사용해봤던 경험으로 저는 Mybatis를 사용하면서 장기간 프로젝트를 이어나가면 코드가 조금 복잡할 수 있겠다 생각했습니다. (물론 제가 실력이 부족해서..ㅎㅎ) JPA를 사용할 경우 얻을 수 있는 장점으로 여러 가지가 있겠지만 저는 밑에 있는 이유 때문에 JPA를 선택했습니다. - 코드를 더욱 간결하게 만들 수 있습니다. - 보다 높은 유연성과 확장성을 제공합니다. 아직 JPA..

    [Spring Boot] TDD - JUnit?

    JUnitJUnit은 Java의 표준 단위 테스트 프레임워크 입니다.JUnit은 어노테이션을 기반으로 테스트를 지원합니다.JUnit 5는 크게 Jupiter, Platform, Vintage 모듈로 구성됩니다. JUnit LifeCycle AnnotationJUnit은 아래와 같은 테스트 라이프 사이클을 가지고 있습니다.@Test  -  테스트용 메소드를 표현하는 어노테이션@BeforeEach  -  각 테스트 메소드가 시작되기 전에 실행되어야 하는 메소드를 표현@AfterEach  -  각 테스트 메소드가 시작된 후 실행되어야 하는 메소드를 표현@BeforeAll  -  테스트 시작 전에 실행되어야 하는 메소드를 표현 (static 처리 필요)@AfterAll  -  테스트 종료 후에 실행되어야 하는 ..