Server 121

Spring - JpaRepository와 Querydsl 연결하기! (사용자 정의 리포지토리)

우리는 자바 스프링으로 웹 서버를 개발할 때 Spring Data JPA와 QueryDSL을 동시에 사용하게 된다. 문제는 JpaRepository는 인터페이스이고, QuerydslRepository는 클래스이다. 그래서 흔히 아래의 두 클래스를 따로 구현하곤 한다. UserJpaRepository UserQuerydslRepository 이를 해결하기 위한 방법을 알아보자. 사용자 정의 리포지토리 사용자 정의 리포지토리를 사용하면 이런 문제를 해결할 수 있다. 사용자 정의 리포지토리는 다음과 같이 사용한다. 사용자 정의 인터페이스 생성 (상속 X) 사용자 정의 인터페이스 구현 JpaRepository에 사용자 정의 인터페이스 상속 Class Diagram으로 아래와 같이 표현할 수 있다. 구현 먼저..

Server/Spring 2022.06.18

SpringBoot - 프로퍼티를 안전하게 가져오는 방법!

개발을 하다보면 클래스에서 프로퍼티(Properties)를 가져오는 일이 종종 생긴다. 더 효율적이고 안전한 방법에 대해 알아보자. 예제를 위한 application.yml 상태는 다음과 같다. directory: root-path: /app/ temp-path: /temp/ @Value 가장 간단하게 값을 주입받는 방식이다. @Value 애노테이션에 프로퍼티 경로를 적으면 값이 주입된다. @Getter public class DirectoryProperties { @Value("${app.directory.root-path}") private String rootPath; @Value("${app.directory.temp-path}") private String tempPath; } 이 방식은 간단하..

Server/Spring 2022.06.14

Spring Boot - Chaos Monkey를 활용한 운영 이슈 테스트!

이번 포스팅에선 카오스 엔지니어링을 할 수 있게 도와주는 라이브러리 Chaos Monkey For Spring Boot (CM4SB)에 대해 알아보자. 카오스 엔지니어링 아무리 훌륭한 기업이라도 운영 중인 어플리케이션에 장애 발생은 불가피하다. 이는 자주 접하는 장애일 수도 있고 뜬금없는 장애일 수도 있다. 이러한 장애를 미리 테스트해서 방지하거나 대책을 찾는 것을 카오스 엔지니어링이라고 한다. 카오스 엔지니어링 툴은 로컬에서는 경험하기 힘든 아래와 같은 이슈를 미리 확인해 볼 수 있는 툴이다. 네트워크 지연 서버 장애 디스크 오작동 메모리 누수 Chaos Monkey For Spring Boot (CM4SB) 란 ? Chaos Monkey For Spring Boot (CM4SB)란 Netflix에서..

Server/JUnit, Spock 2022.06.11

Spring Boot - 커넥션 풀 상태 확인하기!

Spring Boot 2.0 이상에서는 DBCP(DataBase Connection Pool) 구현체를 default로 HikariCP를 사용하고 있다. 다음의 HikariCP의 프로퍼티를 수정해서 현재 커넥션풀의 상태를 확인할 수 있다. application.properties logging.level.com.zaxxer.hikari=TRACE logging.level.com.zaxxer.hikari.HikariConfig=DEBUG application.yml logging: level: com.zaxxer.hikari: TRACE com.zaxxer.hikari.HikariConfig: DEBUG 결과 아래와 같은 로그를 확인하는 것이 가능하다. 예제 앱에서는 데이터 소스를 4개 사용하고 있다. 하..

Server/Spring JPA 2022.06.11

JUnit - TestContainers 사용하는 방법! (+ 장단점 비교)

CI / CD 자동화된 테스트 내가 회사에서 개발하는 서비스의 DB 환경은 아래와 같다. test 환경에서는 어떤 DBMS를 사용할 수 있는가? prod, stage -> mysql 5.7 dev -> mysql 5.7 test -> ? test 환경에서 h2 데이터베이스를 많이 사용한다. 이 경우 CI/CD에서 h2 데이터베이스를 사용해서 자동화된 테스트를 어렵지 않게 할 수 있다. 문제는 h2와 mysql은 다른 부분이 적잖게 존재한다. 가령 격리 수준, 전파 속성, 지원하는 SQL 등 차이점이 많이 존재한다. 실제 운영환경과 유사하게 테스트하기 위해서는 test용 db도 mysql로 실행해야 한다. 그래서 고민을 하게 된다. 로컬에서는 도커나 로컬DB를 띄워서 테스트할 수 있지만 CI/CD의 자동화..

