문자 집합 호환성 여부를 판단할 때
미해결
김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
어떤 두 문자 집합이 호환되는지의 기준은 해당 언어를 표현하는 바이트가 일치해야함 그리고 해당 문자 집합들의 문자의 바이트(비트) 값이 일치해야함. 위 두가지를 모두 만족한다면 두 집합은 서로 호환된다고 이해하면 될까요?
- java
- 네트워크
- 객체지향
172만명의 커뮤니티!! 함께 토론해봐요.
미해결
김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
어떤 두 문자 집합이 호환되는지의 기준은 해당 언어를 표현하는 바이트가 일치해야함 그리고 해당 문자 집합들의 문자의 바이트(비트) 값이 일치해야함. 위 두가지를 모두 만족한다면 두 집합은 서로 호환된다고 이해하면 될까요?
해결됨
죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
강의 잘 보고 있다. 잘 정리된 자료 덕분에 배치 작업을 이해하고 있는 중이다. 다만 설명 중 이해 안되는 부분이 존재한다. 바로 이 부분 멱등하지 않은 ItemProcessor 를 내결함성(FaultTolerance) 기능 과 함께 사용해야 하는 상황이라면, 반드시 processorNonTransactional 를 설정하도록 하자. 오히려 멱등하지 않은 ItemProecessor의 경우에는 이 설정을 비활성화 해야 하는 거 아닌가? 나의 부족한 영어실력과 GPT를 통해 스프링 배치는 ItemProcessor가 트랜잭션이나 멱등성을 가져야 한다고 되어 있는 것으로 이해하였다. It must be either transactional or idempotent. 출처: https://docs.spring.io/spring-batch/reference/transaction-appendix.html 떠라서 멱등하지 않은 ItemProcessor는 processorNonTransactional()을 지양해야 하는 것으로 나는 이해된다... 답변 부탁한다. (존대로 질문하면 rm -rf 하신다길래 이렇게 남겨요 ㅎㅎ..)
미해결
실리콘밸리 데이터 리더가 알려주는 Airflow 기초
안녕하세요 선생님 현재 강의의 6페이지에 (파이썬으로 간단한 ETL 작성해보기) 파이썬으로 구글 코랩에서 작성하는 데이터 파이프라인 이라는 문구에 링크를 걸어두신 거 같은데요, PDF 다운로드 후 링크가 지속적으로 안열립니다. 웹페이지가 아니라 직접 파일 다운로드 해서 열어도 안되는데 어떻게 해야 되나요?
미해결
다양한 사례로 익히는 SQL 데이터 분석
select page_path , count (*) as hits_cnt , count ( distinct a . sess_id ) as net_cnt from ga_sess a join ga_sess_hits b on a . sess_id = b . sess_id where hit_type = 'PAGE' group by page_path order by 2 desc 저도 아래 질문글처럼 같은 방식으로 쿼리를 작성했습니다. 이전섹션인 일별 페이지 조회수와 양식이 유사해서 저한테 더 익숙했기 때문입니다 그런데 수업에서 사용한 쿼리가 제 쿼리보다 월등히 처리속도가 빠르더라고요(3s vs 4.7s). SQL숙련도가 올라가면 튜닝이라는걸 통해 처리속도를 최적화해야 한다고 들었습니다. 나중을 대비해서 익숙한 제 쿼리보다는 처리속도가 빠른 선생님 코드처럼 코드작성 습관을 바꾸는게 좋을까요?
미해결
실습으로 손에 잡히는 SQLD(2과목)
해당 강의는 노랭이 책이 필수인가요? 노랭이책 검색해서 2025년으로 구매했는데 강의에서 1번 문제는 몇 페이지 입니다 해서 찾아 갔는데 내용이 맞지 않네요.
미해결
김영한의 실전 자바 - 중급 2편
[질문 내용] 처음 문제를 풀떄 Card 클래스에 compareTo 오버라이딩을 @Override public int compareTo(Card o) { if(number != o.getNumber()){ return this.number - o.number; } return shape.compareTo(o.getShape()); } 위 코드처럼 작성했는데 숫자가 낮은 카드 먼저 안 나올때가 있는데 잘못 작성한걸까요?
해결됨
BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
안녕하세요. 수업 잘 듣고 있습니다. 말씀 해 주신대로 풀이 보기 전에 풀어보고 다시 영상보고하니 재미도 있고 실력도 빨리 느는 것 같아요. 감사합니다! 1-9 강의에서 주신 피벗 쿼리 작성해 봤습니다! WITH funnel_base AS ( SELECT event_date, event_timestamp, event_name, -- params.key AS key, -- params.value.string_value AS string_value, -- params.value.int_value AS int_value, user_id, user_pseudo_id, platform, MAX(IF(params.key="firebase_screen",params.value.string_value,NULL))AS firebase_screen, MAX(IF(params.key="session_id",params.value.string_value,NULL))AS session_id, -- MAX(IF(params.key="food_id",params.value.int_value,NULL))AS food_id FROM `advance.app_logs` CROSS JOIN UNNEST (event_params) AS params WHERE event_date BETWEEN "2022-08-01" AND "2022-08-18" GROUP BY ALL ), filter_event AS ( -- event_name+screen SELECT * EXCEPT(event_name, firebase_screen,event_timestamp), CONCAT(event_name,'-', firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp FROM funnel_base WHERE event_name IN ('screen_view', 'click_payment') ), funnel_step AS ( SELECT event_date, filter_event.event_name_with_screen, CASE WHEN filter_event.event_name_with_screen = 'screen_view-welcome' THEN 1 WHEN filter_event.event_name_with_screen = 'screen_view-home' THEN 2 WHEN filter_event.event_name_with_screen = 'screen_view-food_category' THEN 3 WHEN filter_event.event_name_with_screen = 'screen_view-restaurant' THEN 4 WHEN filter_event.event_name_with_screen = 'screen_view-cart' THEN 5 WHEN filter_event.event_name_with_screen = 'click_payment-cart' THEN 6 ELSE NULL END AS step_number, COUNT(user_pseudo_id) AS cnt FROM filter_event WHERE event_date BETWEEN "2022-08-01" AND "2022-08-15" GROUP BY ALL HAVING step_number IS NOT NULL) --3. event_name_with_screen 컬럼으로, 일자별로 count SELECT event_date, SUM(IF(funnel_step.event_name_with_screen = "screen_view-welcome", cnt, null)) AS `screen_view-welcome`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-home", cnt, null)) AS `screen_view-home`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-food_category", cnt, null)) AS `screen_view-food_category`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-restaurant", cnt, null)) AS `screen_view-restaurant`, SUM(IF(funnel_step.event_name_with_screen = "screen_view-cart", cnt, null)) AS `screen_view-cart`, SUM(IF(funnel_step.event_name_with_screen = "click_payment-cart", cnt, null)) AS `click_payment-cart` FROM funnel_step GROUP BY ALL ORDER BY event_date
해결됨
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
자바 21버전이 아닌 17버전을 사용해도 괜찮나요?
미해결
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
안녕하세요 문제1번 관련 문의 사항이 있어 글 남깁니다. 1번에 getCount는 synchroinized 하는 이유가 뭔가요? 중간에 호출되는 부분이 없는 것 같고, t1.join() t2.join() 으로 마지막 출력할때도,,, synchroinized이게 안필요하다는 생각이 들어서요 제가 이해를 잘못한건지 문의드립니다.
해결됨
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] h2데이터베이스를 사용해보고 난 후 직접 mysql을 연결하여 해보고 싶어져 연동을 시도하였습니다. <오류화면> <application.properties> 그런데 이때 사진과 같은 오류가 발생합니다. application.properties에 mysql에 대한 정보를 정확히 적었으나 해당 오류가 발생합니다. application.properties의 위치는 src/main/resources에 위치하고 있습니다. 사진과 같이 build.gradle에 의존성도 추가해 두었습니다. 이 때, 영상에서 말씀해주신대로 빌드를 intelliJ로 설정해두면 해당 오류가 발생하나 gradle로 변경하면 정상적으로 db와 연결되어 작동합니다,, intelliJ가 속도가 빠르다고 하셔서 사용하고 있었으나 intelliJ로 빌드하면 오류가 발생하는지 모르겠습니다...ㅜ 코드가 정확히 작성되어도 해당 오류가 발생할 수 있는 것일까요? 이대로 gradle로 빌드하면서 나아가도 나중에 문제가 없을지 궁금합니다.
해결됨
RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기
안녕하세요. 트랜잭션 메시징에 대해 궁금한 것이 생겨 질문드립니다. 트랜잭션 메시징은 데이터베이스 작업과 메시지 발행 작업을 원자적으로 수행하여 데이터의 일관성을 보장하는 것으로 알고 있습니다. 강의 내용 중 '트랜잭션 메시징의 한계'에서 분산 트랜잭션을 완벽하게 보장하지는 않는다고 하셔서 이를 DB의 트랜잭션과 메시지 전송의 트랜잭션이 서로 독립적으로 작동한다고 이해했습니다. 그럼 RabbitMQ에서 트랜잭션 메시징을 지원한다고 할 수 있나요?
해결됨
모르면 야근하는 문자 인코딩 완전 정복
안녕하세요 강의 잘 듣고 있습니다. 강의 듣다가 용어에 관해 궁금한게 생겨서 질문 남겨봅니다. 1강 1분 27초쯤에 인코딩에 대한 구체화된 방법론을 설명하시면서 구글 인코딩이라고 하시는거 같은데 스크립트에서는 코글 인코딩이라고 표현되어서 확인 부탁 드립니다.
해결됨
스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 안녕하세요? 강의 계속 잘 듣고 잇습니다. 이제거의 막바지에 이르렀네요 ㅎㅎ.. 게시글 목록조회 최적화와 관련하여 질문드리고자 합니다. 제가 처음에 이해한 바는 최신의 천개의 데이터를 레디스에 적재하고, 그 외의 데이터는 직접 articleServcie를 통해 가져오자 라고 이해를 했었습니다.(hot, cold Data) 그런데 이후의 결과적으로는 아래 두가지 캐시가 존재하게 되었더라구요 1.zset을 활용한 인기글 데이터 관리(목록 조회 최적화) 2.실제 데이터 queryModel(단건 조회 최적화) 이런 구조에서는 zset에서 천개의 데이터를 관리하긴 하지만 실제로 queryModel에는 데이터가 있을지 없을지 확신을 할 수 없는 상황이라는 생각이 듭니다. 즉 실제로 zset에 있는 데이터라 해도 하루가 지났다면 queryModel이 있을지 없을지 모르는 상황이라고 인지했습니다. 질문1) 제가 이해한바가 맞을까요? 맞다면 이 구조를 선택하신 이유가 조금 궁급합니다. 두 캐시를 합쳐서, queryModel자체를 하나의 캐시에서 천개의 데이터만 관리하면 되지않나? 라는 의문이 생겨가지구요 어차피 천개의 데이터만 관리한다면 메모리를 그렇게 크게 차지 하지 않을 것 같기도 하구요 질문2) 지금과 같은 구조에서는 zset을 활용한 article_id가 그렇게 큰 의미가 있는 부분인가? 라는 생각이 듭니다. - 어차피 최신순(1000개이하)의 데이터에 대해서 id를 추출하는거면 DB에서 offset을 세어도 그렇게 안느린 거 아닌가? 하는 생각이 들구요 - zset에 포함되어 있더라도, 실제 데이터(QueryModel)가 있는지 없는지 확답을 할 수 없는 상황이니 큰 의미가 있는건가? 하는 의문이듭니다. 차라리 최신 천개의 데이터에 대해서는 조회에 필요한 모든 데이터를 캐싱해둔다면 큰 의미가 있을거라고 생각이 드는데, 지금의 경우에 대해서는 잘 모르겠네요 ㅠㅠ -결론적으로, 현재 회사에서 RDB를 주로 쓰고 있는 주니어 개발자 입장에서 관련해서 레디스를 도입해본다면.. 아키텍처 복잡도가 올라가는 부분에 비해 엄청 크게 이득이 되는 부분이 있나?? 라는 생각이 많이 들었습니다. 질문3)추가로, 이거는 좀 다른 부분이긴 한데 read-service에서 like, unlike등 업데이트 이벤트 핸들러의 경우 동시요청에 대해서 lostupdate처럼 동작하는 부분이 있을 것 같은데 이부분은 배제하신건지, 혹은 제가 잘못생각하고 있는건지 궁금합니다. 양질의 강의 정말 감사드립니다
미해결
나도코딩의 자바 기본편 - 풀코스 (20시간)
5번 폴더에서 VariableNamimg)에서 강의에 있는데로 그대로 했고 6강상수로 넘어갔는데 6강에서 필드출력을 하려니까 5강이 에러라면서 넘어가지도 않고 5강도 필드출력이 안되네요. 왜 그런가요?
미해결
토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
해당 강의를 수강하고 하루죙일 찾아봤지만 실질적으로는 문제를 해결하지 못했습니다. ㅜㅜ 문제가 왜 발생했는지 추적한 결과 실제로 xml를 불러들일때, fk 관련 속성을 잘 갖고 오지만, @JoinColumn 을 생성할 때 fk 속성을 삽입하는 코드가 실질적으로 존재하지 않고, fk제약 조건 생성을 위해 alter 시에 @JoinColumns로 지정됩니다. 실제 어노테이션 기법으로 작성 할 경우 @JoinColumn으로 수집이 되지만, -참고- @JoinColumns 으로 수집 시 xml 스펙에서 join-column 태그는 Unbounded로 스펙이 정해져 그렇게 처리 된 거 같아요. 하이버네이트 6.6 버전에서는 jpa 매핑 관련해서 xml 3.1 버전으로 관리되고, 7.0 버전부터는 xml 7버전으로 매핑이 관리될 것 같습니다. 하이버네이트 6.6 버전에선 실질적으로 버그라고 생각되고, 7.0 버전에는 JPAXMLOverridenAnnotationReader 클래스가 사라진 상황이라 7 버전으로 올려서 확인해봐야 할 것 같지만, 스프링 부트 3.x.x버전은 아무래도 하이버네이트 6.6 버전 기준으로 버저닝이 될 거 같아 해당 문제의 해결 방법은 실질적으로 찾진 못했습니다. ㅜ
미해결
실습으로 손에 잡히는 SQLD(2과목)
m1 mac pro 인데 dbeaver 설정에서 add folder add file 등을 누르면 프로그램이 멈춰버리는데 막막하네요 그냥 기본 설정 되어있는걸로는 진행이 안되는걸까요? 기본으로하고 테스트 연결 누르면 SSO SSO KeyStore not available 오류가 발생하네요
미해결
김영한의 실전 데이터베이스 - 기본편
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 1. 2. 3. 예. [질문 내용] SELECT 절에서 상관 서브쿼리 를 사용하는 것에 대해, 완전히 다른 테이블에서 간단한 정보 하나만 조회할 때 적재적소에 사용하면 괜찮다 고 하셨는데 상황 저희 회사에서 사용하는 쿼리 들을 보면, SELECT 절에서 상관 서브쿼리 를 활용해 다른 테이블에서 간단한 정보를 조회하는 경우가 많습니다. 예를 들어, 작성자, 요청자, 접수자 각각에 대해 이름과 부서명을 조회할 때, 각 항목마다 서브쿼리 가 사용됩니다. 작성자 이름: (SELECT name FROM EMP WHERE emp_id = main.writer_id) 작성자 부서: (SELECT dept_name FROM DEPT WHERE dept_id = main.writer_dept_id) 요청자 이름, 접수자 이름 등도 동일한 방식 질문 이렇게 PK 기준으로 조건을 걸고 조회하는 서브쿼리가 여러개 들어가도 성능상 괜찮을까요? 조인으로 처리하면 조인 테이블이 많아져 쿼리가 복잡 해질 것 같은데. 이럴 경우 서브쿼리 방식이 더 적절한가요? 만약 이 방식이 성능상 좋지 않다면 , 보다 나은 방법이나 현실적인 대안 이 있을까요?
해결됨
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
10강에서 데이터 베이스 다룰때 인텔리제이 커뮤니티 버전에서는 어떻게 해야할까요?
미해결
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
앞서 생성자, 소비자 강의에서 생산자가 데이터를 생성하면 다음과 같이 데이터를 넣었고 queue.offer(data); 소비자는 큐에서 생산자가 생산한 데이터를 꺼내어 소비하였습니다. queue.poll(); 이번 강의에서는 큐에 작업을 넣고, 빼서 처리합니다. 생산자 소비자에서는 데이터를 넣고 빼고 이번 스레드풀 강의에서는 작업을 넣고 빼니 처음에는 작업을 넣고 빼는 큐와 생산자,소비자가 사용하는 큐가 별도로 있는 건가? 했는데 강의를 들어보니 별도로 있는건 아니고 같은 큐인것 같더라구요. 그런데 생산자,소비자에서는 어떤 작업의 결과인 데이터를 생산 하여 큐에 넣고 꺼내어 소비 한다는 것이 직관적이어서 이해가 잘되었는데요. 이번 강의에서는 생산자가 '작업'을 큐에 넣고 빼서 소비자가 큐에서 작업을 빼는데 큐에 넣는 주체가 ' 데이터 '에서 ' 작업 '으로 바뀌어 설명하니 무엇을 생산하는 것이지? 하며 헷갈린다고나 할까요. 생산자소비자 강의에서처럼 어떤 작업의 결과를 큐에 넣고 빼는 것이 아니라 실제로는 작업 자체를 생산하여 큐에 넣는건가요? 그러니까 앞선 생산자와 소비자는 단순 이해를 위한 것이고 실제로는 Runnable 이라던지 Callable 같은 작업 객체 자체가 생산되어 큐에 들어가는 것인가요? 감사합니다
미해결
김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
AtomicInteger.get()을 CAS 연산 후 반환값으로 사용하면 안 되는 이유 🚨 핵심 문제: 원자성에 대해서 다시 생각해보기 CAS 연산의 원자성은 compareAndSet() 호출 자체에만 적용됨 CAS 성공 후 get() 호출 은 완전히 별개의 연산 두 연산 사이에 다른 스레드가 개입 가능 멀티스레드 환경에서는 언제든지 다른 스레드가 개입 가능 개발자는 OS가 중간에 어떤 스레드를 호출할지 알 수 없음 🔍 문제 발생 메커니즘 1. 시간적 틈(Time Gap) 존재 result = atomicInteger.compareAndSet(getValue, getValue + 1); // ✅ 원자적 // ← 이 시점에서 다른 스레드가 값을 변경할 수 있음 return atomicInteger.get(); // ❌ 별개의 연산, 원자성 보장 안됨 2. 스레드 스케줄링의 불확실성 sleep(100) 동안 CPU가 다른 스레드로 전환 CAS 성공 직후에도 스케줄러가 해당 스레드를 중단 시킬 수 있음 먼저 시작된 스레드가 먼저 완료된다는 보장 없음 📊 실제 문제 시나리오 초기값: atomicInteger = 0 Thread A: getValue = 0 Thread A: compareAndSet(0, 1) 성공! → atomicInteger = 1 Thread A: CPU 스케줄러에 의해 중단됨 Thread B: getValue = 1 Thread B: compareAndSet(1, 2) 성공! → atomicInteger = 2 Thread A: 재개됨 Thread A: atomicInteger.get() 호출 → 2 반환 ❌ 결과 : Thread A가 실제로는 0→1로 증가시켰지만, 2를 반환하게 됨 ✅ 올바른 해결책: getValue + 1 사용 동작 원리 private static int incrementAndGet(AtomicInteger atomicInteger) { int getValue; boolean result; do { getValue = atomicInteger.get(); // 현재값 저장 result = atomicInteger.compareAndSet( // CAS 연산 getValue, getValue + 1 ); } while (!result); return getValue + 1; // CAS에서 사용한 기댓값 + 1 } 장점 CAS 연산 시점의 값 고정 : getValue 는 CAS 연산에서 사용한 정확한 기댓값 다른 스레드 개입 무관 : 이후 다른 스레드가 값을 어떻게 변경하든 영향받지 않음 메서드 의미 보장 : "이 메서드가 실제로 설정한 값"을 정확히 반환 🎯 핵심 교훈 ❌ 잘못된 가정 "CAS 성공 후 바로 get()을 호출하면 방금 설정한 값을 가져올 것이다" ✅ 올바른 이해 원자성은 단일 연산에만 적용 연산 간의 순서나 연속성은 보장되지 않음 멀티스레드 환경에서는 언제든지 다른 스레드가 개입 가능 개발자는 OS가 중간에 어떤 스레드를 호출할지 알 수 없음 💡 실무 적용점 AtomicInteger의 내장 메서드 활용 // 직접 구현하지 말고 내장 메서드 사용 int result = atomicInteger.incrementAndGet(); CAS 패턴 사용 시 주의사항 연산 결과는 CAS에서 사용한 값을 기준으로 계산 별도의 get() 호출로 "현재값"을 가져오려 하지 말 것 원자성의 범위 명확히 이해 단일 메서드 호출 = 원자적 여러 메서드 호출의 조합 = 원자적이지 않음