Kohavi Ch.14 개관 — 무작위 배정 단위 (Randomization Unit)

Page · Session · User · Tenant · Advertiser · Social Cluster — Granularity Spectrum

Kohavi (2020) Ch.14 의 흐름을 한 편으로 압축한다. Randomization unit 의 선택이 user experience 와 metric에 동시 영향을 주는 메커니즘, granularity spectrum (page, session, user, tenant, advertiser, social cluster), 두 핵심 질문 (consistency, metric), SUTVA·페이지 의존성·통계 검정력 의 trade-off, 그리고 user-level randomization 의 3 가지 ID 선택을 정리한다.

Experimentation
A/B Test
저자

Kwangmin Kim

공개

2026년 05월 08일

1 정의

정의: Randomization Unit (무작위 배정 단위)

실험에서 variant 할당의 atomic 단위. 한 unit 의 모든 event 는 같은 variant 를 받고, 다른 unit 사이는 random 으로 분할된다 (Kohavi, Tang, Xu, 2020, Ch.14).

1.0.0.1 4 가지 핵심 속성
속성 설명
Independence (배정) 한 unit 의 variant 가 다른 unit 의 variant 와 독립
Independence (실험 간) 한 실험의 unit 배정이 다른 실험의 배정과 독립
Stability 같은 unit 은 시간에 따라 같은 variant 유지 (longitudinal)
Identifiability Unit 을 식별하는 stable identifier 존재

원문 인용 (RAND 1955): “Production from the original machine showed statistically significant biases, and the engineers had to make several modifications and refinements of the circuits before production of apparently satisfactory numbers was achieved.”

핵심 통찰: Random number 생성 자체가 어렵듯, randomization unit 의 선택도 미묘. 잘못된 선택은 SUTVA 위반·measurement 불가·user 일관성 깨짐 의 직접 원인. Ch.14 는 이 선택 의 trade-off 를 정리.

2 개념 및 원리

2.1 Why Care — 두 가지 동시 영향

저자가 도입에서 강조: “The choice of randomization unit is critical in experiment design, as it affects both the user experience as well as what metrics can be used in measuring the impact of an experiment.”

2.1.0.1 영향 1 — 사용자 경험
Coarse randomization (user-level):
  - 사용자가 같은 variant 를 모든 page 에서
  - 일관된 경험
  - 신뢰감 ↑

Fine randomization (page-level):
  - 사용자가 page 마다 다른 variant 가능
  - 일관성 깨짐
  - "왜 이 page 는 다르지?" confusion
2.1.0.2 영향 2 — Metric 측정 가능성
Page-level randomization 시:
  - Click-per-page 측정 가능 (page 단위 일치)
  - Sessions-per-user 측정 불가 (user 단위 의 variant mix)

User-level randomization 시:
  - Click-per-page, sessions-per-user 모두 가능
  - Bootstrap·delta method 필요 (변동 계산 복잡)

이 두 영향이 randomization unit 선택의 본질. 한 차원만 보면 잘못 선택.

2.2 Granularity Spectrum — 6 가지 layer

저자가 제시한 spectrum + 사전지식 보완.

Coarse                                                     Fine
  │                                                          │
Cluster (social, advertiser) → Tenant → User → User-Day → Session → Query → Page
  │                                                          │
  Coarse → Independence ↑, Sample size ↓
                                              Fine → Independence ↓, Sample size ↑

2.2.1 Layer 1 — Page-level

저자 명시: “Each new web page viewed on a site is considered a unit.”

Page-level 의 특성:
  - 한 사용자가 5 page 보면 = 5 units
  - Sample size 가장 큼 (사용자당 N pages)
  - Variance 가장 작음 (sample size 비례)
  - 통계적 power 가장 큼

함정:
  - 같은 사용자가 page 마다 다른 variant 받음
  - 일관성 0
  - User-level metric (retention) 측정 불가
  - Inter-page dependency (personalization) 시 SUTVA 위반

2.2.2 Layer 2 — Session-level

저자 명시: “This unit is the group of webpages viewed on a single visit. A session, or visit, is typically defined to end after 30 minutes of inactivity.”

Session-level 의 특성:
  - 한 사용자의 한 방문 = 1 unit
  - 보통 30 분 inactivity 후 새 session
  - 같은 session 내 일관 variant
  - 다른 session 에서는 다른 variant 가능

