전체 글 280

잘 못 처리한 @ControllerAdvice를 수정하기

개요프로젝트에서 ControllerAdvice를 사용해서 에러를 처리하는 중 이상한 버그가 발생했다. 아래와 같이 에러가 처리되는 것이 아닌 무한로그가 찍히면서 요청이 종료되지 않는 것이다.   문제  분석 문제를 분석한 결과 ControllerAdvice에서 에러를 처리할 때 ResponseBody로 처리하지 않아 에러 부분을 스프링에서no static resource에러를 발생한 것이다.   해결 아래와 같이 ControllerAdvice클래스에 ResponseBody를 추가해 해결해 주었다.@ControllerAdvice@ResponseBodypublic class GlobalExceptionHandler {아래와 같이 에러를 옳게 처리하는 것을 확인할 수 있다.

스프링 2024.08.05

[백준] ACM Craft 1005번 (python) 위상정렬 + dp

출처 : https://www.acmicpc.net/problem/1005 풀이 방법 위 문제는 그래프에서 작업의 우선순위가 정해져 있으므로, 위상 정렬을 사용해 해결할 수 있다.위상 정렬에 dp알고리즘을 추가하여 현재 노드를 완료하기 위한 시간을 계산할 수 있다. from collections import dequedef topological_sort(N, K, cTime, linked, degree, win_num): 위상정렬 dp = [0] * (N + 1) queue = deque() # 시작 점 초기화 for i in range(1, N + 1): if degree[i] == 0: queue.append(i) dp[i] =..

Algorithm 2024.08.04

[백준] 치킨 배달 15686번 (python) 조합

출처 : https://www.acmicpc.net/problem/15686 풀이 방법M개의 치킨 집을 선택하는 과정에서 순서에 상관없는 조합을 이용해야 한다.조합을 구하기 위해 백트레킹 dfs를 사용했다.아래의 코드에서 chosen 배열에 넣은 후 dfs를 수행하고 chosen배열에서 pop을 통해 백 트레킹을 수행했다. 치킨 거리 계산은 그냥 유클리드 계산으로 수행하면 된다. N, M = map(int, input().split()) ## N, M 입력받기city = []for i in range(N): ## city 입력 받기 city.append(input().split())house = []store = []chosen = []ans = 987654321for i in range(N): #..

Algorithm 2024.08.04

[백준] 줄 세우기 2252 (python) 위상정렬

출처 : https://www.acmicpc.net/problem/2252 풀이 방법위상 정렬 알고리즘을 통해 풀이할 수 있다.위상 정렬 알고리즘이란 그래프에서 우선순위가 있는 작업을 할 때 순서를 정해주는 알고리즘이다 답이 여러 개가 될 수 있다.조건으로 사이클이 없어야 한다. 또한 최우선순위인 시작 점이 존재해야한다.진입 점이 0인 점을 큐에 넣어서 시작점으로 지정한다.큐에서 하나를 pop 하고 이와 연결된 노드의 진입 점을 -1 한다.만약 2번에서 진입 점을 -1 한 노드의 진입점이 0이면 큐에 추가한다.위 2~3번 과정을 N번 반복하는데 만약 N번 반복하기 전에 큐에 empty가 되면 사이클이 존재하는 경우이다.코드from collections import dequeN, M = map(int, i..

Algorithm 2024.07.28

[백준] 전깃줄 2565번 (python) LSB

출처 : https://www.acmicpc.net/problem/2565 풀이 방법전깃줄이 갖아 길게 안 꼬이는 경우를 찾으면 된다.와이어 A를 기준으로 연결된 쌍을 정렬한 뒤 B의 최장 증가 부분 수열을 구한 후 이를 원본 쌍에서 빼주면 된다. 1. 먼저 모든 연결된 쌍을 입력받는다.2. 와이어 A를 기준으로 정렬한다.3. 와이어 B를 저장하는 배열을 생성한다.4. 와이어 B를 탐색하며 만약 최장증가 부분 수열의 임시 배열인 lsb_arr의 마지막 원소보다 크다면 뒤에 추가한다.5. 크지 않다면 lsb_arr에서 현재 원소가 들어갈 인덱스를 이분탐색을 통해 구한 후 추가해 준다.6. lsb_arr의 길이를 구하면 이것이 최장 증가 부분 수열의 길이이다. N = int(input())wire = [] ..

Algorithm 2024.07.20

스프링에서 GPT API로 이미지 전송하기

개요스프링에서 GPT-4o API를 활용해 이미지를 전송하고 답변을 받아보자.  yml먼저 GPT 설정을 위해 yml파일을 작성하자 openai: model: gpt-4o api: key: token url: https://api.openai.com/v1/chat/completions model과 gpt 사이트에서 발급받은 key를 token에 넣어 둔 후 API를 요청할 url을 작성한다.   이미지 인코딩하기GPT에 요청을 하려면 이미지를 base64로 인코딩을 해야 한다. 이를 위해 ImageUtils 클래스를 만들어 MultipartFile이미지를 인코딩 하자 public class ImageUtils { public static String encodeImageToBase64..

스프링 2024.07.19

테스트에서만 필요한 메서드가 생겼을 때는?

개요테스트를 진행하며 Product코드에서는 필요 없지만 Test를 진행하기 위해 필요한 메서드가 생겼을 경우는 어떻게 해야 할까에 대한 고민을 해보았다. 본론이에 대한 결론은 만들어도 된다 였다. 하지만 보수적으로 만들어야 한다.기본적으로 Test를 위해 코드를 무작위로 작성하는 것은 피해야 한다. 아래의 예시를 보자 아래의 코드에서 ProductCreateRequest의 builder는 Product코드에서는 필요가 없다.자동으로 주입되기 때문이다. 하지만 테스트를 위해 필요한 코드로 생각이 된다. @PostMapping("/api/v1/products/new")public ApiResponse createProduct(@Valid @RequestBody ProductCreateRequest requ..

TestCode 2024.07.18

private 메서드 테스트

개요private메서드를 테스트하고 싶은 경우가 있을 때 어떻게 진행해야 하는지 알아보려고 한다. 본론1. 할 필요가 없다. (하려고 해서도 안된다.)2. 만약 필요하다면 객체를 분리할 시점인가를 고민해야 한다. 먼저 1번의 경우에 대해 알아보자 아래의 코드는 createNectProductNumber이라는 private 메서드가 존재하는데 이 메서드의 역할은 카페 키오스크에서 새로운 상품이 등록될 때 기존 상품의 마지막 번호에 +1 해서 return 하는 메서드이다. ex) 아메리카노 001 , 빵 002 , 라떼 003이라는 상풍 번호를 가지고 있을 때 케이크를 추가하려면 위 메서드를 사용해 004라는 상품 번호로 등록하게 된다.  @RequiredArgsConstructor@Service@Trans..

TestCode 2024.07.18

테스트 Spring boot 띄어지는 수 줄이기

개요테스트 코드를 실행하면 Spring boot 서버가 여러 번 다시 띄어지게 된다.이에 Test 실행 시간이 길어져 서버를 통합하여 Spring boot가 실행되는 수를 줄이고자 한다. 방법기존에는 대략 6번 정도의 서버가 실행되었다.이는 각 Test가 다른 SpringBootTest가 되어있기 때문이었다. (환경이 조금이라도 달라지면 새로 띄운다 ex) MockBean이 있으면 다른 환경이라고 생각) 이를 공통 클래스로 빼어서 상속받는 구조로 바꾸어 서버 실행 수를 줄이고자 한다. 기존각 Test마다 아래와 같이 되어있다.@ActiveProfiles("test")@SpringBootTestclass OrderServiceTest { Test 하위에 IntegrationTestSupport를 두고 이 ..

TestCode 2024.07.18

테스트 팁

한 문단에 한 주제보통 글을 작성할 때 한 문단에 하나의 주제를 두고 작성하라고 많이 듣는다.테스트 또한 하나의 테스트는 하나의 주제만을 가지고 테스트를 하면 좋다. 즉 하나의 테스트 안에 여러 가지를 테스트하는 것이 아닌 테스트를 분리하는 것이 좋다. 테스트 환경의 독립성을 보장하자최대한 생성자를 이용해서 given을 작성하자 내부 함수를 사용해서 given을 작성하는 경우 내부 함수에 대한 이해가 추가적으로 필요하고 내부 함수에서 오류가 발생할 수 있다.테스트 간 독립성을 보장하자두 가지 이상의 테스트는 하나의 자원을 공유하면 안 된다.즉 static 한 변수를 공유해서 테스트를 하면 테스트 간 영향을 주니 사용하지 않아야 한다.또 테스트간 순서에 상관이 없어야 한다. 어떤 테스트가 먼저 실행되어야 ..

TestCode 2024.07.17