diff --git "a/week-07/\352\271\200\353\257\274\355\230\201.md" "b/week-07/\352\271\200\353\257\274\355\230\201.md"
new file mode 100644
index 0000000..9872801
--- /dev/null
+++ "b/week-07/\352\271\200\353\257\274\355\230\201.md"
@@ -0,0 +1,748 @@
+# ESLint를 활용한 정적 코드 분석
+
+## 정적 코드 분석이란?
+
+정적 코드 분석은 코드를 실제로 실행하지 않고, 문제의 소지가 있는 코드를 사전에 수정하는 것을 의미한다.
+
+예를 들어 다음과 같은 코드가 있다고 해보자.
+
+```ts
+function getUserName(user) {
+ return user.name;
+}
+```
+
+이 코드는 `user`가 정상적으로 들어온다면 문제 없이 동작한다. 하지만 `user`가 `undefined`라면 런타임에서 에러가 발생한다.
+
+```ts
+// Cannot read properties of undefined
+```
+
+모든 문제를 정적 분석으로 잡을 수 있는 것은 아니지만, 코드 실행 전에 발견할 수 있는 문제들도 많다.
+
+예를 들어 다음과 같은 문제는 ESLint 같은 정적 분석 도구로 미리 확인할 수 있다.
+
+```txt
+- 사용하지 않는 변수
+- 선언되지 않은 변수
+- 잘못된 import
+- useEffect 의존성 배열 누락
+```
+
+즉, ESLint는 코드가 실행되기 전에 문제 가능성이 있는 부분을 미리 알려주는 안전장치라고 볼 수 있다.
+
+---
+
+## eslint-plugin과 eslint-config
+
+`eslint-plugin` 이라는 접두사로 시작하는 플러그인은 여러 규칙(rule)을 제공하는 패키지이고,
+
+`eslint-config`는 이러한 `eslint-plugin` 묶어둔 패키지이다.
+
+예를 들어 React 프로젝트에서는 `eslint-plugin-react`, `eslint-plugin-react-hooks` 등을 사용해 React와 Hooks 관련 규칙을 검사할 수 있다.
+
+---
+
+## 나만의 ESLint 규칙 만들기
+
+ESLint의 장점은 이미 만들어진 규칙만 사용하는 것이 아니라, 프로젝트에 맞는 규칙을 직접 만들 수도 있다는 점이다.
+
+예를 들어 React 17부터는 새로운 JSX Transform이 도입되어 JSX를 사용하기 위해 매번 `import React from 'react';` 을 선언할 필요가 없다.
+
+기존 코드베이스에 이 구문이 많이 남아 있다면, ESLint의 `no-restricted-imports` 규칙을 활용해 기본 import를 제한할 수 있다.
+
+```js
+export default [
+ {
+ rules: {
+ 'no-restricted-imports': [
+ 'error',
+ {
+ paths: [
+ {
+ name: 'react',
+ importNames: ['default'],
+ message:
+ 'React 17 이후 JSX 사용을 위한 기본 React import는 필요하지 않습니다.',
+ },
+ ],
+ },
+ ],
+ },
+ },
+];
+```
+
+---
+
+## ESLint와 Prettier의 차이
+
+| 구분 | Prettier | ESLint |
+| -------- | ---------------------- | ---------------------------- |
+| 핵심 역할 | 코드 스타일 및 포맷 정리 | 코드 품질 및 위험 요소 점검 |
+| 주요 목적 | 코드 형태의 일관성 유지 | 잠재적인 버그와 잘못된 패턴 방지 |
+| 관리 대상 | 줄바꿈, 들여쓰기, 따옴표, 세미콜론 등 | 사용하지 않는 변수, 잘못된 조건문, 전역 변수 등 |
+| 적용 방식 | 저장 시 또는 커밋 전 자동 포맷 적용 | 규칙 위반 시 경고 또는 에러 표시 |
+| 팀 운영 관점 | 스타일 논쟁 최소화 | 팀의 코드 기준을 규칙으로 고정 |
+| 대체 가능 여부 | ESLint로 대체 불가 | Prettier로 대체 불가 |
+
+---
+
+
+# React Testing Library
+
+React Testing Library란 리액트 공식 문서에서도 사용을 권장하는 UI 컴포넌트 테스트 라이브러리이다.
+
+컴포넌트의 내부 상태나 구현 방식이 아닌, **사용자가 화면에서 실제로 상호작용하는 방식**을 그대로 테스트하도록 설계된 것이 가장 큰 특징이다.
+
+예를 들어 다음과 같은 컴포넌트가 있다고 해보자.
+
+```tsx
+function LoginForm() {
+ const [email, setEmail] = useState('');
+
+ return (
+ <>
+ setEmail(e.target.value)}
+ />
+
+ >
+ );
+}
+```
+
+이 컴포넌트를 테스트한다고 했을 때 이런 생각을 하기 쉽다.
+
+```txt
+- state 값이 변경되었는가?
+- setEmail 함수가 호출되었는가?
+```
+
+하지만 사용자는 이런 것을 전혀 알지 못한다.
+
+
+
+사용자는
+
+'입력 창이 보인다', '이메일을 입력한다', '로그인 버튼이 활성화 된다.' 등
+
+실제로 보이는 것에 의존한다.
+
+즉, 테스트도 **사용자가 경험하는 흐름**을 기준으로 작성해야 한다는 것이 React Testing Library의 핵심 철학이다.
+
+---
+
+## React Testing Library 예시
+
+예를 들어 로그인 폼이 있다고 해보자.
+
+```tsx
+export function LoginForm() {
+ const [email, setEmail] = useState('');
+
+ return (
+
+ );
+}
+```
+
+이 컴포넌트에서 사용자가 실제로 경험하는 흐름은 다음과 같다.
+
+```txt
+1. 로그인 버튼은 처음에 비활성화 상태다.
+2. 이메일을 입력한다.
+3. 로그인 버튼이 활성화된다.
+```
+
+테스트도 그대로 작성한다.
+
+```tsx
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+
+test('이메일을 입력하면 로그인 버튼이 활성화된다.', async () => {
+ const user = userEvent.setup();
+
+ render();
+
+ const input = screen.getByLabelText('이메일');
+ const button = screen.getByRole('button', {
+ name: '로그인',
+ });
+
+ expect(button).toBeDisabled();
+
+ await user.type(input, 'test@example.com');
+
+ expect(button).toBeEnabled();
+});
+
+```
+
+
+
+작성된 테스트 코드를 보면, 앞서 정리한 사용자의 행동 흐름이 그대로 녹아있다는 것을 알 수 있다.
+
+* ``: 사용자가 화면에서 '이메일'이라는 라벨을 보고 입력창을 찾는 과정을 뜻한다.
+* ``: 사용자가 실제로 키보드를 두드려 이메일을 입력하는 행위를 시뮬레이션한다.
+* ``: 이메일이 입력된 후, 사용자 눈에 버튼이 활성화되어 보이는지 검증한다.
+
+테스트 어디에서도 `email`이라는 state가 잘 바뀌었는지, `setEmail` 함수가 실행되었는지는 확인하지 않는다.
+
+오직 **사용자에게 무엇이 보이고, 사용자가 어떤 상호작용을 하는지**에만 집중할 뿐이다.
+
+---
+
+
+
+# 핵심 웹 지표란?
+
+핵심 웹 지표(Core Web Vitals)는 구글에서 만든 지표로, 웹페이지의 사용자 경험을 측정하기 위해 제시한 성능 지표다.
+
+핵심 웹 지표로 다음 세 가지를 다룬다.
+
+* LCP: Largest Contentful Paint (최대 콘텐츠풀 페인트)
+* FID: First Input Delay (최초 입력 지연)
+* CLS: Cumulative Layout Shift (누적 레이아웃 이동)
+
+다만 현재 기준에서는 `FID`가 `INP`로 대체되었다.
+
+따라서 `FID`를 먼저 이해하되, 실제 서비스 성능을 점검할 때는 `INP`까지 함께 확인하는 것이 좋다.
+
+---
+
+# LCP (최대 콘텐츠풀 페인트)
+
+## LCP란?
+
+`LCP(Largest Contentful Paint)`는 페이지가 처음 로드되기 시작한 시점부터, 뷰포트 안에서 가장 큰 요소가 화면에 렌더링되기까지 걸리는 시간을 의미한다.
+
+여기서 뷰포트는 사용자가 현재 보고 있는 화면 영역을 말한다.
+
+LCP의 측정 대상이 될 수 있는 요소는 다음과 같다.
+
+* ``
+* `