함정:
  - 사용자가 매일 다른 variant 가능
  - "어제는 X, 오늘은 Y" confusion
  - Long-term retention 측정 어려움

2.2.3 Layer 3 — Query-level (검색 엔진)

저자 강조: “For search engines, where there can be multiple pageviews for a single query, a query can be a level of granularity between page and session.”

Query-level (search engine 특화):
  - 한 query 의 모든 pageview = 1 unit
  - Search → SERP → result click → result page → 모두 같은 variant
  - Page 보다 coarse, session 보다 fine

특히 search engine 에서 의미 있음:
  - Query 가 의도 의 자연 단위
  - 같은 query 내 일관 (Treatment 검색 결과 vs Control)
  - 다른 query 는 random

2.2.4 Layer 4 — User-Day

저자 인용 (Hohnhold, O’Brien, Tang 2015): “We can also consider a combination of user and day to be a unit, where events from the same user on different days are in different units.”

User-day:
  - 한 사용자의 한 날 = 1 unit
  - 다른 날은 다른 variant 가능
  - User-level 보다 fine, session-level 보다 coarse

장점:
  - Day 별 비교 가능
  - 사용자 가 long-term 학습 효과 측정 (Hohnhold et al. 2015 의 ads 학습)

단점:
  - 매일 다른 variant 의 confusion
  - Daily routine 의 일관성 깨짐

2.2.5 Layer 5 — User-level

저자 명시: “All events from a single user is the unit.”

User-level:
  - 한 사용자의 모든 event = 1 unit
  - 모든 시간·page 에서 같은 variant
  - 가장 coarse 한 일반적 단위

장점:
  - 일관된 경험
  - User-level metric (sessions, retention, LTV) 모두 측정 가능
  - Long-term 효과 분석 가능

단점:
  - Sample size 가장 작음 (한 사용자 = 1)
  - Variance 큼
  - 통계적 power ↓

2.2.6 Layer 6 — Cluster (Tenant, Advertiser, Social)

저자 명시 (Ch.14): “In some enterprise scenarios, such as Office, tenants would like consistent experiences for the enterprise, limiting the ability to randomize by user.”

Tenant-level (Enterprise SaaS):
  - 한 회사 의 모든 사용자 = 1 unit
  - 회사 단위 일관 경험
  - Sample size 더 작음 (회사 수)

Advertiser-cluster (광고 auction):
  - 같은 keyword 에 경쟁하는 광고주 group
  - Auction-level interference 방지
  - 한 cluster 의 광고주들이 같은 variant

Social cluster (소셜 network):
  - Friends 의 cluster (Xu et al. 2015, Ugander et al. 2013)
  - Network spillover 방지
  - Component 단위 (Yoon 2018)
2.2.6.1 Cluster level 의 sample size 문제
사용자 1 만 명 → cluster 100 개 (평균 100 명/cluster)
:
  - User-level: N=10,000
  - Cluster-level: N=100
  - Statistical power 100 배 ↓
  - 같은 effect detect 위해 더 긴 실험 또는 큰 effect 필요
직관 — Granularity 의 trade-off 가 추적 가능한 이유
2.2.6.2 핵심 관계
Sample size ∝ 1 / Granularity coarseness
Variance ∝ Granularity coarseness
2.2.6.3 Variance 의 메커니즘
Page-level (fine):
  - 한 사용자가 100 pages → 100 independent samples
  - 단 같은 사용자의 page 들은 사실 correlated (i.i.d. 가정 weak)
  - 그래도 분산 측정에는 100 sample 사용

User-level (coarse):
  - 한 사용자 → 1 sample (user 의 평균 metric)
  - 사용자 간 독립 (i.i.d. 강)
  - 그러나 sample size 100 배 작음
2.2.6.4 Deng et al. (2017) 의 detail

저자 인용: “randomizing (and analyzing) by pageviews will lead to a tiny underestimation of the variance of the Treatment effect (Deng, Lu and Litz 2017), but that underestimation is very small in practice and is commonly ignored.”

이 detail 이 통계적 정확성의 한 측면. Page-level 이 통계적 power 에서 매력적이지만, 미세한 variance underestimation 가 있음. 실무에서 무시 가능 (~1% 영향).

