diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 29636ed..0000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/README.md b/README.md
index 8ea86cc..c607680 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,190 @@
-# dev-queue
-A personal dev article & video queue with vocabulary tracking, built while learning Java/Spring Boot
+# ๐ DevQueue
+
+๊ฐ๋ฐ ๋ฌธ์/์์์ ์นดํ
๊ณ ๋ฆฌ๋ณ๋ก ์ ์ฅํ๊ณ , ๋ชจ๋ฅด๋ ๋จ์ด๋ฅผ ๋ฑ๋กํด ๋งค์ผ ๋๋ค์ผ๋ก ๋ณต์ตํ๋ ๊ฐ์ธ์ฉ ์ฝ์๊ฑฐ๋ฆฌ ํ + ๋จ์ด์ฅ ์๋น์ค์
๋๋ค.
+A personal reading-queue and vocabulary app that saves dev articles/videos by category, and lets you review random unknown words once a day.
+
+**๐ ๋ฐฐํฌ ๋งํฌ / Live demo: [devqueue.duckdns.org](http://devqueue.duckdns.org)**
+
+
+
+> Java/Spring Boot๋ฅผ ํ์ตํ๋ฉฐ ์งํํ ๊ฐ์ธ ํ๋ก์ ํธ์
๋๋ค. RPI(ResearchโPlanโImplement) ์ํฌํ๋ก๋ก AI์ ํจ๊ป ์ค๊ณํ๊ณ , ๋ชจ๋ ๊ตฌํ ์ฝ๋๋ ์ง์ ์์ฑํ์ต๋๋ค.
+> A personal project built while learning Java/Spring Boot. Designed with AI using the RPI (ResearchโPlanโImplement) workflow; all implementation code was written by hand.
+
+---
+
+## ๐ก ์ ๋ง๋ค์๋ / Why I built this
+
+ํ์ ์ ์ฉํ ๊ฐ๋ฐ ๋ฌธ์๋ ์์์ ์ ์ฅํด๋๊ณ ์ฝ๊ฑฐ๋ ์์ฒญํ๋ฉด์ ๊ธฐ์ ๊ณต๋ถ์ ์์ด ๊ณต๋ถ๋ฅผ ํจ๊ป ํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค.
+๊ทธ๋ฐ๋ฐ ๋งํฌ๋ฅผ ๊ณ์ ์ฌ๋ฌ ๊ตฐ๋ฐ ๋ฉ๋ชจํด๋๋ค ๋ณด๋ ํ์ํ ๋งํฌ๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต๊ฑฐ๋ ์ ์ฅํด๋๊ณ ์์ด๋ฒ๋ฆด ๋๊ฐ ๋ง์์ต๋๋ค.
+
+Java + Spring ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ์ค์ตํ ๊ฒธ, ํ์์ ํ์ํ๋ ์์ ์๋น์ค๋ฅผ ๋ง๋ค๋ฉฐ ๊ณต๋ถํด๋ณด๋ฉด ์ด๋จ๊น ์๊ฐํด์ ์์ํ๊ฒ ๋์์ต๋๋ค.
+
+์นดํ
๊ณ ๋ฆฌ๋ณ๋ก ๋งํฌ๋ฅผ ์ ๋ฆฌํด์ ์ ์ฅํ๊ณ , ์ฝ์ผ๋ฉด์ ๋ชจ๋ฅด๋ ๋จ์ด๋ ๋ฐ๋ก ๊ธฐ๋กํด๋๋ค๊ฐ, ๋งค์ผ ํ์
์ ๋์ ์์ฐ์ค๋ฝ๊ฒ ๋ณต์ตํ๋ ๊ฐ์ธ์ฉ ๋๊ตฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
+
+Java/Spring ๊ธฐ์ด๋ ๊น์ํ ๋์ ์คํ๋ง ๊ฐ์๋ก ๋ค์ก๊ณ , ์ดํ RPI ์ํฌํ๋ก ์ค๊ณยท์ธ์ฆยทJPA ์ ํยทAWS ๋ฐฐํฌยทCI/CD๋ ์ง์ ํ์ฅํ์ต๋๋ค.
+
+I like saving useful dev articles and videos to read or watch, combining tech learning with English study. But scattering links across multiple notes made them hard to find, and I often forgot I'd even saved them.
+
+While studying Java + Spring, I thought it'd be a good way to practice by building a small tool I actually needed.
+
+So I built a personal tool that organizes links by category, lets me jot down unknown words while reading, and surfaces a daily popup to review them naturally.
+
+Java/Spring fundamentals were built through Kim Young-han's Spring course; everything beyond that โ RPI workflow design, authentication, JPA migration, AWS deployment, and CI/CD โ was extended independently.
+
+---
+
+## ๐ ๏ธ ๊ธฐ์ ์คํ / Tech Stack
+
+**Backend**
+- Java 17, Spring Boot 4.1.1, Gradle
+- Spring MVC, Thymeleaf
+- Spring Data JPA, MySQL 8
+- Spring Security Crypto (BCrypt)
+
+**Infra / DevOps**
+- AWS EC2 (Amazon Linux 2023), AWS RDS (MySQL)
+- GitHub Actions (Checkstyle + SpotBugs)
+- DuckDNS
+
+**Dev Process**
+- RPI (ResearchโPlanโImplement) workflow
+- Git branching strategy โ one feature branch + PR per Phase
+
+---
+
+## ๐ฎ ์ฃผ์ ๊ธฐ๋ฅ / Key Features
+
+| ํ๊ธ | English |
+|---|---|
+| ํ์๊ฐ์
/ ๋ก๊ทธ์ธ (์ธ์
๊ธฐ๋ฐ ์ธ์ฆ, BCrypt ์ํธํ) | Sign up / log in (session-based auth, BCrypt hashing) |
+| ๊ฐ๋ฐ ๋ฌธ์/์์ ๋งํฌ ์ ์ฅ (์ ๋ชฉยทURLยท์นดํ
๊ณ ๋ฆฌยท๋ฉ๋ชจ) | Save dev article/video links (title, URL, category, memo) |
+| ์นดํ
๊ณ ๋ฆฌ ํํฐ๋ง (๊ฐ๋ฐ๋ฌธ์ / AI / ์ฑ์ฉ์ ๋ณด / ๊ธฐํ) | Filter by category (Dev Docs / AI / Jobs / Etc) |
+| ๋ฌธ์๋ณ ๋ชจ๋ฅด๋ ๋จ์ด ๋ฑ๋กยท์ญ์ ยท์๊ธฐ ์ฌ๋ถ ํ ๊ธ | Add/delete words per article, toggle memorized status |
+| ๋งค์ผ ์ฒ์ ์ ์ ์ ์ ์ธ์ด ๋จ์ด ์ค ๋๋ค 3๊ฐ ํ์
, ์ฒดํฌํ ๋จ์ด๋ง ์๊ธฐ ์๋ฃ ์ฒ๋ฆฌ | Once a day, on first visit, a popup shows 3 random unmemorized words; only checked ones are marked memorized |
+| ๋ฌธ์ ์ฝ์ ์ฌ๋ถ ํ ๊ธ, ์์ /์ญ์ | Toggle read status, edit/delete articles |
+| ๋ณธ์ธ์ด ๋ฑ๋กํ ๋ฐ์ดํฐ๋ง ์กฐํ ๊ฐ๋ฅ (์์ ๊ถ ๊ฒ์ฆ) | Only the owner can view their own data (ownership check) |
+
+---
+
+## ๐ ๊ฐ๋ฐ ํ๋ก์ธ์ค / Development Process
+
+**RPI(Research โ Plan โ Implement) Claude code ์ํฌํ๋ก**๋ฅผ ์ปค์คํฐ๋ง์ด์งํด์ ์ฌ์ฉํ์ต๋๋ค.
+I customized the **RPI (Research โ Plan โ Implement) Calude code workflow** for this project.
+
+- **Research / Plan**: Claude Code๋ก ์๊ตฌ์ฌํญ์ ๋ถ์ํ๊ณ `pm.md`(์๊ตฌ์ฌํญ) / `ux.md`(ํ๋ฉด ํ๋ฆ) / `eng.md`(๊ธฐ์ ์ค๊ณ) / `PLAN.md`(Phase๋ณ ์คํ ๊ณํ)๋ก ๋ฌธ์ํ
+ Analyzed requirements with Claude Code and documented them as `pm.md` (requirements), `ux.md` (UX flows), `eng.md` (technical design), and `PLAN.md` (phase-by-phase execution plan).
+- **Implement**: ๋ชจ๋ ์ฝ๋๋ ๋ฏธ์
๋จ์๋ก ์ง์ ์์ฑํ๋ฉฐ ํ์ต
+ Every line of code was written by hand, mission by mission, as a learning exercise.
+
+โ ์ค๊ณ ๋ฌธ์ ์ ์ฒด / Full design docs: [`rpi/article-vocab-tracker/`](./rpi/article-vocab-tracker/)
+
+์ด๋ ๊ฒ ๋๋ ์ด์ ๋, ํ์ต ๋จ๊ณ์ด๊ธฐ ๋๋ฌธ์ ํจ๊ณผ๋ฅผ ๊ทน๋ํํ๊ธฐ ์ํด ์ง์ ์์ฑํด๋ณด๋ฉฐ ์ต์ํด์ง๊ธฐ ์ํด์์์ต๋๋ค.
+์ค๊ณ(Research/Plan)๋ AI์ ํจ๊ปํ๋, ์ค์ ๊ตฌํ์ ๊ฐ๋
์ ํ๋์ฉ ๋ฏธ์
์ผ๋ก ๋ฐ์ ์ง์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์ต๋๋ค.
+
+The reason for this split: since this was a learning project, writing every line myself and getting hands-on with each concept was the best way to actually absorb it. So design (Research/Plan) was done with AI, while implementation was done by receiving concepts as missions and writing every line by hand.
+
+---
+
+## ๐ ๊ฐ๋ฐ ํ์คํ ๋ฆฌ (Phase๋ณ) / Development History (by Phase)
+
+๊ฐ Phase๋ ๋ณ๋ ๋ธ๋์น + PR๋ก ์งํํ์ต๋๋ค.
+Each phase was developed on its own branch and merged via PR.
+
+| Phase | ๋ด์ฉ / What | ํต์ฌ ํ์ต ๊ฐ๋
/ Key Concepts |
+|---|---|---|
+| 0 | ์ค์บํด๋ฉ + CI ์ธํ
/ Scaffolding + CI setup | `@Controller`, Thymeleaf, GitHub Actions (Checkstyle/SpotBugs) |
+| 1 | ๋๋ฉ์ธ ๋ชจ๋ธ + ๋ฉ๋ชจ๋ฆฌ Repository / Domain model + in-memory repository | Interface design, `Optional`, plain JUnit vs `@SpringBootTest` |
+| 2 | ์ํฐํด CRUD / Article CRUD | `@PostMapping`, POST-Redirect-GET, domain methods for state changes |
+| 3 | ์นดํ
๊ณ ๋ฆฌ ํํฐ / Category filter | Enum `@RequestParam`, Stream API, service-layer responsibility |
+| 4 | ์ธ์ฆ + ์์ ๊ถ / Auth + ownership | `HttpSession`, BCrypt, `HandlerInterceptor`, DTOs, ownership checks |
+| 5 | ๋จ์ด(Vocabulary) ๊ด๋ฆฌ / Vocabulary management | FK-based 1:N relations, 1:N query methods |
+| 6 | ๋จ์ด ์๊ธฐ ํ์
/ Vocabulary memorization popup | Combining multiple repositories, random sampling, date-based state |
+| 7 | ์คํ์ผ๋ง + ์์ /์ญ์ / Styling + edit/delete | Custom CSS design system, inline JS, completing Article CRUD |
+| 8 | JPA + MySQL ์ ํ / JPA + MySQL migration | `@Entity`, Spring Data JPA, `@Profile` swapping, `@Transactional` |
+
+**Phase 8์ ํต์ฌ ์ฑ๊ณผ / Key outcome of Phase 8**: Phase 1์์ ์ค๊ณํ Repository ์ธํฐํ์ด์ค ๋๋ถ์, ๋ฉ๋ชจ๋ฆฌ ๊ตฌํ์ฒด โ JPA/MySQL ๊ตฌํ์ฒด๋ก ์ ํํ๋ฉด์ **Controller/Service ์ฝ๋๋ฅผ ํ ์ค๋ ๋ฐ๊พธ์ง ์์์ต๋๋ค.**
+Thanks to the repository interfaces designed in Phase 1, switching from the in-memory implementation to JPA/MySQL required **zero changes to Controller/Service code.**
+
+---
+
+## ๐ ๊ฒช์ ์ด์์ ํด๊ฒฐ (์ผ๋ถ) / Issues & Fixes (selected)
+
+- **MySQL ์์ฝ์ด ์ถฉ๋ / MySQL reserved word conflict**: `read`๊ฐ ์์ฝ์ด๋ผ ์ปฌ๋ผ ์์ฑ ์คํจ โ `@Column(name = "is_read")`๋ก ๋งคํ ๋ถ๋ฆฌ
+ `read` is a reserved word, so table creation failed โ mapped it explicitly with `@Column(name = "is_read")`.
+- **JPA dirty checking ๋ฏธ๋ฐ์ / JPA dirty checking not applying**: ๋ฉ๋ชจ๋ฆฌ ๊ตฌํ์ฒด๋ ์ฐธ์กฐ ๊ณต์ ๋ก ํ๋ ๋ณ๊ฒฝ์ด ์ฆ์ ๋ฐ์๋์ง๋ง, JPA๋ ํธ๋์ญ์
๊ฒฝ๊ณ ๋ฐ์์๋ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋์ง ์์ โ ์ํ ๋ณ๊ฒฝ ๋ฉ์๋์ `@Transactional` ์ถ๊ฐ
+ The in-memory repository shared object references, so field changes applied instantly; JPA only detects changes inside a transaction โ added `@Transactional` to all state-mutating methods.
+- **์ธ์
๊ฐ์ฒด์ DB ์ฌ์กฐํ ๊ฐ์ฒด๊ฐ ๋ณ๊ฐ ์ธ์คํด์ค์ธ ๋ฌธ์ / Session object vs. re-fetched DB object being separate instances**: ๋ก๊ทธ์ธ ํ์
๋ ์ง ๊ฐฑ์ ์ DB ๋ฐ์๊ณผ ์ธ์
๊ฐ์ฒด ๊ฐฑ์ ์ ๋ชจ๋ ์ฒ๋ฆฌํ๋๋ก ์์
+ Fixed the login-popup date update to sync both the DB and the in-session object.
+- **RDS ๋ณด์ ๊ทธ๋ฃน ๋ฏธ์ค์ ์ผ๋ก EC2 ์ฐ๊ฒฐ ์คํจ / EC2 couldn't reach RDS due to missing security group rule**: RDS ์ธ๋ฐ์ด๋ ๊ท์น์ EC2 ๋ณด์ ๊ทธ๋ฃน์ ์ถ๊ฐํด ํด๊ฒฐ
+ Resolved by adding the EC2 security group to the RDS inbound rules.
+
+---
+
+## ๐ ๋ฐฐํฌ ์ํคํ
์ฒ / Deployment Architecture
+
+```
+์ฌ์ฉ์ / User โ devqueue.duckdns.org
+ โ
+ EC2 (Amazon Linux 2023, Java 17, Spring Boot)
+ โ (VPC ๋ด๋ถ ํต์ / internal VPC traffic)
+ RDS (MySQL 8, Single-AZ)
+```
+
+- EC2์์ `nohup`์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํํด SSH ์ธ์
์ข
๋ฃ ํ์๋ ์ ์ง
+ Runs the app in the background with `nohup` on EC2, so it stays up after the SSH session ends.
+- DuckDNS๋ก ๋ฌด๋ฃ ์๋ธ๋๋ฉ์ธ ์ฐ๊ฒฐ, 80๋ฒ ํฌํธ๋ก ํฌํธ ๋ฒํธ ์์ด ์ ๊ทผ ๊ฐ๋ฅ
+ Connected a free subdomain via DuckDNS, serving on port 80 so the URL needs no port number.
+
+---
+
+## ๐ฎ ๋ค์ ๊ณํ (v2 ์ดํ) / Roadmap (v2+)
+
+- ๊ฐ๋ฐ์ ์ ํ(ํ๋ก ํธ/๋ฐฑ์๋/๊ธฐํ)๋ณ ์ธ๊ธฐ ๋งํฌ ๋ญํน / Popular-link rankings by developer role (Frontend/Backend/Etc)
+- Gmail OAuth2 ์์
๋ก๊ทธ์ธ ์ถ๊ฐ / Gmail OAuth2 social login
+- Category ๋์ ๊ด๋ฆฌ (ํ์ฌ๋ Enum ๊ณ ์ ) / Dynamic category management (currently a fixed Enum)
+- RDS ํผ๋ธ๋ฆญ ์ก์ธ์ค ๋นํ์ฑํ + Bastion Host ํจํด ์ ์ฉ / Disable RDS public access + adopt a Bastion Host pattern (security hardening)
+- ๋๋ฉ์ธ ๋์ IP ๋์, HTTPS(SSL ์ธ์ฆ์) ์ ์ฉ / Handle dynamic IP for the domain, add HTTPS (SSL certificate)
+
+---
+
+## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ / Project Structure
+
+```
+dev-queue/
+โโโ rpi/article-vocab-tracker/ # RPI ์ํฌํ๋ก ์ค๊ณ ๋ฌธ์ / RPI workflow design docs
+โโโ src/main/java/com/areumz/devqueue/
+โ โโโ domain/ # Article, User, Vocabulary, Category, Role
+โ โโโ repository/ # ์ธํฐํ์ด์ค + memory/jpa ๊ตฌํ์ฒด / interfaces + memory/jpa implementations
+โ โโโ service/
+โ โโโ controller/
+โ โโโ config/ # SecurityConfig, WebConfig, LoginCheckInterceptor
+โโโ src/main/resources/
+โ โโโ templates/ # Thymeleaf views
+โ โโโ static/css/ # custom styles
+โโโ .github/workflows/ci.yml # Checkstyle + SpotBugs
+```
+
+---
+
+## ๐ ๋ก์ปฌ ์คํ ๋ฐฉ๋ฒ / Running Locally
+
+```bash
+git clone https://github.com/areumz/dev-queue.git
+cd dev-queue
+
+# application-local.properties.example ์ฐธ๊ณ ํ์ฌ
+# application-local.properties ์์ฑ (DB ์ ๋ณด ์
๋ ฅ)
+# Copy application-local.properties.example to
+# application-local.properties and fill in your DB credentials
+
+./gradlew bootRun
+```
\ No newline at end of file
diff --git a/docs/images/form.png b/docs/images/form.png
new file mode 100644
index 0000000..f1deb5b
Binary files /dev/null and b/docs/images/form.png differ
diff --git a/docs/images/list.png b/docs/images/list.png
new file mode 100644
index 0000000..24f4d75
Binary files /dev/null and b/docs/images/list.png differ
diff --git a/docs/images/signin.png b/docs/images/signin.png
new file mode 100644
index 0000000..ab146d3
Binary files /dev/null and b/docs/images/signin.png differ
diff --git a/docs/images/word-popup.png b/docs/images/word-popup.png
new file mode 100644
index 0000000..dd9a4a5
Binary files /dev/null and b/docs/images/word-popup.png differ
diff --git a/src/.DS_Store b/src/.DS_Store
deleted file mode 100644
index d3e9a18..0000000
Binary files a/src/.DS_Store and /dev/null differ