반갑습니다!
AI와 컴퓨터 공학의 무한한 가능성을 탐구하며, 그 여정을 여러분과 나누고 싶은 해여입니다.
학부 시절 '컴퓨터 공학 중독자'라 불릴 만큼 전공에 대한 열정으로 4.4점 이상의 전공 학점으로 수석 졸업하였고, S대학원에서 AI를 전공하며 석사 학위를 받고 박사 과정을 통해 전문성을 심화했습니다.
하지만 이론적 탐구만큼이나 실제 세상의 문제를 AI로 해결하는 것에 큰 매력을 느껴, 박사 과정을 잠시 멈추고 스타트업에서 AI 기반 LLM 및 비디오 분석 프로젝트를 경험하며 귀중한 실전 경험을 쌓았습니다.
지금은 국내 Top3 대기업 중 한 곳에서 LLM 프로젝트 개발 및 PM으로 일하며, AI 기술이 우리 삶에 가져올 긍정적인 변화들을 만들어가는 데 기여하고 있습니다. 제가 겪었던 고민과 해결의 과정, 그리고 현장에서 얻은 생생한 노하우들을 여러분께 아낌없이 전달해 드리겠습니다. AI라는 흥미로운 세계로의 여정에 든든한 길잡이가 되어 드릴게요.
Courses
Reviews
- FastAPI: Make 3x quicker, 2x more accurate, 10x faster APIs with Python
- Master All Backend Knowledge with Just One Course!
- Design Patterns for Python
- Design Patterns for Python
Posts
Q&A
강의자료 링크로 들어가면 페이지를 찾지못한다고 나와요
안녕하세요 강사 해여입니다 🙂 현재 강의 영상에 중간중간 잘린 부분이 있어 해당 부분 재촬영을 진행하니라강의자료 게시를 30분 정도 멈췄었습니다! 현재는 다시 정상적으로 접근 가능하니 확인 부탁드려요!새로 촬영한 강의 영상은 8/28일까지 모두 업로드될 예정이니 참고부탁드립니다.불편을 끼쳐드려 죄송합니다. 감사합니다.강사해여 올림
- 0
- 2
- 24
Q&A
PDF로 내보내기 기능 활성화 부탁드립니다.
추가로 확인해보니 Chrome에 여백 최소화 + 배율 조절을 통해 잘림없이 PDF로 내보내기가 가능한 듯 합니다! 활용해보시고 문제가 있으시면 말씀부탁드리겠습니다 🙂
- 0
- 3
- 23
Q&A
PDF로 내보내기 기능 활성화 부탁드립니다.
안녕하세요, 강사 해여입니다.Notion 템플릿 복제 기능을 3일동안 활성화해두겠습니다!강의 자료 개선, 저작권 등의 문제로 인해 영구 활성화는 어려운 점 양해부탁드립니다. 해당 부분 활용하여 PDF로 내보내기가 되는 지 확인 부탁드릴게요 🙂 감사합니다.강사 해여 올림
- 0
- 3
- 23
Q&A
31강 질문: /docs에 read_all_users 관련
🙂
- 1
- 3
- 52
Q&A
15강 수정 요청: DOWNLOAD_DIR 확인 구문 부분
안녕하세요, 강사 해여입니다. 먼저 피드백 감사드립니다. 말씀해주신 대로 상대경로(file_path)를 절대경로(os.path.abspath(DOWNLOAD_DIR))와 startswith로 비교한 기존 코드는 의도한 검증이 제대로 동작하지 않습니다.제가 저렇게 쓴 이유는 예제의 흐름을 단순하게 보여주려다가 “경로를 안전한 루트 안에 가두자”는 취지만 남기고, 절대경로로 정규화하는 단계를 빠뜨렸기 때문입니다. 😿덕분에 문제를 명확히 짚을 수 있었어요. 감사합니다.말씀 주신 대로 절대경로로 변환 후 비교하면 의미 있는 검증이 됩니다.DOWNLOAD_DIR_ABS = os.path.abspath(DOWNLOAD_DIR) safe_base_filename = os.path.basename(file_name) file_path = os.path.join(DOWNLOAD_DIR, safe_base_filename) full_file_path = os.path.abspath(file_path) # 기존: if not file_path.startswith(DOWNLOAD_DIR_ABS): # 상대 vs 절대 비교라 문제 if not full_file_path.startswith(DOWNLOAD_DIR_ABS): raise HTTPException(status_code=403, detail="Access denied") 조금 더 고급 주제로 다뤄보자면, startswith는 .../downloadables2 같은 접두어 충돌이나 OS별 경로 차이, 심볼릭 링크에 취약합니다. 그래서 아래처럼 “좀 더 안전한” 방식으로 바꾸는 걸 권합니다.pathlib의 resolve()와 relative_to()를 쓰면 심볼릭 링크, .. 포함 경로까지 정규화해 확실히 가둘 수 있어요.from pathlib import Path import os, mimetypes from fastapi import HTTPException from fastapi.responses import FileResponse BASE = Path(DOWNLOAD_DIR).resolve() def resolve_under_base(user_name: str) -> Path: safe = os.path.basename(user_name) # 경로 성분 제거 path = (BASE / safe).resolve() # 심볼릭 링크/.. 정규화 try: path.relative_to(BASE) # BASE 밖이면 ValueError except ValueError: raise HTTPException(status_code=403, detail="Access denied") if not path.is_file(): raise HTTPException(status_code=404, detail="File not found") return path @app.get("/download/basic/{file_name}") async def download_basic(file_name: str): requested = resolve_under_base(file_name) return FileResponse(str(requested)) @app.get("/download/custom/{file_name}") async def download_custom(file_name: str): requested = resolve_under_base(file_name) media_type, _ = mimetypes.guess_type(str(requested)) media_type = media_type or "application/octet-stream" return FileResponse( path=str(requested), filename=f"downloaded_{requested.name}", media_type=media_type ) 대안으로 os.path.commonpath([requested, base]) == base 비교도 안전한 편입니다. (realpath/abspath로 정규화 후 사용)추가 팁!허용 목록(allowlist): 제공 가능한 파일명/확장자를 제한하세요.유니코드 정규화: unicodedata.normalize("NFC", name)로 이름 혼동을 줄입니다.로깅 최소화: 존재 여부를 과하게 로그로 노출하지 않기.테스트 케이스: .., %2e%2e/, 심볼릭 링크, 윈도우/리눅스 경로 차이를 포함해 단위테스트 추가.다시 한 번 날카로운 피드백에 감사드립니다. 덕분에 자료를 더 탄탄하게 다듬을 수 있게 되었어요! 🙏곧 해당 자료는 반영해두겠습니다 🙂
- 0
- 2
- 40
Q&A
26강 에러발생: 해결방법 알려주세요.
안녕하세요 강사해여입니다!인프런 AI인턴님이 대답해주셔서 다행이네요!열정적인 강의 수강 감사드립니다!👍
- 0
- 3
- 41
Q&A
34강 강의 마지막에 나오는 35강 websocket 관련 강의 관련 질문
안녕하세요! 강사해여입니다.websocket 부분도 강의에 포함됩니다 🙂이번 주말까지는 음성 개선 및 인코딩을 완료해서 업로드하겠습니다!
- 1
- 1
- 52
Q&A
Docker와 AWS 배포 강의 관련
안녕하세요 강사해여입니다! 현재 강의 영상 촬영 이후 확인해보니 음성이 약간 깨지는 현상이 발견되어,해당 부분 음질을 개선하는 작업을 진행 중입니다. 촬영 자체는 마무리되어 음질 개선 작업 및 인코딩 완료되면 업로드될 예정 입니다! 업로드가 늦어진 점 사과드립니다. 감사합니다.
- 0
- 2
- 40
Q&A
30강 질문: 토큰생성 관련
안녕하세요 🙂강사 해여입니다! 가장 마지막에 올려주신 질문은 해결되었다는 말씀을 올려주신 것을 확인하였습니다! 혹시 이 질문도 해결이 되셨을까요?아래 부분을 참고해보세요 🙂문제의 원인은 요청 형식과 인증 UI의 올바른 사용법에 대한 오해 때문입니다. --- FastAPI의 OAuth2PasswordRequestForm은 클라이언트가 JSON 형식이 아닌, 웹 폼(form)을 제출할 때 사용하는 application/x-www-form-urlencoded 형식으로 데이터를 보내줄 것이라고 예상합니다. 하지만 Postman에서 기본적으로 POST 요청의 Body를 설정하면 JSON으로 보내는 경우가 많기 때문에, 서버는 예상과 다른 형식의 데이터가 들어와 처리할 수 없다는 의미로 422 Unprocessable Content 에러를 반환하는 것입니다. 해결 방법 (Postman 설정): 1. Postman에서 새 요청을 열고, POST 메소드를 선택한 뒤 주소창에http://127.0.0.1:8000/token을 입력합니다. 2. Body 탭을 선택합니다. 3. raw 대신 x-www-form-urlencoded를 선택합니다. 4. 아래 Key-Value 입력란에 다음과 같이 두 개의 필드를 추가합니다. * KEY username, VALUE (등록한 사용자 이메일) * KEY password, VALUE (등록한 사용자 비밀번호) 5. Send 버튼을 누릅니다. 이제 서버는 올바른 형식의 요청을 받았으므로, 성공적으로 인증을 처리하고 아래와 같이 access_token이 포함된 JSON 응답을 반환할 것입니다. 2. Swagger UI (/docs)에서 발급받은 토큰 사용법 올바른 사용법 1. 웹 브라우저에서 http://127.0.0.1:8000/docs로 접속합니다. 2. 오른쪽 상단에 있는 녹색 Authorize 버튼을 클릭합니다. 3. Available authorizations 라는 팝업창이 뜹니다. 여기서 client_id와 client_secret은 무시하고 비워두세요. 우리 프로젝트는 해당 방식(Authorization Code Flow)을 사용하지 않습니다. 4. Password flow 섹션에 있는 Username과 Password 입력란만 채웁니다. * Username: 등록한 사용자의 이메일 주소 * Password: 등록한 사용자의 비밀번호 5. 팝업창 하단의 Authorize 버튼을 클릭합니다. 인증이 성공하면 팝업창에 "Authorized"라고 표시되고, 자물쇠 아이콘이 잠금 상태로 바뀝니다. 이제 Close 버튼을 눌러 팝업을 닫습니다. 6. 이것으로 끝입니다! 이제부터 /docs 페이지에서 자물쇠가 걸려있는 API(예: GET /tasks, POST /tasks 등)를 테스트하면, Swagger UI가 자동으로 모든 요청의 헤더에 `Authorization: Bearer `을 추가하여 보내줍니다. 이제 /tasks 엔드포인트의 "Try it out"을 클릭하고 "Execute"를 누르면, 인증이 필요한 요청이 성공적으로 전송될 것입니다. 별도로 토큰을 복사해서 붙여넣을 필요가 전혀 없습니다.요약 * Postman: /token 요청 시 Body 타입을 raw (JSON)이 아닌 x-www-form-urlencoded로 설정하고, username과 password를 Key-Value로 전달해야 합니다. * Swagger UI /docs): Authorize 버튼을 눌러 나타난 팝업에서 username과 password로 한 번만 로그인하면, 그 이후의 모든 API 테스트 요청에 토큰이 자동으로 포함됩니다. client_secret 필드는 사용하지 않습니다.
- 1
- 2
- 58
Q&A
25강에서 에러발생: 해결방법 알려주세요
안녕하세요! 강사해여입니다.에러로그를 보니 Windows 기본 인코딩(cp949)으로 alembic.ini 같은 텍스트 파일을 읽다가, UTF-8로 저장된 파일을 만나 생기는 오류로 생각됩니다. (한글/이모지가 문제에요!) 다음의 두 방법을 사용해보세요!alembic.ini의 내용을 영문으로 바꾸는 방법파이썬을 UTF-8 모드로 실행(ini에 한글을 유지하고 싶다면)PowerShell(영구): setx PYTHONUTF8 1 후 새 터미널 열기현재 셸만: $env:PYTHONUTF8=1또는 실행 시:python -X utf8 -m alembic revision --autogenerate -m "Create tasks table"참고 1. fileConfig(config.config_file_name)부분이 alembic.ini를 cp949로 읽는 경우 다음과 같이 수정할 수도 있습니다! from logging.config import fileConfig # ... if config.config_file_name is not None: # ✨ 인코딩 명시! fileConfig( config.config_file_name, disable_existing_loggers=False, encoding="utf-8", ) 참고 2.PyCharm에서 영구 적용 방법Terminal 환경변수 설정File → Settings → Tools → Terminal → Environment variablesPYTHONUTF8=1, PYTHONIOENCODING=utf-8 추가 → 터미널 재시작.Run/Debug Configuration에도 적용(별도 실행 구성으로 돌릴 때)우측 상단 Run/Debug Configurations 열기 → 사용하는 구성 선택→ Environment variables에 PYTHONUTF8=1 추가.파일 인코딩 기본값을 UTF-8로File → Settings → Editor → File EncodingsGlobal/Project/Default encoding 모두 UTF-8로 맞추고 alembic.ini 다시 저장.상태바(오른쪽 아래)에서 현재 파일 인코딩이 UTF-8인지도 확인하세요. 감사합니다! 강사 해여드림
- 0
- 3
- 48