김영한
@yh
수강생
582,531
수강평
40,275
강의 평점
5.0
교육자
전: 우아한형제들 기술이사, 카카오, SK플래닛
진짜 실무에 필요한 제대로 된 개발자가 될 수 있도록, 교육하는 것이 저의 목표입니다.
저의 개발 인생 이야기
EO 인터뷰 영상
개발바닥 - 시골 청년 개발왕 되다
취업과 이직에 대한 고민 해결
강의
로드맵
전체 4수강평
- 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
- 김영한의 실전 데이터베이스 - 설계 2편, 실무에서 반드시 마주치는 9가지 설계 패턴
- 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
- 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
게시글
질문&답변
추후 강의 질문있습니다
치즈초코우유님 안녕하세요.말씀하신 애플리케이션 아키텍처 부분이 제가 가장 좋아하고 또 가장 자신있는 분야인데요.저도 어서 그런 강의를 하고 싶은데, 그런데 이런 부분을 정말 제대로 설명하려면 듣는 분들께서 우선 수 많은 기초들이 다 정리가 되어야 겠더라구요.예를 들어서 자바, 데이터베이스, 스프링, JPA 등등 모든 기반이 있어야 진짜 깊이있는 애플리케이션 아키텍처에 대한 이해가 가능하다 생각합니다.지금은 데이터베이스 로드맵을 완성하는데 집중하고 있지만, 이후 강의 진행 방향중 하나의 큰 축으로 애플리케이션 아키텍처가 들어가 있다고 보시면 됩니다 🙂감사합니다.
- 0
- 2
- 64
질문&답변
자바 기본편 - .(dot)에 관한 질문입니다!
안녕하세요. 7580750님생각하신 내용이 맞습니다^^!감사합니다.
- 0
- 1
- 43
질문&답변
setVlaue질문
안녕하세요. 여비님질문하신 부분은 강의에서 가변 객체(Mutable)와 불변 객체(Immutable)를 비교해서 설명하기 위해 서로 다른 두 개의 클래스를 번갈아 사용하고 있기 때문에 발생한 혼란입니다.결론부터 말씀드리면, setValue()를 다시 만든 것이 아니라 가변 객체인 Address 클래스를 사용한 예제를 먼저 보여주었기 때문입니다,.뒤에서 ImmutableAddress를 보여드리는데요. ImmutableAddress는 불변이고, Address는 가변입니다.감사합니다.
- 0
- 2
- 48
질문&답변
실무 통계 질문(고민) 드립니다..!
안녕하세요. 감사합니두 ~님상황에 따라 다른 통계를 제공해야 해서 고민이 많으시겠네요. 1. 비즈니스 상황에 따라 다르겠지만, 최대한 많은 부분에서 중복과 코딩의 양을 줄이기 위해서 차트에 대한 메타데이터 테이블"을 별도로 설계하여 매핑하는 방식을 권장합니다.메타데이터의 정보만으로 많은 것을 자동화 하실 수 있을거에요.추가로 과거 RDB를 시도하셨다가 제각각인 Raw Data 구조 때문에 포기하신 것은 어쩌면 당연한 결정입니다. 차트마다 요구하는 데이터 구조가 완전히 다르기 때문입니다.이를 해결하는 표준적인 방법은 정규화된 컬럼을 포기하고 "고정 메타 컬럼 + 유연한 데이터 컬럼(JSON)"의 조합으로 가는 방법이 있습니다. (강의 마지막에 관계형 DB에서 JSON 방법 설명) 2. 이미 아실 것 같기도 한데, 데이터 파이프라인 (ETL)의 명확한 역할 분리하는 것을 권장합니다.매일 새벽 3시에 도는 배치를 논리적으로 3단계로 분리하면 관리와 재처리가 훨씬 쉬워집니다.1. Extract & Load (수집): 30만 번의 외부 API를 최대한 빠르게 긁어와서 원본 그대로 MongoDB(Raw)에 덤프합니다.2. Transform (가공): 메타데이터 테이블의 규칙을 읽어, MongoDB의 Raw Data를 차트 모양에 맞게 집계한 뒤 Data Mart (고정 메타 컬럼 + JSON 테이블)에 영구 저장합니다.3. Cache Warming (캐시 적재): Data Mart의 결과를 Redis에 미리 올려둡니다.감사합니다.
- 0
- 2
- 59
질문&답변
외부조인1 강의 관련 질문
안녕하세요. 박준혁님수학의 '집합' 개념(요소의 유무)으로만 접근하면 생각하신 내용이 맞습니다 🙂하지만 데이터베이스의 JOIN은 단순한 집합론과는 조금 다릅니다.핵심부터 말씀드리면, JOIN은 단순히 '행(Row)'을 합치는 것이 아니라, 서로 다른 테이블의 '열(Column, 정보)'을 옆으로 이어 붙이는 작업이기 때문입니다. 첨부해주신 그림의 users(A)와 orders(B) 테이블을 예시로 들어보겠습니다.1. 왜 B(교집합)의 데이터가 의미 없는 데이터가 아닐까?데이터베이스에서 A 테이블과 B 테이블은 서로 가지고 있는 '정보의 종류(컬럼)'가 다릅니다.A (users) 테이블이 가진 정보: 유저 번호, 이름, 가입일 등 (유저 그 자체에 대한 정보)B (orders) 테이블이 가진 정보: 주문 번호, 주문한 유저 번호, 주문 상품명 등 (주문 내역에 대한 정보)"교집합 부분이 이미 A에 들어가 있다"고 하신 것은 '유저 번호(1~5번)'라는 기준(Key)에 대한 이야기입니다. 하지만 LEFT JOIN을 통해 우리가 얻고자 하는 것은 A 테이블(유저 정보) 옆에 B 테이블(주문 정보)을 가져와서 붙이는 것입니다.즉, A 테이블만 보면 이 유저들이 "어떤 상품을 주문했는지"는 알 수 없습니다. B 테이블과 조인(교집합 생성)을 해야만 비로소 유저 정보 옆에 주문 상품 정보가 따라붙게 되는 것이죠.여기서 예를 들어서 1~5번의 경우에는 유저 이름과 주문한 상품명이 모두 포함됩니다. 하지만 6번의 경우에는 유저 이름은 있지만, 상품명이 포함되지 않습니다. 감사합니다.
- 0
- 3
- 47
질문&답변
Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?
안녕하세요. dltkdcksqkqh님AI 인턴이 잘 답해주었는데요. 내용을 조금 더 보충하자면작성하신 코드와 같이 CPU 연산 및 무한 루프 작업일 경우에는 인터럽트가 불가능합니다.이 경우 작업자가 주기적으로 자신의 인터럽트 상태를 확인하고, 취소 요청이 들어왔으면 스스로 작업을 중단하도록 다음과 같이 코드를 작성해야 합니다.static class MyTask implements Callable { @Override public String call() { log("작업 시작..."); // 1. while 루프 조건에 Thread.currentThread().isInterrupted() 추가 // 인터럽트 신호가 오면 루프를 탈출합니다. while (!Thread.currentThread().isInterrupted()) { log("무한 작업 중..."); // (선택 사항) I/O나 기타 로직이 있다면 이 안에서 처리 // 만약 이 안에서 무거운 로직이 있다면 중간중간 isInterrupted()를 확인하는 것이 좋습니다. } log("인터럽트가 감지되어 작업을 안전하게 종료합니다."); return "Cancelled or Completed"; } }감사합니다.
- 0
- 2
- 43
질문&답변
[Deprecated] 오타 제보
안녕하세요. 개발하는쿼카님 🙂쿼리의 다음 조건 때문에 2026-01-02에 취소(CANCELLED)된 한 건은 제외됩니다 🙂WHERE order_status = 'COMPLETED'따라서 2건이 맞습니다.감사합니다.
- 0
- 1
- 58
질문&답변
오타 제보
개발하는쿼카님 고맙습니다 🙂다음 패치에 반영하겠습니다!
- 0
- 2
- 59
질문&답변
학습중인 수업자료를 받아볼 수 있을까요??
안녕하세요. 낙하가 무서운 뽀또님섹션1 -> 수업자료에서 다운로드 받으실 수 있습니다 🙂감사합니다.
- 0
- 2
- 58
질문&답변
category_path 테이블에서 idx_descendant 인덱스를 생성하는 이유가 궁금합니다
안녕하세요. 개발하는쿼카님이 인덱스가 부분이 중요한 내용이라, 여기서는 인덱스의 이름을 명시적으로 지정해주기 위해서 직접 사용했습니다 🙂인덱스의 이름을 명시적으로 지정하거나, 인덱스의 조건을 좀 더 다르게(역방향 등등) 주고 싶다면 인덱스를 직접 만들면 됩니다. 물론 FK 인덱스와 중복으로 만들어지지는 않고, 명시적으로 지정한 인덱스가 사용됩니다.감사합니다.
- 0
- 2
- 62









