본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 10: λ™μž‘ν•˜λŠ” 골격

πŸ“š 골격 μ‚¬μš© 쀀비​

  • λ™μž‘ν•˜λŠ” 골격의 핡심은 λŒ€λž΅μ μΈ μ‹œμŠ€ν…œ ꡬ쑰λ₯Ό μ œμ•ˆν•˜κ³  κ·Έκ²ƒμ˜ μœ νš¨μ„±μ„ 검증할 수 μžˆμ„ μ •λ„λ‘œ μš”κ΅¬ 사항을 μ΄ν•΄ν•˜λŠ” 데 μ΄λ°”μ§€ν•˜λŠ” 것이닀.

πŸ“š 졜초 ν…ŒμŠ€νŠΈβ€‹

  • λ™μž‘ν•˜λŠ” 골격은 λ°˜λ“œμ‹œ 경맀 μŠ€λ‚˜μ΄νΌ μ‹œμŠ€ν…œμ˜ λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ, 즉 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€, μŠ€λ‚˜μ΄νΌ μ»΄ν¬λ„ŒνŠΈ, 경맀 μ„œλ²„μ™€μ˜ 톡신 등을 포괄해야 ν•œλ‹€.
  • μš°λ¦¬λŠ” κ΅¬ν˜„μ΄ 이미 μ‘΄μž¬ν•˜λŠ” κ²ƒμ²˜λŸΌ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•œ λ‹€μŒ ν•΄λ‹Ή κ΅¬ν˜„μ΄ λ™μž‘ν•˜λŠ” 데 ν•„μš”ν•œ 것을 μ±„μ›Œλ‚˜κ°€λŠ” μ‹μœΌλ‘œ μ‹œμž‘ν•˜λŠ” 방식을 μ„ ν˜Έν•œλ‹€. (희망적 관츑에 μ˜ν•œ ν”„λ‘œκ·Έλž˜λ°) ν…ŒμŠ€νŠΈλ₯Ό 가지고 μ—­μœΌλ‘œ μž‘μ—…ν•˜λ©΄ μ‹œμŠ€ν…œμ„ μ–΄λ–»κ²Œ λ™μž‘ν•˜κ²Œ λ§Œλ“€μ§€μ— κ΄€λ ¨ν•œ λ³΅μž‘ν•¨ λ•Œλ¬Έμ— 발λͺ©μ΄ μž‘νžˆλŠ” λŒ€μ‹  μ‹œμŠ€ν…œμ΄ ν•΄μ•Ό ν•  일에 μ§‘μ€‘ν•˜λŠ” 데 도움이 λœλ‹€.
public class AuctionSniperEndToEndTest {
private final FakeAuctionServer auction = new FakeAuctionServer("item-54321");
private final ApplicationRunner application = new ApplicationRunner();

@Test public void sniperJoinsAuctionUntilAuctionCloses() throws Exception {
auction.startSellingItem(); // 1. κ²½λ§€μ—μ„œ ν’ˆλͺ©μ„ 판맀
application.startBiddingIn(auction); // 2. 경맀 μŠ€λ‚˜μ΄νΌκ°€ ν•΄μ•‹ κ²½λ§€μ—μ„œ μž…μ°°μ„ μ‹œμž‘ν•˜λ©΄
auction.hasReceivedJoinRequestFromSniper(); // 3. κ²½λ§€μ—μ„œλŠ” 경맀 μŠ€λ‚˜μ΄νΌλ‘œλΆ€ν„° Join μš”μ²­μ„ 받을 것이닀.
auction.announceClosed(); // 4. 경맀가 Close됐닀고 μ„ μ–Έν•˜λ©΄
application.showsSniperHasLostAuction(); // 5. 경맀 μŠ€λ‚˜μ΄νΌλŠ” κ²½λ§€μ—μ„œ λ‚™μ°°ν•΄ μ‹€νŒ¨ν–ˆμŒμ„ 보여쀄 것이닀.
}
}
  • μ–΄λ–€ λ©”μ„œλ“œκ°€ 이벀트λ₯Ό λ°œμƒμ‹œμΌœ ν…ŒμŠ€νŠΈλ₯Ό μ΄λˆλ‹€λ©΄ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ 이름은 startBiddingIn() 같은 λͺ…λ Ή(command)이 될 것이닀.
  • 반면 μ–΄λ–€ λ©”μ„œλ“œμ—μ„œ μ–΄λ–€ 일이 μΌμ–΄λ‚˜μ•Ό ν•œλ‹€κ³  단정(assert)ν•œλ‹€λ©΄ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ 이름은 μ„œμˆ ν˜•(μ§€μ‹œμ μΈ ν˜•νƒœ)이 될 것이닀. 예λ₯Ό λ“€μ–΄ showsSniperHasLostAuction() λ©”μ„œλ“œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 경맀 μƒνƒœλ₯Ό λ‚™μ°° μ‹€νŒ¨λ‘œ 보여주지 μ•ŠλŠ”λ‹€λ©΄ μ˜ˆμ™Έλ₯Ό 던질 것이닀.

