강의 내용 인상 깊게 잘 보았습니다! 각 JD의 자격 요건에 대해 궁금한 점이 생겨 질문 남깁니다. 아래 방향으로 접근하면 될지, 더 나은 의견 역시도 궁금합니다. JD의 자격 요건을 최대한 커버할 수 있도록 이력서 내용을 구성 (보조 내용으로서 이미지도 포함하여) 자격 요건(또는 우대사항)이 10개 넘어가는 경우에는 다 넣기가 어렵지 않을까? 자격 요건이 명시되어야 기업에서 뽑아주지 않을까? JD마다 자격 요건이 다를 수 있으니, 특성에 따라 여러 버전의 이력서를 준비할 것 이렇게 접근할 때, 관리 부담과 작업 공수를 최소화하려면 버전 간 차별화를 어느 정도 수준으로 유지하는 것이 적절한지 감사합니다!
매일매일 꾸준히 학습 인증해서 단서를 획득해서 제출 폼에서 알맞은 답변들을 선택했습니다. 마지막에 '몽타주를 완성하시겠습니까?' 에서 '아니오'를 선택하고 넘겨서 최종 제출하게 되었는데 몽타주를 안 그릴 경우에 사례금을 받는 조건에서 인정 안되나요? 몽타주를 안 그려서 다시 제출하려고 했는데, 최초 제출된 것만 인정한다고 하셔서 질문 남깁니다.
20번 강의 > 7번 문제를 풀던 중, 모든 나이에 1을 더하고, cond1 cond2를 설정한 뒤 각 조건의 절댓값 차이를 result 변수에 넣고 값을 확인했습니다. 값이 783.37이 나왔습니다. 선생님께서는 정답을 263.13으로 말씀 주셨습니다. 코드가 같은데, 값이 다른 이유가 궁금합니다. 제가 쓴 코드는 아래에 첨부하였습니다. df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/refs/heads/main/p1/type1_data1.csv") df['age'] = df['age'] +1 cond1 = (df['age']>=20) & (df['age']<30) cond2 = (df['age']>=30) & (df['age']<40) result = abs(df[cond1]['views'].mean() - df[cond2]['views'].mean()) print(result) print(round(result, 2))
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! 질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요 먼저 유사한 질문이 있었는지 검색해보세요 기출 9회 작업형 1에서 보면, grouped[1] 을 사용해서 지역코드와 성별로 그룹된 데이터프레임에서 1에 해당하는 컬럼명과 데이터를 선택합니다. 그런데 저는 이제까지 연습할 때 데이터프레임에서 열을 선택하기 위해 df[숫자]를 쓰면 행이 선택이 되었고, df[: , 숫자]를 입력하면 에러가 났었습니다. 그래서 df에서는 loc나 iloc를 사용해서 슬라이싱 혹은 인덱싱을 하고 있었습니다. 그런데 본 데이터에서는 오히려 loc와 iloc를 사용하면 에러가 납니다. 차이가 무엇인가요? 해당 데이터에서는 왜 컬럼 선택으로 출력이 되는 건가요?
학습 관련 질문을 남겨주세요. 전후 상황을 구체적으로 알려주실수록 좋습니다. 커뮤니티에 비슷한 질문과 답변이 있었는지 먼저 검색해 보세요. 서로 예의를 지키며 존중하는 분위기를 함께 만들어가요. [잠깐!] 인프런 서비스 관련 문의는 1:1 문의하기를 이용해 주세요. 모든 강의의 예제 파일 링크가 아래와 같으며 파일을 다운 받을 수 없습니다. 엑셀러 홈페이지에서 검색해도 찾을 수 가 없습니다. 요청하신 페이지를 찾을 수 없습니다. 주소가 잘못 입력되었거나, 변경되었을 수 있습니다. 입력하신 주소: 404; https://www.iexceller.com:443/myxls/excellertv/chatgpt-excel-for-mem/sample/chatgpt-example-2.xlsx
(AI 퀀트) 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
💡 수강생 안내 사항 (커뮤니티 가이드) 학습 관련 질문 : 구체적으로 적을수록 정확한 답변을 받을 수 있습니다. 작성 팁 : 마크다운과 단축키를 활용하면 글을 더 편리하게 작성할 수 있습니다. 사전 검색 : 질문을 남기기 전, 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해 보세요. 커뮤니티 매너 : 서로 예의를 지키며 존중하는 분위기를 함께 만들어가요. 서비스 문의 : 인프런 서비스 관련 문의는 1:1 문의하기 를 이용해 주세요. 37. 텔레그램 연동 (특강) - 수업자료 다운 받으세요 의 수업노트 노션 " 📈 [특강] 종가베팅 파이프라인 텔레그램 연동 프롬프트 가이드 "의 사용권한이 없다고 하네요ㅠ
LLM 기초부터 최신 RAG·LangChain까지: 단 5시간 만에 LLM 기초과정 마스터!
실습2_GPT기반_온라인_댓글_분류_자동 파일 오류 수정해주세요. 쥬피터 노트북 파일에는 total 데이터 썼다고 되어 있는데, review 데이터 아닌가요? 토탈 데이터 없습니다. 그리고 text 컬럼 없어요. 시간 한참 허비 했습니다. 그리고 전체적으로 코드 자료 구글 드라이브 엑셀 파일 정리 좀 맞게 해주세요. 매치가 안 되고 정리가 안 돼서 보기 불편합니다. 강의명에 맞게 파일을 정리해야죠. 뭔가 정리가 잘 안 되네요. reviews['text']
(AI 퀀트) 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
💡 수강생 안내 사항 (커뮤니티 가이드) 학습 관련 질문 : 구체적으로 적을수록 정확한 답변을 받을 수 있습니다. 작성 팁 : 마크다운과 단축키를 활용하면 글을 더 편리하게 작성할 수 있습니다. 사전 검색 : 질문을 남기기 전, 커뮤니티 질문 & 답변에 비슷한 내용이 있었는지 먼저 검색해 보세요. 커뮤니티 매너 : 서로 예의를 지키며 존중하는 분위기를 함께 만들어가요. 서비스 문의 : 인프런 서비스 관련 문의는 1:1 문의하기 를 이용해 주세요. Part4 완성자료의 CLAUDE.md 자료의 프로젝트 구조를 보면, 시각화_가이드 폴더에 가이드 파일들이 있는데, 이 파일은 어디에 있나요?
안녕하세요 강의 내용에서 김영한님이 "지연 로딩과 다르게 강의의 코드는 자바가 실행될 때 객체를 미리 만들어 생성해두는 가장 단순하고 안전한 방법이다. 인스턴스가 너무 메모리를 잡아먹는게 아니면 로딩할 때 만드는 이 방법이 제일 안전하고 간편하다. getInstance 할 때 없으면 만들고 있으면 그걸 쓰는 지연 로딩 방식은 다르다. "라고 하셨습니다. public class SingletonService { private static final SingletonService instance = new SingletonService(); public static SingletonService getInstance() { return instance; } private SingletonService() { System.out.println("SingletonService 생성자 호출됨"); } public void logic() { System.out.println("싱글톤 객체 로직 호출"); } } 그래서 생성자 함수에도 출력이 되게 하고 자바 main함수에서 그냥 자바 실행시켜 봤는데, 생성자 호출이 안 되더라고요. getInstance를 부르면 생성자 호출이 출력되고요. 자바가 뜰 때(JVM이 실행될 때) SingletonService 클래스와 static변수인 instance는 메모리의 static영역에, instance에 할당되는 실제 SingletonService인스턴스는 힙 영역에 바로 다 생기는 게 맞나요? 강의에서 말씀하신 지연 로딩이랑 다르면 이렇게 되어야한다고 이해했습니다. 그렇다면 왜 제가 만든 private 생성자 함수 속 출력문은 getInstance 코드 없이 자바가 실행될 때 나오지 않았나요?
안녕하세요, Spring Security 필터 등록 방식에 대해 질문이 있습니다. 현재 이전까지 저는 Security 필터를 아래처럼 new 로 직접 생성해서 사용하고 있습니다. LoginFilter loginFilter = new LoginFilter(authenticationManager, loginSuccessHandler, loginFailureHandler); @Component 를 달아 Bean으로 등록하면 Spring이 Security 필터체인과 별개로 기본 서블릿 필터체인에도 자동 등록해버려서 필터가 두 번 실행되는 문제가 있기 때문입니다. 혹시 최신 Spring Boot 버전에서는 이 문제가 개선되었나요? 아니면 @Component + 생성자 주입 방식을 안전하게 사용할 수 있는 방법이 따로 있는지 궁금합니다.
수업노트로 요청한 tdd-red 스킬의 초안은 다음과 같습니다. 아래 내용으로 진행하면 import error, 파일 없음 에러도 정상적인 red 로 인식하고 다음 단계로 진행됩니다. --- name: tdd-red description: 승인된 테스트 시나리오를 실패하는 테스트 코드로 작성한다. TDD Red 단계 시작 시 사용한다. argument-hint: <feature> <이슈 번호> allowed-tools: Read Write Bash --- `$ARGUMENTS`에서 feature 이름과 이슈 번호를 파싱해 해당 이슈의 승인된 시나리오를 실패하는 테스트 코드로 작성한다. ## 시작 전 ### 인자 파싱 `$ARGUMENTS`를 공백으로 분리해 첫 번째 토큰을 `{feature}`, 두 번째 토큰을 `{issue}` 로 사용한다. | 입력 예시 | feature | issue | | ------------------ | -------- | ----- | | `/tdd-red tag 2` | `tag` | `2` | | `/tdd-red search 1`| `search` | `1` | 누락된 값이 있으면 실행 전에 사용자에게 질문한다. - `{feature}`가 없으면: "어떤 기능의 이슈인가요? (예: tag, search, ...)" - `{issue}`가 없으면: "이슈 번호를 알려주세요." 두 값이 확정된 뒤 `docs/features/{feature}/issue-{issue}.md` 를 읽어 시그니처와 테스트 시나리오 목록을 파악한다. - 시그니처 섹션: 테스트 대상 파일 경로 및 함수·컴포넌트명 확인 - 테스트 시나리오 섹션: 작성할 시나리오 목록 전체 수집 파일이 없으면 즉시 멈추고 사용자에게 알린다 (`/test-scenarios {feature} {issue}` 를 먼저 실행해야 한다는 안내 포함). --- ## 단계 1: 테스트 파일 준비 시그니처에서 테스트 대상 파일 경로를 추출하고 테스트 파일 경로를 결정한다. ### 파일 위치 규칙 | 구현 파일 | 테스트 파일 | | ---------------------------------- | ---------------------------------------- | | `src/api/tags.ts` | `src/api/tags.test.ts` | | `src/components/TagInput.tsx` | `src/components/TagInput.test.tsx` | | `src/context/NotesContext.tsx` | `src/context/NotesContext.test.tsx` | - 테스트 파일이 이미 존재하면 기존 내용을 읽어 중복 `describe` 블록을 피한다. - 테스트 파일이 없으면 새로 생성한다. ### 파일 헤더 (신규 생성 시) ```ts import { describe, it, expect, vi, beforeEach } from 'vitest'; // 컴포넌트 파일인 경우에만 추가: // import { render, screen } from '@testing-library/react'; // import userEvent from '@testing-library/user-event'; ``` --- ## 단계 2: 시나리오를 테스트 코드로 작성 시나리오를 하나씩 `it()` 블록으로 변환한다. 한 번에 모두 작성하지 않고 **시나리오 하나 작성 → 실행 → 실패 확인 → 다음 시나리오** 순서를 반복한다. ### 테스트 이름 형식 ``` should [기대 동작] when [조건] ``` ### describe 블록 구조 함수·컴포넌트 단위로 묶는다. ```ts describe('함수명 또는 컴포넌트명', () => { it('should [기대 동작] when [조건]', () => { // Red 단계: 구현이 없으므로 실패하는 코드만 작성 }); }); ``` ### Red 테스트 작성 원칙 - 구현이 존재하지 않으므로 import가 실패하거나 호출이 오류를 던져야 한다. - 억지로 통과시키려 하지 않는다. 실패 자체가 목표다. - `expect`는 실제 기대 동작을 명확하게 표현한다. `expect(true).toBe(false)` 같은 더미 assertion은 사용하지 않는다. **API 함수 예시** ```ts import { addTag } from './tags'; describe('addTag', () => { it('should return updated note when valid tag is added', async () => { const result = await addTag('note-1', 'work'); expect(result.tags).toContain('work'); }); it('should throw when tag is empty string', async () => { await expect(addTag('note-1', '')).rejects.toThrow(); }); }); ``` **컴포넌트 예시** ```ts import { render, screen } from '@testing-library/react'; import { TagInput } from './TagInput'; describe('TagInput', () => { it('should render input when component is mounted', () => { render(<TagInput tags={[]} onAdd={vi.fn()} onRemove={vi.fn()} />); expect(screen.getByRole('textbox')).toBeInTheDocument(); }); }); ``` --- ## 단계 3: 시나리오별 실행 루프 각 시나리오를 작성한 직후 아래 명령으로 해당 테스트 파일만 실행한다. ```bash npx vitest run <테스트-파일-경로> --reporter=verbose ``` - **실패 확인**: `FAIL` 또는 import 오류가 나오면 정상. 다음 시나리오로 이동한다. - **통과**: 테스트가 의도치 않게 통과하면 즉시 멈추고 사용자에게 알린다. 구현 파일이 이미 존재하는지 확인한다. --- ## 단계 4: 전체 확인 모든 시나리오 작성이 끝나면 전체 테스트를 실행한다. ```bash npm test ``` - 작성한 테스트 파일의 모든 케이스가 실패하는지 확인한다. - 기존에 통과하던 테스트가 새로 실패하면 즉시 사용자에게 보고한다. --- ## 제약 - 테스트 파일(`*.test.ts`, `*.test.tsx`)만 생성하거나 수정한다. - `src/` 안의 구현 코드(`*.ts`, `*.tsx`, `*.css` 등 테스트 파일 제외)는 절대 수정하지 않는다. - 테스트가 통과하도록 mock이나 stub으로 우회하지 않는다. --- ## 산출물 - 작성된 테스트 파일 목록 및 경로 - 시나리오별 실패 메시지 요약 - `npm test` 결과: 실패한 테스트 수 / 전체 테스트 수 관련해서, import 에러 및 파일 에러는 없어야한다.(stub 이 있어야 함. Collect 는 모두 성공하고 Test 단계에서 실패해야한다.) 는 점을 고려해서 아래와 같이 스킬을 수정했는데, 피드백 부탁드립니다. --- name: tdd-red description: 승인된 테스트 시나리오를 실패하는 테스트 코드로 작성한다. TDD Red 단계 시작 시 사용한다. argument-hint: <feature> <이슈 번호> allowed-tools: Read Write Bash --- `$ARGUMENTS`에서 feature 이름과 이슈 번호를 파싱해 해당 이슈의 승인된 시나리오를 실패하는 테스트 코드로 작성한다. ## 시작 전 ### 인자 파싱 `$ARGUMENTS`를 공백으로 분리해 첫 번째 토큰을 `{feature}`, 두 번째 토큰을 `{issue}` 로 사용한다. | 입력 예시 | feature | issue | | ------------------- | -------- | ----- | | `/tdd-red tag 2` | `tag` | `2` | | `/tdd-red search 1` | `search` | `1` | 누락된 값이 있으면 실행 전에 사용자에게 질문한다. - `{feature}`가 없으면: "어떤 기능의 이슈인가요? (예: tag, search, ...)" - `{issue}`가 없으면: "이슈 번호를 알려주세요." 두 값이 확정된 뒤 `docs/features/{feature}/issue-{issue}.md` 를 읽어 시그니처와 테스트 시나리오 목록을 파악한다. - 시그니처 섹션: 테스트 대상 파일 경로 및 함수·컴포넌트명 확인 - 테스트 시나리오 섹션: 작성할 시나리오 목록 전체 수집 파일이 없으면 즉시 멈추고 사용자에게 알린다 (`/test-scenarios {feature} {issue}` 를 먼저 실행해야 한다는 안내 포함). --- ## 단계 0: 스텁 생성 테스트 파일을 작성하기 전에, 이슈의 시그니처를 읽어 **아직 존재하지 않는 구현 파일**에 대해서만 최소 스텁을 생성한다. ### 목적 Import Error 때문에 테스트가 실행조차 되지 않으면, 테스트가 무엇을 거부하는지 알 수 없다. 스텁은 빌드를 통과시켜 테스트가 **Assertion Failure로 실패**하도록 만드는 것이 전부다. ### 스텁 작성 규칙 - **기존 파일이 있으면 건드리지 않는다.** 신규 파일만 생성한다. - 시그니처의 파라미터·반환 타입을 그대로 선언한다. 구현 로직은 쓰지 않는다. - 반환값은 타입을 만족하는 최솟값으로 고정한다. | 반환 타입 | 스텁 반환값 | | ------------------ | ------------- | | `string[]` | `[]` | | `string` | `''` | | `boolean` | `false` | | `Promise<T>` | `Promise.resolve(/* 최솟값 */)` | | React 컴포넌트 | `return <div />;` | | `void` | _(반환 없음)_ | ### 스텁 예시 **훅 (`src/hooks/useTagInput.ts`)** ```ts import { useState } from 'react'; export function useTagInput(_initialTags: string[]) { const [tags] = useState<string[]>([]); const [inputValue, setInputValue] = useState(''); return { tags, inputValue, setInputValue, addTag: (_value: string) => {}, removeTag: (_tag: string) => {}, handleKeyDown: (_e: React.KeyboardEvent<HTMLInputElement>) => {}, }; } ``` **컴포넌트 (`src/components/TagInput.tsx`)** ```tsx import { TagInputProps } from '../types'; // 필요 시 인라인 정의 export function TagInput(_props: TagInputProps) { return <div />; } ``` **API 함수 (`src/api/tags.ts`)** ```ts import { Note } from '../types/note'; export async function addTag(_noteId: string, _tag: string): Promise<Note> { return Promise.resolve({} as Note); } ``` --- ## 단계 1: 테스트 파일 준비 시그니처에서 테스트 파일 경로를 결정한다. | 구현 파일 | 테스트 파일 | | -------------------------------- | ----------------------------------- | | `src/api/tags.ts` | `src/api/tags.test.ts` | | `src/components/TagInput.tsx` | `src/components/TagInput.test.tsx` | | `src/context/NotesContext.tsx` | `src/context/NotesContext.test.tsx` | - 테스트 파일이 이미 존재하면 기존 내용을 읽어 중복 `describe` 블록을 피한다. - 테스트 파일이 없으면 새로 생성한다. ### 파일 헤더 (신규 생성 시) ```ts import { describe, it, expect, vi, beforeEach } from 'vitest'; // 컴포넌트 파일인 경우에만 추가: // import { render, screen } from '@testing-library/react'; // import userEvent from '@testing-library/user-event'; ``` --- ## 단계 2: 시나리오를 테스트 코드로 작성 이슈의 시나리오 전체를 한 번에 `it()` 블록으로 변환한다. ### 테스트 이름 형식 ``` should [기대 동작] when [조건] ``` ### describe 블록 구조 함수·컴포넌트 단위로 묶는다. ```ts describe('함수명 또는 컴포넌트명', () => { it('should [기대 동작] when [조건]', () => { // 스텁이 있으므로 import는 통과하고, assertion이 실패한다 }); }); ``` ### Red 테스트 작성 원칙 - `expect`는 실제 기대 동작을 명확하게 표현한다. `expect(true).toBe(false)` 같은 더미 assertion은 사용하지 않는다. - 스텁의 반환값(빈 배열, `<div />` 등)을 기준으로 assertion이 자연스럽게 실패하도록 작성한다. - 테스트가 통과하도록 mock이나 stub으로 우회하지 않는다. **API 함수 예시** ```ts import { addTag } from './tags'; describe('addTag', () => { it('should return updated note when valid tag is added', async () => { const result = await addTag('note-1', 'work'); expect(result.tags).toContain('work'); // 스텁은 {} 반환 → tags 없음 → Assertion Failure }); it('should throw when tag is empty string', async () => { await expect(addTag('note-1', '')).rejects.toThrow(); // 스텁은 throw 안 함 → Assertion Failure }); }); ``` **컴포넌트 예시** ```ts import { render, screen } from '@testing-library/react'; import { TagInput } from './TagInput'; describe('TagInput', () => { it('should render input when component is mounted', () => { render(<TagInput tags={[]} onAdd={vi.fn()} onRemove={vi.fn()} />); expect(screen.getByRole('textbox')).toBeInTheDocument(); // 스텁은 <div /> → textbox 없음 → Assertion Failure }); }); ``` --- ## 단계 3: 실행 및 Red 품질 확인 모든 테스트 파일을 작성한 뒤 파일별로 실행한다. ```bash npx vitest run <테스트-파일-경로> --reporter=verbose ``` ### Red 품질 기준 | 실패 유형 | 판정 | 조치 | | ------------------ | ------------- | ---------------------------------------- | | Assertion Failure | ✅ 올바른 Red | 다음으로 진행 | | Runtime Error | ✅ 허용 | 다음으로 진행 | | Import Error | ❌ 스텁 누락 | 단계 0으로 돌아가 해당 파일 스텁 보완 | | Syntax Error | ❌ 테스트 오류 | 테스트 코드 수정 | - **Import Error가 발생하면 올바른 Red로 인정하지 않는다.** 스텁을 보완한 뒤 다시 실행한다. - 테스트가 의도치 않게 통과하면 즉시 멈추고 사용자에게 알린다. --- ## 단계 4: 전체 확인 모든 파일의 Red 품질이 확인된 뒤 전체 테스트를 실행한다. ```bash npm test ``` - 이슈에서 작성한 테스트 파일의 케이스가 모두 Assertion Failure로 실패하는지 확인한다. - 기존에 통과하던 테스트가 새로 실패하면 즉시 사용자에게 보고한다. --- ## 제약 - 테스트 파일(`*.test.ts`, `*.test.tsx`)은 자유롭게 생성·수정한다. - 단계 0의 스텁은 **존재하지 않는 파일**에 한해서만 신규 생성한다. - **기존 구현 파일은 수정하지 않는다.** --- ## 산출물 - 생성된 스텁 파일 목록 및 최솟값 반환 내용 - 작성된 테스트 파일 목록 및 경로 - 파일별 실패 유형 요약 (Assertion Failure / Runtime Error) - `npm test` 결과: 실패한 테스트 수 / 전체 테스트 수