본문 바로가기

전체 글

(273)
[DB] ORDER BY에서 별칭을 사용할 때 주의할 점 쿼리를 작성할 때 정렬(ORDER BY) 단계에서 주의해야 할 점이 있다. 다음 문제를 보자. https://school.programmers.co.kr/learn/courses/30/lessons/284531 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 이 문제는 데이터를 노선(ROUTE)별로 그룹화하여 합계와 평균을 구하는 집계 능력, 그리고 숫자 데이터에 반올림과 단위(km)를 붙이는 가공 능력을 동시에 요구한다. 이때 컬럼에 'km'라는 문자를 붙여버리면 컴퓨터는 이를 숫자가 아닌 문자열로 인식하여 정렬 결과가 꼬일 수 있다.따라서 다음과 같이 쿼리를 작성하면 틀렸다는 결과를 얻는다.SELECT ..
[오답노트] 프로그래머스 – 전화번호 목록 (2026-01-31) https://school.programmers.co.kr/learn/courses/30/lessons/42577?language=java# 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 이 문제는 정렬이나 해시를 사용해서 효율적으로 풀 수 있는 문제다. 전화번호가 최대 100만 개나 되기 때문에, 단순히 이중 반복문을 사용해 모든 경우를 비교하면 O(N²)의 시간 복잡도가 되어 효율성 테스트를 통과할 수 없다. ❌ 오답import java.util.*;class Solution { public boolean solution(String[] phone_book) { Set set = new H..
[오답노트] 백준 17140번 – 이차원 배열과 연산 (2026-01-22) https://www.acmicpc.net/problem/17140 1. 연산 선택현재 배열의 행의 개수와 열의 개수를 비교하여 R 연산 또는 C 연산을 수행2. 정렬 규칙숫자의 등장 횟수가 적은 순으로 정렬횟수가 같다면 숫자 값이 작은 순으로 정렬정렬된 결과는 [수1, 횟수1, 수2, 횟수2, ...] 형태로 다시 배열에 저장숫자 0은 정렬 시 무시3. 크기 관리각 행/열을 정렬한 후 가장 긴 길이를 기준으로 배열의 크기를 갱신나머지 빈칸은 0으로 채움크기가 100을 넘어가면 100개까지만 남기고 자름4. 반복 및 종료매 초마다 A[r][c] == k인지 확인 (배열 인덱스가 1부터 시작함에 주의)100초가 넘어가면 -1을 출력 ⚠️ 주의: A[r][c]를 확인할 때 r이나 c가 현재 배열의 유효 ..
[오답노트] 백준 5582번 – 공통 부분 문자열 (2026-01-20) https://www.acmicpc.net/problem/5582 이 문제는 최장 공통 부분 문자열(LCS, Longest Common Substring)을 구하는 문제다.최장 공통 부분 수열(Longest Common Subsequence) 문제와 혼동하곤 하는데, 이 문제의 핵심은 "연속적이어야 한다"는 점이다. 두 문자열을 s1, s2라고 할 때, dp[i][j]를 s1의 i번째 문자열과 s2의 j번째 문자열에서 끝나는 최장 공통 부분 문자열의 길이라고 정의한다. 1. 두 문자가 같을 때이전 문자들까지의 공통 길이에 1을 더한다.dp[i][j] = dp[i-1][j-1] + 12. 두 문자가 다를 때연속적이어야 하므로 공통 부분 문자열이 끊긴다.dp[i][j] = 0 ❌ 오답import java.i..
[오답노트] 백준 21608번 – 상어 초등학교 (2026-01-16) https://www.acmicpc.net/problem/21608 1. 데이터 구조 선택각 학생이 좋아하는 학생 4명을 빠르게 조회하기 위해 Map> 또는 인접 리스트 배열을 사용교실 자리는 N × N 2차원 배열로 관리2. 규칙 적용 (우선순위)1순위: 인접한 칸 중 좋아하는 학생이 가장 많은 칸2순위: (1순위 만족 칸 중) 인접한 빈칸이 가장 많은 칸3순위: (2순위 만족 칸 중) 행 번호가 작은 칸4순위: (3순위 만족 칸 중) 열 번호가 작은 칸모든 칸을 순회하며 이 조건들을 비교하여 최적의 위치를 찾음3. 만족도 계산모든 자리가 정해진 후, 다시 전수 조사를 하며 인접한 칸에 좋아하는 학생이 몇 명인지 계산하여 점수를 합산함 ❌ 오답import java.io.*;import java.uti..
[오답노트] 백준 17472번 – 다리 만들기 2 (2026-01-15) https://www.acmicpc.net/problem/17472 1. 섬 식별 (BFS)격자판에서 연결된 땅들을 찾아서 각 섬에 번호(1번 섬, 2번 섬...)를 붙여 구분한다.2. 간선(다리) 추출모든 섬의 해안가에서 상하좌우 네 방향으로 다리를 놓아본다.조건: 다리의 길이는 2 이상이어야 하며, 중간에 다른 섬을 만나지 않고 목적지 섬에 닿아야 한다.섬 A와 섬 B를 연결하는 여러 다리 중 가장 짧은 길이를 간선 가중치로 저장한다.3. 최소 신장 트리(MST) 구하기추출된 다리 정보들을 바탕으로 모든 섬을 연결하는 최소 비용을 구한다. (크루스칼 또는 프림 알고리즘 사용)주의: 모든 섬이 연결되지 않는 경우 -1을 출력한다. ❌ 오답import java.io.*;import java.util...
[오답노트] 백준 4386번 – 별자리 만들기 (2026-01-15) https://www.acmicpc.net/problem/4386 1. 핵심 포인트모든 별을 최소 비용으로 연결해야 함즉, 최소 신장 트리(MST, Minimum Spanning Tree) 문제!2. 그래프 구성정점(Node): 각각의 별간선(Edge): 모든 별과 별 사이의 거리비용(Weight): 두 별 사이의 거리 sqrt((x1 - x2)^2 + (y1 - y2)^2)3. 알고리즘 선택별의 개수(n)가 최대 100개로 매우 적음이 경우 모든 별 사이의 간선을 미리 계산해도 간선의 개수는 C(n, 2) ≈ 5,000개 미만크루스칼(Kruskal) 알고리즘 혹은 프림(Prim) 알고리즘 둘 다 사용 가능 ❌ 오답import java.io.*;import java.util.*;public class ..
[오답노트] 백준 11559번 – Puyo Puyo (2026-01-05) https://www.acmicpc.net/problem/11559 이 문제는 전형적인 시뮬레이션과 BFS를 결합한 문제다.뿌요뿌요의 핵심 로직인 '연결된 뿌요 찾기', '터뜨리기', '중력 처리'를 반복하면 해결할 수 있다. 1. 전체 루프 (연쇄 카운트)더 이상 터질 뿌요 그룹이 없을 때까지 과정을 반복한다.한 번의 루프가 끝날 때마다 연쇄를 1씩 증가시킨다.2. 뿌요 찾기 및 터뜨리기 (BFS)보드 전체를 탐색하며 아직 방문하지 않은 뿌요를 발견하면, 같은 색깔이 상하좌우로 몇 개 연결되어 있는지 확인한다.연결된 개수가 4개 이상이라면 해당 뿌요들을 제거한다.3. 중력 적용터진 자리에 빈칸(.)이 생기면, 위에 떠 있는 뿌요들을 바닥부터 차곡차곡 쌓이도록 아래로 내린다. ❌ 틀린 풀이import j..
[오답노트] 백준 20055번 – 컨베이어 벨트 위의 로봇 (2026-01-03) https://www.acmicpc.net/problem/20055 이 문제는 시뮬레이션 유형으로, 문제에서 제시한 4가지 단계를 순서대로 정확하게 구현하는 것이 핵심이다.컨베이어 벨트가 원형으로 연결되어 있으므로 배열을 회전시키거나 인덱스를 조절하는 로직이 필요하다. 1. 데이터 구조durability: 각 칸의 내구도를 저장하는 배열 (크기: 2N)hasRobot: 로봇이 해당 칸에 있는지 여부를 저장하는 배열 (크기: N)로봇은 위쪽 벨트(0 ~ N - 1 인덱스)에만 존재할 수 있으므로 N 크기면 충분하다.2. 회전내구도 배열과 로봇 배열을 모두 시계 방향으로 한 칸 이동시킨다.⚠️ 주의: 로봇이 내리는 위치(N - 1 인덱스)에 도달하면 그 즉시 내려야 한다.3. 로봇 이동가장 먼저 올라간 로봇..
[Spring DB] @Transactional – 트랜잭션 전파 (Propagation) 스프링 트랜잭션의 핵심은 @Transactional을 통한 AOP 기반의 선언적 트랜잭션 관리다.하지만 여러 트랜잭션이 복잡하게 얽힌 상황, 예를 들어 트랜잭션이 진행 중인 메서드 안에서 새로운 트랜잭션이 필요한 다른 메서드를 호출하는 경우에는 어떻게 동작해야 할까? 이때 필요한 개념이 바로 트랜잭션 전파다. 🧩 트랜잭션 전파란 무엇인가? 트랜잭션 전파(Propagation)란, 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때, 새로운 트랜잭션 메서드를 어떻게 동작시킬지 결정하는 규칙이다.쉽게 말해, 하나의 트랜잭션 작업(예: 주문 처리) 중에 다른 트랜잭션 작업(예: 로그 기록)을 호출했을 때,이 두 트랜잭션을 하나의 큰 트랜잭션으로 묶을 것인지, 아니면 별개의 트랜잭션으로 처리..
[Spring DB] @Transactional – 주요 옵션 @Transactional은 단순히 "트랜잭션을 걸어준다"는 의미 이상으로, 여러 속성(옵션)을 통해 트랜잭션의 전파, 격리, 롤백 동작 등을 정교하게 제어할 수 있다.public @interface Transactional { // 사용할 트랜잭션 매니저 지정 String value() default ""; // transactionManager 옵션과 동일 // 트랜잭션 전파 수준 지정 Propagation propagation() default Propagation.REQUIRED; // 트랜잭션 격리 수준 지정 Isolation isolation() default Isolation.DEFAULT; // 트랜잭션 수행 제한 시간 지정 ..
[카카오 기출문제] 표현 가능한 이진트리 – 트리, 재귀, 문자열 https://school.programmers.co.kr/learn/courses/30/lessons/150367 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr ✅ 문제 해결 전략 숫자를 포화 이진트리 형태의 이진 문자열로 변환먼저 주어진 십진수(number)를 이진 문자열로 변환한다.문제의 규칙에 따라 이진수는 포화 이진트리(Perfect Binary Tree)로 표현된다.포화 이진트리의 노드 개수는 항상 2^h - 1 (h는 높이) 형태다. (예: 1, 3, 7, 15, 31, ...)변환된 이진 문자열의 길이가 2^h - 1 이 되도록, 길이가 모자란다면 앞에 '0'을 채워 넣어 포화 이진트리 노드 수에..
[카카오 기출문제] 주사위 고르기 – 조합, 완전 탐색, 이진 탐색 (lower bound) https://school.programmers.co.kr/learn/courses/30/lessons/258709 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr ✅ 문제 해결 전략 이 문제는 주어진 조건에 따라 A가 이길 확률을 최대로 만드는 주사위 조합을 찾는 문제다.주사위의 총개수(n)가 최대 10개로 매우 작기 때문에, 가능한 모든 주사위 조합을 탐색하는 완전 탐색 방식으로 접근할 수 있다. A의 주사위 조합 생성n개의 주사위 중 A가 가져갈 n / 2개의 주사위를 선택하는 조합을 구한다.재귀 함수를 이용한 DFS 방식으로 모든 조합을 효율적으로 생성할 수 있다.각 조합에 대한 모든 점수 합계 계산A의 ..
[카카오 기출문제] 이모티콘 할인행사 – 완전 탐색 (브루트포스) https://school.programmers.co.kr/learn/courses/30/lessons/150368 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr ✅ 문제 해결 전략 이 문제는 가능한 모든 할인율 조합을 탐색하여 목표에 가장 부합하는 결과를 찾는 완전 탐색(Brute-force) 문제다.이모티콘의 최대 개수가 7개로 매우 적기 때문에, 각 이모티콘에 대해 4가지(10%, 20%, 30%, 40%) 할인율을 모두 적용해볼 수 있다. 모든 할인율 조합 생성 (완전 탐색)이모티콘이 m개 있고, 각 이모티콘에 적용할 수 있는 할인율이 4가지이므로, 총 4^m개의 조합이 존재한다.이모티콘 개수가 최대 7..
[Java] 배열(Array)과 컬렉션(Collection)의 정렬 방식 1️⃣ 배열(Array) 정렬배열은 java.util.Arrays 클래스의 정적 메서드 sort()를 이용해 정렬한다.기본적으로 오름차순 정렬이며, 내림차순 정렬 시에는 Comparator를 함께 사용해야 한다. 1. 기본 타입 배열 (int[], double[] 등)import java.util.Arrays;public class ArraySortExample { public static void main(String[] args) { int[] numbers = {5, 2, 9, 1, 7}; // 오름차순 Arrays.sort(numbers); // 내림차순 // 기본 타입 배열은 Comparator를 직접 적용할 수 없음 → 박싱 ..
동시성 제어 – synchronized, 비관적 락, 원자적 UPDATE 패턴 선착순 쿠폰을 여러 사용자가 동시에 다운로드하는 시나리오를 가정해 보자.사용자는 /api/coupons/{couponId}/download API를 호출하여 쿠폰을 다운로드한다.쿠폰은 선착순으로 발급되며, 발급 가능한 수량(totalQuantity)이 한정되어 있다.여러 사용자가 동시에 요청하더라도 쿠폰 발급 수량을 초과하지 않아야 한다. 🧩 1. 엔티티package com.example.coupon.domain;import jakarta.persistence.*;import lombok.Getter;import lombok.NoArgsConstructor;@Entity@Getter@NoArgsConstructorpublic class Coupon { @Id @GeneratedValue(st..
[카카오 기출문제] 택배 배달과 수거하기 – 그리디 https://school.programmers.co.kr/learn/courses/30/lessons/150369 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr ✅ 문제 해결 전략 이 문제는 그리디 알고리즘을 사용하여 해결할 수 있다.최소 이동 거리를 구하기 위해서는 가장 먼 집부터 배달 및 수거를 처리하여, 먼 거리를 여러 번 왕복하는 경우를 피하는 것이 핵심이다. 역순 탐색가장 먼 집(n번째)부터 물류창고 쪽으로 이동하면서 배달/수거 작업을 처리한다.이렇게 하면 가장 비싼 비용(긴 이동 거리)이 드는 왕복을 최소화할 수 있다.필요 작업량 누적먼 집부터 탐색하면서, 현재 처리해야 할 배달량과 수거량을 계속 ..
[카카오 기출문제] 개인정보 수집 유효기간 – 구현, 문자열 https://school.programmers.co.kr/learn/courses/30/lessons/150370 문제 설명고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.당신은 오늘 날짜로 파기해야 할 개인정..
[Java] List<Integer> ↔ int[] 변환 방법 1️⃣ List → int[] 변환 ✅ Java 8 이상 – Stream API 사용 (권장)List list = Arrays.asList(1, 2, 3, 4, 5);int[] arr = list.stream() .mapToInt(Integer::intValue) .toArray(); list.stream() → 스트림 생성.mapToInt(Integer::intValue) → Integer를 int로 언박싱.toArray() → 배열로 변환내부적으로 박싱/언박싱 연산이 포함되어 있어, 아주 큰 리스트에서는 미세한 오버헤드 존재 ✅ for문을 이용한 수동 변환List list = Arrays.asList(1, 2, 3, 4, 5);int[] arr =..
[카카오 기출문제] 도넛과 막대 그래프 – 그래프 차수 분석 https://school.programmers.co.kr/learn/courses/30/lessons/258711 문제 설명도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프들이 있습니다. 이 그래프들은 1개 이상의 정점과, 정점들을 연결하는 단방향 간선으로 이루어져 있습니다.크기가 n인 도넛 모양 그래프는 n개의 정점과 n개의 간선이 있습니다. 도넛 모양 그래프의 아무 한 정점에서 출발해 이용한 적 없는 간선을 계속 따라가면 나머지 n-1개의 정점들을 한 번씩 방문한 뒤 원래 출발했던 정점으로 돌아오게 됩니다. 도넛 모양 그래프의 형태는 다음과 같습니다.크기가 n인 막대 모양 그래프는 n개의 정점과 n-1개의 간선이 있습니다. 막대 모양 그래프는 임의의 한 정점에서 출발해 간선을 계속 따라가면 ..
[Java] 주요 자료구조 클래스의 핵심 메서드 🧩 1. String (불변 객체)문자열을 다루는 클래스 (java.lang.String) length(): 문자열 길이 반환charAt(int index): 특정 인덱스 문자 반환indexOf(String s) / lastIndexOf(String s): 특정 문자(열) 위치 찾기substring(int begin, int end) / substring(int begin): 부분 문자열 추출 (begin ~ end-1 / begin ~ 끝까지)toLowerCase() / toUpperCase(): 대소문자 변환contains(String s): 포함 여부 확인startsWith() / endsWith(): 접두사, 접미사 검사split(String regex): 구분자로 분리해 String[] 반환r..
[카카오 기출문제] 가장 많이 받은 선물 – 구현 선물을 직접 전하기 힘들 때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다.두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.예를 들어 A가 B에게 선물을 5번 줬고, B가 A에게 선물을 3번 줬다면 다음 달엔 A가 B에게 선물을 하나 받습니다.두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.예를 들어 A..
[오늘의 백준 문제] 15681번 트리와 쿼리 – 트리, DFS, DP https://www.acmicpc.net/problem/15681 간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자.정점 U를 루트로 하는 서브트리에 속한 정점의 수를 출력한다.만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자.9 5 31 34 35 45 66 72 39 66 8548트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 10^5, 1 ≤ R ≤ N, 1 ≤ Q ≤ 10^5)이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V)이는 U와 V를 양 끝점으로 하는 간선이 트리에 속함을 의미한다.이어 Q줄에 걸쳐, 문제..
[오늘의 백준 문제] 1761번 정점들의 거리 – 트리, 최소 공통 조상 (LCA) https://www.acmicpc.net/problem/1761 N(2 ≤ N ≤ 40,000)개의 정점으로 이루어진 트리가 주어지고 M(1 ≤ M ≤ 10,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.71 6 136 3 93 5 74 1 32 4 204 7 231 61 42 6첫째 줄에 노드의 개수 N이 입력되고 다음 N-1개의 줄에 트리 상에 연결된 두 점과 거리를 입력받는다. 그 다음 줄에 M이 주어지고, 다음 M개의 줄에 거리를 알고 싶은 노드 쌍이 한 줄에 한 쌍씩 입력된다. 두 점 사이의 거리는 10,000보다 작거나 같은 자연수이다.정점은 1번부터 N번까지 번호가 매겨져 있다.13336M개의 줄에 차례대로 입력받은 두 노드 사이의 거리를 출력한다. 💡 아이디..
[오늘의 백준 문제] 11437번 LCA – 트리, 최소 공통 조상 (LCA) https://www.acmicpc.net/problem/11437 N(2 ≤ N ≤ 50,000)개의 정점으로 이루어진 트리가 주어진다. 트리의 각 정점은 1번부터 N번까지 번호가 매겨져 있으며, 루트는 1번이다.두 노드의 쌍 M(1 ≤ M ≤ 10,000)개가 주어졌을 때, 두 노드의 가장 가까운 공통 조상이 몇 번인지 출력한다.151 21 32 43 76 23 84 92 55 117 1310 411 1512 514 766 1110 92 67 68 138 15첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정점 쌍이 주어진다.242131M개의 줄에 차례대..
[Spring DB] 스프링 트랜잭션 @Transactional 사용 시 주의점 🧩 스프링 트랜잭션의 핵심: 추상화와 AOP 트랜잭션 추상화 (PlatformTransactionManager)각각의 데이터 접근 기술(JDBC, JPA 등)은 트랜잭션을 다루는 코드가 다르다.스프링은 PlatformTransactionManager라는 인터페이스를 통해 트랜잭션 기능을 추상화한다.또한 각각의 데이터 접근 기술마다 PlatformTransactionManager 인터페이스를 구현한 클래스도 제공한다.스프링 부트는 현재 사용 중인 데이터 접근 기술을 자동으로 인식하여, 그에 맞는 구현체를 스프링 빈으로 등록해 준다.따라서 개발자는 이 인터페이스에만 의존하면 된다.선언적 트랜잭션 관리 (@Transactional과 AOP)트랜잭션 매니저를 직접 사용하여 트랜잭션을 다룰 수도 있지만, 비즈니..
[Spring DB] Querydsl ❌ 동적 쿼리와 문자열 쿼리의 한계 JdbcTemplate, MyBatis, JPA(JPQL)와 같은 기존 데이터 접근 기술들은 다음과 같은 공통적인 약점을 가지고 있다.동적 쿼리 작성의 어려움:검색 조건이 다양하게 조합되는 동적 쿼리를 작성하기가 매우 복잡하다.자바 코드에서 if 문으로 SQL 문자열을 조립하거나, XML에서 복잡한 태그를 사용해야 한다.문자열 기반 쿼리의 한계:SQL이나 JPQL은 결국 문자열이다.따라서 쿼리에 오타가 있어도 컴파일 시점에는 오류를 잡을 수 없고, 애플리케이션이 실행된 후에야 런타임 오류가 발생한다. Querydsl은 바로 이 두 가지 문제를 해결하기 위해 등장한 쿼리 빌더 라이브러리다. 🧩 Querydsl: 쿼리를 Java 코드로, Type-Safe하게 Queryd..
[Spring DB] 스프링 데이터 JPA (Spring Data JPA) 🧩 스프링 데이터 JPA의 등장: 반복의 종말 이전의 순수 JPA 리포지토리는 JdbcTemplate이나 MyBatis에 비해 많은 발전을 이루었지만,여전히 개발자는 각 엔티티마다 em.persist(), em.find() 등 기본적인 CRUD 코드를 반복적으로 작성해야 한다. 스프링 데이터 JPA는 이러한 반복적인 리포지토리 구현을 제거하기 위해 등장한, JPA를 더욱 편리하게 사용하도록 도와주는 기술이다.따라서 개발자는 더 이상 리포지토리의 구현 클래스를 작성할 필요가 없다. 🧩 스프링 데이터 JPA의 핵심 기능 1. 공통 인터페이스 (JpaRepository)save(), findById(), findAll(), delete() 등 대부분의 DB에 대한 공통 메서드를 모아 JpaRepositor..
[Spring DB] JPA (Java Persistence API) 🧩 ORM과 JPA: 왜 SQL에서 객체로 패러다임이 전환되었나? JdbcTemplate이나 MyBatis와 같은 SQL Mapper 기술은 JDBC의 반복 작업을 줄여주었지만,여전히 개발자가 SQL을 직접 작성해야 하는 한계가 있다. 이는 애플리케이션의 객체 모델과 데이터베이스의 관계형 모델 사이에 불일치가 발생하며,개발자는 객체를 SQL로, SQL 결과를 다시 객체로 변환하는 반복적이고 지루한 작업을 계속해야 한다.이러한 SQL 중심 개발의 문제점을 해결하기 위해 ORM(Object-Relational Mapping) 기술이 등장했다.ORM은 이름 그대로 애플리케이션의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑해주는 기술이다.JPA(Java Persistence API)는 이러한 ORM 기..
[Spring DB] MyBatis 🧩 MyBatis: SQL 중심의 데이터 접근 기술 MyBatis는 JdbcTemplate과 같이 SQL을 직접 다루는 SQL Mapper 기술이다.하지만 JdbcTemplate보다 더 많은 편의 기능, 특히 동적 쿼리 작성과 SQL의 분리 측면에서 강력한 장점을 가진다. JdbcTemplate vs MyBatisSQL 작성:JdbcTemplate: SQL을 자바 코드 내에서 문자열로 작성해야 하므로, 여러 줄의 복잡한 SQL을 다루기 불편하다.MyBatis: SQL을 별도의 XML 파일에 작성하므로, SQL 자체에만 집중할 수 있고 가독성이 높다.동적 쿼리 작성:JdbcTemplate: 자바 코드에서 수많은 if 문과 문자열을 조립해야 하므로, 복잡하고 오류가 발생하기 쉽다.MyBatis: 동적 쿼리..