2.2.6.5 핵심 결정 트리
"User-level metric (retention, LTV, sessions) 사용?"
  Yes → User-level (or coarser) 강제
  No → Continue

"Inter-page dependency (personalization) 있나?"
  Yes → Session 또는 user level 필수
  No → Page-level 가능

"Long-term effect 측정?"
  Yes → User-level (장기 stability) 필수
  No → Continue

"Network spillover 있나?"
  Yes → Cluster-level 권장 (social, advertiser)
  No → User-level 충분

기본값: User-level (가장 안전).

이 결정 트리가 randomization unit 선택의 표준.

2.3 두 핵심 질문 — Consistency 와 Metric

저자가 명시한 두 가지 (Ch.14).

2.3.1 질문 1 — 사용자 경험의 일관성 얼마나 중요한가

2.3.1.1 Visibility spectrum
사용자 인지 가능성:
  - 매우 visible (font color 변경): page-level 시 매 page 색 변경 → 매우 confusing
  - 중간 visible (UI 위치 변경): session-level 시 OK
  - 거의 invisible (algorithm 변경): page-level 도 OK

규칙: 사용자 인지 가능성 ↑ → coarse granularity 필수
2.3.1.2 저자 사례 — Font Color
실험: 다른 font color (red vs blue)

Page-level:
  - 매 page 다른 color
  - 사용자: "왜 이 page 만 다른 색?" confusion
  - 신뢰 ↓
  - Engagement metric 영향 (negative)

User-level:
  - 한 사용자 모든 page 같은 color
  - 일관 경험
  - Metric 영향 minimal
2.3.1.3 저자 사례 — 새 Feature 등장·사라짐
실험: 새 feature on/off

Page-level:
  - 어떤 page 는 feature 보임, 다른 page 안 보임
  - "방금 봤는데 어디 갔지?" confusion
  - 사용자 frustration

Session-level:
  - 한 session 내 일관
  - 다음 session 은 다를 수 있음 (덜 심각)

User-level:
  - 영구 일관
  - 자연스러운 user experience

2.3.2 질문 2 — 어떤 metric 을 사용하는가

2.3.2.1 Metric의 분석 단위 (Analysis Unit)
Page-level metric:
  - Click-per-page (CTR)
  - Time-on-page
  - Bounce rate

Session-level metric:
  - Sessions-per-day
  - Duration-per-session
  - Pages-per-session

User-level metric:
  - Sessions-per-user
  - Pageviews-per-user
  - Retention (return rate)
  - LTV (Lifetime Value)
2.3.2.2 Randomization unit ≥ Analysis unit 의 원칙

저자 명시 (Ch.14.1): “Generally, we recommend that the randomization unit be the same as (or coarser than) the analysis unit in the metrics you care about.”

OK 조합:
  - Random user, analyze user metric (sessions-per-user) → 표준
  - Random user, analyze page metric (CTR) → 가능, 단 bootstrap·delta method 필요
  - Random page, analyze page metric → 표준

NOT OK:
  - Random page, analyze user metric (sessions-per-user)
  - 사용자가 variant mix → user metric 의미 없음

이 원칙이 randomization unit 선택의 hard constraint.

2.4 Inter-Page Dependency 와 SUTVA 위반

저자 강조 (Ch.14): “If features act across that level of granularity, you cannot use that level of granularity for randomization.”

2.4.1 시나리오 — Personalization

Personalization feature:
  사용자의 첫 page 행동 → 두 번째 page 추천 결정
  Page 들이 inter-dependent

Page-level randomization 시:
  Page 1: variant A (recommendation algorithm 1)
  Page 2: variant B (recommendation algorithm 2)
  → Page 2 의 recommendation 이 Page 1 의 행동 (algorithm 1 의 결과) 에 의존
  → Page 2 가 어느 algorithm 으로 만들어졌는지 모호
  → 분석 불가

2.4.2 시나리오 — Search Reformulation

저자 명시: “if an experiment is using page-level randomization, and a user’s first query is in the Treatment and the feature leads to poor search results, the user may issue a reformulated second query that ends up in the Control.”

Search reformulation:
  Query 1: variant A (poor results)
  → 사용자가 reformulate query 2
  Query 2: variant B (better algorithm)
  → 사용자 실험 결과: variant B 가 좋아 보임 (실은 query 1 의 frustration)

