인기 글
최신 글
카테고리 없음2026.02.03 19:31[프로그래머스] 2025 프로그래머스 코드챌린지 1차 예선 유연근무제 Python

https://school.programmers.co.kr/learn/courses/30/lessons/388351 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr문제 분석 및 핵심 로직문제의 목표는 직원들의 출근 희망 시각과 일주일간의 실제 출근 기록을 비교하여 상품 수령 대상자를 세는 것이다.핵심 조건:지각 허용: 희망 시각 + 10분까지는 인정시간 포맷: 시(Hour) * 100 + 분(Minute) 형태의 정수 (예: 10시 10분 = 1010)요일 예외: 토, 일요일은 지각해도 상관없음시간 관련 연산 최적화시간 계산에서 가장 까다로운 부분은 "60분이 넘어가면 1시간을 올려야 한다"는 점이다. 보통은 몫..

GPT와 Notion API를 활용한 초지능 일정 관리 자동화 에이전트
Chlidevknowledge2026.01.27 18:58GPT와 Notion API를 활용한 초지능 일정 관리 자동화 에이전트

작성일: 2026년 1월 27일기술 스택: iOS Shortcuts, OpenAI API (gpt-4o-mini), Notion API1. Project Background (개발 배경)평소 노션(Notion)에 일정과 프로젝트를 꼼꼼히 기록하는 편입니다. 하지만 기록하는 과정 자체가 꽤 번거로울 때가 많았습니다. 예를 들어 길을 걷다 "다음 주 화요일 저녁 7시, 강남역에서 하준이와 회의"라는 일정이 생각나면, 폰을 켜고 앱을 실행해 페이지를 찾고, 제목과 날짜, 태그를 일일이 지정해야 합니다. 이 과정에 약 20초 정도가 소요되는데, 생각의 흐름이 끊기는 게 아쉬웠습니다. "그냥 말로 대충 던져주면 알아서 정리해 줄 순 없을까?" 이 단순한 필요에서 시작해, 단축어와 API를 활용한 자동화 작업을 시..

[Mate] 개발일지 #21 - 통합 검색 구현과 좀비 세션(Zombie Session) 퇴치
mate2026.01.20 18:23[Mate] 개발일지 #21 - 통합 검색 구현과 좀비 세션(Zombie Session) 퇴치

로그인된 줄 알고 글을 썼는데 튕겨 나가는 '좀비 세션' 문제를 해결하고, 제목과 본문은 물론 댓글 내용까지 찾아내는 통합 검색 기능을 구현했습니다. 이 과정에서 발생한 React Query의 캐시 동기화 이슈와 백엔드 쿼리 누락 문제를 바로잡아 시스템의 안정성을 확보했습니다.인증 로직 강화 및 좀비 세션 해결액세스 토큰(Access Token)이 만료되었음에도 UI상으로는 로그인 상태가 유지되는, 이른바 '좀비 세션' 현상이 사용자 경험을 해치고 있었습니다. 사용자는 글쓰기나 좋아요를 누르는 시점에야 401 에러를 마주하고 강제 로그아웃 당하는 불편을 겪었습니다.이를 해결하기 위해 Axios Interceptor를 고도화했습니다. 401 에러가 감지되면 즉시 리프레시 토큰(Refresh Token)으로..

[Mate] 개발일지 #20 - AWS CORS 해결 및 대댓글 시스템 구현
mate2026.01.19 18:41[Mate] 개발일지 #20 - AWS CORS 해결 및 대댓글 시스템 구현

AWS 배포 환경에서 DELETE 요청이 차단되는 CORS 문제를 해결하고, 대댓글 시스템과 낙관적 업데이트를 구현했습니다. 데이터 무결성을 위해 Soft Delete 방식을 도입했으며, DTO 분리를 통해 네트워크 페이로드를 최적화했습니다.AWS API Gateway CORS 설정 및 DELETE 메서드 허용로컬 환경에서는 정상 작동하던 댓글 삭제 기능이 AWS Amplify 배포 환경에서 405 Method Not Allowed 및 CORS 에러를 일으켰습니다. 원인은 FastAPI의 설정과 무관하게, 요청을 가장 먼저 받는 AWS API Gateway가 DELETE 메서드를 차단하고 있었기 때문이었습니다.API Gateway의 CORS 설정 목록에 DELETE 메서드를 명시적으로 추가하고, Acce..

