java
컨트롤러 테스트 코드 작성
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]] 이다.만약 뛰는 거..

[BOJ/JAVA] 7562번: 나이트의 이동
7562번: 나이트의 이동https://www.acmicpc.net/problem/7562키워드나이트가 한 번에 이동할 수 있는 칸은 아래와 같다.이 때 원하는 위치에 가기까지 이동 횟수를 구하라구현final static int dydx[][] 현재 위치 기준으로 나이트가 이동할 수 있는 방향(8방향)을 기록한다. private static int solution()현재 위치에서 나이트가 목적지까지 갈 때 최소 이동 횟수를 반환한다.board[][]모든 위치의 값을 -1로 초기화한다. 현재 위치 기준으로 이동할 위치(toY, toX)를 계산한다.해당 위치가 -1값이 아니라면(방문한 적이 없다면)board[toY][toX] = here.count+1 로 갱신한다. (방문 처리)갈 수 있는 경로를 큐에 추가..
[BOJ/JAVA] 1068번: 트리
1068번: 트리https://www.acmicpc.net/problem/1068키워드트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.구현private static int solution() 노드를 돌면서 리프 노트의 갯수를 반환하는 메소드방문할 노드를 찾기tree[i] 값은 i노드가 tree[i]값을 부모로 한다는 의미이다.tree[i]는 자식을 가진 노드라는 의미이므로 이 노드는 방문할 필요가 없다.만약 현재 노드가 지워지는 노드라면부모 노드가 리프노드가 될 수 있으므로, 부모 노드 추적을 하지 않는다.boolean isLeafNode[] 에 리프 노드일 수도 있는 ..