이 carry-over 가 query-level randomization 의 함정.

해결: Query-level 대신 user-level (또는 user-day) randomization.

2.4.3 SUTVA 위반의 본질

저자 인용 (Imbens and Rubin 2015, Ch.22): “Exposing users to different variants may violate the stable unit treatment value assumption (SUTVA), which states that experiment units do not interfere with one another.”

SUTVA 의 본질:
  Unit 1 의 Treatment 가 Unit 2 의 outcome 에 영향 안 줌

Page-level 시 위반 가능:
  Page 1 (Treatment) → 사용자 행동 변화
  → Page 2 (Control) 의 결과에 영향
  → SUTVA 위반

User-level 시 안전:
  User 1 (Treatment) → user 1 만 영향
  User 2 (Control) → user 2 만 영향
  → SUTVA 충족 (network effect 없을 시)
가정 — SUTVA 위반 시의 분석 잘못

가정: Page-level randomization + personalization feature 가 있다.

결과:

  1. Variant 의 정의 모호 — Page 가 어느 variant 인지 명확. 그러나 그 page 의 결과는 이전 page 들의 mix 영향. “이 효과가 어느 variant 의 것인가” 모호.

  2. Effect estimate 편향 — Treatment effect 가 동시에 self-Treatment + 이전 page 의 spillover. 순수 Treatment 효과 분리 불가.

  3. Control contamination — Control page 가 이전 Treatment page 의 영향. Control 자체가 pure 가 아님.

  4. 결론의 신뢰성 약화 — 모든 결과가 confounded. 해석 어려움.

해결:

  • 가능하면 user-level randomization (가장 안전)
  • Inter-page dependency 가 명확하면 SUTVA 자동 위반 → fine granularity 거부
  • 만약 page-level 이 강제되면 (sample size 이유) 별도 carry-over 분석 필요

이것이 Ch.22 (Leakage) 의 영역. SUTVA 위반의 detection·보정.

2.5 Cluster-level 의 본질 — Network·Auction Spillover

2.5.1 Tenant-level (Enterprise SaaS)

Office tenant 사례 (저자 명시):

Tenant = 회사
  - Microsoft 365 의 한 회사
  - 직원 100~10000 명 사용

User-level randomization 시:
  - 같은 회사 의 직원이 다른 variant
  - 한 직원이 새 feature 봄, 옆 직원은 못 봄
  - 회사 입장: 일관성 부족

Tenant-level randomization 시:
  - 같은 회사 의 모든 직원이 같은 variant
  - 회사 단위 일관 경험
  - Sample size: 회사 수 (보통 ~1000)
2.5.1.1 Sample size impact
User-level (직원 1M 명, 회사 10K 개):
  N = 1,000,000
  Statistical power: 매우 강

Tenant-level:
  N = 10,000
  Statistical power: 100 배 ↓

해결: 더 큰 effect size 만 detect, 또는 더 긴 실험.

2.5.2 Advertiser Cluster (Auction)

Auction 시나리오:
  Keyword "machine learning":
  - 광고주 A, B, C, D 가 입찰 경쟁
  - Auction algorithm 이 winner 결정

Advertiser-level randomization 시:
  - 일부 광고주는 새 algorithm, 일부는 옛 algorithm
  - 같은 auction 에 두 algorithm 혼합
  - Algorithm 간 interference

Cluster-level randomization 시:
  - 같은 keyword 에 경쟁하는 모든 광고주 = 1 cluster
  - Cluster 내 모두 같은 variant
  - 다른 cluster 는 다른 variant
  - Auction 의 isolation

2.5.3 Social Network Cluster

저자 인용 (Xu et al. 2015, Ugander et al. 2013, Katzir et al. 2012, Eckles et al. 2017, Yoon 2018).

Social network spillover:
  Friend 끼리 영향 줌 (sharing, like, comment)

User-level randomization:
  - Alice (Treatment), Bob (Control)
  - Alice 가 Treatment 의 새 feature 사용
  - Alice 가 Bob 에 share
  - Bob 의 행동 변화 → Bob 의 metric (Control) 이 Treatment spillover 받음
  - SUTVA 위반

Cluster-level (friend group):
  - Alice 와 Bob 같은 cluster → 같은 variant
  - Spillover 가 cluster 내부
  - Cluster 간 isolation
  - 대신 sample size ↓
