전체 글 238

Outbox Pattern으로 트랜잭션 일관성 보장하기

마이크로서비스 아키텍처에서 이벤트 기반 통신을 사용할 때 가장 큰 고민 중 하나는 **트랜잭션 일관성**입니다. ## 문제 상황일반적으로 다음과 같은 코드를 작성하게 됩니다.@Transactionalpublic void createArticle(ArticleCreateRequest request) { // 1. 데이터베이스에 저장 Article article = articleRepository.save(new Article(...)); // 2. Kafka에 이벤트 발행 kafkaTemplate.send("article-created", event);}하지만 이 코드에는 심각한 문제가 있습니다. 문제 1: 트랜잭션 실패 시 메시지 발행만약 데이터베이스 저장 후, 트랜잭션이 ..

백준 1717: 집합의표현(유니온 파인드)

유니온-파인드란?유니온-파인드는 여러 원소들을 그룹, 즉 집합으로 나누었을 때 두 가지 연산을 효율적으로 처리하는 자료구조 알고리즘입니다.Union (합치기): 두 원소가 속한 집합을 하나로 합치는 연산Find (찾기): 특정 원소가 속한 집합의 대표 원소(루트)를 찾는 연산이 두 가지 연산을 어떻게 구현하는지에 따라 알고리즘의 효율성이 크게 달라져요. 백준 1717번 문제는 이 두 연산을 직접 구현해봐야 합니다. 문제 해결을 위한 핵심 로직문제를 풀기 위해선 먼저 각 원소의 '부모' 정보를 담는 배열 parent를 만들어야 합니다. 이 배열 하나로 모든 것을 해결할 수 있어요.초기화처음에는 모든 원소가 각자 하나의 독립적인 집합을 이룹니다. 따라서 parent[i]의 값은 자기 자신인 i로 초기화합니..

Algorithm 2025.09.04

자바 다형성(Polymorphism) 완벽 이해하기

다형성이란 무엇인가?다형성(Polymorphism)은 한자 그대로 '여러 가지(多) 형태(形)를 가질 수 있는 성질(性)'을 의미합니다. 자바에서는 하나의 객체가 여러 가지 타입을 가질 수 있다는 것을 뜻해요.이게 무슨 말인지 와닿지 않으시죠? 현실 세계의 예시로 이해해 봅시다.동물이라는 큰 틀이 있다고 생각해 보세요. 이 동물이라는 개념은 강아지, 고양이, 오리 등 다양한 실제 동물들을 포괄할 수 있습니다.강아지도 동물이다.고양이도 동물이다.오리도 동물이다.이처럼 강아지 객체는 강아지 타입이면서 동시에 동물 타입이 될 수 있습니다. 이것이 바로 다형성의 기본 원리입니다. 다형성이 주는 이점그냥 강아지는 강아지, 고양이는 고양이라고 하면 될 것을 왜 굳이 동물이라는 개념으로 묶는 걸까요?바로 코드의 유연..

Back_End/Java 2025.08.28

백준 17136번: 색종이 붙이기(자바)

문제를 처음 접했을 때, 떠올릴 수 있는 접근법은 '모든 경우의 수를 다 해보는 것'입니다. 10x10 격자의 모든 칸을 탐색하면서 1을 발견하면, 그 위치에 붙일 수 있는 색종이의 모든 경우를 시도하는 거죠. 이때, 가장 큰 색종이부터 붙여보는 게 효율적입니다. 왜냐하면 큰 색종이일수록 한 번에 덮는 면적이 넓어서 색종이 개수를 줄일 수 있는 가능성이 크기 때문이죠.이런 유형의 문제는 전형적인 백트래킹(Backtracking) 문제입니다. 특정 위치에 색종이를 붙인 다음, 다음 탐색을 진행하고, 만약 원하는 결과를 얻지 못하면 다시 색종이를 떼어내고 다른 경우를 시도해야 합니다. 재귀(DFS) 함수로 구현하기dfs(row, col, count)라는 재귀 함수를 만들어서 문제를 풀었습니다. // dfs..

Algorithm 2025.08.26

프로그래머스: 땅따먹기

문제 설명프로그래머스의 땅따먹기 문제(레벨 2) 는 다음과 같은 조건을 가진다:2차원 배열 land가 주어진다.각 행에서 하나의 열(0~3)을 선택해서 아래로 내려간다.단, 바로 전 행에서 선택한 열과 같은 열은 선택할 수 없다.마지막 행까지 내려갔을 때 얻을 수 있는 점수의 최댓값을 구해야 한다.int[][] land = { {1, 2, 3, 5}, {5, 6, 7, 8}, {4, 3, 2, 1}};​이 경우 가능한 모든 경로 중 최댓값 경로의 합을 찾아야 한다. 처음 생각한 풀이: DFS (깊이 우선 탐색)처음에는 다음과 같은 생각을 했다."각 행마다 4개 중 하나를 선택하되, 바로 위 열만 피하면 되니까 DFS로 모든 경우를 탐색하면 되겠네?"그래서 다음과 같이 DFS로 구현하였다..

Algorithm 2025.08.01

백준 14719번: 빗물

