# [[Seams (μ΄μŒμƒˆ)]] ## πŸ“Œ Brief Summary Seams(μ΄μŒμƒˆ ν˜Ήμ€ 접점)λŠ” μ†ŒμŠ€ μ½”λ“œλ₯Ό 직접 νŽΈμ§‘ν•˜μ§€ μ•Šκ³ λ„ ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ„ λ³€κ²½ν•  수 μžˆλŠ” 지점을 μ˜λ―Έν•œλ‹€ [1-3]. μ΄λŠ” 마이클 νŽ˜λ”μŠ€(Michael Feathers)κ°€ λ ˆκ±°μ‹œ μ½”λ“œμ— ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•΄ κΉŒλ‹€λ‘œμš΄ μ˜μ‘΄μ„±μ„ λŠμ–΄λ‚΄λŠ” λ°©λ²•μœΌλ‘œ λ„μž…ν•œ 핡심 κ°œλ…μ΄λ‹€ [1, 3]. ν”„λ‘œκ·Έλž˜λ° 언어와 λΉŒλ“œ 단계에 따라 객체 μ΄μŒμƒˆ, μ „μ²˜λ¦¬ μ΄μŒμƒˆ, 링크 μ΄μŒμƒˆ λ“±μœΌλ‘œ λ‚˜λ‰˜λ©°, 각 μ΄μŒμƒˆλŠ” λ™μž‘μ˜ 변경을 κ²°μ •ν•˜λŠ” 'ν™œμ„±ν™” 지점(Enabling Point)'을 λ™λ°˜ν•œλ‹€ [4, 5]. ## πŸ“– Core Content * **κ°œλ…μ  λ°°κ²½ 및 λͺ©μ :** λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό μ•ˆμ „ν•˜κ²Œ λ³€κ²½ν•˜λ €λ©΄ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜μ§€λ§Œ, κΈ°μ‘΄ μ½”λ“œμ—λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ μ„œλ“œνŒŒν‹° μ„œλ²„ λ“± ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μš΄ μ˜μ‘΄μ„±μ΄ μ–½ν˜€ μžˆλŠ” κ²½μš°κ°€ λ§Žλ‹€ [1, 3, 6]. μ΄μŒμƒˆλŠ” μ½”λ“œλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μ΄λŸ¬ν•œ μ˜μ‘΄μ„±μ„ λΆ„λ¦¬ν•˜κ±°λ‚˜ μ½”λ“œ λ‚΄λΆ€ μƒνƒœλ₯Ό 감지(sense)ν•  수 있게 ν•΄μ£ΌλŠ” ꡬ쑰적 지점이닀 [1, 7]. * **ν™œμ„±ν™” 지점 (Enabling Point):** λͺ¨λ“  μ΄μŒμƒˆλŠ” ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘ 방식을 선택할 수 μžˆλŠ” 'ν™œμ„±ν™” 지점'을 κ°–λŠ”λ‹€ [5]. μ†ŒμŠ€ μ½”λ“œλŠ” ν”„λ‘œλ•μ…˜κ³Ό ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ λ™μΌν•˜κ²Œ μœ μ§€ν•˜λ˜, 이 ν™œμ„±ν™” 지점(예: μ „μ²˜λ¦¬κΈ° 맀크둜 μ •μ˜, 클래슀패슀, 객체 생성 μ‹œμ  λ“±)을 톡해 ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œλ§Œ λ‹€λ₯Έ λ™μž‘μ„ μ£Όμž…ν•  수 μžˆλ‹€ [5, 8, 9]. * **μ΄μŒμƒˆμ˜ μ’…λ₯˜:** μ†ŒμŠ€ μ½”λ“œκ°€ μ‹€ν–‰ κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨μœΌλ‘œ λ³€ν™˜λ˜λŠ” 각 λ‹¨κ³„μ—μ„œ λ‹€μ–‘ν•œ μ΄μŒμƒˆκ°€ λ°œμƒν•œλ‹€ [4]. * **객체 μ΄μŒμƒˆ (Object Seams):** 객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œ κ°€μž₯ 널리 쓰이고 μœ μš©ν•œ μ΄μŒμƒˆλ‹€ [10]. λ©”μ„œλ“œ 호좜 μ‹œ λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜μ—¬ μ‹€μ œ 객체 λŒ€μ‹  κ°€μ§œ 객체(Mock)λ‚˜ ν•˜μœ„ 클래슀λ₯Ό μ£Όμž…ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘μ„ λ³€κ²½ν•œλ‹€ [3, 11]. * **μ „μ²˜λ¦¬ μ΄μŒμƒˆ (Preprocessing Seams):** Cλ‚˜ C++와 같은 μ–Έμ–΄μ—μ„œ μ œκ³΅ν•˜λŠ” 맀크둜 μ „μ²˜λ¦¬κΈ°λ₯Ό ν™œμš©ν•˜λŠ” 방식이닀 [12, 13]. 컴파일 이전 λ‹¨κ³„μ—μ„œ νŠΉμ • ν•¨μˆ˜ 호좜 등을 ν…ŒμŠ€νŠΈμš© 맀크둜둜 μΉ˜ν™˜ν•˜μ—¬ μ˜μ‘΄μ„±μ„ λ°°μ œν•œλ‹€ [14]. * **링크 μ΄μŒμƒˆ (Link Seams):** 컴파일 이후 링컀(Linker)κ°€ 쀑간 ν‘œν˜„μ„ κ²°ν•©ν•˜λŠ” λ‹¨κ³„λ‚˜ μžλ°”(Java)의 클래슀패슀(Classpath)λ₯Ό ν™œμš©ν•˜λŠ” 방식이닀 [8, 15]. ν”„λ‘œλ•μ…˜μš© 라이브러리 λŒ€μ‹  ν…ŒμŠ€νŠΈμš©(Stub) 라이브러리λ₯Ό μ—°κ²°ν•˜μ—¬ μ™ΈλΆ€ μ˜μ‘΄μ„±μ˜ 싀행을 λŒ€μ²΄ν•œλ‹€ [16, 17]. ## βš–οΈ Trade-offs & Caveats * **μœ μ§€λ³΄μˆ˜ 및 λͺ…μ‹œμ„± 문제:** μ „μ²˜λ¦¬ μ΄μŒμƒˆλ‚˜ 링크 μ΄μŒμƒˆλŠ” 객체 μ΄μŒμƒˆμ— λΉ„ν•΄ λͺ…μ‹œμ μ΄μ§€ μ•Šμ•„ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€ 수 μžˆλ‹€ [18]. λ”°λΌμ„œ 객체 μ§€ν–₯ μ–Έμ–΄μ—μ„œλŠ” 객체 μ΄μŒμƒˆλ₯Ό μ΅œμš°μ„ μœΌλ‘œ μ‚¬μš©ν•˜κ³ , μ „μ²˜λ¦¬ 및 링크 μ΄μŒμƒˆλŠ” μ˜μ‘΄μ„±μ΄ μ½”λ“œ μ „λ°˜μ— 퍼져 μžˆμ–΄ λ‹€λ₯Έ λŒ€μ•ˆμ΄ 없을 λ•Œλ§Œ μ œν•œμ μœΌλ‘œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ [18]. * **μ½”λ“œ 가독성 μ €ν•˜:** C/C++μ—μ„œ μ „μ²˜λ¦¬ μ΄μŒμƒˆλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 쑰건뢀 컴파일 μ§€μ‹œμž(`#ifdef`, `#ifndef` λ“±)λ₯Ό λ‚¨μš©ν•˜λ©΄, ν•˜λ‚˜μ˜ μ†ŒμŠ€ νŒŒμΌμ— μ—¬λŸ¬ λ²„μ „μ˜ ν”„λ‘œκ·Έλž¨μ΄ μ„žμ΄κ²Œ λ˜μ–΄ μ½”λ“œμ˜ λͺ…ν™•μ„±(clarity)이 μ‹¬κ°ν•˜κ²Œ λ–¨μ–΄μ§€λ©° μˆ¨κ²¨μ§„ 버그λ₯Ό μœ λ°œν•  수 μžˆλ‹€ [19]. * **ν…ŒμŠ€νŠΈ ν™˜κ²½ κ΅¬μ„±μ˜ ν˜Όλž€:** 링크 μ΄μŒμƒˆλ₯Ό μ‚¬μš©ν•  경우 컴파일러 μ™ΈλΆ€μ˜ λΉŒλ“œ μŠ€ν¬λ¦½νŠΈλ‚˜ 경둜 섀정에 μ˜μ‘΄ν•˜κ²Œ λ˜λ―€λ‘œ 적용 μ—¬λΆ€λ₯Ό λˆˆμΉ˜μ±„κΈ° μ–΄λ €μšΈ 수 μžˆλ‹€ [10]. ν…ŒμŠ€νŠΈ ν™˜κ²½κ³Ό ν”„λ‘œλ•μ…˜ ν™˜κ²½ κ°„μ˜ 차이가 λͺ…λ°±ν•˜κ²Œ λ“œλŸ¬λ‚˜λ„λ‘ κ΄€λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ ν”„λ‘œλ•μ…˜ λΉŒλ“œ μ‹œ 예기치 μ•Šμ€ 였λ₯˜κ°€ λ°œμƒν•  μœ„ν—˜μ΄ μžˆλ‹€ [10]. --- *Last updated: 2026-05-03*