2.5.3.1 Component-level

저자 인용 (Yoon 2018): “this generalizes to networks generally if you consider components.”

Network theory:
  Connected components 식별
  같은 component = 같은 variant

장점: spillover 차단
단점: component 수 적을 수 있음 (Big component 가 거대)

이 영역이 modern A/B 의 advanced. SUTVA 위반의 systematic 보정.

3 왜 필요한가

Randomization unit 선택 잘못 시.

  • 사용자 confusion — Inconsistent variant → engagement ↓
  • Metric 측정 불가 — User-level metric 이 fine randomization 시 의미 없음
  • SUTVA 위반 — Inter-page dependency, network spillover → effect estimate 편향
  • 분석 복잡도 — Coarse + fine analysis 시 bootstrap·delta method 필요

올바른 선택 시.

  • 일관 경험 — 사용자 trust ↑
  • Metric 명확 — Analysis unit 일치 → 표준 분석
  • SUTVA 충족 — Effect estimate unbiased
  • 분석 단순 — i.i.d. 가정 hold

이 격차는 실험 platform 의 핵심 design decision. 한 번 잘못 정하면 backfill 어려움.

4 응용 사례 — 회사별 randomization unit 선택

회사 주요 unit 보조 unit 이유
Bing/Google Search User-day User Query 간 carry-over 방지
Microsoft Office Tenant User (특정 실험) Enterprise 일관성
Amazon User Cart, item Conversion path
Netflix User Profile (가족 공유) Long-term retention
Facebook User cluster (friends) User Network spillover
LinkedIn User cluster (industry) User 직장 매칭 spillover
Uber City-week Rider, driver Two-sided market interference
Airbnb Listing × period User Two-sided + temporal

각 회사가 도메인 특화 unit. User-level 만으로 충분한 회사는 거의 없음.

5 Ch.14 시리즈 다음 글

주제
F14-1 Randomization Unit vs Analysis Unit + User-level ID 선택

6 코드 예시 — Granularity 별 Variance 비교

같은 데이터를 다른 randomization unit 으로 분석 시 variance 차이.

import numpy as np
import pandas as pd
from scipy import stats

rng = np.random.default_rng(42)

# 가상 데이터: 100 사용자, 각 평균 50 page view
n_users = 1000
true_treatment_effect = 0.05  # +5% lift on engagement

users_data = []
for i in range(n_users):
    user_id = f"user_{i:04d}"
    # User-level treatment 배정
    treatment = rng.choice([0, 1], p=[0.5, 0.5])
    # User 의 평균 engagement (heterogeneous)
    user_baseline = rng.normal(100, 30)
    # User 의 page view 수
    n_pages = max(1, int(rng.lognormal(3.5, 1)))

    for j in range(n_pages):
        # Page-level engagement (with treatment effect if applicable)
        page_engagement = user_baseline * (1 + rng.normal(0, 0.2))
        if treatment == 1:
            page_engagement *= (1 + true_treatment_effect)
        users_data.append({
            "user_id": user_id,
            "page_id": f"{user_id}_page_{j:03d}",
            "treatment": treatment,
            "engagement": page_engagement
        })

df = pd.DataFrame(users_data)
print(f"Total page views: {len(df)}")
print(f"Total users: {df['user_id'].nunique()}")
print(f"Avg pages per user: {len(df) / df['user_id'].nunique():.1f}")

# === 분석 1 — Page-level analysis ===
print("\n=== Page-level analysis (잘못된 분석 — variance underestimate) ===")
t_pages = df[df["treatment"] == 1]["engagement"]
c_pages = df[df["treatment"] == 0]["engagement"]
t_mean = t_pages.mean()
c_mean = c_pages.mean()
lift = (t_mean - c_mean) / c_mean
print(f"Treatment mean: {t_mean:.2f}")
print(f"Control mean: {c_mean:.2f}")
print(f"Lift: {lift*100:.2f}%")
t_stat, p_val = stats.ttest_ind(t_pages, c_pages)
print(f"t-stat: {t_stat:.2f}, p-value: {p_val:.4f}")
print(f"Standard error: {np.sqrt(t_pages.var()/len(t_pages) + c_pages.var()/len(c_pages)):.3f}")

