전체 글

전체 글

    테스트 주도 개발(TDD)

    💡테스트 코드를 먼저 작성한 후 테스트를 통과하는 코드를 작성하는 과정을 반복하는 소프트웨어 개발 방식테스트 코드 개발 주기실패 테스트 작성 : 실패하는 경우의 테스트 코드를 먼저 작성한다.테스트를 통과하는 코드 작성 : 테스트 코드를 성공시키기 위한 실제 코드를 작성한다.리팩토링 : 중복 코드를 제거하거나 일반화하는 리팩토링을 수행한다.테스트 주도 개발의 효과디버깅 시간 단축테스트 코드 기반으로 개발이 진행되기 때문에 문제의 추적이 쉬움생산성 향상테스트 코드를 통해 지속적으로 애플리케이션 코드의 불안정성에 대한 피드백을 받기 때문에 리팩토링 횟수가 줄고 생산성이 높아짐재설계 시간 단축작성돼 있는 테스트 코드 기반으로 작성하기 때문에 재설계가 필요할 경우 테스트 코드를 조정하는 것으로 재설계 시간 단축 ..

    테스트코드 작성 (이론편)

    💡우리가 작성한 코드나 비즈니스 로직 자체를 테스트하기 위해 작성한 코드테스트 코드를 작성하는 이유개발 과정에서 문제를 미리 발견할 수 있다.리팩토링의 리스크가 줄어든다.애프리케이션을 가동해서 직접 테스트하는 것보다 테스트를 빠르게 진행할 수 있다.하나의 명세 문서로서의 기능을 수행한다.몇 가지 프레임워크에 맞춰 테스트 코드를 작성하면 좋은 코드를 생상할 수 있다.코드가 작성된 목적을 명확하게 표현할 수 있으며, 불필요한 내용이 추가되는 것을 방지한다. 개발 과정에서 문제를 미리 발견할 수 있다.리팩토링의 리스크가 줄어든다.명세 문서로서의 기능을 수행한다.단위 테스트 & 통합 테스트단위 테스트💡애플리케이션의 개별 모듈을 독립적으로 테스트하는 방식 메서드 단위로 테스트를 수행의도한 결괏값이 나오는지 확인테..

    컨트롤러 테스트 코드 작성

    Slice Test@WebMvcTest Annotation을 사용한 테스트를 Slice Test라고 한다.단위 테스트와 통합 테스트의 중간 개념레이어드 아키텍처를 기준으로 각 레이어별로 나누어 테스트를 진행한다는 의미개요의존성 주입을 받는 클래스의 경우 의존성 주입을 받는 객체는 외부 요인에 해당된다.이를 최대한 배제하기 위해서 Mock을 사용한다.@RestController @RequestMapping("/product") public class ProductController { private final ProductService productService; @Autowired public ProductController(ProductService productService) { this.produc..

    Gson

    💡JSON String ↔ Java Object 상호 변환해주는 라이브러리Gson 공식 사이트https://github.com/google/gsonGitHub 코드 정리https://github.com/qpdh/Spring-Boot-Study/tree/main/gson설치 방법Gradledependencies { implementation 'com.google.code.gson:gson:2.10.1' }Maven com.google.code.gson gson 2.10.1 프로젝트 생성하기Intellij 를 이용하여 Maven 또는 Gradle 프로젝트를 생성한다. pom.xml에 dependency를 추가한 모습Java Object를 JSON String으로 변환하기User 클래스를 하나 생성한다.pac..

    서비스 테스트 코드 작성

    getProduct() 테스트 코드package com.springboot.test.service.impl; import com.springboot.test.data.dto.ProductResponseDTO; import com.springboot.test.data.entity.Product; import com.springboot.test.data.repository.ProductRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.mockito...

    리포지토리 테스트 코드 작성

    리포지토리의 기본 메서드에 대한 테스트는 큰 의미가 없다.검증을 마치고 제공된 것이기 때문 데이터베이스 연동 여부데이터베이스를 제외시키기테스트용 데이터베이스 사용하기 데이터베이스 저장 테스트package com.springboot.test.data.repository; import com.springboot.test.data.entity.Product; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.D..

    JPA save vs saveAndFlush

    JpaRespository 인터페이스에서 save와 saveAndFlush 라는 메서드가 존재한다.두 메서드 모두 인자 내의 데이터를 데이터베이스에 저장하는 메서드이다.두 메서드가 어떤 차이가 있는지 알아보자. Docs 살펴보기JpaRepository (Spring Data JPA Parent 3.0.3 API)declaration: package: org.springframework.data.jpa.repository, interface: JpaRepositoryhttps://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html위 사이트로 접속하게 되면 JpaRepo..

    유클리드 알고리즘

    유클리드 알고리즘💡두 수의 최대공약수를 구하는 방법정의두 수 p, q(p>q)의 공약수 집합은 p-q와 q의 공약수 집합과 같다. 증명p, q의 공약수 g가 존재한다고 해보자그럼 다음과 같이 나타낼 수 있다.p = p’gq = q’g 이때 p-q = (p’ - q’)g 이므로g는 p-q의 약수이며, q의 약수이다. 구현위를 이용하여 코드로 구현해보자int gcd(int p, int q) { if (p < q) { int tmp = q; q = p; p = tmp; } if (q == 0) { return p; } return gcd(p - q, q); }짧은 코드로 구현이 가능하나, 위 코드를 보면 p와 q의 차이가 클 경우에 많은 연산이 이루어 질 수 있다는 단점이 있다.gcd(1024,6)=gcd(1..

    소수 판별

    소수 판별💡양의 약수가 1과 자기 자신 2개 뿐인 자연수소수가 아닌 수는 합성수이다.가장 단순한 방법2부터 n-1까지 모든 수를 돌면서 나머지가 0이 아니면 소수이다.조금 더 발전한 방법합성수는 n = p*q (p, q ≠ 1, n) 형태로 나타낼 수 있다. 이때 (p≤q) 일때 p는 항상 √n 이하이고 q는 항상 √n 이상이다.따라서 범위를 n-1까지가 아니라 √n 까지 줄일 수 있다.코드// 자연수 n이 소수인지 판별한다. static boolean isPrime(int n) { // 1과 2는 예외처리 if (n

    [BOJ/JAVA] 11060번: 점프 점프

    11060번: 점프 점프https://www.acmicpc.net/problem/11060키워드i번째 칸에 쓰여 있는 수를 AiA_iAi​라고 했을 때, 재환이는 AiA_iAi​이하만큼 오른쪽으로 떨어진 칸으로 한 번에 점프할 수 있다.가장 오른쪽 끝으로 갈 수 없는 경우에는 -1을 출력구현private static int dp(int index, int count)현재 위치가 index이고, 뛴 횟수가 count일 때 끝까지 갈 때의 최소 점프 횟수 반환하는 메소드끝에 도달한 경우 (index == N-1)현재까지 뛴 횟수를 반환한다.캐시값이 존재하는 경우 (cache[index][count] ≠ -2)캐시값을 반환한다.갈 수 있는 경로를 탐색한다.범위는 [1, A[index]] 이다.만약 뛰는 거..