[Mate] 개발일지 #19 - 메인 페이지 로딩 속도 개선 및 인터랙션 반응성 최적화
mate2026.01.18 18:22[Mate] 개발일지 #19 - 메인 페이지 로딩 속도 개선 및 인터랙션 반응성 최적화

메인 페이지의 로딩 지연 문제를 해결하기 위해 데이터베이스 반정규화와 조회 로직 분리를 수행하여 LCP(Largest Contentful Paint)를 단축했다. 또한 비회원 유입을 위한 UX 패턴을 적용하고, 낙관적 업데이트(Optimistic Update)를 도입하여 사용자의 인터랙션 지연 시간을 제로(Zero Latency) 수준으로 최적화했다.DB 반정규화 및 N+1 문제 해결을 통한 로딩 속도 단축현상 및 원인서비스 초기 로딩 시간이 평균 2.8초로 측정되어 사용자 경험 저하가 우려되었다. 프로파일링 결과, 게시글 목록 조회 시 각 객체의 좋아요 및 댓글 수를 산출하기 위해 수백 개의 연관 객체를 메모리에 로드하는 N+1 문제가 발생하고 있었다.해결 과정단순 쿼리 최적화의 한계를 극복하기 위해 ..

[Mate] 개발일지 #18 - WebAuthn 기기 잠금 미설정 예외 처리 및 UX 개선
mate2026.01.17 18:20[Mate] 개발일지 #18 - WebAuthn 기기 잠금 미설정 예외 처리 및 UX 개선

Windows 환경 등에서 기기 잠금(PIN, 생체인증)이 설정되지 않았을 때 발생하는 WebAuthn 에러에 대한 예외 처리를 구현했다. 불명확한 에러 메시지를 구체적인 행동 가이드로 매핑하고, 플랫폼 인증 장치의 가용성을 사전에 감지하는 로직을 추가하여 사용자 경험을 개선했다.WebAuthn 에러 코드 매핑 및 가이드 메시지 구체화현상 및 원인 Windows 환경에서 OS 차원의 잠금 설정(PIN, 비밀번호, 생체인증)이 비활성화된 상태로 패스키 가입을 시도할 경우, NotAllowedError가 발생하며 프로세스가 중단되었다. 브라우저가 반환하는 기본 에러 메시지는 기술적인 내용에 국한되어 있어, 일반 사용자가 기기 잠금 설정이 원인임을 인지하고 해결하기 어려웠다.해결 과정AxiosError 핸들링..

[Mate] 개발일지 #17 - AWS Serverless 백엔드 안정화 및 테스트 데이터 구축
mate2026.01.16 00:19[Mate] 개발일지 #17 - AWS Serverless 백엔드 안정화 및 테스트 데이터 구축

배포된 AWS Serverless 백엔드 API에서 발생한 접속 장애와 데이터 불일치, Cold Start 지연 문제를 해결했다. API Gateway의 호환성 설정과 CORS 정책을 수립하고, 테스트 데이터를 구축하여 프론트엔드 연동 환경을 정상화했다. 또한 EventBridge를 활용한 Warmer 트리거를 설정하여 컨테이너 초기 구동 속도 문제를 개선했다.API Gateway 호환성 확보 및 CORS 정책 수립현상 및 원인 API 호출 시 404 및 500 에러가 발생했으며, 프론트엔드 연동 시 CORS 정책 위반으로 데이터 호출이 차단되었다. 원인 분석 결과, API Gateway HTTP API(v2)의 Payload 2.0 형식을 Python 어댑터(Mangum)가 해석하지 못하는 호환성 문제..

[Mate] 개발일지 #16(2) - AWS Lambda Docker 배포 및 API Gateway 연동 트러블슈팅
mate2026.01.16 00:18[Mate] 개발일지 #16(2) - AWS Lambda Docker 배포 및 API Gateway 연동 트러블슈팅