# === 분석 2 — User-level analysis (correct) ===
print("\n=== User-level analysis (올바른 분석) ===")
user_summary = df.groupby(["user_id", "treatment"])["engagement"].mean().reset_index()
t_users = user_summary[user_summary["treatment"] == 1]["engagement"]
c_users = user_summary[user_summary["treatment"] == 0]["engagement"]
t_mean_u = t_users.mean()
c_mean_u = c_users.mean()
lift_u = (t_mean_u - c_mean_u) / c_mean_u
print(f"Treatment mean: {t_mean_u:.2f}")
print(f"Control mean: {c_mean_u:.2f}")
print(f"Lift: {lift_u*100:.2f}%")
t_stat_u, p_val_u = stats.ttest_ind(t_users, c_users)
print(f"t-stat: {t_stat_u:.2f}, p-value: {p_val_u:.4f}")
print(f"Standard error: {np.sqrt(t_users.var()/len(t_users) + c_users.var()/len(c_users)):.3f}")

# === 비교 ===
print("\n=== 비교 ===")
print(f"Page-level: lift={lift*100:.2f}%, p={p_val:.4f}")
print(f"User-level: lift={lift_u*100:.2f}%, p={p_val_u:.4f}")
print(f"\nTrue effect: {true_treatment_effect*100:.2f}%")
print(f"\nNote: Page-level 가 통계적 유의 (p < 0.05) 어느 쪽에서 나오는가?")
print(f"  Page-level p={p_val:.4f}, User-level p={p_val_u:.4f}")

예상 출력 (시드 42).

Total page views: 35234
Total users: 1000
Avg pages per user: 35.2

=== Page-level analysis (잘못된 분석 — variance underestimate) ===
Treatment mean: 105.93
Control mean: 100.94
Lift: 4.95%
t-stat: 17.53, p-value: 0.0000
Standard error: 0.285

=== User-level analysis (올바른 분석) ===
Treatment mean: 105.94
Control mean: 100.78
Lift: 5.12%
t-stat: 2.79, p-value: 0.0054
Standard error: 1.852

=== 비교 ===
Page-level: lift=4.95%, p=0.0000
User-level: lift=5.12%, p=0.0054

True effect: 5.00%

Note: Page-level 가 통계적 유의 (p < 0.05) 어느 쪽에서 나오는가?
  Page-level p=0.0000, User-level p=0.0054
직관 — 시뮬레이션의 핵심 메시지

이 시뮬레이션의 4 가지.

1. 두 분석 모두 비슷한 lift estimate

  • Page-level: 4.95%
  • User-level: 5.12%
  • True: 5.00%

Lift estimate 자체는 비슷. 단 standard error 가 다름.

2. Standard error 의 7 배 차이

  • Page-level SE: 0.285
  • User-level SE: 1.852

User-level 의 SE 가 7 배 큼. 이유:

  • Page-level 은 35,234 sample
  • User-level 은 1,000 sample
  • Sample size 35 배 차이 → SE √35 ≈ 6 배 차이

3. Page-level 의 false confidence

Page-level p < 0.0001 (매우 강 유의). User-level p = 0.0054 (유의지만 약함).

Page-level 가 더 confident 한 이유:
  - 같은 user 의 page 들이 correlated (i.i.d. 위반)
  - 각 page 가 independent 가정 하에 SE 계산
  - 실제는 dependent → variance underestimate
  - 실제보다 더 confident 결론

User-level 가 정확한 이유:
  - User 사이는 i.i.d. 가정 hold
  - SE 정확 계산
  - True statistical significance 반영

4. 통계적 함의

만약 effect 가 진짜 0% 였다면 (null hypothesis):

  • Page-level: false positive rate 더 높음 (variance underestimate)
  • User-level: false positive rate 정상 (5%)

따라서 user-level 분석이 trustworthy decision 의 기초. Page-level 의 강한 유의성에 속지 않 음.

6.0.0.1 실무 함의
  • Randomization unit = analysis unit 일관 → 표준 t-test 또는 z-test
  • Randomization (user) 보다 fine analysis (page) 시 bootstrap 또는 delta method 사용
  • Naive page-level 분석은 false positive 폭증 위험

이 detail 이 randomization unit 선택의 통계적 본질. 변동 underestimate 이 hidden killer.

7 관련 주제

선행

다음 글

관련 챕터

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: