java 39

[트러블슈팅] JSON 응답 필드 순서 고정하기 (JsonPropertyOrder)

상황OrderMenuResponse의 JSON 응답 필드 순서가 의도한 대로 나오지 않았다. subtotalPrice가 중간에 출력되어 가독성이 떨어졌다.{ "menuName": "아메리카노", "quantity": 2, "subtotalPrice": 9000, "unitPrice": 4500}해결 방법@JsonPropertyOrder 어노테이션을 사용하면 JSON 응답의 필드 출력 순서를 고정할 수 있다.@Getter@JsonPropertyOrder({"menuName", "unitPrice", "quantity", "subtotalPrice"})public class OrderMenuResponse { private final String menuName; private final ..

[Spring AI] Chat Memory(대화 기억)

Chat Memory이전 대화를 저장하고 프롬프트에 포함시키는 역할을 수행-> LLM의 무상태성을 극복하여 LLM이 맥락을 이해하도록 하는 핵심 기술undefined Spring AI의 Chat Memory 구조classDiagram class ChatMemoryAdvisor { > 프롬프트에 기억을 추가하는 전략 } class ChatMemory { > 메시지 윈도우 관리 } class ChatMemoryRepository { > 실제 저장소 구현 } class MessageChatMemoryAdvisor { 메시지 모음으로 추가 } class PromptChatMem..

[알고리즘] 2016년

문제 본문 (Problem Presentation)2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.제한 조건2016년은 윤년입니다.2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)나의 풀이 (My Solution)3줄 접근 (3-sentence approach)핵심 접근"1월 1일을 기준점(0일 경과)"으로 삼아, 목표 날..

카테고리 없음 2026.03.23

[알고리즘] 콜라 문제: 수학적으로 닫힌 공식으로 환원하기

문제 본문오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.정답은 아무에게도 말하지 마세요.콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다. ..

Algorithm 2026.03.17

[Test] 분명 사용되지 않아서 지웠는데, 왜 테스트가 실패할까?

요약@MockBean private JwtTokenProvider jwtTokenProvider가 사용되지 않아 삭제했더니, 테스트가 모두 실패했다.알고보니 @Import(SecurityConfig.class)에 의해서 SecurityConfig가 실제로 로드되는데, 내부적으로 JwtTokenProvider를 빈으로 주입받기 때문에 이를 삭제할 경우 SecurityConfig가 정상적으로 로드되지 않아 발생한 문제였다.그럼 여기서 본질적인 궁금증: 애초에 왜 @Import를 통해 SecurityConfig.class를 명시적으로 불러왔어야 했나?@Import는 지정한 클래스를 빈으로 강제 등록하는 어노테이션이다.@WebMvcTest는 웹 레이어 빈만 로드하기에(@Controller, @Controller..

[Github] Runner 서버에 Docker를 설치해야 할까?

요약Github Actions의 hosted runner(예: ubuntu-latest)에는 Docker가 기본적으로 설치되어 있다. 따라서 services 블록에 이미지를 명시하면 Github Actions가 내부적으로 Docker를 사용해 컨테이너를 자동으로 띄워준다.jobs: test: runs-on: ubuntu-latest # 여기에 Docker가 이미 포함되어 있음 services: redis: image: redis:7 # GitHub Actions가 알아서 docker pull → docker run ports: - 6379:6379 options: >- --health-cmd "red..

[알고리즘] 푸드 파이트 대회 - StringBuilder, repeat(), reverse()

문제 본문수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 ..

Algorithm 2026.03.11

[알고리즘] 가장 가까운 같은 글자 찾기: HashMap으로 이중 루프 예방하기

문제 본문문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 ..

Algorithm 2026.03.06

[알고리즘] 두 개 뽑아서 더하기: Set 인터페이스 활용

문제 요구사항정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.제한사항numbers의 길이는 2 이상 100 이하입니다.numbers의 모든 수는 0 이상 100 이하입니다. 3줄 접근서로 다른 인덱스에 있는 모든 두 수를 더하고, 순서를 보장해 주는 Treeset에 더한다.set에 담긴 요소들을 배열에 복사한다.배열을 출력한다.나의 풀이import java.util.Set;import java.util.TreeSet;class Solution { public int[] solution(int[] numbers) { ..

Algorithm 2026.03.05

[Spring Plus] JPQL을 Querydsl로 변환하기

목표JPQL로 작성된 아래 메서드의 쿼리문을 Querydsl로 변환하자. 상황1. Todo 조회 시 연관된 엔티티인 user를 left join으로 가져옴: N+1 문제 발생 가능2. Querydsl 관련 종속성 및 QuerydslConfig 없음: 추가 필요3. 연관 객체로 가져오는 user의 데이터 중에서 일부만 사용하여 dto로 재가공: db에서 조회할 때부터 dto projection 적용 해결 방법1. build.gradle에 종속성 추가 2. QuerydslConfig.java 파일 추가 3. TodoCustomRepository.java 및 Querydsl 적용할 db 조회 메서드 생성 4. 3의 구현체인 TodoCustomRepositoryImpl 및 Querydsl 쿼리문 작성 5. ..