분류 전체보기
-
-
[JPA] 1+N 문제JPA 2025. 4. 26. 15:59
JPA는 ORM을 통해 객체지향적으로 SQL 쿼리문을 다루고 SQL 쿼리문을 우리가 직접 작성하지 않고 코드레벨에서 함수를 정의하면 이게 SQL 쿼리문으로 바꿔주는거잖임.근데 그때 JPA는 JOIN을 비효율적이라고 생각해서 일부러 JOIN을 안쓰고 select를 두 번 하는 상황을 거쳐서 데이터를 주도록 설계되어있어서 N+1 상황이 발생하는거임.N+1이 발생하는 이유 = JPA가 자체적으로 남발적인 JOIN을 사용하지 않도록 설계되어서 일부러 SELECT를 여러번 거치는 경우로 설계된 것이기 때문임. N+1 문제는 JPA가 객체지향적으로 Lazy Loading을 기본 채택하면서, 무분별한 JOIN을 막기 위해 설계된 결과로 생기는 현상이다."JOIN을 남발하지 않기 위해서" + "객체를 필요할 때 불러오..
-
[JPA] 즉시로딩 지연로딩 (FetchType)JPA 2025. 4. 26. 01:37
지연로딩 로딩되는 시점에 Lazy 로딩 설정이 되어있는 Team 엔티티는 프록시 객체로 가져온다. Member findMember = em.find(Member.class, member.getId());System.out.println(findMember.getTeam().getClass()); Member 조회 시 Team 객체의 클래스를 확인해보면 Proxy 객체가 조회됨. class hello.jpa.Team$HibernateProxy$e97rdqZR // 프록시 객체 하지만 팀의 이름을 출력하는 순간에는 실제 Team 엔티티를 참조해야하므로추가적인 쿼리가 나간다.System.out.println("TEAM NAME : " + findMember.getTeam().getName()); 즉 지연로딩..
-
[백준 2798] 블랙잭백준/DFS and 백트래킹 2025. 2. 4. 16:59
전형적인 DFS 사용한 조합론 문제이다. DFS 돌때 자신의 뒤 idx부터 호출하게 하고총 3개이면 조건판단해서 종료되게 하였다. 시간초과를 방지하기 위해3개를 조합하는 과정에서 M을 이미 넘어가게 되면 스킵하게 하였다 #include #include #include #define SIZE 101using namespace std;int N, M;vector arr;int ans = 0;void solve(int idx, int sum, int cnt){ // 종료조건이면 확인하고 return if(cnt == 3){ // 최신화가 안되어있었거나 지금꺼가 M에 더 가까우면 최신화 if (M - ans > M - sum) { ans = s..
-
[백준 3109] 빵집백준/DFS and 백트래킹 2025. 2. 4. 16:17
DFS만 쓰면 시간초과가 난다따라서 DP로 못가는 경로는 미리 막아두어 다음턴에도 해당 경로로 탐색이 불가능하게 해줘야한다 이미 지나간 경로도 map[newy][newx] = 1 로 마킹하고 길이 없는 경로도 1로 마킹되게 해서 접근하지 못하게 하였다.#include #include using namespace std;int R, C;bitset map[10001];// 오른쪽 대각선 위, 오른쪽, 오른쪽 대각선 아래 순서로int dy[3] = {-1, 0, 1};int dx[3] = {1, 1, 1};int dfs(int cury, int curx){ // 종점 도달이면 if (curx == C - 1) { map[cury][curx] = 1; return 1;..
-
[백준 1181] 단어 정렬백준/자료구조 2025. 2. 3. 12:59
priority_queue + unordered_map 조합을 사용해도 되고처음부터 set을 사용해서 정렬과 중복제한을 한번에 보장받아도 된다 set이 그냥 중복 허용을 안하는 집합인 것만 떠올리면 안되고내부적으로 이진트리로 구현되어 있어 정렬도 보장하는 것을 꼭 명심하고 있어야한다 그리고 pair로 저장되기 때문에각 stl에 맞게끔 커스텀 정렬기준을 정의해줘야한다 이때 priority_queue는 return true가 우선순위가 더 낮다는 것을set은 return true일때 우선순위가 더 높다는 것을 조심해야한다 https://www.acmicpc.net/problem/1181 1. priority_queue + unordered_map 사용#include #include #include using..
-
[Leet 1934] Confirmation RateLeet 2025. 1. 31. 20:12
이것도 GROUP BY로 통계내기 직전 CASE WHEN으로 특정 조건에 맞는 행으로 통계내는 식이다 여기 문제들 왜 거의 다 이런 식이지..문제 풀이 방식이 왜 다 똑같냐..https://leetcode.com/problems/confirmation-rate/description/ SELECT s.user_id AS user_id, ROUND( SUM( CASE WHEN c.action = 'confirmed' THEN 1 ELSE 0 END ) / COUNT(*) ,2) AS confirmation_rateFROM Signups AS sLEFT JOIN Confirmatio..
-
[Leet 1193] Monthly Transactions 1Leet 2025. 1. 31. 19:56
DATE_FORMAT으로 날짜 형식 맞추기그리고 GROUP BY 후 집계함수 내 CASE - WHEN 이나 IF 절로 원하는 조건에 맞게 통계내기 이거 두 개가 핵심이다 SELECT DATE_FORMAT(trans_date,'%Y-%m') AS month, country, COUNT(*) AS trans_count, SUM( CASE WHEN state = 'approved' THEN 1 ELSE 0 END ) AS approved_count, SUM(amount) AS trans_total_amount, SUM( CASE WHEN state = 'approved' T..
-
[Leet 585] Investments in 2016Leet 2025. 1. 31. 19:24
lat, lon 가 unique한 행들 중tiv_2015 값이 동일한 행들이 2개 이상있는 row들만 추출해서해당 row들의 tiv_2016의 합계를 구하는 문제이다. GROUP BY와 HAVING절 COUNT를 통해서 unique하고 unique하지 않은 행들을 추출해내는게 핵심이다 https://leetcode.com/problems/investments-in-2016/description/ SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016FROM InsuranceWHERE tiv_2015 IN ( SELECT tiv_2015 FROM Insurance GROUP BY tiv_2015 HAVING COUNT(*) > 1) AND (lat,lon) IN ..
-
[Leet 262] Trips and UsersLeet 2025. 1. 15. 19:53
이 문제의 핵심은 날짜별로 GROUP BY를 한 후해당 날짜별로 취소율을 계산해야한다는 것이다 GROUP BY를 하면 GROUP BY의 기준 칼럼만 명시 가능하고 그 외 칼럼들을 사용하지는 못한다. 사용해도 집계함수가 포함된 절을 활용해야한다. 예를 들어, SUM COUNT 같은 것들. 하지만 SUM 내에서 CASE 구문을 통해서 특정 칼럼을 활용할 수 있다는 것을 알았다. 아래에서는 집계함수인 SUM 내에서 CASE WHEN 절을 활용하여 취소된 개수를 구하고 COUNT(*)로 나눠 취소율을 구한다.' https://leetcode.com/problems/trips-and-users/description/ WITH temp AS ( SELECT users_id FROM Users WHE..