Server/JUnit, Spock 2022.06.06

Mockito로 BDD 테스트 코드 작성하기 (BDDMockito)

BDD BDD란 Danial Terhorst-North와 Charis Matts가 TDD에서 착안한 방법론으로 행위 주도 개발(Behavior-Driven Development)을 말한다. 테스트 대상의 상태의 변화를 시나리오를 기반(Narrative)으로 테스트하는 패턴을 주로 사용한다. 이 때 권장하는 행동 패턴은 Given, When, Then 구조이다. 해당 패턴은 어떤 상태에서(Given) 어떤 행동을 했을 때(When) 어떤 결과가 되는 지(Then)를 테스트한다. BDDMockito 다양한 테스트 코드를 보면 Mockito를 사용할 때 when().thenReturn()와 given().thenReturn()패턴이 있는데 전자는 org.mockito.Mockito가 제공하는 기능이고 후자는 ..

Server/JUnit, Spock 2022.06.05

Mockito를 제대로 사용하는 방법들! (단위테스트)

우리는 JUnit Test에서 Mock을 위한 Framework 중 Mockito를 많이 사용한다. 해당 포스팅은 Mocking을 하는 과정에서 '어 이런 상황에는 어떻게 Mock 하지?' 라고 생각할 때 해결을 하기 위해 다양한 기법에 대해 다룬다. Mockito 기본 사용 천리길도 한 걸음부터라고 기본 사용 방법부터 보자. 먼저 의존성을 추가한다. testImplementation 'org.mockito:mockito-core:3.11.2' testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' 이후 Mockito를 사용할 테스트 클..

Server/JUnit, Spock 2022.06.04

JUnit5 - 단위 테스트에서 프로퍼티 불러오기

테스트 코드를 작성하다보면 Property에서 값을 가져오는 일이 많이 생긴다. 그런데 @Value("${property-path}")를 사용해도 프로퍼티 값이 불러와지지 않는다. 해당 포스팅에서는 단위 테스트에서 프로퍼티를 가져오는 방법에 대해 다룬다. 1. @TestPropertySource @TestPropertySource를 사용하면 해당 파일의 프로퍼티를 읽을 수 있다. @TestPropertySource(locations = "classpath:application.yml")) @SpringBootTest(classes = UserService.class) public class UserServiceTest { private UserService userservice; @Value("${pro..

Server/JUnit, Spock 2022.06.02

SpringBoot - @SpringBootTest vs @WebMvcTest

백기선님의 강의 영상을 보고 Mvc 통합테스트를 하는 방법을 익혔다. 하지만 현업에서 그렇게 했을 때 생기는 문제점을 피드백 받았고, 컨트롤러를 테스트 하는 두 가지 방법이 있음을 알게 되었다. 예제 코드 아래의 예제를 보자. [TestController] @RestController @RequiredArgsConstructor public class TestController { private TestService testService; @GetMapping("/hello") public String hello() { return "Controller : " + testService.hello(); } } [TestService] @Service public class TestService { publ..

Server/Spring 2022.05.30

QueryDSL - Select 성능 개선하는 방법들! (+ JPQL 관련 이슈)

해당 포스팅은 "[우아콘2020] 수십억건에서 QUERYDSL 사용하기" 라는 영상의 내용을 정리한 글입니다. 해당 영상은 아래 Reference에서 시청할 수 있습니다. - https://www.youtube.com/watch?v=zMAX7g6rO_Y exist 메소드 금지 SQL문 중 exists 문은 조건을 만족하는 레코드를 1개 찾으면 바로 결과를 반환하고 쿼리를 종료한다. 반면 count(1)의 경우 마지막 레코드까지 검사를 하게 되기 때문에 성능이 낭비된다. 이런 성능차이는 스캔 대상이 앞에 위치할수록 더 심하게 발생한다. 문제는 QueryDSL의 exists는 SQL문의 exists를 사용하지 않고 count()>0로 쿼리를 날린다. 이를 개선하기 위해서 Querydsl의 selectOne..

Server/Spring JPA 2022.05.29