1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] openJDK21이 없어서 25로 다운로드 받아서 설치했는데 수업듣는데 지장이 없을까요?
안녕하세요 한기용 지식공유자님. 37. 앞서 Airflow 예제를 개선해보자 (v4) - 실습 강의에서 데이터의 벌크 업로드를 위해 dag의 insert into 코드를 copy into로 변경했습니다. 그러나 이 경우 기존에 한 줄씩 insert into 하던 방식보다 더 느린 결과가 나옵니다(insert into의 경우 2분, copy into의 경우 3분) 개인적으로는 제 컴퓨터의 IO 연산이 좋지 않고, 데이터의 양이 크지 않아서 오버헤드가 더 크기 때문인 것으로 예상하고 있는데, 지식공유자님의 의견도 알고 싶습니다 🙂
MySQL 8.x 버전에서 다음과 같이 두 개의 인덱스를 생성했습니다. CREATE INDEX idx_items_price ON items (price); CREATE INDEX idx_items_price2 ON items (price DESC); 이 상태에서 아래 쿼리를 실행하면, SELECT * FROM items WHERE price BETWEEN 50000 AND 100000 ORDER BY price DESC; 처음에는 possible_keys 에 두 인덱스가 모두 나타나고, 옵티마이저가 idx_items_price (오름차순 인덱스)를 backward index scan으로 사용합니다. 이후에는 몇 번 실행 후에는 possible_keys 에 idx_items_price2 (내림차순 인덱스)만 나타나고 이 인덱스가 쿼리에 사용됩니다. 이런 현상이 발생하는 원인이 옵티마이저가 통계 정보를 수집하고 점차 최적화되어 인덱스 선택이 변경되는 것인지 궁금합니다. 그리고 한 번 최적화가 이루어진 후에는 idx_items_price2 인덱스를 계속 사용하는 것이 보장되는지, 아니면 나중에 다시 변경될 가능성도 있는지도 알고 싶습니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요! 강의 교안에 따르면 원자적 연산은 '멀티스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리되는 연산이라는 뜻이다' 라고 하는데요 그렇다면 동일 객체에 대한 원자적 연산들이 여러 CPU 코어에 나뉘어 동시에 실행하려고 해도 동시에 수행할 수 없기 때문에 원자적 연산은 멀티스레드 환경에서 안전하다고 이해해도 될까요? 그렇게 해야 멀티 스레드 상황에서 원자적 연산들이 다른 스레드의 간섭없이 처리될 수 있을 것 같아서요.
안녕하세요. 현재 cs 강의부터 c/c++/시스템.네트워크,tcp/ip 등 백엔드에 도움되는 강의를 듣고 현재 자바강의를 듣고 있습니다. 자료구조와 알고리즘을 공부할 때 저의 공부방법이 왜 사용하는지, 어떨 때 사용할지, 어떻게 작성하는지, 이럴 때엔 어떻게 대응 할 지를 중심으로 공부를 하고 있습니다. 배열, 스택, 큐, 연결리스트는 코드를 보지 않고 작성할 수 있도록 미리 훈련을 해놓았었지만 최근에 트리 / 해시로 넘어가면서부터 '이걸 안 보고 쓸 정도로 외우려면 시간 소요가 심할 것 같은데?' 생각이 들었습니다. 이러한 고민을 하게 된 건 전에 경쟁력 있는 백엔드 개발자가 되려면 홈페이지 하나는 코드를 보지 않고 써야한다 라는 얘기를 들었기 때문입니다. (다만 공부하고 있는 학생으로 홈페이지 만드는 코드가 무엇인지를 모르기에 이러한 고민을 하게 되는 것도 있습니다.) 13년 전에 C/C++ 개발 회사에서 일을 했을 때 코드를 외우는 게 아니라 어떠한 코드가 필요할 때 책을 펼쳐서 보고 직접 타이핑을 쳤었는데, 안 보고 쓸 정도로 외우기가 어려운 알고리즘들도 마찬가지 아닐까 하는 의구심이 들어 질문 드려봅니다. (현재는 바이브 코딩이겠지만요)
안녕하세요. 우선 한푼도 아깝지 않은 명강의를 만들어주심에 진심으로 감사드립니다. WebApiExRateProvider를 템플릿 콜백 패턴을 적용한 구조로 변경하면서, 토비님께서는 실제 API를 호출하고 콘솔에 찍힌 결과를 보며 진행한 테스트 방식에 의문이 들어 한번 테스트 코드를 만들어보았는데요. 피드백을 받아보고 싶습니다. 코드는 GitHub Repository에 Commit 내역에서 확인하실 수 있습니다. ( Commit 내역 링크 ) 의도에 대해 간단히 설명드리면 반드시 지정된 URL로 API 호출을 보내야 한다는 동작 과 특정 스펙의 JSON을 파싱해서 환율 정보를 반환하는 동작 을 테스트했습니다. 이때 ApiExecutor 의 경우 단순히 API를 호출하고 그 응답을 반환하는 역할이므로 테스트 할 가치가 없다고 판단하여 배제 했습니다. 주로 궁금한 것은 다음과 같습니다. 테스트하려는 기능에 대해 부족하거나 과함은 없는지? Mock을 활용한 테스트 방식에 대해서는 아쉬움이 없는지? 아무래도 Mock을 활용한 테스트에는 찝찝함이 남아있는데, 어떻게 해소할 수 있을지? 토비님이라면 어떤 식으로 테스트를 진행하셨을 지? 다시 한번 좋은 강의 제공해주셔서 진심으로 감사합니다.
저도 13분쯤에 create 테스트를 하다가 안 되어서 삽질했는데, 드디어 됐습니다. 원인은 createdAt, updatedAt에 값을 설정하지 않고 넣으려다 보니, null로 들어가서 에러가 발생했던 것이었습니다. 그리고 mysql에 접속했을 때는 use article; 로 DB에 접근해야 합니다. 저는 use database; 로 접근하고 있었네요. 이 과정에서 GPT의 도움을 많이 받았습니다. 13분쯤 진행다가 나오던 그 500 에러 로그는 애플리케이션을 확인해 봐야 하고요. 테스트 코드의 create 메서드에는 IDE의 설명도 같이 참고했습니다. 왜 오류가 떴는지 알려주더군요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 강사님! 강의 잘보고 있습니다 🙂 트랜잭션 강의를 듣고나니 mysql에서 table에서 트랜잭션관리 + lock이 필요함을 이해했습니다. 근데 이 강의를 듣고나니 헷갈리는게 고급1편강의에서 lock(reentrant lock, synchronized, cas, 비관적락 같이 임계영역을 보호하는 것) 과 헷갈려 질문하게 되었습니다. 먼저 executor패키지 같은 멀티스레드 경우는 당연히 여러 사용자의 요청을 동시에 처리해야하니 필수적이라고 이해되는데 문제는 lock관련 부분이 헷갈리기 시작했습니다ㅠㅠ 일단 이런 애플리케이션 단의 lock들(reentrantlock synchronized cas 비관적락)은 서버가 여러대 A,B,C서버가 되면 각각의 서버에서만 lock을 관리해서 A서버의 a1스레드 출금로직 과 B서버의 b1스레드 출금로직이 겹칠 수 있다고 하더라구요! 그래서 애플리케이션에서 각 서버에 lock을 걸었어도 mysql단의 lock이 필수적이다. 라고 이해했는데 이러면 애플리케이션단에서 lock들이 존재하는 필요성이 사라져서 의문입니다..ㅠㅠ 그냥 db단에서만 걸어주면 충분하지 않나요?? 어차피 걸어도 서버 분산화가되면 소용없는거 아닌가요..? 그래서 찾아본 해결방안이 애플리케이션 java단의 출금메서드에 @Transactional을 걸고 관련 repository메서드들에 @Lock(PESSIMISTIC_WRITE)를 걸면 SELECT --- FOR UPDATE가 걸려서 db 단에서 lock이걸린다. reentrantlock같은건 쓰지 않아도 된다. 로 이해했는데 맞을까요? 그렇다면 이러한 lock들은 단일서버에서만 통하니 실무에선 잘 사용하지 않는것인지... 배운지식들을 합치니까 헷갈리기 시작하네요 😇 😇 강사님께선 어떻게 하시는지 궁금합니다!!! 긴 질문 읽어주셔서 감사드립니다 🥰
제 자력으로는 bfs로 풀어봤는데 정답이 뜨긴 했습니다. 그리고 선생님이 푸신 기법으로도 제출해보았더니 실행시간은 비슷하더라구요. 이 문제에서만은 bfs로 해결해도 되지만 뒤에 있는 문제를 풀기 전에 알아야할 코드이기에 선수학습 코드로 알고 있으면 될까요? 최소 스패닝 트리 문제는 bfs만으로는 풀 수가 없는걸까요...? 한 집합에서 노드들이 응축이 되지 않고 계속 연결만 되고 있는 상태에서 마지막으로 입력된(연결된) fb가 이 집합의 배열의 값이 되는건가요? 입력 예시로 보면 (1,2), (2,3), (3,4), (1,5)는 결국 하나의 집합인거잖아요? 여기서 5(fb)가 이 집합의 배열값으로 무조건 고정이 되는건지 궁금합니다.
2025년 10월 4일 기준 MySQL Workbench 최신 버전인 8.0.43 버전 다운로드 시 크롬에서 다운로드 실패하는 이슈가 있네요! 저는 Archives에서 8.0.42 버전을 다운받으니 정상적으로 받아서 설치할 수 있었습니다. 혹시 다른 수강생분들도 비슷한 이슈 겪으실까 싶어 글 남깁니다.
반말은 조금 부끄러워서.. 존댓말로 질문드리겠습니다. ItemWriter에서 예외 발생 시 재시도 - 청크 단위로 재시도 관리 1. ItemWriter에서 예외 발생 시 ItemProcessor부터 처리가 재개된다. 2. ItemProcessor에서와 달리, ItemWriter에서의 재시도 횟수는 청크 단위로 관리된다. 요 부분에서 실제로 배치를 돌려보니 writer부터 재시작하는 것을 확인 가능했습니다.. 관련해서 원인을 분석해보니, 아래 결론에 도달했는데 맞을까요? processorNonTransactional() 설정이 켜져있으면 Item 단위로 처리 결과를 캐시에 저장하기때문에 processor는 모두 완료 처리 -> writer부터 시작 processorNonTransactional() 설정이 꺼져있으면 청크 단위로 완료 처리하기때문에 processor부터 다시 시작
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] package scanner.ex; import java.util.Scanner; public class ScannerWhileEx1 { public static void main(String[] args) { Scanner input = new Scanner( System.in ); while (true) { System.out.print("이름을 입력하세요 (종료를 입력하면 종료): "); String name = input.nextLine(); if (name.equals("종료")) { System.out.println("프로그램을 종료합니다."); break; } System.out.print("나이를 입력하세요: "); int age = input.nextInt(); input.nextInt(); System.out.println("입력한 이름: " + name + ", 나이: " + age); } } } 해당코드를 실행했는데 (줄바꿈처리도 잘 했습니다.) 커서가 저 상태에서 깜빡거리고, 아무 출력도 없어요.
킬구형, 청크 지향 처리 시 벌크 read를 할 수 있는 방법이 있어? ItemReader 사용 시 소스에서 1건 씩 데이터를 읽어온다면, 단건 SELECT문이 매번 날아가거나 아니면 JDBC의 ResultSet next()를 사용하는 것 같은데,, 전자면 DB 부하가 너무 심하고 후자여도 네트워크 IO가 꽤 발생할 것 같은데.. 지금 수백? 수천만? 건 정도의 데이터를 마이그레이션 해야하는 업무를 받았는데, 청크 생성 시 DB 부하나 네트워크 트래픽을 좀 줄이고 싶은데 다건 SELECT를 통해 처리하는 방법이 있을까?
backend-practice 로 시작하는 포트폴리오용 백엔드 서버만 접속이 가능하고 다른 서버들은 현재 접속할 수 없습니다. 이로인해 현재 포트폴리오용 사이트 실습을 제외하고 기본 강의에서 제시해주시는 코드 테스트가 불가능합니다. 약 일주일정도 살짝 넘게 강의 수강하면서 시도하는데 문제가 지속되는 것으로 봐서 관리가 안되고 있는 것 같은데 확인 부탁드립니다.
저는 풀스택 주니어입니다. 특수 목적을 위해 바닐라js에서 ,document.innerHTML이나 element.remove(), element.append() 등으로 html element의 생성과 삭제가 빈번한 로직을 다루고 있습니다. 이 때 종종 브라우저 렌더링의 실행 완료에 대해 명확하게 알지 못해서 찝찝한 채로 브라우저에 렌더링 일을 시키고 있습니다. 그러던 중 이벤트 루프 관련 3개 강의(16,17,18강) 를 듣고 복습차, 17강으로 다시 돌아와서 보는 2분18초 경에 브라우저 랜더링에 대해 궁금한게 생겼습니다. 예를 들면 const mySchedule = async () => { await randeringPipelineTask(); //랜더링파이프라인 await macroTask(); // 매크로태스크(); } 으로 구성된 mySchedule 메서드가 있다고 가정하겠습니다. macroTask()는 renderingPipelineTask()의 브라우저 페인트까지 모두 완료를 확인한 후에 실행될까요? 아니면 JS엔진이라는 것은, 페인트는 브라우저에 렌더링을 해달라고 부탁까지만하고 macroTask()를 실행할까요? ('실행의 시작'과 '실행의 끝'을 나눠서 생각해서 그런지 생각하면 할수록 햇갈립니다.)
마지막 강의에서 진행한 헥사고날 아키텍처 테스트에서 저는 아래와 같이 에러가 발생하고 있는데 어떻게 수정을 해야 할까요? 소스 코드는 동일한 것 같은데... 무엇이 차이인지 모르겠어요 13:09:39.840 [Test worker] INFO com.tngtech.archunit.core.PluginLoader -- Detected Java version 17.0.12 Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting of layer 'domain' ('com.inflearn.splearn.domain..') layer 'application' ('com.inflearn.splearn.application..') layer 'adapter' ('com.inflearn.splearn.adapter..') where layer 'domain' may only be accessed by layers ['application', 'adapter'] where layer 'application' may only be accessed by layers ['adapter'] where layer 'adapter' may not be accessed by any layer' was violated (1 times): Method <com.inflearn.splearn.SplearnTestConfiguration.passwordEncoder()> calls method <com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()> in (SplearnTestConfiguration.java:19) java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'Layered architecture considering all dependencies, consisting of layer 'domain' ('com.inflearn.splearn.domain..') layer 'application' ('com.inflearn.splearn.application..') layer 'adapter' ('com.inflearn.splearn.adapter..') where layer 'domain' may only be accessed by layers ['application', 'adapter'] where layer 'application' may only be accessed by layers ['adapter'] where layer 'adapter' may not be accessed by any layer' was violated (1 times): Method <com.inflearn.splearn.SplearnTestConfiguration.passwordEncoder()> calls method <com.inflearn.splearn.domain.member.MemberFixture.createPasswordEncoder()> in (SplearnTestConfiguration.java:19) at com.tngtech.archunit.lang.ArchRule$Assertions.assertNoViolation(ArchRule.java:94) at com.tngtech.archunit.lang.ArchRule$Assertions.check(ArchRule.java:86) at com.tngtech.archunit.library.Architectures$LayeredArchitecture.check(Architectures.java:347) at com.inflearn.splearn.HexagonalArchitectureTest.hexagonalArchitecture(HexagonalArchitectureTest.java:22) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at com.tngtech.archunit.junit.internal.ReflectionUtils.invoke(ReflectionUtils.java:111) at com.tngtech.archunit.junit.internal.ReflectionUtils.invokeMethod(ReflectionUtils.java:103) at com.tngtech.archunit.junit.internal.ArchUnitTestDescriptor$ArchUnitMethodDescriptor.execute(ArchUnitTestDescriptor.java:203) at com.tngtech.archunit.junit.internal.ArchUnitTestDescriptor$ArchUnitMethodDescriptor.execute(ArchUnitTestDescriptor.java:173) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)