diff --git a/README.md b/README.md
new file mode 100644
index 0000000..6713ff3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,747 @@
+
+
+# ๐ PinHouse
+
+**๊ณต๊ณต ์๋์ฃผํ ์ ๋ณด ๋ฐ ์ฒญ์ฝ ์ง๋จ ํ๋ซํผ**
+
+[](https://openjdk.org/)
+[](https://spring.io/projects/spring-boot)
+[](https://gradle.org/)
+[](https://www.mongodb.com/)
+[](https://www.mysql.com/)
+[](https://redis.io/)
+
+[๊ธฐ์ ์คํ](#-๊ธฐ์ -์คํ) โข [์ํคํ
์ฒ](#-์ํคํ
์ฒ) โข [์ฃผ์ ๊ตฌํ ์ฌํญ](#-์ฃผ์-๊ตฌํ-์ฌํญ)
+
+
+
+---
+
+## ๐ ๋ชฉ์ฐจ
+
+- [ํ๋ก์ ํธ ์๊ฐ](#-ํ๋ก์ ํธ-์๊ฐ)
+- [์ฃผ์ ๊ธฐ๋ฅ](#-์ฃผ์-๊ธฐ๋ฅ)
+- [๊ธฐ์ ์คํ](#-๊ธฐ์ -์คํ)
+- [์ํคํ
์ฒ](#-์ํคํ
์ฒ)
+- [๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ](#-๋ฐ์ดํฐ๋ฒ ์ด์ค-์ค๊ณ)
+- [ํ๋ก์ ํธ ๊ตฌ์กฐ](#-ํ๋ก์ ํธ-๊ตฌ์กฐ)
+- [์ฃผ์ ๊ตฌํ ์ฌํญ](#-์ฃผ์-๊ตฌํ-์ฌํญ)
+- [์ฑ๋ฅ ์ต์ ํ](#-์ฑ๋ฅ-์ต์ ํ)
+- [๋ณด์](#-๋ณด์)
+- [CI/CD](#-cicd)
+
+---
+
+## ๐ฏ ํ๋ก์ ํธ ์๊ฐ
+
+**PinHouse**๋ ๊ณต๊ณต ์๋์ฃผํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์ฌ์ฉ์์ ์ฒญ์ฝ ์๊ฒฉ์ ์ง๋จํ๋ ํ๋ซํผ์
๋๋ค.
+๋ณต์กํ ์ฒญ์ฝ ์ ๋ณด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ ๊ณตํ๋ฉฐ, ์์น ๊ธฐ๋ฐ ์๋น์ค๋ฅผ ํตํด ์ฌ์ฉ์ ๋ง์ถคํ ์ฃผํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
+
+### ๐ ํต์ฌ ๊ฐ์น
+
+- **์ ๋ณด ํฌ๋ช
์ฑ**: ๊ณต๊ณต ์๋์ฃผํ ๋ฐ์ดํฐ๋ฅผ ํตํฉํ์ฌ ํฌ๋ช
ํ๊ฒ ์ ๊ณต
+- **๋ง์ถคํ ์ง๋จ**: ์ฌ์ฉ์ ์ํฉ์ ๋ง๋ ์ฒญ์ฝ ์๊ฒฉ ์๋ ์ง๋จ
+- **์์น ๊ธฐ๋ฐ ์ถ์ฒ**: ์ง์ฅ/ํ๊ต ๋ฑ ๊ด์ฌ ์์น ๊ธฐ๋ฐ ์ต์ ์ฃผํ ์ถ์ฒ
+- **์ฌ์ฉ์ ๊ฒฝํ**: ๋ณต์กํ ์ ๋ณด๋ฅผ ์ง๊ด์ ์ด๊ณ ํธ๋ฆฌํ๊ฒ ์ ๊ณต
+
+---
+
+## โจ ์ฃผ์ ๊ธฐ๋ฅ
+
+### ๐ ์ธ์ฆ ๋ฐ ์ฌ์ฉ์ ๊ด๋ฆฌ
+- **์์
๋ก๊ทธ์ธ**: Kakao, Naver OAuth2 ์ธ์ฆ
+- **JWT ๊ธฐ๋ฐ ์ธ์ฆ**: Access/Refresh Token์ ํตํ ๋ณด์ ๊ฐํ
+- **๋ง์ดํ์ด์ง**: ํ๋กํ ๊ด๋ฆฌ, ์ข์์ ๋ชฉ๋ก, ์ง๋จ ์ด๋ ฅ ์กฐํ
+
+### ๐๏ธ ์ฃผํ ์ ๋ณด ๊ด๋ฆฌ
+- **๋จ์ง ์ ๋ณด**: ์๋์ฃผํ ๋จ์ง์ ์์ธ ์ ๋ณด ์ ๊ณต
+ - ๋๋ฐฉ๋ฐฉ์, ์ด์ธ๋์, ๊ณต๊ธํธ์
+ - ๋ฐฉ ํ์
๋ณ ์ ๋ณด (๋ฉด์ , ์๋๋ฃ, ๊ด๋ฆฌ๋น)
+ - ์ฃผ๋ณ ์ธํ๋ผ ์ ๋ณด (์นดํ, ํธ์์ , ๋ณ์, ํ๊ต ๋ฑ)
+
+- **๊ณต๊ณ ๊ฒ์**: ๋ค์ํ ํํฐ๋ง ๋ฐ ์ ๋ ฌ ์ต์
+ - ์ง์ญ, ๊ณต๊ธ ์ ํ, ๊ฐ๊ฒฉ ๋ฒ์, ๋ฉด์ ๋ณ ๊ฒ์
+ - ์ปค์ ๊ธฐ๋ฐ ๋ฌดํ ์คํฌ๋กค ํ์ด์ง๋ค์ด์
+ - ์ธ๊ธฐ์, ์ต์ ์ ์ ๋ ฌ
+
+- **๋ฐฉ ๋น๊ต ๊ธฐ๋ฅ**: ์ฌ๋ฌ ๋ฐฉ ํ์
์ ํ๋์ ๋น๊ต
+
+### ๐ ์์น ๊ธฐ๋ฐ ์๋น์ค
+- **ํํฌ์ธํธ**: ์ฌ์ฉ์์ ๊ด์ฌ ์์น ๋ฑ๋ก (์ง์ฅ, ํ๊ต, ๋ถ๋ชจ ์ง ๋ฑ)
+- **๊ฑฐ๋ฆฌ ์๋ฎฌ๋ ์ดํฐ**: Odsay API๋ฅผ ํ์ฉํ ๋์ค๊ตํต ๊ฒฝ๋ก ๊ณ์ฐ
+ - ์ด ์์ ์๊ฐ, ๊ฑฐ๋ฆฌ, ์๊ธ ์ ๋ณด
+ - ๊ตฌ๊ฐ๋ณ ์์ธ ๊ฒฝ๋ก (์น์ฐจ/ํ์ฐจ ์ ๋ณด, ๋
ธ์ ์์)
+ - ์ต๋ 3๊ฐ ๊ฒฝ๋ก ์ ๊ณต
+
+### ๐ ์ฒญ์ฝ ์ง๋จ ์์คํ
+- **์๊ฒฉ ์ง๋จ**: ์ฌ์ฉ์์ ์๋, ์์ฐ, ๊ฐ์กฑ ๊ตฌ์ฑ์ ์ ๋ณด ๊ธฐ๋ฐ ์ฒญ์ฝ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ
+- **๊ท์น ์์ง**: ๊ณต๊ธ ์ ํ๋ณ ๋ณต์กํ ์ฒญ์ฝ ์๊ฒฉ ๊ท์น ์๋ ์ ์ฉ
+ - ์ ํผ๋ถ๋ถ ํน๋ณ๊ณต๊ธ
+ - ๋ค์๋
๊ฐ๊ตฌ ํน๋ณ๊ณต๊ธ
+ - ์์ ์ต์ด ํน๋ณ๊ณต๊ธ
+ - ์ฒญ๋
ํน๋ณ๊ณต๊ธ
+- **์ง๋จ ์ด๋ ฅ ๊ด๋ฆฌ**: ๊ณผ๊ฑฐ ์ง๋จ ๊ฒฐ๊ณผ ์ ์ฅ ๋ฐ ์กฐํ
+
+### ๐ ๊ฒ์ ๋ฐ ํํฐ๋ง
+- **๋น ๋ฅธ ๊ฒ์**: ์ง์ญ, ๋ฐฉ ํ์
, ์๋๋ฃ ๋ฒ์๋ก ๊ฐํธ ๊ฒ์
+- **๊ณ ๊ธ ๊ฒ์**: ํค์๋ ๊ธฐ๋ฐ ๊ฒ์ ๋ฐ ๋ค์ํ ํํฐ ์กฐํฉ
+- **์ธ๊ธฐ ๊ฒ์์ด**: ์ค์๊ฐ ์ธ๊ธฐ ๊ฒ์์ด ์ ๊ณต
+- **๊ฒ์ ๊ธฐ๋ก**: MongoDB ๊ธฐ๋ฐ ์ฌ์ฉ์๋ณ ๊ฒ์ ์ด๋ ฅ ์ถ์
+
+### โค๏ธ ์ข์์ ๋ฐ ๋ถ๋งํฌ
+- ๊ณต๊ณ , ๋จ์ง, ๋ฐฉ ํ์
์ ๋ํ ์ข์์ ๊ธฐ๋ฅ
+- ๋ก๊ทธ์ธ ์ฌ์ฉ์๋ณ ์ข์์ ๋ชฉ๋ก ๊ด๋ฆฌ
+
+---
+
+## ๐ ๊ธฐ์ ์คํ
+
+### Backend
+- **Language**: Java 21
+- **Framework**: Spring Boot 3.4.3
+- **Build Tool**: Gradle 8.x
+- **Architecture**: Clean Architecture (4-Layer)
+
+### Database
+- **MySQL 8.0**: ๊ด๊ณํ ๋ฐ์ดํฐ (์ฌ์ฉ์, ๊ณต๊ณ , ๋จ์ง, ์ง๋จ ๊ฒฐ๊ณผ)
+- **MongoDB**: ๋ฌธ์ ๊ธฐ๋ฐ ๋ฐ์ดํฐ (ํํฌ์ธํธ, ๊ฒ์ ์ด๋ ฅ, ์ฃผ๋ณ์์ค)
+- **Redis 7.2.5**: ์ธ์
๊ด๋ฆฌ (JWT Refresh Token, ์์ ์ฌ์ฉ์ ์ ๋ณด)
+
+### Security & Auth
+- **Spring Security**: ๋ณด์ ํ๋ ์์ํฌ
+- **OAuth2 Client**: ์์
๋ก๊ทธ์ธ (Kakao, Naver)
+- **JWT**: `io.jsonwebtoken:jjwt-api:0.11.5`
+
+### Infrastructure
+- **Docker & Docker Compose**: ์ปจํ
์ด๋ํ
+- **Nginx**: ๋ฆฌ๋ฒ์ค ํ๋ก์
+- **Certbot**: SSL/TLS ์ธ์ฆ์ ๊ด๋ฆฌ
+
+### DevOps
+- **GitHub Actions**: CI/CD ์๋ํ
+- **JUnit 5**: ๋จ์ ๋ฐ ํตํฉ ํ
์คํธ
+
+### External APIs
+- **Odsay API**: ๋์ค๊ตํต ๊ฒฝ๋ก ๋ฐ ์๊ฐ ๊ณ์ฐ
+- **Kakao Local API**: ์ฃผ์-์ขํ ๋ณํ
+- **OAuth2 Providers**: Kakao, Naver
+
+### Documentation & Monitoring
+- **Swagger/OpenAPI**: `springdoc-openapi-starter-webmvc-ui:2.8.6`
+- **Spring Actuator**: ์ ํ๋ฆฌ์ผ์ด์
๋ชจ๋ํฐ๋ง
+
+---
+
+## ๐ ์ํคํ
์ฒ
+
+### ์์คํ
์ํคํ
์ฒ
+
+```mermaid
+graph TB
+ subgraph "Client Layer"
+ Client[Client Application]
+ end
+
+ subgraph "API Gateway"
+ Nginx[Nginx Reverse Proxy]
+ end
+
+ subgraph "Application Server"
+ Spring[Spring Boot 3.4.3]
+
+ subgraph "Clean Architecture Layers"
+ Presentation[Presentation Layer
REST Controllers]
+ Application[Application Layer
UseCase + Services]
+ Domain[Domain Layer
Entities + Repositories]
+ Infrastructure[Infrastructure Layer
DB + External APIs]
+ end
+ end
+
+ subgraph "Data Layer"
+ MySQL[(MySQL 8.0
Relational Data)]
+ MongoDB[(MongoDB
Document Data)]
+ Redis[(Redis 7.2.5
Cache & Session)]
+ end
+
+ subgraph "External Services"
+ Odsay[Odsay API]
+ KakaoLocal[Kakao Local API]
+ OAuth2[OAuth2 Providers
Kakao, Naver]
+ end
+
+ Client -->|HTTPS| Nginx
+ Nginx -->|HTTP| Spring
+ Spring --> Presentation
+ Presentation --> Application
+ Application --> Domain
+ Domain --> Infrastructure
+ Infrastructure --> MySQL
+ Infrastructure --> MongoDB
+ Infrastructure --> Redis
+ Infrastructure --> Odsay
+ Infrastructure --> KakaoLocal
+ Infrastructure --> OAuth2
+
+ style Spring fill:#6DB33F
+ style MySQL fill:#4479A1
+ style MongoDB fill:#47A248
+ style Redis fill:#DC382D
+```
+
+### Clean Architecture (4-Layer)
+
+```
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+โ Presentation Layer โ
+โ (REST API Controllers - *Api.java) โ
+โโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ โ depends on
+โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+โ Application Layer โ
+โ UseCase Interfaces + Service Implementations โ
+โ (Business Logic) โ
+โโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ โ depends on
+โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+โ Domain Layer โ
+โ Entities + Repository Interfaces โ
+โ (Business Rules) โ
+โโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ โ depends on
+โโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+โ Infrastructure Layer โ
+โ Repository Implementations + External APIs โ
+โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+```
+
+### ๋๋ฉ์ธ ๋ชจ๋ ๊ตฌ์กฐ
+
+๊ฐ ๋๋ฉ์ธ์ ์ผ๊ด๋ ํจํค์ง ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ
๋๋ค:
+
+```
+/
+โโโ presentation/ # REST API ์๋ํฌ์ธํธ
+โ โโโ *Api.java # Controller
+โ โโโ swagger/ # API ๋ช
์ธ
+โโโ application/
+โ โโโ usecase/ # UseCase ์ธํฐํ์ด์ค
+โ โโโ service/ # UseCase ๊ตฌํ
+โ โโโ dto/ # Request/Response DTO
+โ โโโ request/
+โ โโโ response/
+โโโ domain/
+โ โโโ entity/ # JPA/MongoDB Entity
+โ โโโ repository/ # Repository Interface
+โโโ external/ # ์ธ๋ถ API ํตํฉ (์ ํ)
+```
+
+### ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํคํ
์ฒ
+
+```
+โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
+โ MySQL โ โ MongoDB โ โ Redis โ
+โ โ โ โ โ โ
+โ - User โ โ - PinPoint โ โ - JWT Token โ
+โ - Complex โ โ - Search โ โ - TempUser โ
+โ - Notice โ โ History โ โ โ
+โ - Diagnosis โ โ - Facility โ โ โ
+โ - Like โ โ โ โ โ
+โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
+```
+
+---
+
+## ๐พ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
+
+### Entity Relationship Diagram
+
+```mermaid
+erDiagram
+ USER ||--o{ DIAGNOSIS : has
+ USER ||--o{ LIKE : creates
+ USER ||--o{ PINPOINT : owns
+ USER ||--o{ SEARCH_HISTORY : performs
+
+ NOTICE ||--o{ NOTICE_COMPLEX : contains
+ COMPLEX ||--o{ NOTICE_COMPLEX : included_in
+ COMPLEX ||--o{ UNIT_TYPE : has
+ COMPLEX ||--o{ FACILITY : near
+
+ LIKE }o--|| NOTICE : targets
+ LIKE }o--|| COMPLEX : targets
+ LIKE }o--|| UNIT_TYPE : targets
+
+ USER {
+ uuid id PK
+ string name
+ string profile_image_url
+ string oauth_provider
+ string oauth_id
+ datetime created_at
+ datetime updated_at
+ }
+
+ NOTICE {
+ string id PK
+ string title
+ date recruit_start_date
+ date recruit_end_date
+ string region
+ string supply_type
+ }
+
+ COMPLEX {
+ string id PK
+ string name
+ string address
+ string heating
+ int total_households
+ }
+
+ UNIT_TYPE {
+ string id PK
+ string complex_id FK
+ string type_code
+ int area
+ int rent
+ int deposit
+ }
+
+ DIAGNOSIS {
+ uuid id PK
+ uuid user_id FK
+ json diagnosis_result
+ datetime created_at
+ }
+
+ LIKE {
+ uuid id PK
+ uuid user_id FK
+ string target_type
+ string target_id
+ }
+
+ PINPOINT {
+ string id PK
+ uuid user_id
+ string name
+ coordinate location
+ boolean is_first
+ }
+
+ FACILITY {
+ string id PK
+ string complex_id
+ string facility_type
+ array facilities
+ }
+
+ SEARCH_HISTORY {
+ string id PK
+ uuid user_id
+ string keyword
+ json filters
+ datetime created_at
+ }
+
+ NOTICE_COMPLEX {
+ string notice_id FK
+ string complex_id FK
+ }
+```
+
+### MySQL (Relational Data)
+
+**User ํ
์ด๋ธ**
+- ์ฌ์ฉ์ ๊ธฐ๋ณธ ์ ๋ณด (์ด๋ฆ, ํ๋กํ ์ด๋ฏธ์ง, OAuth ์ ๋ณด)
+- ์ง๋จ ๊ฒฐ๊ณผ์ 1:N ๊ด๊ณ
+- ์ข์์์ 1:N ๊ด๊ณ
+
+**Complex ํ
์ด๋ธ**
+- ์๋์ฃผํ ๋จ์ง ์ ๋ณด
+- Notice์ N:M ๊ด๊ณ (ํ๋์ ๊ณต๊ณ ์ ์ฌ๋ฌ ๋จ์ง)
+- UnitType๊ณผ 1:N ๊ด๊ณ
+
+**Notice ํ
์ด๋ธ**
+- ์ฒญ์ฝ ๊ณต๊ณ ์ ๋ณด
+- ๋ชจ์ง ๊ธฐ๊ฐ, ๋น์ฒจ์ ๋ฐํ์ผ, ๊ณ์ฝ์ผ ๋ฑ
+
+**Diagnosis ํ
์ด๋ธ**
+- ์ฒญ์ฝ ์ง๋จ ๊ฒฐ๊ณผ ์ ์ฅ
+- ์ฌ์ฉ์ ์๋, ์์ฐ, ๊ฐ์กฑ ๊ตฌ์ฑ์ ์ ๋ณด
+
+**Like ํ
์ด๋ธ**
+- ์ฌ์ฉ์๋ณ ์ข์์ ์ ๋ณด
+- ๊ณต๊ณ , ๋จ์ง, ๋ฐฉ ํ์
๊ตฌ๋ถ
+
+### MongoDB (Document-based Data)
+
+**PinPoint Collection**
+- ์ฌ์ฉ์์ ๊ด์ฌ ์์น ์ ๋ณด
+- Kakao Local API๋ฅผ ํตํ ์ขํ ๋ฐ์ดํฐ
+- ์ฆ๊ฒจ์ฐพ๊ธฐ(first) ์ฌ๋ถ
+
+**SearchHistory Collection**
+- ์ฌ์ฉ์๋ณ ๊ฒ์ ๊ธฐ๋ก
+- ๊ฒ์ ํค์๋, ํํฐ ์กฐ๊ฑด, ํ์์คํฌํ
+
+**Facility Collection**
+- ๋จ์ง ์ฃผ๋ณ ์์ค ์ ๋ณด
+- ์นดํ
๊ณ ๋ฆฌ๋ณ ์์ค ๋ชฉ๋ก
+
+### Redis (Cache & Session)
+
+- **JWT Refresh Token**: ํ ํฐ ๊ฐฑ์ ์ฉ ๋ฆฌํ๋ ์ ํ ํฐ ์ ์ฅ
+- **TempUserInfo**: OAuth2 ์ธ์ฆ ํ ํ์๊ฐ์
์ ์์ ์ฌ์ฉ์ ์ ๋ณด
+
+---
+
+## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
+
+```
+server/
+โโโ src/
+โ โโโ main/
+โ โ โโโ java/com/pinHouse/server/
+โ โ โ โโโ core/ # ๊ณตํต ๊ด์ฌ์ฌ
+โ โ โ โ โโโ aop/ # @CheckLogin AOP
+โ โ โ โ โโโ config/ # Swagger, DB ์ค์
+โ โ โ โ โโโ exception/ # ์์ธ ์ฒ๋ฆฌ
+โ โ โ โ โโโ response/ # ํ์ค ์๋ต
+โ โ โ โ โโโ util/ # ์ ํธ๋ฆฌํฐ
+โ โ โ โโโ security/ # ๋ณด์ ๋ฐ ์ธ์ฆ
+โ โ โ โ โโโ auth/ # OAuth2 ์ฒ๋ฆฌ
+โ โ โ โ โโโ jwt/ # JWT ํ ํฐ
+โ โ โ โ โโโ oauth2/ # OAuth2 ์ค์
+โ โ โ โ โโโ config/ # Security ์ค์
+โ โ โ โโโ platform/ # ๋น์ฆ๋์ค ๋๋ฉ์ธ
+โ โ โ โโโ user/ # ์ฌ์ฉ์
+โ โ โ โโโ housing/ # ์ฃผํ ์ ๋ณด
+โ โ โ โ โโโ complex/ # ๋จ์ง
+โ โ โ โ โโโ notice/ # ๊ณต๊ณ
+โ โ โ โ โโโ facility/ # ์ฃผ๋ณ์์ค
+โ โ โ โโโ diagnostic/ # ์ฒญ์ฝ ์ง๋จ
+โ โ โ โ โโโ diagnosis/
+โ โ โ โ โโโ school/
+โ โ โ โ โโโ rule/
+โ โ โ โโโ pinPoint/ # ํํฌ์ธํธ
+โ โ โ โโโ like/ # ์ข์์
+โ โ โ โโโ search/ # ๊ฒ์
+โ โ โโโ resources/
+โ โ โโโ application.yml
+โ โ โโโ application-local.yml
+โ โ โโโ application-dev.yml
+โ โโโ test/ # ํ
์คํธ ์ฝ๋
+โโโ pinhouse_docker/ # Docker ์ค์
+โ โโโ docker-compose.yml
+โโโ build.gradle
+โโโ CLAUDE.md # ๊ฐ๋ฐ ๊ฐ์ด๋
+โโโ README.md
+```
+
+---
+
+## ๐ง ์ฃผ์ ๊ตฌํ ์ฌํญ
+
+### OAuth2 ์ธ์ฆ ํ๋ฆ
+
+```mermaid
+sequenceDiagram
+ participant Client
+ participant Backend
+ participant OAuth2 as OAuth2 Provider
(Kakao/Naver)
+ participant Redis
+ participant MySQL
+
+ Client->>Backend: 1. OAuth2 ๋ก๊ทธ์ธ ์์ฒญ
+ Backend->>OAuth2: 2. ์ธ์ฆ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
+ OAuth2->>Client: 3. ์ฌ์ฉ์ ๋์ ํ Authorization Code ๋ฐํ
+ Client->>Backend: 4. Authorization Code ์ ๋ฌ
+ Backend->>OAuth2: 5. Access Token ์์ฒญ
+ OAuth2->>Backend: 6. Access Token ๋ฐํ
+ Backend->>OAuth2: 7. ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ
+ OAuth2->>Backend: 8. ์ฌ์ฉ์ ์ ๋ณด ๋ฐํ
+
+ alt ์ ๊ท ์ฌ์ฉ์
+ Backend->>Redis: 9. ์์ ์ฌ์ฉ์ ์ ๋ณด ์ ์ฅ (tempUserKey)
+ Backend->>Client: 10. tempUserKey ๋ฐํ
+ Client->>Backend: 11. ํ์๊ฐ์
์์ฒญ (tempUserKey + ์ถ๊ฐ ์ ๋ณด)
+ Backend->>Redis: 12. ์์ ์ ๋ณด ์กฐํ
+ Backend->>MySQL: 13. ์ฌ์ฉ์ ์์ฑ
+ Backend->>Client: 14. JWT Token ๋ฐ๊ธ (Access + Refresh)
+ else ๊ธฐ์กด ์ฌ์ฉ์
+ Backend->>MySQL: 9. ์ฌ์ฉ์ ์กฐํ
+ Backend->>Redis: 10. Refresh Token ์ ์ฅ
+ Backend->>Client: 11. JWT Token ๋ฐ๊ธ (Access + Refresh)
+ end
+```
+
+### 1. Clean Architecture ์ ์ฉ
+
+**์์กด์ฑ ์ญ์ ์์น (DIP) ์ค์**
+```java
+// UseCase Interface (Application Layer)
+public interface ComplexUseCase {
+ ComplexDetailResponse getComplex(String id, String pinPointId);
+}
+
+// Service Implementation
+@Service
+@RequiredArgsConstructor
+public class ComplexService implements ComplexUseCase {
+ @Override
+ public ComplexDetailResponse getComplex(String id, String pinPointId) {
+ // ๊ตฌํ
+ }
+}
+
+// Controller๋ UseCase ์ธํฐํ์ด์ค์ ์์กด
+@RestController
+@RequiredArgsConstructor
+public class ComplexApi {
+ private final ComplexUseCase complexUseCase; // ๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค์ ์์กด
+}
+```
+
+### 2. AOP๋ฅผ ํตํ ์ธ์ฆ ์ฒ๋ฆฌ
+
+```java
+@CheckLogin // ์ปค์คํ
์ด๋
ธํ
์ด์
+@GetMapping("/mypage")
+public ApiResponse getMyPage(
+ @AuthenticationPrincipal PrincipalDetails principalDetails
+) {
+ UUID userId = principalDetails.getId();
+ // ๋น์ฆ๋์ค ๋ก์ง
+}
+```
+
+**LoginCheckAspect**๊ฐ `@CheckLogin` ๋ฉ์๋ ํธ์ถ ์ ์ ์ธ์ฆ ์ฌ๋ถ๋ฅผ ์๋ ๊ฒ์ฆํฉ๋๋ค.
+
+### 3. ๋ค์ธต ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ต
+
+**MySQL** - ์ ํ ๋ฐ์ดํฐ (JPA)
+```java
+@Entity
+@Table(name = "users")
+public class User extends BaseTimeEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private UUID id;
+
+ @OneToMany(mappedBy = "user")
+ private List diagnoses;
+}
+```
+
+**MongoDB** - ๋น์ ํ ๋ฐ์ดํฐ
+```java
+@Document(collection = "pinpoints")
+public class PinPointDocument {
+ @Id
+ private String id;
+
+ private Coordinate coordinate; // Nested Document
+ private List tags; // ์ ์ฐํ ์คํค๋ง
+}
+```
+
+**Redis** - ์ธ์
๋ฐ ์บ์ฑ
+```java
+@RedirectAttributes
+public void saveRefreshToken(UUID userId, String refreshToken) {
+ redisTemplate.opsForValue()
+ .set("RT:" + userId, refreshToken, 7, TimeUnit.DAYS);
+}
+```
+
+### 4. ๋ณต์กํ ๊ท์น ์์ง ๊ตฌํ
+
+**Chain of Responsibility ํจํด์ ํ์ฉํ ์ฒญ์ฝ ์๊ฒฉ ํ๋จ**
+
+```java
+public interface DiagnosisRule {
+ boolean matches(RuleCriteria criteria);
+ DiagnosisResult apply(UserInfo userInfo);
+}
+
+@Component
+public class RuleChain {
+ private final List rules;
+
+ public DiagnosisResult diagnose(UserInfo userInfo, RuleCriteria criteria) {
+ return rules.stream()
+ .filter(rule -> rule.matches(criteria))
+ .findFirst()
+ .map(rule -> rule.apply(userInfo))
+ .orElse(DiagnosisResult.notEligible());
+ }
+}
+```
+
+### 5. ํจ์จ์ ์ธ ํ์ด์ง๋ค์ด์
+
+**Cursor ๊ธฐ๋ฐ ๋ฌดํ ์คํฌ๋กค**
+```java
+public record SliceRequest(
+ int page,
+ int size
+) {
+ public Pageable toPageable() {
+ return PageRequest.of(page, size + 1); // N+1 ์กฐํ
+ }
+}
+
+public record SliceResponse(
+ List content,
+ boolean hasNext
+) {
+ public static SliceResponse from(Page page) {
+ boolean hasNext = page.getContent().size() > page.getSize();
+ List content = hasNext
+ ? page.getContent().subList(0, page.getSize())
+ : page.getContent();
+ return new SliceResponse<>(content, hasNext);
+ }
+}
+```
+
+### 6. ํ์คํ๋ API ์๋ต
+
+```java
+public record ApiResponse(
+ boolean success,
+ T data,
+ ErrorResponse error
+) {
+ public static ApiResponse ok(T data) {
+ return new ApiResponse<>(true, data, null);
+ }
+
+ public static ApiResponse error(ErrorCode errorCode) {
+ return new ApiResponse<>(false, null,
+ new ErrorResponse(errorCode.getCode(), errorCode.getMessage()));
+ }
+}
+```
+
+### 7. ๋์ค๊ตํต ๊ฒฝ๋ก ์ ๋ณด ์ต์ ํ
+
+**TransitInfoResponse** - ์ ์ฒด ๊ฒฝ๋ก ์ ๋ณด์ ๊ตฌ๊ฐ๋ณ ์ ๋ณด ๋ถ๋ฆฌ
+```java
+public record TransitInfoResponse(
+ String totalTime, // "์ฝ 1์๊ฐ 23๋ถ"
+ Integer totalTimeMinutes, // 83
+ Double totalDistance, // 39.6 (km)
+ List segments // ๊ตฌ๊ฐ๋ณ ์์ธ ์ ๋ณด
+) {}
+```
+
+์ด๋ฅผ ํตํด ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ณ API ์๋ต ํฌ๊ธฐ๋ฅผ ์ต์ ํํ์ต๋๋ค.
+
+---
+
+## โก๏ธ ์ฑ๋ฅ ์ต์ ํ
+
+### 1. ๋ค์ธต ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ต
+- **MySQL**: ์ ํํ๋ ํธ๋์ญ์
๋ฐ์ดํฐ
+- **MongoDB**: ๋ณต์กํ ๊ฒ์ ์ฟผ๋ฆฌ ๋ฐ ์ ์ฐํ ์คํค๋ง
+- **Redis**: ์ธ์
์บ์ฑ์ผ๋ก DB ๋ถํ ๊ฐ์
+
+### 2. ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์
+- Offset ๋ฐฉ์ ๋์ Cursor ๊ธฐ๋ฐ ๋ฌดํ ์คํฌ๋กค ๊ตฌํ
+- ๋๋ ๋ฐ์ดํฐ ์กฐํ ์ ์ฑ๋ฅ ์ต์ ํ (O(n) โ O(1))
+
+### 3. DTO ์ต์ ํ
+- Java Record ํ์
์ผ๋ก ๋ถ๋ณ ๊ฐ์ฒด ์์ฑ
+- ์ค๋ณต ๋ฐ์ดํฐ ์ ๊ฑฐ (TransitInfoResponse ๊ตฌ์กฐ ๊ฐ์ )
+
+### 4. N+1 ๋ฌธ์ ํด๊ฒฐ
+- JPA Fetch Join ๋ฐ EntityGraph ํ์ฉ
+- ์ฐ๊ด ๊ด๊ณ ๋ฐ์ดํฐ ํ ๋ฒ์ ์กฐํ
+
+### 5. AOP๋ฅผ ํตํ ํก๋จ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
+- `@CheckLogin` ์ด๋
ธํ
์ด์
์ผ๋ก ์ธ์ฆ ๋ก์ง ์ค๋ณต ์ ๊ฑฐ
+- ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค ๊ฐ๋ฅ
+
+---
+
+## ๐ ๋ณด์
+
+### ์ธ์ฆ ๋ฐ ์ธ๊ฐ
+- **JWT ๊ธฐ๋ฐ ์ธ์ฆ**: Stateless ์ธ์ฆ์ผ๋ก ํ์ฅ์ฑ ํ๋ณด
+- **Refresh Token**: Redis์ ์ ์ฅํ์ฌ ๋ณด์ ๊ฐํ
+- **OAuth2**: ์์
๋ก๊ทธ์ธ์ผ๋ก ํจ์ค์๋ ๊ด๋ฆฌ ๋ถ๋ด ์ ๊ฑฐ
+
+### ๋ณด์ ์ค์
+- **CORS ์ค์ **: ํ์ฉ๋ ๋๋ฉ์ธ๋ง API ์ ๊ทผ ๊ฐ๋ฅ
+- **HTTPS**: Nginx + Certbot์ผ๋ก SSL/TLS ์ ์ฉ
+- **SQL Injection ๋ฐฉ์ง**: JPA Prepared Statement ์ฌ์ฉ
+
+---
+
+## ๐ CI/CD
+
+### GitHub Actions Workflows
+
+**1. CI Test (`ci-test.yml`)**
+- **ํธ๋ฆฌ๊ฑฐ**: Pull Request to `develop`
+- **์์
**:
+ - MySQL, Redis, MongoDB ์๋น์ค ์ปจํ
์ด๋ ์คํ
+ - `./gradlew clean build` ์คํ (ํ
์คํธ ํฌํจ)
+ - JUnit ํ
์คํธ ๊ฒฐ๊ณผ ๋ฐํ
+
+**2. Dev Deployment (`dev-ci-cd.yml`)**
+- **ํธ๋ฆฌ๊ฑฐ**: Push to `develop`
+- **์์
**:
+ - Docker ์ด๋ฏธ์ง ๋น๋
+ - Dev ์๋ฒ ๋ฐฐํฌ
+
+### ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ
+
+```
+feature/* โ PR โ develop (CI Test) โ merge โ develop (Deploy to Dev)
+```
+
+---
+
+## ๐ธ ์คํฌ๋ฆฐ์ท (Screenshots)
+
+> ๐ **Note**: ์ค์ ํ๋ก์ ํธ ์คํฌ๋ฆฐ์ท์ ์ถ๊ฐํ๋ฉด ํฌํธํด๋ฆฌ์ค ํจ๊ณผ๊ฐ ๊ทน๋ํ๋ฉ๋๋ค.
+> - Swagger API ๋ฌธ์ ํ๋ฉด
+> - ์์คํ
๋ชจ๋ํฐ๋ง ๋์๋ณด๋
+> - ๋ฐ์ดํฐ๋ฒ ์ด์ค ERD ๋ค์ด์ด๊ทธ๋จ
+> - ์ฃผ์ ๊ธฐ๋ฅ ๋์ ํ๋ฉด
+
+---
+
+## ๐ฅ ๊ฐ๋ฐ ํ
+
+**Backend Team**
+- Spring Boot, Clean Architecture, Multi-Database Design
+- OAuth2, JWT ์ธ์ฆ/์ธ๊ฐ ๊ตฌํ
+- ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ์ค๊ณ (์ฒญ์ฝ ์ง๋จ ๊ท์น ์์ง)
+- Odsay API ์ฐ๋ ๋ฐ ๋์ค๊ตํต ๊ฒฝ๋ก ์ต์ ํ
+- Kakao Local API๋ฅผ ํ์ฉํ ์ขํ ๋ณํ ์์คํ
+
+---
+
+## ๐ ๋ผ์ด์ผ์ค
+
+์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ผ์ค๋ฅผ ๋ฐ๋ฆ
๋๋ค.
+
+---
+
+## ๐ ๋ฌธ์
+
+ํ๋ก์ ํธ์ ๋ํ ์ง๋ฌธ์ด๋ ์ ์์ด ์์ผ์๋ฉด ์ด์๋ฅผ ๋ฑ๋กํด์ฃผ์ธ์.
+
+**Repository**: [PinHouse GitHub](https://github.com/PinHouse/PinHouse_BE)
+
+---
+
+
+
+**Built with โค๏ธ by PinHouse Team**
+
+
diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/SubwayLineType.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/SubwayLineType.java
index 42a7465..945a853 100644
--- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/SubwayLineType.java
+++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/result/SubwayLineType.java
@@ -23,44 +23,45 @@ public enum SubwayLineType {
SEOUL_LINE_7(7, "์๋๊ถ 7ํธ์ ", "#69702D"),
SEOUL_LINE_8(8, "์๋๊ถ 8ํธ์ ", "#E5046C"),
SEOUL_LINE_9(9, "์๋๊ถ 9ํธ์ ", "#CEA43A"),
+
GTX_A(91, "GTX-A", "#9A6292"),
AIRPORT(101, "๊ณตํญ์ฒ ๋", "#3CA8EA"),
- MAGLEV(102, "์๊ธฐ๋ถ์์ฒ ๋", "#BBBBBB"),
+ MAGLEV(102, "์๊ธฐ๋ถ์์ฒ ๋", "#8FC31F"),
GYEONGUI_JUNGANG(104, "๊ฒฝ์์ค์์ ", "#69CCCC"),
EVERLINE(107, "์๋ฒ๋ผ์ธ", "#6CAB2A"),
- GYEONGCHUN(108, "๊ฒฝ์ถ์ ", "#BBBBBB"),
+ GYEONGCHUN(108, "๊ฒฝ์ถ์ ", "#0C8E72"),
SINBUNDANG(109, "์ ๋ถ๋น์ ", "#C12B2F"),
UIJEONGBU(110, "์์ ๋ถ๊ฒฝ์ ์ฒ ", "#DF7503"),
- GYEONGGANG(112, "๊ฒฝ๊ฐ์ ", "#BBBBBB"),
+ GYEONGGANG(112, "๊ฒฝ๊ฐ์ ", "#003DA5"),
UISINSEOL(113, "์ฐ์ด์ ์ค์ ", "#AFBF04"),
SEOHAE(114, "์ํด์ ", "#4DA635"),
GIMPO_GOLDLINE(115, "๊นํฌ๊ณจ๋๋ผ์ธ", "#957326"),
SUIN_BUNDANG(116, "์์ธ๋ถ๋น์ ", "#FFCE32"),
- SILLIM(117, "์ ๋ฆผ์ ", "#BBBBBB"),
+ SILLIM(117, "์ ๋ฆผ์ ", "#6789CA"),
// ์ธ์ฒ
INCHEON_LINE_1(21, "์ธ์ฒ 1ํธ์ ", "#7EAAD6"),
- INCHEON_LINE_2(22, "์ธ์ฒ 2ํธ์ ", "#BBBBBB"),
+ INCHEON_LINE_2(22, "์ธ์ฒ 2ํธ์ ", "#F5A200"),
// ๋์
- DAEJEON_LINE_1(31, "๋์ 1ํธ์ ", "#BBBBBB"),
+ DAEJEON_LINE_1(31, "๋์ 1ํธ์ ", "#007448"),
// ๋๊ตฌ
- DAEGU_LINE_1(41, "๋๊ตฌ 1ํธ์ ", "#BBBBBB"),
- DAEGU_LINE_2(42, "๋๊ตฌ 2ํธ์ ", "#BBBBBB"),
- DAEGU_LINE_3(43, "๋๊ตฌ 3ํธ์ ", "#BBBBBB"),
- DAEGYEONG(48, "๋๊ฒฝ์ ", "#BBBBBB"),
+ DAEGU_LINE_1(41, "๋๊ตฌ 1ํธ์ ", "#D93F3F"),
+ DAEGU_LINE_2(42, "๋๊ตฌ 2ํธ์ ", "#00AA80"),
+ DAEGU_LINE_3(43, "๋๊ตฌ 3ํธ์ ", "#F7B500"),
+ DAEGYEONG(48, "๋๊ฒฝ์ ", "#4B6CB7"),
// ๊ด์ฃผ
- GWANGJU_LINE_1(51, "๊ด์ฃผ 1ํธ์ ", "#BBBBBB"),
+ GWANGJU_LINE_1(51, "๊ด์ฃผ 1ํธ์ ", "#0094D8"),
// ๋ถ์ฐ
- BUSAN_LINE_1(71, "๋ถ์ฐ 1ํธ์ ", "#BBBBBB"),
- BUSAN_LINE_2(72, "๋ถ์ฐ 2ํธ์ ", "#BBBBBB"),
- BUSAN_LINE_3(73, "๋ถ์ฐ 3ํธ์ ", "#BBBBBB"),
- BUSAN_LINE_4(74, "๋ถ์ฐ 4ํธ์ ", "#BBBBBB"),
- DONGHAE(78, "๋ํด์ ", "#BBBBBB"),
- BUSAN_GIMHAE(79, "๋ถ์ฐ-๊นํด๊ฒฝ์ ์ฒ ", "#BBBBBB"),
+ BUSAN_LINE_1(71, "๋ถ์ฐ 1ํธ์ ", "#F06A00"),
+ BUSAN_LINE_2(72, "๋ถ์ฐ 2ํธ์ ", "#6AC6B8"),
+ BUSAN_LINE_3(73, "๋ถ์ฐ 3ํธ์ ", "#CFA32E"),
+ BUSAN_LINE_4(74, "๋ถ์ฐ 4ํธ์ ", "#4E67A1"),
+ DONGHAE(78, "๋ํด์ ", "#005BAC"),
+ BUSAN_GIMHAE(79, "๋ถ์ฐ-๊นํด๊ฒฝ์ ์ฒ ", "#875CAC"),
UNKNOWN(-1, "UNKNOWN", "#BBBBBB");