전체 글 361

DDD - Infrastructure Layer 설계하는 방법 (+ DIP 제대로 사용하기)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 Layer Architecture 아래는 계층 구조 아키텍처를 도식화한 그림이다. 위의 계층 구조 아키텍처는 다음의 특징이 있다. 도메인의 복잡도에 따라 응용과 도메인을 분리하기도 하고 한 계층으로 합치기도 한다. 상위 계층에서 하위 계층으로 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않는다. 응용계층이 도메인 뿐만 아니라 Infrastructure에 의존하기도 한다. Infrastructure에 의존하면 테스트하기 어렵다. 기능 확장이 어렵다. 해결 방법은 DIP를 적용하는 것이다..

Programming/DDD 2022.06.05

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

MySQL - 커버링 인덱스

커버링 인덱스 커버링 인덱스(Covering Index)는 원하는 데이터를 인덱스에서만 추출할 수 있는 인덱스를 의미한다. B-Tree 스캔만으로 원하는 데이터를 가져올 수 있으며, 칼럼을 읽기 위해 실제 데이터 블록에 접근할 필요가 전혀 없다. 인덱스는 행 전체 크기보다 훨씬 작고 인덱스 값에 따라 정렬이 되기 때문에 Sequential Read로 접근할 수 있기 때문에 쿼리 성능을 크게 향상할 수 있다. 그래서 인덱스를 설계한다고 해서 WHERE 절에 국한된 문제가 아니라, 사실 쿼리 전체에 대해 인덱스 설계가 필요하다. 예시 테이블 생성 create table user ( id int(11) not null auto_increment, name varchar(20) not null default '..

Database/SQL 2022.05.31

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

QueryDSL - Repository 구조잡기 (extends / implements 사용 X)

해당 포스팅은 "[우아콘2020] 수십억건에서 QUERYDSL 사용하기" 라는 영상의 내용을 정리한 글입니다. 해당 영상은 아래 Reference에서 시청할 수 있습니다. - https://www.youtube.com/watch?v=zMAX7g6rO_Y extends / implements 사용하지 않기 현업에서 JPA & QueryDSL-JPA를 많이 사용한다. Repository를 구현할 떄는 다음의 같은 구조로 구현할 수 있다. 사용할 Repository가 JpaRepository를 상속받고 RepositoryCustom이라는 별도의 인터페이스를 추가적으로 상속을 받는다. 그리고 해당 인터페이스의 구현체인 RepositoryImpl을 생성하게 된다. 해당 방법은 매번 Interface와 Impl 구..

Server/Spring 2022.05.29

JUnit5 - Parameterized Tests

Parameterized Tests @ParameterizedTest 애노테이션을 @Test 애노테이션 대신 사용하면 여러 개의 파라미터 값에 대해 각각 테스트를 수행하는 코드를 간편하게 작성할 수 있다. @ParameterizedTest @ValueSource(ints = {0, 1, 3, 5, 15, -10, -200 Integer.MAX_VALUE}) void isInteger_ShouldReturnTrueForIntegers(int number) { assertTrue(Numbers.isInteger(number)); } ValueSource @ValueSource 애노테이션에 지정한 배열을 파라미터 값으로 넘기면 각 인수에 대해 테스트를 각각 실행한다. @ParameterizedTest @Val..

Server/JUnit, Spock 2022.05.29

Gradle이란 무엇인가? (+ Ant, Maven 비교)

Gradle이란 그래들(Gradle)은 그루비(Groovy)를 기반으로 한 빌드 도구이다. Ant, Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 자동화 도구이다. 빌드 자동화의 목적은 소프트웨어 개발자가 반복적으로 해야 하는 코딩을 잘 짜여진 프로세스를 통해 자동으로 실행하며, 믿을 수 있는 결과물을 생산해내는 일련의 과정을 말한다. 짧게 요약하면 라이브러리를 간편하게 추가하고 관리할 수 있고, 버전도 효율적으로 동기화해서 개발자가 비즈니스 로직에 집중할 수 있게 도와준다. 빌드 도구는 Ant -> Maven -> Gradle 순으로 발전되어 왔다. 이전 세대 빌드 도구의 특징 앞서 언급했듯 이전 세대 빌드 도구는 대표적으로 Ant, Maven이 ..

Server/Gradle 2022.05.28