학습 관련 질문을 최대한 상세히 남겨주세요! 고민 과정도 같이 나열해주셔도 좋습니다. 먼저 유사한 질문이 있었는지 검색해보세요. 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요! 20:15 경 작성해주신 findByPath 의 함수에서 article_id 의 경우 함께 조회할 필요가 없나요? 이전에 생성했던 unique index 구조를 생각해보면 article_id 와 path 2개로 복합 인덱스를 생성하였기 때문에 게시글마다 path 에 대한 unique 함을 보장하는 것이기 때문에 조회 시에 findByArticleIdAndPath 과 같은 식으로 해야 할 것 같은데, 제가 잘못 이해한 부분이 있는지 궁금합니다!
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다! [질문 전 답변] 1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요] 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요] 3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요] ( https://inf.run/DvsRD ) 4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up 으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. ( https://inf.run/Ljaer ) [질문 하기] 안녕하세요. 얼마전에 OVA 인증서 관련하여 질문드렸었고, 해당 부분 수정조치를 통해서 해결했고 지금은 잘 수강중인 수강생입니다. 이번엔 조금 다른 인증 문제로 추측되는 부분이 보여 문의드리고자 합니다. 지금 발생한 문제는 Deployment로 생성한 nginx Pod가 ContainerCreating 상태에서 멈춰 있고, 아무리 기다려도 컨테이너가 뜨지 않는 현상입니다. Pod는 w2-k8s 노드로 정상 배치되었지만, 컨테이너 실행 직전 단계에서 계속 실패하는 중이며 직접적인 에러는 Pod sandbox 생성 실패로 보입니다. FailedCreatePodSandBox 이벤트와 함께, Calico CNI가 Pod 네트워크를 구성하는 과정에서 kube-apiserver 접근 권한이 거부되고 있는게 맞나 모르겠습니다만 이런저런 검색을 통해 확인해본 결과 Calico 자체가 죽어 있거나 미배포된 문제는 아닌 것 같습니다. calico-node와 calico-kube-controllers Pod는 전 노드에서 모두 Running 상태였고, 프로세스는 살아 있어 보이는데 클러스터 인증이 정상이지 않은 것은 아닌가.. 하여 문의드립니다. Calico의 API 요청이 현재 kube-apiserver 인증 정보와 맞지 않아 거부되고 있는건지 맞다면 이것도 지난번 인증문제의 연장선인지 궁금합니다. root@cp-k8s:~# kubectl create deployment deploy-nginx --image=nginx deployment.apps/deploy-nginx created oot@cp-k8s:~# kubectl get pods NAME READY STATUS RESTARTS AGE chk-info 1/1 Running 1 (2d23h ago) 3d21h deploy-nginx-74d7d6d848-qfm9t 0/1 ContainerCreating 0 9m2s nginx 1/1 Running 1 (2d23h ago) 3d21h deployment 배포 시 계속 creating 중인것을 확인하여 이것저것 확인해보았습니다. root@cp-k8s:~# kubectl describe pod deploy-nginx-74d7d6d848-qfm9t Name: deploy-nginx-74d7d6d848-qfm9t Namespace: default Priority: 0 Service Account: default Node: w2-k8s/192.168.1.102 Start Time: Sat, 10 Jan 2026 19:55:18 +0900 Labels: app=deploy-nginx pod-template-hash=74d7d6d848 Annotations: Status: Pending IP: IPs: Controlled By: ReplicaSet/deploy-nginx-74d7d6d848 Containers: nginx: Container ID: Image: nginx Image ID: Port: Host Port: State: Waiting Reason: ContainerCreating Ready: False Restart Count: 0 Environment: Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8xmt6 (ro) Conditions: Type Status PodReadyToStartContainers False Initialized True Ready False ContainersReady False PodScheduled True Volumes: kube-api-access-8xmt6: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: DownwardAPI: true QoS Class: BestEffort Node-Selectors: Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 9m42s default-scheduler Successfully assigned default/deploy-nginx-74d7d6d848-qfm9t to w2-k8s Warning FailedCreatePodSandBox 9m41s kubelet Failed to cr eate pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "00 b664464bf90cf3b54ba9fc929062889571285e8bf0c25021b3a66691fd3f7f": plugin type="calico" fail ed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized Normal SandboxChanged 4m30s (x25 over 9m41s) kubelet Pod sandbox changed, it will be killed and re-created. root@cp-k8s:~# kubectl get pods -n kube-system | grep calico calico -kube-controllers-546f76d588-pft8d 1/1 Running 2 (2d23h ago) 11d calico -node-98wj4 1/1 Running 2 (2d23h ago) 11d calico -node-99qnn 1/1 Running 2 (2d23h ago) 11d calico -node-mpfgs 1/1 Running 2 (2d23h ago) 11d calico -node-qtflz 1/1 Running 1 (2d23h ago) 11d
안녕하세요. 과제를 잘 못 이해한건가 싶기도 하지만 아래와 같은 조건하에 구현을 해 봤습니다. 수업 과정에서 Front-end는 고정인 상황이기 때문에 기존 API는 변경이 없다는 가정하에 변경 해 봤습니다. 시간대1개와 요일n개의 설정이 하나의 row로 묶여있는 상태로는 요일별 시간대 변동에 대응하기 까다로운 것 같아 요일별 개별 row로 저장하도록 일부 수정 하였습니다. API endpoint 모델 변경을 피하기 위해서 내부적으로 여러개의 요일별 row로 나누어 저장하도록 했습니다. 고민중에 작가님께서 올려 놓으신 레퍼런스 코드를 봤는데, 책에서 언급하신 것 처럼 postgres 경우와 sqlite 경우로 코드가 분기 되는 것을 보았고, 지금은 교육 과정이기 때문이라고 생각 하지만 배포 코드와 개발 환경 코드가 다른것은 여러모로 좋지 않은 것 같아 현재는 sqlite 기준으로 개별 DB구현에서만 지원하는 것은 배제하는 방향으로 구현 했습니다. 1과 같이 변경 함으로써, 기 등록된 정보의 수정에서는 개별 날짜 별 시간대 설정 면에서 자유도가 생겼다고 생각 됩니다. 타임슬롯의 변경과 삭제에 관해서는 내부적으로는 time-slot으로 관리하지만, 외부공개 id는 아니므로, 키 로서 start-time, end-time, weekday (API형태로서는 리스트)조합으로 정의 해서 동작 하도록 구현했습니다. 특히 삭제의 경우는 부득이 delete method의 경우는 payload가 포함되는것이 받아들여지지 않는 경우도 있는것을 고려해서, 새 등록 값 두가지(new_start_time과, new_end_time) 값이 모두 제공되고 같은 경우를 특정하여 삭제 동작으로 정의하여 동작하도록 구현했습니다. class TimeSlotUpdateByGroupIn(SQLModel): start_time: time end_time: time weekdays: Weekdays new_start_time: time | None = None new_end_time: time | None = None new_weekdays: Weekdays | None = None @model_validator(mode="after") def check_update_fields(self): update_fields = { "new_start_time": self.new_start_time, "new_end_time": self.new_end_time, "new_weekdays": self.new_weekdays, } if not any(value is not None for value in update_fields.values()): raise ValueError("최소 하나의 수정 필드는 반드시 제공되어야 합니다.") return self @router.post("/time-slots", status_code=status.HTTP_201_CREATED, response_model=TimeSlotOut) async def create_time_slot( user: CurrentUserDep, session: DbSessionDep, payload: TimeSlotCreateIn, ) -> TimeSlotOut: if not user.is_host: raise GuestPermissionError() weekdays = sorted(set(payload.weekdays)) # dup. check with already exist one stmt = select(TimeSlot).where( and_( TimeSlot.calendar_id == user.calendar.id, TimeSlot.weekday.in_(weekdays), TimeSlot.start_time < payload.end_time, TimeSlot.end_time > payload.start_time, ) ) result = await session.execute(stmt) existing_time_slot = result.scalars().first() if existing_time_slot: raise TimeSlotOverlapError() time_slots = [ TimeSlot( calendar_id=user.calendar.id, start_time=payload.start_time, end_time=payload.end_time, weekday=weekday, ) for weekday in weekdays ] session.add_all(time_slots) await session.commit() if not time_slots: raise TimeSlotOverlapError() return TimeSlotOut( start_time=time_slots[0].start_time, end_time=time_slots[0].end_time, weekdays=weekdays, created_at=time_slots[0].created_at, updated_at=time_slots[0].updated_at, ) @router.get( "/time-slots/{host_username}", status_code=status.HTTP_200_OK, response_model=list[TimeSlotOut], ) async def get_host_timeslots( host_username: str, session: DbSessionDep, ) -> list[TimeSlotOut]: stmt = ( select(User) .where(User.username == host_username) .where(User.is_host.is_(true())) ) result = await session.execute(stmt) host = result.scalar_one_or_none() if host is None or host.calendar is None: raise HostNotFoundError() stmt = select(TimeSlot).where(TimeSlot.calendar_id == host.calendar.id) result = await session.execute(stmt) time_slots = result.scalars().all() grouped: dict[tuple[time, time], TimeSlotOut] = {} for time_slot in time_slots: key = (time_slot.start_time, time_slot.end_time) if key not in grouped: grouped[key] = TimeSlotOut( start_time=time_slot.start_time, end_time=time_slot.end_time, weekdays=[time_slot.weekday], created_at=time_slot.created_at, updated_at=time_slot.updated_at, ) continue grouped[key].weekdays.append(time_slot.weekday) if time_slot.created_at < grouped[key].created_at: grouped[key].created_at = time_slot.created_at if time_slot.updated_at > grouped[key].updated_at: grouped[key].updated_at = time_slot.updated_at if not grouped: raise TimeSlotNotFoundError() for time_slot in grouped.values(): time_slot.weekdays = sorted(set(time_slot.weekdays)) return list(grouped.values()) @router.patch( "/time-slots", status_code=status.HTTP_200_OK, response_model=TimeSlotOut | None, ) async def update_time_slot( user: CurrentUserDep, session: DbSessionDep, payload: TimeSlotUpdateByGroupIn, ) -> TimeSlotOut | None: if not user.is_host: raise GuestPermissionError() current_weekdays = sorted(set(payload.weekdays)) stmt = select(TimeSlot).where( and_( TimeSlot.calendar_id == user.calendar.id, TimeSlot.start_time == payload.start_time, TimeSlot.end_time == payload.end_time, ) ) result = await session.execute(stmt) current_slots = result.scalars().all() if not current_slots: raise TimeSlotNotFoundError() existing_weekdays = sorted({slot.weekday for slot in current_slots}) if existing_weekdays != current_weekdays: raise TimeSlotNotFoundError() delete_only = ( payload.new_start_time is not None and payload.new_end_time is not None and payload.new_start_time == payload.new_end_time ) if delete_only: current_ids = [slot.id for slot in current_slots] await session.execute(delete(TimeSlot).where(TimeSlot.id.in_(current_ids))) await session.commit() return None new_start_time = payload.new_start_time or payload.start_time new_end_time = payload.new_end_time or payload.end_time new_weekdays = sorted(set(payload.new_weekdays or payload.weekdays)) if new_start_time >= new_end_time: raise HTTPException( status_code=status.HTTP_422_UNPROCESSABLE_CONTENT, detail="시작 시간은 종료 시간보다 빨라야 합니다.", ) current_ids = [slot.id for slot in current_slots] stmt = select(TimeSlot).where( and_( TimeSlot.calendar_id == user.calendar.id, TimeSlot.weekday.in_(new_weekdays), TimeSlot.start_time < new_end_time, TimeSlot.end_time > new_start_time, TimeSlot.id.not_in(current_ids), ) ) result = await session.execute(stmt) existing_time_slot = result.scalars().first() if existing_time_slot: raise TimeSlotOverlapError() await session.execute(delete(TimeSlot).where(TimeSlot.id.in_(current_ids))) new_time_slots = [ TimeSlot( calendar_id=user.calendar.id, start_time=new_start_time, end_time=new_end_time, weekday=weekday, ) for weekday in new_weekdays ] session.add_all(new_time_slots) await session.commit() return TimeSlotOut( start_time=new_start_time, end_time=new_end_time, weekdays=new_weekdays, created_at=new_time_slots[0].created_at, updated_at=new_time_slots[0].updated_at, )
안녕하세요! 강의 두 번째 복습 중 궁금한 점이 생겼습니다. 광고 실험 시 여러 개의 광고 그룹·캠페인을 만든다고 하셨는데, 이는 초기 광고 단계에서도 동일하게 적용되는 방법 인가요? 초기 광고는 소액(일 2,000~5,000원) 으로 세팅한다고 하셨는데, 이 예산 안에서 여러 광고 그룹·캠페인을 동시에 운영할 수 있는지 궁금합니다. (5,000원을 쪼개서 2~3개의 캠페인을 돌리시는지? 아니면 안정성이 확보되고 예산을 늘릴 때 캠페인도 같이 늘리시는지..?)
어떤 강의에 대한 질문인지 자세하게 알려주시면 답변을 드리는데 도움이 됩니다. 스크린샷 윈도우키 + 쉬프트키 + S(윈도우) 을 자세히 첨부하시면 답변 드리는데 많은 도움이 됩니다. 동영상 재생 관련 같은 인프런 서비스 관련 문의는 1:1 문의하기를 이용해 주세요. 7강 강의를 보면 switch 노드에 community에서 검색한 imap노드를 사용하시던데요. 지금은 n8n 정책이 바뀌어서 사용이 안된다고 합니다. AI를 찾아보니 정책 바뀐건 맞더라구요. 혹시 해당 기능을 쓸 수 있는 방법이나 대체 방법 알려주시면 감사하겠습니다.
안녕하세요, 강의 정말 감명 깊게 잘 보고 있습니다. 2026년 새해 복 많이 받으시길 바랍니다! 저는 2022년 비전공 국비 교육을 거쳐 운 좋게 취업에 성공했고, 이후 약 2년 6개월간 중소기업에서 유니티 클라이언트 프로그래머로 근무했습니다. 주로 보드게임과 카지노 분야를 담당해 왔으나, 제가 진정으로 추구하는 개발 방향과 차이가 크다는 생각에 최근 퇴사 후 포트폴리오 정비에 들어갔습니다. 하지만 막상 준비를 시작하니 큰 고민에 빠졌습니다. 현재 4인 규모 모바일 게임사 경력까지 합치면 약 [3년 경력의 클라이언트 프로그래머]라는 타이틀이 붙게 되는데, 솔직히 스스로를 되돌아봤을 때 그 타이틀에 걸맞은 깊이 있는 지식이나 어필할 만한 현업 프로젝트 결과물이 부족하다는 확신이 듭니다. 그래서 2026년 한 해를 온전히 투자해, 오는 4월부터 프로카데미 11개월 커리큘럼을 수료하며 기초부터 다시 단단히 다지고자 합니다. 이후 경력을 내세우기보다, 루키스님께서 강조하신 것처럼 제대로 된 곳에 신입으로 재취업을 도전해보고 싶습니다. 여기서 제가 판단이 서지 않는 점은 두 가지입니다. 1. 3년이라는 실무 시간을 뒤로하고 다시 1년의 교육 과정을 밟는 것이 시간 낭비는 아닐지, 아니면 지금이라도 늦지 않은 선택인지 궁금합니다. 2. 도움이 되지 않는다고 판단되는 지난 경력을 이력서에서 아예 지우는 것이 나을까요? 아니면 경력은 적되 '기초가 부족해 다시 공부한 중고 신입'의 포지션을 취하는 것이 맞을까요? 전문가이신 루키스님의 시선에서 이 선택이 미련한 행동인지, 아니면 제대로 된 방향으로 가는 과정인지 냉정한 조언을 부탁드리고 싶습니다. 긴 글 읽어주셔서 감사합니다.
해당 강의 8:10처럼 동일하게 돌렸을 때 다음과 같이 출력이 찍힙니다. 624만원에 관한 정보는 나오지 않습니다. ㅠㅠ 여러번 돌려도 계속 그렇게 나오네요 .. 어떤 문제일까요?, 혹시나 DB에 문서를 적재하는 과정중에서 55조의 테이블이 씹힌건가? 해서 document_list 찍었을땐 (적재 전 txt 파일을 로딩하는과정에서) 또 624만원에 관련된 내용이 있습니다... 출력내용이 길어 10000자가 넘어 마지막 answer만 올려드립니다. document answer == {'answer': AIMessage(content='연봉 5천만 원인 거주자의 소득세는 근로소득공제를 적용하여 계산됩니다. 총급여액 5천만 원의 경우, 근로소득공제는 1천200만 원+(4천500만 원을 초과하는 금액의 100분의 5)입니다. 따라서, 소득세는 해당 공제를 적용한 과세표준에 세율을 적용하여 계산하게 됩니다. 하지만 세율 정보가 없으므로 정확한 소득세 금액을 계산할 수 없습니다. ++ 다른 테이블은 context로 찍히는데 55조 624만원 관련 테이블만 안찍힙니다..
안녕하세요. 프리랜서 강의 너무 잘 들었습니다. 운이 좋게도 아는 지인분께서 프리랜서 계약 관련 요청을 주셨는데요. 아직 상세 기획서, 예산 등은 받지 않은 상태라 정확한 정보가 없지만 추후에 받게 되면 제가 적절한 견적 및 개발 계획을 세울 예정입니다. 혹시 정리가 된 이후에 적절한지 수정할 부분은 없는지 피드백을 받는 것도 멘토링 신청으로 가능한지 여쭤봅니다!
소득세법 제55조(세율) 및 제47조(근로소득공제)에 따르면, 거주자 기준으로 연봉 5천만원(근로소득)의 소득세는 다음과 같이 계산됩니다. 근로소득공제 적용 총급여액 5천만원 기준 공제액: 1,475만원 (5천만원 × 15% + 75만원, 단 최고 한도 2천만원 미만) 과세표준 산정 5천만원 - 1,475만원 = 3,525만원 종합소득세율 적용 3,525만원 구간: 1,400만원 이하 6% + 초과분 15% 산출세액: 84만원(1,400만원 × 6%) + (3,525만원 - 1,400만원) × 15% = 474.75만원 최종 납부세액 474.75만원에서 근로소득세액공제 (산출세액의 55% 한도) 등 추가 공제 적용 가능 ※ 정확한 세액은 의료비·교육비·보험료 등 추가 공제항목에 따라 달라질 수 있습니다. (추가 설명: "거주자"는 직장·자영업 등 소득 유형과 무관하게 국적에 관계없이 국내 주소를 둔 개인을 의미하며, 직장인은 그 하위 범주에 포함됩니다.) 답변이 전혀 다르고 이상하게 근거없는 숫자도 나오는데 왜그런걸까유 fewshot하는것까지 작성했습니다.
PPT - 11page 2장 max.jsx => main 아닌가요? ( 강의 영상이라..수정이.. 암튼 그러핟고요_ 예전에 제가 "코드로 배우는 스프링 웹 프로젝트" (개정판) ..ㅋㅋ 도서에도 오타 잡는 취미가 있었다는 ㅎㅎㅎ ^^ 다른 분이 찾으셨다면.. . .. 중복 Q&A 문의 죄송합니다.
안녕하세요 강의 잘보고 있습니다. 문의 내용이 있어서요 강의 내용중 소스내용이 많아 강사님 말씀처럼 자료에 있는 소스를 복붙하고 있는데요 문자 인코딩 (PPT와 vscode) 문제인지 복붙을 하고 보면 위와같이 붉은색으로 표시가 되는데 (일반 import를 안해서 생기는 line 말고요) 강의 화면을 보면 같은 증상으로 누구는 한글 에 노락 박스로 나타난다고 하는데 vt 및 저는 한글이 아니어도 같은 증상입니다. 라인 맨앞에 노락박스로 탭표시가 되는데 소스 가독에 상당히 힘들어서요. AI 말로는 위와같이 설정해도 같은 증상이고 저 내용에 "직접 삭제" ? ...ㅡㅡ (하나하나? 라인 마다?) 혹시 강의교안이나 다른데서 받아 올수 없나요? 아 git에서 다운로드 받을 수있는지요? (죄송합니다. 있으면 제가 아직 못찾은듯요..) 강사님... 급해결 요청드립니다. 아~ 너무 보기 힘드네요 ★ 앗! 지금 보니까 강사님 소스 작성할때는 잠깐 나타나따 사라지네요? 말씀드렸지만... 위 AI 내용데로 ..설정햇는데.. 구글링에도 같은소리만..ㅡㅡ; 저만 그런가요..?
안녕하세요 강의 잘보고 있습니다. 문의 내용이 있어서요 강의 내용중 소스내용이 많아 강사님 말씀처럼 자료에 있는 소스를 복붙하고 있는데요 문자 인코딩 (PPT와 vscode) 문제인지 복붙을 하고 보면 위와같이 붉은색으로 표시가 되는데 강의 화면을 보면 같은 증상으로 누구는 한글 에 노락 박스로 나타난다고 하는데 vt 및 저는 한글이 아니어도 같은 증상입니다. 라인 맨앞에 노락박스로 탭표시가 되는데 소스 가독에 상당히 힘들어서요. AI 말로는 위와같이 설정해도 같은 증상이고 저 내용에 "직접 삭제" ? ...ㅡㅡ (하나하나? 라인 마다?) 혹시 강의교안이나 다른데서 받아 올수 없나요? 아 git에서 다운로드 받을 수있는지요? (죄송합니다. 있으면 제가 아직 못찾은듯요..) 강사님... 급해결 요청드립니다. 아~ 너무 보기 힘드네요
안녕하세요. 좋은 강의 감사합니다. 강의를 듣다 몇가지 의문이 있어 글을 작성합니다. 애드몹 광고는 비공개 테스트시에도 적용을 해야하나요. 비공개 테스트시에도 애드몹광고를 추가한 상태에서 진행해야하나요? 비공개 테스트가 완료된 상태에서 애드몹광고를 추가하고 출시가 가능한가요? 비공개 테스트시에는 애드몸광고를 넣지않고 앱을 개시할때 추가해도되나요 애드몹 공고로 등록한 모바일 폰은 비공개 테스트 시 12개중한개의 모바일폰에 포함되나요.
저는 프론트개발자이고(FE) 백앤드개발자(BE)와 어드민개발자와 협업을 진행했었습니다. 프로젝트를 진행하다가 어드민개발자가 (어드민도 BE인데) 만들어준 API를 직접 호출하다가 호출이 정상적으로 되지 않아 백앤드 개발자에게 말하니, 백앤드 개발자가 proxy로 API를 만들어야 해요 라고 하던군요. 백앤드개발자가 만든 proxy로 감싼? API를 따로 제공해주고 그 API를 호출하니 그제서야 데이터를 받아와 처리 할 수 있었습니다. 이제야 약간 왜 그랬었는지 유추가 가능해졌습니다. 서버 투 서버는 CORS가 안나서 그런거 맞나요?