학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 여기에 질문 내용을 남겨주세요 왜 자꾸 Unused property 가 뜰까요?.... Gradle 업로드 해도 계속이러네요ㅠㅠ 제미나이와 몇시간을 여러방법을 썼는데 실패해서 처음 질문드려요.... .
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네 [질문 내용] 외부 조인1 강의 듣다가 궁금한게 생겼는데요. (A 집합을 왼쪽, B 집합을 오른쪽) 강의에서 LEFT JOIN의 경우는 집합 그림상으로도 그렇고 A(왼쪽 집합) 의 전체 데이터 + B에서 조건에 해당하는 데이터라면, B에 해당하는 부분은 사실상 A와 B의 교집합이고 A에는 항상 A와 B의 교집합 부분이 들어가 있기때문에 추가적으로 들어오는 A(AND)B 교집합 부분은 의미없는 데이터고 결국엔 집합 A랑 다를게 없는거 아닐까요?? 좀 이해가 안되서 질문 드립니다.
안녕하세요! 현재 사내 시스템의 기본 차트 기능이 요구사항을 구현하기엔 너무 복잡하고 한계가 있어서, 차라리 API로 데이터를 직접 뽑아 커스텀 대시보드 웹사이트를 자체 구축하여 운영하고 있습니다. 이 과정에서 데이터 구조 및 아키텍처 설계에 대한 고민이 생겨 선배님들의 조언을 구하고자 합니다. [현재 상황 및 아키텍처] 요구사항: N개의 프로젝트마다 각기 다른 40여 개의 통계 차트를 제공해야 합니다. 데이터 수집 (파멸의 약 30만 번 API 호출...): 외부 API를 연동해 통계 데이터를 수집합니다. 전체 프로젝트 기준 매일 새벽 3시에 약 프로젝트 갯수 * 3000 번의 API 호출이 발생합니다. 배치 및 동시성 처리: Spring WebFlux를 활용해 10개 단위로 청크(Chunk)를 나누어 병렬로 배치 처리를 하고 있습니다. 데이터 적재: 프로젝트의 일별 베이스라인(Baseline)을 유지하기 위해 원본(Raw) 데이터는 MongoDB에 저장하고 있습니다. 실시간 동기화: 사용자가 화면에서 차트 '새로고침'을 누르면, 해당 시점에 즉시 API를 다시 쏘아서 데이터를 업데이트해 줍니다. 현재의 서빙 방식: 일별 통계 결과는 현재 Redis에 담아두고 클라이언트에 제공하고 있습니다. 🤔 [고민되는 지점] 프로젝트당 40개의 차트를 그리는데, 각 차트(통계)마다 필요한 Raw Data의 종류와 개수가 천차만별입니다. 처음에는 통계 결과용 RDB 테이블을 만들까 했지만, Project_ID 와 구조가 제각각인 Raw Data 들을 깔끔하게 담아내기가 까다로웠습니다. 그래서 현재는 캐시 툴에 크게 의존하고 있는데, 앞으로 차트 종류가 더 늘어나고 시스템이 확장될 것을 고려하여 좀 더 포괄적인 대응을 위해 "차트에 대한 메타데이터 테이블"을 별도로 설계하여 매핑하는 방식 으로 구조를 개편할까 고민 중입니다. 💡 [질문 드립니다] 이처럼 요구되는 Raw Data의 형태와 수량이 각기 다른 수십 개의 차트를 서빙할 때, 메타데이터 테이블을 도입하여 관리하는 방식에 대해 어떻게 생각하시나요? 캐시에만 의존하는 것보다 나은 선택일까요? 혹시 비슷한 형태의 대규모 API 연동 기반 통계/대시보드 시스템을 구축에 있어, 추천할 만한 데이터 모델링이나 아키텍처 개선 방향이 있을지 궁금합니다.... 개인적인 고민 질문드려 죄송하고 잘 모르는 후배가 선배님께 여쭤봅니다. 영한님이 아니시더라도 해당 고민을 들어주시고 의견 주시는 선배님들께 감사합니다 !
12분 20초 경에 "복잡한 분석을 하는 경우에 엄청난 쿼리를 전송하는 경우도 있고~" 라는 말씀을 해주시는데요. 여기서 말하는 엄청난 쿼리는 어떤 쿼리인지 잘 모르겠습니다. 데이터베이스에 굉장히 많은, 혹은 복잡한 연산을 야기하는 쿼리일까요? 쿼리가 길고 뚱뚱해서 대체 어떤 걸하는 쿼리인지 사람이 읽고 파악하기 어려운 쿼리를 말하는 걸까요?
안녕하세요. 게시판 관련 강의를 듣는 도중 궁금한 점이 있어 질문을 남깁니다. 강의에서는 Snowflake 기반 단순 정렬을 기준으로 커버링 인덱스를 설명해주셨는데요, 실무에서는 여러 정렬 조건과 필터, 검색 조건이 함께 붙는 경우가 많습니다. ✅ 이런 복합적인 조회 패턴에서도 커버링 인덱스를 중심으로 설계하는 것이 적절한지, 아니면 다른 전략을 어떻게 사용해야 하는지 궁금합니다.(설명이 길어질 경우 간단한 힌트라도 부탁드립니다.) 💥 걱정하는 부분 정렬되는 컬럼 전부에 대해 인덱스를 걸면 더 문제가 발생할 것 같아요. 검색 %검색어% 의 경우에는 결국엔 full_scan 이어서 성능 최적화가 불가능하다.
Debezium이 데이터베이스 트랜잭션 로그(binlog, WAL 등)를 읽어서 변경사항을 Kafka로 발행한다는 것은 이해했습니다. 그런데 혼란스러운 부분이.... 일반적인 CRUD API 요청도 결국 DB에 변경을 가하는데, Debezium이 이를 어떻게 구분하는지 궁금합니다. 예를 들어 주문 생성 API → DB INSERT → 이건 CDC 이벤트로 발행해야 함 사용자 세션 저장 API → DB INSERT → 이건 CDC 불필요 이런 경우에는 어떻게 구분되나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 메모리 구조, 동작 순서, 코드는 이해가 가는데 막상 문제와 풀이 부분에서 어떻게 해야할지 모르겠어요. 뭔가 이렇게 해야 될 것 같다 까진 생각이 나는데 막상 코드를 치려고 하면 막막해지는 느낌.. 이런 문제는 어떻게 해결 해 나가야 될까요? 경험 부족일까요?
A obj= new C(); 업캐스팅 상태인거같은데 근데 그 클래스가 static이 붙어서 4라는 출력을 못하고 계속 static이 안붙으면 계속 참조를 하게 되는데 오버라이딩은 참조가 안되고 보니까 static g가 2개인데 c.g는 참조지만 static이기때문에 오버라이딩불가고 a.g는 static이 붙었지만 obj.g가 static메소드이기 때문에 a.g로 된다라는 정수뽑는 문제인데 이건 업케스팅영상도 보고 다른 영상도 다시 봐야 하나보군요 문제집을 보고 질문올립니다 아직도 뭐가 뭔지 햇갈리는데 정리도 하고 기출문제도 풀어봐야하나 보내요 ㅎ;;;
안녕하세요~~ 강의 너무 잘 듣고 있습니다. 강의 듣다가 한가지 의문이 생겨서 질문 남깁니다. GC가 회수한다 라고 말씀을 해주셨는데 여기서 회수는 정확히 어떤 의미일까여? reachable 가능성을 따져서 도달 가능한 인스턴스를 제외한 나머지 공간을 OS에 반납(실제 OS에 반납은 아닐거 같지만 JVM에 반납한다? 라는 의미로 얘기합니다..)한다는 의미일까여 아님 그냥 JVM이 사용가능한 공간으로 만들어 주는것 (free와 같은 개념)으로 만들어 주는걸 의미하는 걸까여? 간략하게 여기서 회수란 메모리 재사용 가능 상태(실제 값이 0으로 초기화 되거나 그런게 아니라 연결을 끊음으로써 언제든 그 공간을 새롭게 할당 가능한 상태)로 돌림으로 이해하면 될까여 아님 실제로 반납을 해주는걸까여....? 진짜 어렵네여 ㅠㅠ 일하면서도 단한번 제대로 잡고간적 없는듯 해서 맨날 헷갈리는 개념입니다 ㅠㅠ
영한님, 안녕하세요. 또 좋은 강의로 다시 만나뵙게 되었네요. Spring, Java 로 강의를 듣다가 순수 DB 만 설명을 듣다보니 다소 적응이 되지 않는 감이 있는데요 ㅎ 카테고리의 비정형 속성을 관리하기 위해 Json 설계하는 부분을 설명해주셨는데 이런 경우, Java 에서는 보통 어떤 식으로 객체와 맵핑을 하는지요? 각 카테고리별로 도메인 객체를 분리해서 각각 연동을 하는 식인지, 아니면 단순히 Map 으로 활용하는지 궁금합니다. 저장할 때도 객체를 그대로 저장하면 되기 때문에 편리하다고 하셨는데 각 카테고리별로 별도 객체가 있고 이를 개별 저장하는 형태를 말씀하시는 것인지 질문드립니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. Future 의 cancel 기능에 대해 실험하면서 해결하기 어려운 부분을 만나 질문드립니다. 📋 실험 내용 Callable 의 call 메서드 내부에서 I/O 와 같은 블로킹 작업 진행(or Interrupt 가 되지 않는 작업) Future 의 cancel 진행 스레드 호출 대상은 CancellationException 예외 발생 후 진행 ※ 스레드 풀 의 스레드는 계속 실행 중임을 확인 💥 문제 사항 이런 방식으로 로직이 지속 실행되면 스레드 풀의 스레드는 종료되지 않으면서 고갈되어 가고 결국엔 작업이 쌓이다가 에러를 뱉어내고 오작동 하게 될 것이라 추측됩니다. ❓ 질문 내용 Q. cancel 기능은 Interrupt 를 발생해주면서 작업을 중단합니다. 만약 I/O 작업 처럼 Interrupt 가 먹히지 않는 로직에서는 어떻게 스레드의 실행을 종료하고 스레드 풀로 반납할 수 있을까요? 💻 코드 public class FutureCancelMain { private static boolean mayInterrupIfRunning = true; public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(1); Future<String> future = es.submit(new MyTask()); log("Future.state: " + future.state()); sleep(3000); log("future.cancel(" + mayInterrupIfRunning + ") 호출"); boolean cancelResult = future.cancel(mayInterrupIfRunning); log("cancel(" + mayInterrupIfRunning + ") result: " + cancelResult); try { log("Future result: " + future.get()); } catch (CancellationException e) { log("Future는 이미 취소되었습니다."); } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } es.close(); } static class MyTask implements Callable<String> { @Override public String call(){ boolean flag = true; // Scanner scanner = new Scanner(System.in); while(flag) { log("무한 작업 중..."); } return "Completed"; } }
시력 이슈로 Deprecated 안녕하세요. 영한님! 7장1, 2, 3page 오타 제보 합니다! 아래 쿼리를 실행해서 데이터를 생성하고, -- # 7. 통계 테이블 설계 -- ## 통계 데이터와 성능 문제 -- ### 원본 데이터 준비 DROP TABLE IF EXISTS orders; CREATE TABLE orders ( order_id BIGINT AUTO_INCREMENT PRIMARY KEY, customer_id BIGINT NOT NULL, total_amount INT NOT NULL, order_status VARCHAR(20) NOT NULL, order_date DATETIME NOT NULL ); -- 데이터 입력 (예시를 위해 소량만 입력하지만, 실제로는 수백만 건이라고 가정한다) INSERT INTO orders (customer_id, total_amount, order_status, order_date) VALUES (1, 10000, 'COMPLETED', '2026-01-01 10:00:00'), (2, 25000, 'COMPLETED', '2026-01-01 14:30:00'), (3, 15000, 'COMPLETED', '2026-01-01 18:20:00'), (4, 50000, 'COMPLETED', '2026-01-02 09:15:00'), (5, 30000, 'COMPLETED', '2026-01-02 11:00:00'), (6, 12000, 'CANCELLED', '2026-01-02 15:45:00'), (7, 45000, 'COMPLETED', '2026-01-03 10:00:00'); 아래 통계 쿼리를 실행하면, -- ### 원본 테이블 직접 집계의 유혹 SELECT DATE(order_date) as stat_date, COUNT(*) as order_count, SUM(total_amount) as total_sales FROM orders WHERE order_status = 'COMPLETED' GROUP BY DATE(order_date) ORDER BY stat_date; 아래와 같은 결과가 나온다고 적혀있는데요. 2026-01-02 데이터가 3개라서 실제로는 아래와 같은 결과가 나와야할것 같아요! 감사합니다.
안녕하세요 우선 강의 잘 들었습니다~ batch 를 실무에 적용해보고자 하는데요 spring batch의 경우 batch_db에 batch_job 관련 테이블이 자동 실행되는 걸로 보이는데요 실무에서는 dba를 통해 테이블을 생성해야되는데요 batch_job 관련 스키마를 모두 반드시 생성을 해야 되는 건가요??
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 스트림 강의를 보다가 질문 드립니다 웹 어플리케이션 기준으로 스트림은 보통 데이터를 처리하는데 쓰일 것 같은데요 많은양의 데이터라면 보통 디비단에서 최대한 필터링하고 걸러서 가져오는게 네트워크호출랴도 그렇고 이점이 많을것 같은데 그럼 스트림은 보통 언제쓰이나요? 데이터를 필터링하고 정렬하고 가공하는건 디비단에서 해서 가져오는게 더 효율이 좋다 했을 때 스트림으로 가공하는 데이터 수준은 디비단에서 다 할 수 있을 것 같아서요 같은 데이터를 가공하단 는게 필요하다고 해도 기존 sql 재사용 하고 스트림으로 재가공 하는것보다는 새로 sql문 날려서 가져오는게 더 낫지 않나요? 보통 웹 어플리케이션에서 어떤 상황에 쓰이는지 궁금합니다!
public int[] solution1(int[] weights) { int[] answer = new int[weights.length]; ArrayDeque<int[]> stack = new ArrayDeque<>(); for (int i = 0; i < weights.length; i++) { int weight = weights[i]; while (!stack.isEmpty() && stack.peek()[1] < weight) { var popped = stack.pop(); int poppedIndex = popped[0]; answer[poppedIndex] = i - poppedIndex; } stack.push(new int[] {i, weight}); } return answer; } 위와 같이 답변을 작성하였고, 강의에서 나오는 답과 변수명 정도 외에는 차이가 없어 보이는데, 시간 초과 오류가 발생합니다.