강의에서는 직접 만들어서 쓰기도 한다고 언급하셨는데, 그게 업계에서 대부분이 그렇게 쓰는건지, 아니면 특수한 경우에서만 그렇게 썼던 것인지 궁금합니다. 강의에서 나온 xnew 같은 것들을 만약 디버깅이나 개발의 편의성을 위해서 직접 쓴다면, 제가 개인 프로젝트를 할 때 강의에서 나온 주요 서버 엔진 코드(매크로 등)를 기본 베이스로 깔고 해도 되는건가요? 아니면 만들다가 필요한 부분이 있으면 그때 그때 엔진도 같이 발전시켜 나가는 형태로 개발이 되는건가요? 이 강의를 다 듣고 추후에 포트폴리오를 만들 때 강의에 나온 코드를 이용하여도 되는지 궁금합니다.
1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 여기까지 이해하신 내용은 무엇인가요? 강사님 안녕하세요 :) 현재 4-9 낙관적 락, 비관적 락 강의를 수강하는 중이며, 단일 행에 대해 배타 락을 거는 방식을 학습한 후 관련 문의 드립니다. 2. 어려움을 겪는 부분 어느 부분에서 막히셨나요? 코드의 어떤 로직이 이해가 안 되시나요? 어떤 개념이 헷갈리시나요? 만약 비관적 락(PESSIMISTIC_WRITE) 방식으로 한 테이블의 여러 행에 락을 걸어야 한다면, 아래 두 방식 중 어느 방식이 적절한지 궁금합니다. N번의 DB 조회를 방지하기 위해 아래 1번 방식을 고려했으나, 관련 케이스가 많지 않아 제가 놓치는 부분이 있는지 여쭤보고 싶습니다. 더불어 실무에서는 어떤 방식으로 접근하시는지도 궁금합니다. :) 3. 시도해보신 내용 문제 해결을 위해 어떤 시도를 해보셨나요? 에러가 발생했다면 어떤 에러인가요? 현재 작성하신 코드를 공유해주세요 1. IN절 조회 후 락 걸기 @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("select p from Product p where p.productNumber in :productNumbers") List<Product> findAllByProductNumberIn(@Param("productNumbers") List<String> productNumbers); 만약 1번 방식이 적절하다면, 데드락 방지를 위해 ORDER BY 정렬이 필수인지 궁금합니다. 2. 루프를 돌며 조회 후 락 걸기 for (String productNumber : productNumbers) { Product product = productRepository.findByProductNumberWithLock(productNumber) .orElseThrow( ··· ); ··· } @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("SELECT p FROM Product p WHERE p.productNumber = :productNumber") Optional<Product> findByProductNumberWithLock(@Param("productNumber") String productNumber); 이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다!
안녕하세요 34강 34. 권한 모드 (accept, plan): 프로필 웹 사이트 만들기 학습 중에 있습니다. 저는 IDE는 인텔리제이에서 터미널에서 claude code를 사용 중에 있는데요 강의에서는 이미지 캡처해서 붙여넣기를 해서 명령을 내리던데 IntelliJ에서는 되지 않아서 문의를 남깁니다. 터미널에서는 안되는건가요? 혹시 IntelliJ에서도 이미지 캡처를 사용할 수 있는 방법이 있을까요?
VPN 사용시 패킷이 전체 암호화가 되면서 목적지의 게이트웨이로 전달된다고 설명해주셨는데(예를 들면 5.5.5.1) 예를 들어서 VPN client를 켜놓고 목적지를 private network가 아닌 public access(예를들면 단순한 google.com 접속) 시에도 여전히 packet encrypted되어서 나가는건가요? 이 패킷의 암호화의 주체는 누구인가요? VPN client인가요 아니면 2번의 Secure Gateway인가요?
안녕하세요. 강의 잘 보고 있습니다. shrimp task manager를 사용해보고 있었는데, github을 보니 더 이상 업데이트가 안되는 것 같습니다. (7개월전이 마지막 업데이트고, 이슈도 오픈 된 상태로 답변 없이 몇 달째 방치 중이네요) 개발자도 거의 손을 뗀 거 아닌가 싶은데, 계속 사용을 해도 괜찮을까요?
안녕하세요~ 강의 중 강사님께서 null을 되도록 허용하지 않는 것으로 보였습니다. 공감이 되었는데, CancelEntity.orderItemId 와 같은 곳에 -1 을 설정한 다거나 QnA.answer 에 Answer.EMPTY 를 설정하는 것은 어떤 장점이 있을지 궁금합니다. 저는 위와 같은 경우는 해당 필드를 nullable 로 하는 것이 이 필드는 없을 수 있다는 것을 더 명확하게 나타낼 수 있다고 생각했습니다. 좋은 강의 감사합니다!
안녕하세요! 항상 강의 잘 듣고있습니다 :) 강의에서 onAuthStateChange 를 사용해서 사용자 로그인 시 세션 데이터가 변경되며 업데이트된 세션이 매개변수로 전달되고, 업데이트된 세션을 스토어에 보관했었습니다 supabase 를 사용하지 않는다면 세션 데이터 변경을 어떻게 감지하고, 스토어에 보관 해야될지 고민해봤는데 세션 데이터를 사용하는 곳에서 직접 저장 / 수정하는 방법 혹은 강의에서 배웠던 persist 와 subscribeWithSelector 를 활용한 방법도 있을 것 같은데 명확한 방법이 떠오르지 않아 강의 내용과는 조금 방향성이 다르지만 질문드리게 되었습니다!
김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)
안녕하세요. sum과 같은 집계함수를 나중에 select 에서 계산한다는 부분이 교재에 조금 헷갈리게 되어있는거 같아서요. 그러니까 sum, count 같은부분은 이미 group by 하고 난다음 select전에 집계함수가 미리 구해진 걸로 ai로 공부하다가 찾아보면서 알게되어서요.. 그렇게 미리 구해진 집계함수가 having이나 select에서 사용되는 거지 select 절에서 계산되는게 아니라고 알게 되었어요. 그거 때문에 성능도 빠른거라고.. 그런데 교재 7. 집계와 그룹핑에 p. 31에 보면 5번 select 절이 실행될때 집계함수 계산이 여기에 이루어진다고 나와있습니다. 수정이 필요한게 아닌가 싶습니다. 아.. 그래서 group by 가 없는 경우와도 헷갈렸었는데 그 경우도 select에서 집계함수가 계산된다기 보다 group by가 없어도 전체 데이터가 하나의 데이터로 implicit grouping으로 select 전에 계산되어지고 select에서는 보여주는 것만 관여하는게 되어서 흐름이 맞춰지더라구요... 개인적으로.. 공식문서에 https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html " This section describes aggregate functions that operate on sets of values"
일단 시키는데로 했는데, 버전이 달라서 그런지 영상 내 설치 화면과 제가 실제 설치한 화면이 다른거 같습니다. 그리고 강사님께서 설명해주신데로 쭉쭉 진행은 했는데 중간에 에러코드가 나와서 chatgpt한테 물어보고.. env.example은 뒤에 example만 떼면 된다고 해서 docker가 뭔지 모르지만 그것까지 설치를 했습니다. 다만 그 다음부터 진행이 안되네요.. 제가 뭘 잘못했는지.. 안내해주시면 좋겠습니다. 저는 port(s)에 뭐가 안나오는거 같습니다. 완전 초보를 위한 강의라고 하지만 어느 정도 지식이 있다는 가정하에 진행하시는 것 같아서 따라잡기 많이 힘드네요. .
id를 전부 string으로 변경했음에도 계속 오류가 발생해서 ai한테 도움을 요청했더니 create-todo.ts에 header값을 붙이라고 하더라고요! 그래서 해당 파일 코드에 headers: { 'Content-Type': 'application/json',} 를 붙여줬더니 정삭작동하는 걸 확인할 수 있엇습니다. 왜 이 헤더를 붙여줘야 하는 건가요? import { API_URL } from '@/lib/constants'; import type { Todo } from '@/types'; export async function createTodo(content: string) { const response = await fetch(`${API_URL}/todos`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ content, isDone: false }), }); if (!response.ok) throw new Error('Create Todo Failed'); const data: Todo = await response.json(); return data; }