AWS Lambda(Container) 기반의 FastAPI 서버를 배포하는 과정에서 발생한 접속 장애와 500 에러를 해결했다. API Gateway의 라우팅 설정 미비, Docker 컨테이너의 Cold Start 지연, Mangum 어댑터의 Payload 버전 불일치, 그리고 FastAPI 경로 매핑 문제를 단계적으로 수정하여 안정적인 배포 환경을 구축했다.인프라 설정 및 런타임 타임아웃 조정CI/CD 파이프라인을 통해 이미지는 정상적으로 배포되었으나, API Gateway 엔드포인트 접속 시 요청이 Lambda로 전달되지 않았다. 초기 설정 시 스테이지와 라우트가 정의되지 않은 것이 원인이었다. 명시적인 default 스테이지와 $default 라우트를 생성하여 Lambda와 통합을 완료했다.이후 ..

[Mate] 개발일지 # 16 - 이메일/패스키 인증 시스템 구축 및 회원가입 UX 개선
mate2026.01.13 16:55[Mate] 개발일지 # 16 - 이메일/패스키 인증 시스템 구축 및 회원가입 UX 개선

백엔드 인증 로직 구현 및 DB 모델링이메일 및 패스키 인증 시스템 Google SMTP를 활용한 인증번호 발송 로직과 WebAuthn 표준을 따르는 패스키 회원가입 API(/signup/options, /verify)를 구현했다. 보안 강화를 위해 python-dotenv를 도입하여 민감 정보를 환경변수로 분리했다. 데이터베이스는 User와 Passkey 테이블을 1:N 관계로 정의하고, credential_id 및 public_key 등 필수 필드에 대한 인덱싱을 완료했다.보안 모듈 리팩토링 기존 create_access_token 함수가 단일 문자열 인자만 허용하여 확장이 불가능한 문제가 있었다. 이를 딕셔너리(data: dict) 전체를 인자로 받도록 리팩토링하여, 향후 토큰 내에 역할(Role)..

[Mate] 개발일지 #15 - 메인 페이지 렌더링 성능 측정 및 DB/API 구조 변경 롤백
mate2026.01.08 19:44[Mate] 개발일지 #15 - 메인 페이지 렌더링 성능 측정 및 DB/API 구조 변경 롤백

프론트엔드 렌더링 중단 오류를 수정하고, 메인 페이지의 실제 로딩 속도를 측정하기 위해 모니터링 도구를 구현했다. 측정된 정량적 지표를 바탕으로 로딩 시간을 단축하기 위해 ORM 튜닝, DB 반정규화, API 통합 등 다양한 최적화를 시도했으나, 성능 저하 및 복잡도 증가 문제가 발생하여 기존 아키텍처로 롤백을 결정했다.useQuery 구조 분해 수정 및 로딩 시간 측정현상게시글 상세 페이지(PostDetail.tsx) 진입 시 'isFetching' is not defined 에러가 발생하며 렌더링이 중단되었다. useQuery 훅의 반환 객체에서 isFetching을 구조 분해 할당하지 않은 상태에서 변수로 참조하려 한 것이 원인이었다. 또한 메인 페이지와 달리 상세 페이지의 API 응답 속도에 대한..

프로젝트
[Mate] 개발일지 #21 - 통합 검색 구현과 좀비 세션(Zombie Session) 퇴치
[Mate] 개발일지 #21 - 통합 검색 구현과 좀비 세션(Zombie Session) 퇴치
mate
2026.01.20 18:23
로그인된 줄 알고 글을 썼는데 튕겨 나가는 '좀비 세션' 문제를 해결하고, 제목과 본문은 물론 댓글 내용까지 찾아내는 통합 검색 기능을 구현했습니다. 이 과정에서 발생한 React Query의 캐시 동기화 이슈와 백엔드 쿼리 누락 문제를 바로잡아 시스템의 안정성을 확보했습니다.인증 로직 강화 및 좀비 세션 해결액세스 토큰(Access Token)이 만료되었음에도 UI상으로는 로그인 상태가 유지되는, 이른바 '좀비 세션' 현상이 사용자 경험을 해치고 있었습니다. 사용자는 글쓰기나 좋아요를 누르는 시점에야 401 에러를 마주하고 강제 로그아웃 당하는 불편을 겪었습니다.이를 해결하기 위해 Axios Interceptor를 고도화했습니다. 401 에러가 감지되면 즉시 리프레시 토큰(Refresh Token)으로..
[Mate] 개발일지 #20 - AWS CORS 해결 및 대댓글 시스템 구현
[Mate] 개발일지 #20 - AWS CORS 해결 및 대댓글 시스템 구현
mate
2026.01.19 18:41
AWS 배포 환경에서 DELETE 요청이 차단되는 CORS 문제를 해결하고, 대댓글 시스템과 낙관적 업데이트를 구현했습니다. 데이터 무결성을 위해 Soft Delete 방식을 도입했으며, DTO 분리를 통해 네트워크 페이로드를 최적화했습니다.AWS API Gateway CORS 설정 및 DELETE 메서드 허용로컬 환경에서는 정상 작동하던 댓글 삭제 기능이 AWS Amplify 배포 환경에서 405 Method Not Allowed 및 CORS 에러를 일으켰습니다. 원인은 FastAPI의 설정과 무관하게, 요청을 가장 먼저 받는 AWS API Gateway가 DELETE 메서드를 차단하고 있었기 때문이었습니다.API Gateway의 CORS 설정 목록에 DELETE 메서드를 명시적으로 추가하고, Acce..
[Mate] 개발일지 #19 - 메인 페이지 로딩 속도 개선 및 인터랙션 반응성 최적화
[Mate] 개발일지 #19 - 메인 페이지 로딩 속도 개선 및 인터랙션 반응성 최적화
mate
2026.01.18 18:22
메인 페이지의 로딩 지연 문제를 해결하기 위해 데이터베이스 반정규화와 조회 로직 분리를 수행하여 LCP(Largest Contentful Paint)를 단축했다. 또한 비회원 유입을 위한 UX 패턴을 적용하고, 낙관적 업데이트(Optimistic Update)를 도입하여 사용자의 인터랙션 지연 시간을 제로(Zero Latency) 수준으로 최적화했다.DB 반정규화 및 N+1 문제 해결을 통한 로딩 속도 단축현상 및 원인서비스 초기 로딩 시간이 평균 2.8초로 측정되어 사용자 경험 저하가 우려되었다. 프로파일링 결과, 게시글 목록 조회 시 각 객체의 좋아요 및 댓글 수를 산출하기 위해 수백 개의 연관 객체를 메모리에 로드하는 N+1 문제가 발생하고 있었다.해결 과정단순 쿼리 최적화의 한계를 극복하기 위해 ..
[Mate] 개발일지 #18 - WebAuthn 기기 잠금 미설정 예외 처리 및 UX 개선
[Mate] 개발일지 #18 - WebAuthn 기기 잠금 미설정 예외 처리 및 UX 개선
mate
2026.01.17 18:20
Windows 환경 등에서 기기 잠금(PIN, 생체인증)이 설정되지 않았을 때 발생하는 WebAuthn 에러에 대한 예외 처리를 구현했다. 불명확한 에러 메시지를 구체적인 행동 가이드로 매핑하고, 플랫폼 인증 장치의 가용성을 사전에 감지하는 로직을 추가하여 사용자 경험을 개선했다.WebAuthn 에러 코드 매핑 및 가이드 메시지 구체화현상 및 원인 Windows 환경에서 OS 차원의 잠금 설정(PIN, 비밀번호, 생체인증)이 비활성화된 상태로 패스키 가입을 시도할 경우, NotAllowedError가 발생하며 프로세스가 중단되었다. 브라우저가 반환하는 기본 에러 메시지는 기술적인 내용에 국한되어 있어, 일반 사용자가 기기 잠금 설정이 원인임을 인지하고 해결하기 어려웠다.해결 과정AxiosError 핸들링..
[Mate] 개발일지 #17 - AWS Serverless 백엔드 안정화 및 테스트 데이터 구축
[Mate] 개발일지 #17 - AWS Serverless 백엔드 안정화 및 테스트 데이터 구축
mate
2026.01.16 00:19
배포된 AWS Serverless 백엔드 API에서 발생한 접속 장애와 데이터 불일치, Cold Start 지연 문제를 해결했다. API Gateway의 호환성 설정과 CORS 정책을 수립하고, 테스트 데이터를 구축하여 프론트엔드 연동 환경을 정상화했다. 또한 EventBridge를 활용한 Warmer 트리거를 설정하여 컨테이너 초기 구동 속도 문제를 개선했다.API Gateway 호환성 확보 및 CORS 정책 수립현상 및 원인 API 호출 시 404 및 500 에러가 발생했으며, 프론트엔드 연동 시 CORS 정책 위반으로 데이터 호출이 차단되었다. 원인 분석 결과, API Gateway HTTP API(v2)의 Payload 2.0 형식을 Python 어댑터(Mangum)가 해석하지 못하는 호환성 문제..
리눅스
[L18] rpm과 세부적인 패키지 파일 설치 방법_Linux/centOS
[L18] rpm과 세부적인 패키지 파일 설치 방법_Linux/centOS
Linux공부
2022.02.09 10:00
rpm 패키지 파일을 구하는 방법 설치 CD에 있는 패키지 파일을 사용 다른 컴퓨터로 internet에서 패키지 파일을 다운받고 공유 rpm 작접 시 주의사함 의존성 오류 가급적 무시 x 설치 /삭제 작업은 눈에 보이는 순서대로 바뀜 단, main 패키지가 있느 경우에만 main 패키지를 우선으로 진행 동일한 종류의 패키지는 가급적이면 버전 정보를 일치시켜야 하낟. 의존성 오류에 나오는 내용 패키지명 = 버전 : 해당 버전의 패키지가 필요하다 패키지명 > 버전 : 해당 버전 보다 더 높은 버전의 패키지가 필요하다 패키지 설치 시 * 기호를 이용하여 모든 패키지를 한 번에 설치 x 의존성 오류 발생 시 패키지 의존 관계 확인이 힘들다. centOS 페이지 접속 후 centOS Linux 칸 클 7-2009..
[L17] 프로그램 설치와 압축, 그리고 의존성 오류_Linux/centOS
[L17] 프로그램 설치와 압축, 그리고 의존성 오류_Linux/centOS
Linux공부
2022.02.07 10:00
프로그램 설치 과정 종류 소스 파일 다운로드 -> compile -> 설정 및 파일 배치 -> 프로그램 실행 tar + 압축 패키지 파일 마련한 상태 -> 명령어를 이용한 설치 -> 프로그램 실행 rpm (Internet 연결) 명령어를 이용한 설치 -> 프로그램 실행 yum 압축 파일의 용량을 줄이기 위해 사용한다. 원본 파일 자체가 압축된다 (복사본 생성 후 압축하는 작업x) 여러 파일이 동시에 압축하면 각각의 파일이 개별 압축된다. 디렉토리 압축은 불가능하다. 형식 명령어 [옵션] 대상 *압축의 형식과 압축/압축해제 작업에 따라 명령어가 달라진다. 압축 형식 압축 압축 해제 .zip zip unzip .gz gzip gunzip (gzip -d) .bz2 bzip bunzip2 (bzip2 -d) ..
[L16] 여러가지 특수 권한_Linux/centOS
[L16] 여러가지 특수 권한_Linux/centOS
Linux공부
2022.02.05 10:00
작업 주체 작업 대상 필요 권한 1. kdj ~kdj owner 영역 x 권한 2. kdj ~kdj owner 영역 r 권한 3. kdj html 소유권에 따른 영역의 x 권한 4. kdj html 소유권에 따른 영역의 w 권한 5. apache html, index.html other 영역 x 권한, other 영역 r 권한 (이 파일의 권한은 변경하지 않기 때문에 파일은 무조건 본다) 특수 권한 특이한 동작을 하는 권한 setUID, setGID, sticky bit 3가지의 특수 권한이 있다. 4777 r w x r w x r w x setUID 2777 r w x r w s r w x setGID 1777 r w x r w x r w t sticky bit *x 위치의 문자가 s/t로 변경 (x가..
[L15] http와 허가권 및 소유권_Linux/centOS
[L15] http와 허가권 및 소유권_Linux/centOS
Linux공부
2022.02.03 10:00
http web server : client의 요청에 web page를 제공해주는 서버 http- 로 시작하는 web server는 apache web server 설치 및 사용 준비 yum -y install httpd-* web server 설치 systemctl restart httpd web server 동작 systemctl enable httpd 부팅 시 web server 자동 동작 firewall-cmd --permanent --add-service=http 방화벽 예외 규칙에 web server 등록 firewall-cmd --reload 예외 규칙 적용 사용 방법 web browser에 web server의 IP를 입력 소유권 파일 및 디렉토리를 어느 사용가와 그룹이 소유하고 있는지 나..
[L14] 권한과 권한 표현 방법_Linux/centOS
[L14] 권한과 권한 표현 방법_Linux/centOS
Linux공부
2022.02.01 10:00
권한 파일이나 디렉토리를 사용할 수 있는지 여부를 정하는 개념이다. 허가권과 소유권으로 구분 허가권 + 소유권 = 권한 허가권 ls -l 명령을 입력했을 때 나오는 출력 내용 중 개체 형식을 나타내는 첫 글자 뒤에 오는 9개의 글자가 허가권을 나타낸다. 8가지 문자로 권한을 표현 : r, w, x, -, s, S, t, T r, w, x, - : 일반 권한을 표현하는 문자 s, S, t, T : 특수 권한을 표현하는 문자 r : 읽기 권한 파일 - 파일 내용 읽기 ex) cat, head, tail, more, less, vi로 열었을 때 등 디렉토리 - 디렉토리 내부 목록 확인 ex) ls, GUI 환경에서 폴더로 들어갔을 때 등 w : 쓰기 권한 파일 - 파일 내용 수정 ex) 문서 편집 후 저장, ..
HTML & CSS
CSS(Cascading Style Sheets) Basics [2]
CSS(Cascading Style Sheets) Basics [2]
HTML & CSS
2023.08.16 19:05
Order 플렉스 컨테이너에 나타나는 순서를 제어한다. 기본 값은 0 flex-grow / flex-shrink 플렉스 박스 아이템의 기본 너비를 자동으로 늘어나거나 줄어들도록 해서 행 안에 적절한 너비로 배치되도록 맞추는 기능을 한다. grow속성의 기본 값은 0이다. 음수는 허용되지 않는다. flex-shrink 필요한 경우 플렉스 item이 축소되는 기능을 정의 flex-shrink 속성은 플렉스 박스에 flex-wrap: wrap 속성을 부여한 경우 적용되지 않는다. flex-item에 flex-grow를 0으로 지정, 나머지 요소들의 flex-grow를 다르게 주었다. 실습 flex-item에 flex-shrink를 0을 주고 item-4에만 1을 준 경우 item-4만 줄어들어서 해당 행에 맞..
CSS(Cascading Style Sheets) Basics [1]
CSS(Cascading Style Sheets) Basics [1]
HTML & CSS
2023.08.15 01:00
CSS를 사용하는 방법? HTML 안에서 Style 속성을 이용하는 방법 (인라인 스타일) 태그를 통해 HTML 문서 내부에서 이용하는 방법 (내부 스타일 시트) 별도로 CSS 파일을 분리하여 HTML의 문서에 연결하는 방법 (외부 스타일 시트) 인라인 스타일, 내부 스타일, 외부 스타일 적용이 혼합되어 사용될 경우 어떤 스타일을 적용하나? 인라인 스타일 -> 내부 스타일 시트, 외부 스타일 시트 -> 웹 브라우저 기본 스타일 순서로 우선적용 CSS의 기본 구조 선택자, 프로퍼티, 값 내부 스타일 시트 방식으로 css를 적용 외부 스타일 시트 방식으로 css를 적용 .a-button:hover a-button 요소에 마우스를 가져갔을 때만 적용되는 스타일 .a-button:active a-button 요..
HTML(Hyper Text Markup Language) Basics
HTML(Hyper Text Markup Language) Basics
HTML & CSS
2023.08.14 15:42
태그 (tag) 웹 문서를 구성하는 명령어 꺽새 안에 들어있는 정보를 정의하는 형식 요소의 일부로 시작 태그와 종료 태그 두 종류 종료 태그가 없는 과 같은 태그가 있음(내부에 내용이 필요없음) 요소 (element) 빈 요소 , 내용 없이 구조적인 기능만 하는 요소 블록 요소 h1~h6, div, list, p, ··· 다른 요소를 포함할 수 있는 요소 인라인 요소를 포함할 수 있다. 블록 요소 이후 블록 요소를 사용하면 내용이 세로로 나타난다. margin, padding 값을 가질 수 있다. 인라인 요소 a, span, strong, ··· 인라인 요소는 블록 요소를 포함할 수 없다. 블록 요소 이후 블록 요소를 사용하면 내용이 가로로 나타난다. 너비, 높이 값을 가질 수 없다. index.html..
728x90
image