문제 설명2차원 세계에 벽이 쌓여있을 때, 빗물이 고일 수 있는 총량을 계산하는 문제입니다. 여기서 H는 높이, W는 너비를 의미합니다. 문제는 각 칸의 높이가 주어지며, 빗물은 양쪽의 벽이 높아야 고일 수 있습니다. 즉, 어떤 한 지점에 빗물이 고이려면 그 지점의 왼쪽에서 가장 높은 벽과 오른쪽에서 가장 높은 벽 중 더 낮은 벽의 높이보다 현재 지점의 높이가 낮아야 합니다. 고이는 빗물의 양은 min(왼쪽 최대 높이, 오른쪽 최대 높이) - 현재 높이로 계산됩니다. 예를 들어, 높이 배열이 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]이라면, 각 위치마다 왼쪽과 오른쪽의 최대 높이를 확인하여 빗물이 고이는지 판단하고 그 양을 합산해야 합니다. 자바코드import java.io.Buf..

Algorithm 2025.07.31

백준 2504번: 괄호의 값(JAVA)

문제 설명이 문제에서 주어지는 괄호 문자열은 다음과 같은 규칙을 가집니다.()는 2의 값을 가집니다.[]는 3의 값을 가집니다.(와 ) 사이에 유효한 괄호 문자열 X가 있다면, (X)는 2timesX의 값을 가집니다.[와 ] 사이에 유효한 괄호 문자열 X가 있다면, [X]는 3timesX의 값을 가집니다.유효한 괄호 문자열 X와 Y가 연결되어 있다면, XY는 X+Y의 값을 가집니다.예를 들어, (()[[]])([])와 같은 문자열이 주어졌을 때, 이 규칙에 따라 최종 값을 계산해야 합니다. 만약 올바르지 않은 괄호 문자열이거나 괄호의 짝이 맞지 않는다면 0을 출력해야 합니다. 스택(Stack) 사용이 문제를 해결하기 위해 스택(Stack) 자료구조를 선택한 이유는 괄호 문자열의 본질적인 특성 때문입니다...

Algorithm 2025.07.31

백준 1025번: 제곱수 찾기

'제곱수 찾기' 문제 설명'제곱수 찾기' 문제는 N*M 크기의 숫자판이 주어지면, 이 숫자판에서 시작 위치와 행/열의 등차를 정하여 숫자를 이어 붙였을 때 만들 수 있는 숫자 중 가장 큰 완전 제곱수를 찾는 문제입니다. 등차는 양수, 음수, 그리고 0도 가능하지만, 등차가 동시에 0인 경우는 제외됩니다. 즉, 같은 자리에서 움직이지 않는 경우는 고려하지 않습니다.예를 들어, 다음과 같은 숫자판이 있다고 가정해 봅시다.123456789만약 시작 위치가 (0,0)이고 행 등차가 1, 열 등차가 1이라면, 다음과 같은 숫자를 만들 수 있습니다.1 (1)15 (1, 5)159 (1, 5, 9)이 중에서 완전 제곱수를 찾아야 합니다. 자바코드import java.io.BufferedReader;import jav..

Algorithm 2025.07.31

JPA 심화(다형성 쿼리, Named 쿼리, 그리고 벌크 연산)

다형성 쿼리JPA의 다형성 쿼리는 상속 관계에 있는 엔티티들을 조회할 때 사용합니다. 부모 타입으로 조회하더라도 자식 타입의 데이터를 함께 가져올 수 있습니다.엔티티 직접 사용: JPQL(Java Persistence Query Language)에서 엔티티를 직접 사용하여 쿼리를 작성할 수 있습니다. 예를 들어, SELECT m FROM Member m과 같이 특정 엔티티 타입을 대상으로 쿼리를 작성하면, 해당 엔티티와 그 하위 타입의 모든 인스턴스를 조회할 수 있습니다.ID로 조회: 상속 관계의 엔티티를 ID로 조회할 때도 다형성을 활용합니다. 예를 들어, EntityManager.find(Parent.class, id)를 호출하면, 해당 ID를 가진 엔티티가 실제로는 어떤 자식 타입인지 JPA가 내부..

Back_End/JPA 2025.07.25

JPA 경로 표현식

JPA 경로 표현식이란?JPQL에서 경로 표현식은 엔티티 객체의 필드를 마치 객체의 멤버에 접근하듯이 점(.)을 이용하여 탐색하는 것을 의미합니다. 예를 들어, m.name에서 m은 Member 엔티티의 별칭이고, name은 Member 엔티티의 필드를 나타냅니다. 이는 우리가 자바 코드에서 member.getName()과 같이 객체의 속성에 접근하는 방식과 매우 유사합니다.이러한 경로 표현식을 통해 우리는 엔티티 내부의 필드뿐만 아니라, 연관 관계를 맺고 있는 다른 엔티티의 필드까지 탐색하여 데이터를 조회할 수 있습니다. 이는 객체지향적인 방식으로 데이터를 조회하고 필터링하는 데 매우 강력한 기능을 제공합니다. 경로 표현식의 종류와 특징상태 표현식 (State Field Path Expression)..

Back_End/JPA 2025.07.24