πŸ“š λͺ‡ 가지 초기 선택​

  • 이제 ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
  • μ—¬κΈ°μ„œλŠ” μš°μ„  XMPP λ©”μ‹œμ§€ 브둜컀, XMPPλ₯Ό 톡해 톡신할 수 μžˆλŠ” μŠ€ν… 경맀, GUI ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬, 닀쀑 μŠ€λ ˆλ“œλ₯Ό μ§€μ›ν•˜κ³  비동기적인 μ•„ν‚€ν…μ²˜μ—μ„œ ν™œμš©κ°€λŠ₯ν•œ ν…ŒμŠ€νŠΈ 섀비인데, 이 λ„€ 가지 ꡬ성 μš”μ†Œλ₯Ό μ°Ύμ•„λ³΄κ±°λ‚˜ 직접 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
  • μžλ™ν™”λœ λΉŒλ“œ, 배포, ν…ŒμŠ€νŠΈ ν”„λ‘œμ„ΈμŠ€μ™€ ν•¨κ»˜ 버전 κ΄€λ¦¬ν•˜μ— ν”„λ‘œμ νŠΈλ₯Ό 진행해야 ν•œλ‹€.
  • μ΄λ ‡κ²Œ 처음으둜 μž‘μ„±ν•  μ „ ꡬ간 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ‹€ 보면 νŒ¨ν‚€μ§€ν™”μ™€ 배포 같은 ꡬ쑰적인 츑면에 κ΄€ν•œ μ˜μ‚¬ 결정을 λ‚΄λ €μ•Ό ν•  것이닀.

🎈 μ „ ꡬ간 ν…ŒμŠ€νŠΈβ€‹

  • μ „ ꡬ간 ν…ŒμŠ€νŠΈμ—μ„œλŠ” λŒ€μƒ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€λ₯Ό λ“€μ—¬λ‹€λ³Ό 수 μ—†μœΌλ©°, λ”°λΌμ„œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€κ°€ λ°”λ€Œκ±°λ‚˜ λ‘œκ·Έκ°€ λ‚¨λŠ” κ²ƒμ²˜λŸΌ μ–΄λ–€ κ°€μ‹œμ μΈ 효과λ₯Ό 감지할 λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Όλ§Œ ν•œλ‹€.

🎈 μ‹œμž‘ 쀀비​

  • μ—¬κΈ°μ„œ 첫 ν…ŒμŠ€νŠΈλŠ” μ‹€μ œλ‘œ μ „ ꡬ간을 λŒ€μƒμœΌλ‘œ ν•˜μ§€ μ•ŠλŠ”λ‹€. 이 ν…ŒμŠ€νŠΈμ—λŠ” μ‹€μ œ 경맀 μ„œλΉ„μŠ€κ°€ 포함돼 μžˆμ§€ μ•Šλ‹€. κ·Έ μ΄μœ λŠ” μ‹€μ œ 경맀 μ„œλΉ„μŠ€λ₯Ό λ§ˆλ ¨ν•˜κΈ° 쉽지 μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.
  • ν…ŒμŠ€νŠΈ 주도 개발 κΈ°μˆ μ—μ„œ μ€‘μš”ν•œ 뢀뢄은 ν…ŒμŠ€νŠΈ λŒ€μƒμ„ μ–΄λ””κΉŒμ§€ 바라봐야 ν•˜κ³ , κ²°κ΅­ μ–΄λ–»κ²Œ λͺ¨λ“  뢀뢄을 ν…ŒμŠ€νŠΈν• μ§€ νŒλ‹¨ν•˜λŠ” 것이닀.
  • 차이λ₯Ό 일찍 νŒŒμ•…ν• μˆ˜λ‘ μ˜€ν•΄μ— κΈ°μ΄ˆν•œ μ½”λ“œμ–‘μ€ 쀄고 뢈일치λ₯Ό κ³ μΉ  μ‹œκ°„μ€ λŠ˜μ–΄λ‚  것이닀.