[[TableOfContents]] * [https://sites.google.com/site/xperdokdo/ xper dokdo]ì°¸ê³ == 들어가며 == * p.44 * 스프ë§ì„ 사용하는 개발ìžë“¤ì€ ìžì—°ìŠ¤ëŸ½ê²Œ ìžë°”와 엔터프ë¼ì´ì¦ˆ ê°œë°œì˜ ê¸°ë³¸ì— ì¶©ì‹¤í•œ ë² ìŠ¤íŠ¸ 프랙티스를 ì ìš©í• ìˆ˜ ìžˆê³ , ì´ìƒì ì¸ ê°œë°œ ì² í•™ê³¼ í”„ë¡œê·¸ëž˜ë° ëª¨ë¸ì„ ì´í•´í•˜ê²Œ ë˜ê³ , ì¢‹ì€ ê°œë°œ ìŠµê´€ì„ ì²´ë“하게 ëœë‹¤. * 스프ë§ì„ 사용하는 개발ìžë“¤ì´ 스프ë§ì„ 통해 얻게 ë˜ëŠ” ë‘ ê°€ì§€ 중요한 가치가 있다면 ê·¸ê²ƒì€ '''단순함'''ê³¼ '''ìœ ì—°ì„±'''ì´ë‹¤. == ì´í•´ == === 오브ì 트와 ì˜ì¡´ê´€ê³„ === * p.61 * 잘 ë™ìž‘하는 코드를 êµ³ì´ ìˆ˜ì •í•˜ê³ ê°œì„ í•´ì•¼ 하는 ì´ìœ 는 ë˜ê¹Œ? * ì´ëŸ° ë§ì´ ìƒê°ë‚˜ë„¤ìš” ''컴퓨터가 ì´í•´í• 수 있는 코드는 ì–´ëŠ ë°”ë³´ë‚˜ 다 ìž‘ì„±í• ìˆ˜ 있다. ì¢‹ì€ í”„ë¡œê·¸ëž˜ë¨¸ëŠ” ì‚¬ëžŒì´ ì´í•´í• 수 있는 코드를 ì§ ë‹¤ - 마틴파울러'' - [서지혜] * p.62 * 가장 ì¢‹ì€ ëŒ€ì±…ì€ ë³€í™”ì˜ íì„ ìµœì†Œí•œìœ¼ë¡œ 줄여주는 것ì´ë‹¤. * p.70 * ê·¸ëŸ°ë° ë””ìžì¸ íŒ¨í„´ì€ ì„¤ê³„ ì „ëžµì´ê¸°ë„ 하지만 굉장히 편리한 커뮤니케ì´ì…˜ 수단ì´ê¸°ë„ 하다. * p.73 * ë³€í™”ì˜ ì„±ê²©ì´ ë‹¤ë¥´ë‹¤ëŠ” ê±´ ë³€í™”ì˜ ì´ìœ 와 시기, 주기 ë“±ì´ ë‹¤ë¥´ë‹¤ëŠ” 뜻ì´ë‹¤. === 테스트 === === 템플릿 === * p.211 * 템플릿ì´ëž€ ì´ë ‡ê²Œ 바뀌는 ì„±ì§ˆì´ ë‹¤ë¥¸ 코드 중ì—ì„œ ë³€ê²½ì´ ê±°ì˜ ì¼ì–´ë‚˜ì§€ 않으며 ì¼ì •í•œ 패턴으로 ìœ ì§€ë˜ëŠ” íŠ¹ì„±ì„ ê°€ì§„ ë¶€ë¶„ì„ ìžìœ ë¡ê²Œ 변경ë˜ëŠ” ì„±ì§ˆì„ ê°€ì§„ 부분으로부터 ë…립시켜서 효과ì 으로 í™œìš©í• ìˆ˜ 있ë„ë¡ í•˜ëŠ” 방법ì´ë‹¤. * p.217 * ì´ ë¬¸ì œì˜ í•µì‹¬ì€ ë³€í•˜ì§€ 않는, 그러나 ë§Žì€ ê³³ì—ì„œ 중복ë˜ëŠ” 코드와 ë¡œì§ì— ë”°ë¼ ìžê¾¸ 확장ë˜ê³ ìžì£¼ 변하는 코드를 잘 분리해내는 ìž‘ì—…ì´ë‹¤. * p.223 * ì „ëžµ íŒ¨í„´ì— ë”°ë¥´ë©´ Contextê°€ ì–´ë–¤ ì „ëžµì„ ì‚¬ìš©í•˜ê²Œ í• ê²ƒì¸ê°€ëŠ” Context를 사용하는 ì•žë‹¨ì˜ Clientê°€ ê²°ì •í•˜ëŠ” 게 ì¼ë°˜ì ì´ë‹¤. * Context는 ì „ë‹¬ë°›ì€ ê·¸ Strategy 구현 í´ëž˜ìŠ¤ì˜ 오브ì 트를 사용한다. * p.226 * DIì˜ ê°€ìž¥ 중요한 ê°œë…ì€ ì œ3ìžì˜ ë„ì›€ì„ í†µì• ë‘ ì˜¤ë¸Œì 트 사ì´ì˜ ìœ ì—°í•œ 관계가 ì„¤ì •ë˜ë„ë¡ ë§Œë“ ë‹¤ëŠ” 것ì´ë‹¤. * ì¼ë°˜ì 으로 DI는 ì˜ì¡´ê´€ê³„ì— ìžˆëŠ” ë‘ ê°œì˜ ì˜¤ë¸Œì 트와 ì´ ê°„ê³„ë¥¼ 다ì´ë‚´ë¯¹í•˜ê²Œ ì„¤ì •í•´ì£¼ëŠ” 오브ì 트 íŒ©í† ë¦¬(DI 컨테ì´ë„ˆ), ê·¸ë¦¬ê³ ì´ë¥¼ 사용하는 í´ë¼ì´ì–¸íŠ¸ë¼ëŠ” 4ê°œì˜ ì˜¤ë¸Œì 트 사ì´ì—ì„œ ì¼ì–´ë‚œë‹¤. * p.250 * ê³ ì •ëœ ìž‘ì—… íë¦„ì„ ê°–ê³ ìžˆìœ¼ë©´ì„œ ì—¬ê¸°ì €ê¸°ì„œ ìžì£¼ 반복ë˜ëŠ” 코드가 있다면, 중복ë˜ëŠ” 코드를 ë¶„ë¦¬í• ë°©ë²•ì„ ìƒê°í•´ë³´ëŠ” ìŠµê´€ì„ ê¸°ë¥´ìž. * p.257 * 템플릿과 ì½œë°±ì„ ì°¾ì•„ë‚¼ 때는, 변하는 ì½”ë“œì˜ ê²½ê³„ë¥¼ ì°¾ê³ ê·¸ 경계를 사ì´ì— ë‘ê³ ì£¼ê³ ë°›ëŠ” ì¼ì •í•œ ì •ë³´ê°€ 있는지 확ì¸í•˜ë©´ ëœë‹¤ê³ 했다. * hamcrest.CoreMatchersì— ëŒ€í•´ì„œ : CoreMatcherë¡œ 테스트 코드를 만들 ë•Œ null ê°’ì€ ë¹„êµë‚˜ notì„ ì‚¬ìš©í•˜ëŠ” ê²ƒì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤(ex. assertThat(tempObject, is(null)); -> ì—러). ì´ê±´ nullì´ ê°’ì´ ì•„ë‹ˆê¸° 때문ì¸ë°, CoreMatcherì—ì„œ null ê°’ì„ ì“¸ 때는 org.hamcrest.CoreMatchersì˜ notNullValue()와 nullValue()를 사용하시면 ë˜ê² 습니다. http://jmock.org/javadoc/2.5.1/org/hamcrest/CoreMatchers.html === 예외 === * p.283 * 예외는 처리ë¼ì•¼ 한다. * 예외를 ì²˜ë¦¬í• ë•Œ 반드시 지켜야 í• í•µì‹¬ ì›ì¹™ì€ í•œ 가지다. ëª¨ë“ ì˜ˆì™¸ëŠ” ì ì ˆí•˜ê²Œ 복구ë˜ë“ 지 아니면 ìž‘ì—…ì„ ì¤‘ë‹¨ì‹œí‚¤ê³ ìš´ì˜ìž ë˜ëŠ” 개발ìžì—게 분명하게 통보ë¼ì•¼ 한다. * p.284 * êµ³ì´ ì˜ˆì™¸ë¥¼ ìž¡ì•„ì„œ ë”ê°€ 조치를 ì·¨í• ë°©ë²•ì´ ì—†ë‹¤ë©´ 잡지 ë§ì•„야 한다. * p.290 * 예외를 회피하는 ê²ƒì€ ì˜ˆì™¸ë¥¼ 복구하는 것처럼 ì˜ë„ê°€ 분명해야 한다. * p.317 * ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ ë¡œì§ì„ 담기 위한 예외는 ì²´í¬ ì˜ˆì™¸ë¡œ ë§Œë“ ë‹¤. === 서비스 추ìƒí™” === ==== ì‚¬ìš©ìž ë ˆë²¨ 관리 기능 추가 ==== * p.320 * ì˜ë¯¸ 없는 숫ìžë¥¼ 프로í¼í‹°ì— 사용하면 íƒ€ìž…ì´ ì•ˆì „í•˜ì§€ ì•Šì•„ì„œ ìœ„í—˜í• ìˆ˜ 있다. * p.321 * 그래서 ìˆ«ìž íƒ€ìž…ì„ ì§ì ‘ 사용하는 것보다는 ìžë°” 5 ì´ìƒì—ì„œ ì œê³µí•˜ëŠ” ì´ëŠ„(enum)ì„ ì´ìš©í•˜ëŠ” 게 ì•ˆì „í•˜ê³ íŽ¸í•˜ë‹¤. * p.327 * ë¹ ë¥´ê²Œ 실행 가능한 í¬ê´„ì ì¸ í…ŒìŠ¤íŠ¸ë¥¼ 만들어ë‘ë©´ ì´ë ‡ê²Œ ê¸°ëŠ¥ì˜ ì¶”ê°€ë‚˜ ìˆ˜ì •ì´ ì¼ì–´ë‚ ë•Œ ê·¸ ìœ„ë ¥ì„ ë°œíœ˜í•œë‹¤. * p.329 * 가장 ë§Žì€ ì‹¤ìˆ˜ê°€ ì¼ì–´ë‚˜ëŠ” ê³³ì€ ë°”ë¡œ SQL 문장ì´ë‹¤. * p.330 * ë‘ ë²ˆì§¸ ë°©ë²•ì€ í…ŒìŠ¤íŠ¸ë¥¼ ë³´ê°•í•´ì„œ ì›í•˜ëŠ” ì‚¬ìš©ìž ì™¸ì˜ ì •ë³´ëŠ” 변경ë˜ì§€ 않았ìŒì„ ì§ì ‘ 확ì¸í•˜ëŠ” 것ì´ë‹¤. * ì´ê²ƒë„ 확ì¸í•´ì•¼í•œë‹¤ëŠ” ìƒê°ì„ 미처 못했다. - [김수경] * 테스트를 만들면 작성한 ì½”ë“œì— í™•ì‹ ì„ ê°€ì§ˆ 수 ìžˆê³ ë§ˆìŒì´ 편해지는 ê±´ 사실ì´ì§€ë§Œ, ê·€ì°®ë‹¤ê³ ëŒ€ì¶© 작성한 테스트는 ì˜¤ížˆë ¤ 찾기 íž˜ë“ ë²„ê·¸ì™€ ì‚¬ê³ ì˜ ì›ì¸ì´ ë ìˆ˜ë„ ìžˆìœ¼ë‹ˆ 조심하ìž. * p.331 * DAO는 ë°ì´í„°ë¥¼ 어떻게 ê°€ì ¸ì˜¤ê³ ì¡°ìž‘í• ì§€ë¥¼ 다루는 ê³³ì´ì§€ 비즈니스 ë¡œì§ì„ ë‘는 ê³³ì´ ì•„ë‹ˆë‹¤. * p.332 * ë°ì´í„° 액세스 ë¡œì§ì´ ë°”ë€Œì—ˆë‹¤ê³ ë¹„ì¦ˆë‹ˆìŠ¤ ë¡œì§ ì½”ë“œë¥¼ ìˆ˜ì •í•˜ëŠ” ì¼ì´ 있어서는 안 ëœë‹¤. * p.335 * ì´ ì •ë„ ì½”ë“œë¼ë©´ í•œ 번 살펴보는 것 ë§Œìœ¼ë¡œë„ ì˜¤ë¥˜ê°€ 있는지 쉽게 찾아낼 ìžì‹ ì´ ìžˆëŠ” 개발ìžë„ ìžˆê² ì§€ë§Œ, ì •ë§ ë›°ì–´ë‚œ 개발ìžë¼ë©´ 아무리 간단해 ë³´ì—¬ë„ ì‹¤ìˆ˜í• ìˆ˜ 있ìŒì„ ì•Œê³ ìžˆê¸° ë•Œë¬¸ì— í…ŒìŠ¤íŠ¸ë¥¼ 만들어서 ì§ì ‘ ë™ìž‘하는 ëª¨ìŠµì„ í™•ì¸í•´ë³´ë ¤ê³ í• ê²ƒì´ë‹¤. * ì´ì •ë„~ ë¶€ë¶„ì„ ì½ê³ ìžì‹ 있어한 ë‚´ê°€ 부ë„럽다.. í—ë¦¬ìš°ë“œì— ê°€ì„œ jesus=heaven no jesus=hell íŒë“¤ê³ 행진하는 사람들처럼.. - [서지혜] * p.339 * 코드가 ê¹”ë”í•´ ë³´ì´ì§€ 안는 ì´ìœ 는 ì´ë ‡ê²Œ ì„±ê²©ì´ ë‹¤ë¥¸ 여러 가지 ë¡œì§ì´ í•œë° ì„žì—¬ìžˆê¸° 때문ì´ë‹¤. * p.340 * ê´€ë ¨ì´ ìžˆì–´ ë³´ì´ì§€ë§Œ ì‚¬ì‹¤ì€ ì„±ê²©ì´ ì¡°ê¸ˆì”© 다른 ê²ƒë“¤ì´ ì„žì—¬ 있거나 분리ë˜ì„œ 나타나는 구조다. * ì„±ê²©ì´ ë‹¤ë¥¸ ë‘ ê°€ì§€ 경우가 ëª¨ë‘ í•œ ê³³ì—ì„œ 처리ë˜ëŠ” ê²ƒì€ ë”ê°€ ì´ìƒí•˜ë‹¤. * p.345 * ê°ì²´ì§€í–¥ì ì¸ ì½”ë“œëŠ” 다른 오브ì íŠ¸ì˜ ë°ì´í„°ë¥¼ ê°€ì ¸ì™€ì„œ 작업하는 ëŒ€ì‹ ë°ì´í„°ë¥¼ ê°–ê³ ìžˆëŠ” 다른 오브ì 트ì—게 ìž‘ì—…ì„ í•´ë‹¬ë¼ê³ ìš”ì²í•œë‹¤. 오브ì 트ì—게 ë°ì´í„°ë¥¼ 요구하지 ë§ê³ ìž‘ì—…ì„ ìš”ì²í•˜ë¼ëŠ” ê²ƒì´ ê°ì²´ì§€í–¥ 프로그래ë°ì˜ 가장 ê¸°ë³¸ì´ ë˜ëŠ” ì›ë¦¬ì´ê¸°ë„ 하다. * p.349 * í•œ 가지 변경 ì´ìœ ê°€ ë°œìƒí–ˆì„ ë•Œ 여러 êµ°ë°ë¥¼ ê³ ì¹˜ê²Œ ë§Œë“ ë‹¤ë©´ 중복ì´ë‹¤. ==== 트랜ìžì…˜ 서비스 추ìƒí™” ==== * p.351 * 게다가 í…ŒìŠ¤íŠ¸ì˜ ê¸°ë³¸ì€ ìžë™í™”ëœ í…ŒìŠ¤íŠ¸ì—¬ì•¼ 하니 ì‚¬ëžŒì´ ê°„ì„하는 ê²ƒì€ ì¢‹ì€ ìƒê°ì´ 아니다. * 테스트를 위해 코드를 함부로 건드리는 ê²ƒì€ ì¢‹ì€ ìƒê°ì´ 아니다. * p.355 * 트랜ìžì…˜ì´ëž€ ë” ì´ìƒ 나눌 수 없는 단위 ìž‘ì—…ì„ ë§í•œë‹¤. ìž‘ì—…ì„ ìª¼ê°œì„œ ìž‘ì€ ë‹¨ìœ„ë¡œ 만들 수 없다는 ê²ƒì€ íŠ¸ëžœìžì…˜ì˜ 핵심 ì†ì„±ì¸ ì›ìžì„±ì„ ì˜ë¯¸í•œë‹¤. * ë”°ë¼ì„œ ì¤‘ê°„ì— ì˜ˆì™¸ê°€ ë°œìƒí•´ì„œ ìž‘ì—…ì„ ì™„ë£Œí• ìˆ˜ 없다면 아예 ìž‘ì—…ì´ ì‹œìž‘ë˜ì§€ ì•Šì€ ê²ƒì²˜ëŸ¼ 초기 ìƒíƒœë¡œ ëŒë ¤ë†”야 한다. ì´ê²ƒì´ 바로 트랜ìžì…˜ì´ë‹¤. * 하지만 여러 ê°œì˜ SQLì´ ì‚¬ìš©ë˜ëŠ” ìž‘ì—…ì„ í•˜ë‚˜ì˜ íŠ¸ëžœìžì…˜ìœ¼ë¡œ 취급해야 하는 ê²½ìš°ë„ ìžˆë‹¤. * p.356 * ëª¨ë“ íŠ¸ëžœìžì…˜ì€ 시작하는 지ì ê³¼ ë나는 지ì ì´ ìžˆë‹¤. 시작하는 ë°©ë²•ì€ í•œ 가지ì´ì§€ë§Œ ë나는 ë°©ë²•ì€ ë‘ ê°€ì§€ë‹¤. ëª¨ë“ ìž‘ì—…ì„ ë¬´íš¨í™”í•˜ëŠ” 롤백과 ëª¨ë“ ìž‘ì—…ì„ ë‹¤ í™•ì •í•˜ëŠ” 커밋ì´ë‹¤. * p.362 * 비즈니스 ë¡œì§ì„ ë‹´ê³ ìžˆëŠ” UserService 메소드 안ì—ì„œ 트랜ìžì…˜ì˜ 경계를 ì„¤ì •í•´ ê´€ë¦¬í•˜ë ¤ë©´ 지금까지 ë§Œë“¤ì—ˆë˜ ê¹”ë”하게 ì •ë¦¬ëœ ì½”ë“œë¥¼ í¬ê¸°í•´ì•¼ í• ê¹Œ? 아니면, 트랜ìžì…˜ ê¸°ëŠ¥ì„ í¬ê¸°í•´ì•¼ í• ê¹Œ? ë¬¼ë¡ ë‘˜ 다 아니다. 스프ë§ì€ ì´ ë”œë ˆë§ˆë¥¼ í•´ê²°í• ìˆ˜ 있는 멋진 ë°©ë²•ì„ ì œê³µí•´ì¤€ë‹¤. * p.370 * UserService는 ìžì‹ ì˜ ë¡œì§ì´ 바뀌지 않았ìŒì—ë„ ê¸°ìˆ í™˜ê²½ì— ë”°ë¼ì„œ 코드가 바뀌는 코드가 ë¼ë²„ë¦¬ê³ ë§ì•˜ë‹¤. * p.371 * ì´ë ‡ê²Œ 여러 ê¸°ìˆ ì˜ ì‚¬ìš© ë°©ë²•ì— ê³µí†µì ì´ ìžˆë‹¤ë©´ 추ìƒí™”를 ìƒê°í•´ë³¼ 수 있다. 추ìƒí™”란 하위 ì‹œìŠ¤í…œì˜ ê³µí†µì ì„ ë½‘ì•„ë‚´ì„œ 분리시키는 ê²ƒì„ ë§í•œë‹¤. ê·¸ë ‡ê²Œ 하면 하위 ì‹œìŠ¤í…œì´ ì–´ë–¤ 것ì¸ì§€ 알지 못해ë„, ë˜ëŠ” 하위 ì‹œìŠ¤í…œì´ ë°”ë€Œë”ë¼ë„ ì¼ê´€ëœ 방법으로 ì ‘ê·¼í• ìˆ˜ê°€ 있다. * p.374 * ì–´ë–¤ í´ëž˜ìŠ¤ë“ 스프ë§ì˜ 빈으로 등ë¡í• ë•Œ ë¨¼ì € ê²€í† í•´ì•¼ í• ê²ƒì€ ì‹±ê¸€í†¤ìœ¼ë¡œ ë§Œë“¤ì–´ì ¸ 여러 ìŠ¤ë ˆë“œì—ì„œ ë™ì‹œì— ì‚¬ìš©í•´ë„ ê´œì°®ì€ê°€ 하는 ì ì´ë‹¤. ìƒíƒœë¥¼ ê°–ê³ ìžˆê³ , ë©€í‹°ìŠ¤ë ˆë“œ 환경ì—ì„œ ì•ˆì „í•˜ì§€ ì•Šì€ í´ëž˜ìŠ¤ë¥¼ 빈으로 ë¬´ìž‘ì • 등ë¡í•˜ë©´ 심ê°í•œ ë¬¸ì œê°€ ë°œìƒí•˜ê¸° 때문ì´ë‹¤. ==== 서비스 추ìƒí™”와 ë‹¨ì¼ ì±…ìž„ ì›ì¹™ ==== * p.377 * ì´ë ‡ê²Œ ê¸°ìˆ ê³¼ ì„œë¹„ìŠ¤ì— ëŒ€í•œ 추ìƒí™” ê¸°ë²•ì„ ì´ìš”하면 íŠ¹ì • ê¸°ìˆ í™˜ê²½ì— ì¢…ì†ë˜ì§€ 않는 í¬í„°ë¸”í•œ 코드를 만들 수 있다. * p.379 * ë‹¨ì¼ ì±…ìž„ ì›ì¹™ì€ í•˜ë‚˜ì˜ ëª¨ë“ˆì€ í•œ 가지 ì±…ìž„ì„ ê°€ì ¸ì•¼ 한다는 ì˜ë¯¸ë‹¤. í•˜ë‚˜ì˜ ëª¨ë“ˆì´ ë°”ë€ŒëŠ” ì´ìœ 는 í•œ 가지여야 í•œë‹¤ê³ ì„¤ëª…í• ìˆ˜ë„ ìžˆë‹¤. * ë‹¨ì¼ ì±…ìž„ ì›ì¹™ì„ 잘 ì§€í‚¤ê³ ìžˆë‹¤ë©´, ì–´ë–¤ ë³€ê²½ì´ í•„ìš”í• ë•Œ ìˆ˜ì • 대ìƒì´ 명확해진다. * p.380 * ë§Žì€ ì½”ë“œë¥¼ ìˆ˜ì •í•˜ëŠ” ìž‘ì—…ì—ì„ ê·¸ë§Œí¼ ì‹¤ìˆ˜ê°€ ì¼ì–´ë‚ í™•ë¥ ì´ ë†’ë‹¤. 치명ì ì¸ ë²„ê·¸ê°€ ë„ìž…ë ê°€ëŠ¥ì„±ë„ ìžˆë‹¤. * p.381 * 패턴ì´ë‚˜ 설계 ì›ì¹™ì„ 공부하는 ì´ìœ 는 í¼ë‚˜ëŠ” 용어를 ì™¸ìš°ê³ ê¸°ê³„ì ì¸ ì§€ì‹ì„ 습ë“하면 ì €ì ˆë¡œ ê¹”ë”í•˜ê³ ìœ ì—°í•œ 코드가 나오기 ë•Œë¬¸ì´ ì•„ë‹ˆë‹¤. ì¢‹ì€ ì½”ë“œë¥¼ 만들기 위한 ê°œë°œìž ìŠ¤ìŠ¤ë¡œì˜ ë…¸ë ¥ê³¼ ê³ ë¯¼ì´ ìžˆì„ ë•Œ ë„ì›€ì„ ì£¼ê¸° 때문ì´ë‹¤. * 스프ë§ì„ DI í”„ë ˆìž„ì›Œí¬ë¼ê³ 부르는 ì´ìœ 는 외부 ì„¤ì •ì •ë³´ë¥¼ 통한 런타임 오브ì 트 DIë¼ëŠ” 단순한 ê¸°ëŠ¥ì„ ì œê³µí•˜ê¸° ë•Œë¬¸ì´ ì•„ë‹ˆë‹¤. ì˜¤ížˆë ¤ 스프ë§ì´ DIì— ë‹´ê¸´ ì›ì¹™ê³¼ ì´ë¥¼ ì‘용하는 í”„ë¡œê·¸ëž˜ë° ëª¨ë¸ì„ ìžë°” 엔터프ë¼ì´ì¦ˆ ê¸°ìˆ ì˜ ë§Žì€ ë¬¸ì œë¥¼ 해결하는 ë° ì ê·¹ì 으로 í™œìš©í•˜ê³ ìžˆê¸° 때문ì´ë‹¤. ë˜, 스프ë§ê³¼ 마찬가지로 스프ë§ì„ 사용하는 개발ìžê°€ 만드는 ì• í”Œë¦¬ì¼€ì´ì…˜ 코드 ë˜í•œ ì´ëŸ° DI를 활용해서 ê¹”ë”í•˜ê³ ìœ ì—°í•œ 코드와 설계를 만들어낼 수 있ë„ë¡ ì§€ì›í•˜ê³ 지지해주기 때문ì´ë‹¤. ==== ë©”ì¼ ì„œë¹„ìŠ¤ 추ìƒí™” ==== * p.384 * 그런ë°, 과연 테스트를 하면서 매번 ë©”ì¼ì´ 발송ë˜ëŠ” ê²ƒì´ ë°”ëžŒì§í•œê°€? 대개는 바람ì§í•˜ì§€ 못하다. * 여기서 지ì 하지 않았다면 ê·¸ ë¶€ë¶„ì— ëŒ€í•´ 딱히 ë¬¸ì œë¼ê³ ìƒê°í•˜ì§€ ì•Šì•˜ì„ ê²ƒ 같다. - [김수경] * ë‚˜ë„ í…ŒìŠ¤íŠ¸ ì¼œë†“ê³ ë†€ëŸ¬ê°”ì„ ê±°ê°™ë‹¤ - [서지혜] * p.391 * 서비스 추ìƒí™”ì—는 ê¸°ëŠ¥ì€ ìœ ì‚¬í•˜ë‚˜ 사용 ë°©ë²•ì´ ë‹¤ë¥¸ ë¡œìš°ë ˆë²¨ì˜ ë‹¤ì–‘í•œ ê¸°ìˆ ì— ëŒ€í•´ ì¶”ìƒ ì¸í„°íŽ˜ì´ìŠ¤ì™€ ì¼ê´€ì„± 있는 ì ‘ê·¼ ë°©ë²•ì„ ì œê³µí•´ì£¼ëŠ” ê²ƒì„ ë§í•œë‹¤. ë°˜ë©´ì— í…ŒìŠ¤íŠ¸ë¥¼ ì–´ë µê²Œ 만드는 ê±´ì „í•˜ì§€ ì•Šì€ ë°©ì‹ìœ¼ë¡œ ì„¤ê³„ëœ API를 ì‚¬ìš©í• ë•Œë„ ìœ ìš©í•˜ê²Œ ì“°ì¼ ìˆ˜ 있다. * p.392 * 서비스 추ìƒí™”란 ì´ë ‡ê²Œ ì›í™œí•œ í…ŒìŠ¤íŠ¸ë§Œì„ ìœ„í•´ì„œë„ ì¶©ë¶„ížˆ 가치가 있다. ê¸°ìˆ ì´ë‚˜ í™˜ê²½ì´ ë°”ë€” ê°€ëŠ¥ì„±ì´ ìžˆìŒì—ë„, JavaMail처럼 í™•ìž¥ì´ ë¶ˆê°€ëŠ¥í•˜ê²Œ ì„¤ê³„í•´ë†“ì€ API를 사용해야 하는 경우ë¼ë©´ 추ìƒí™” ê³„ì¸µì˜ ë„ìž…ì„ ì ê·¹ ê³ ë ¤í•´ë³¼ 필요가 있다. 특별히 ì™¸ë¶€ì˜ ë¦¬ì†ŒìŠ¤ì™€ ì—°ë™í•˜ëŠ” 대부분 ìž‘ì—…ì€ ì¶”ìƒí™”ì˜ ëŒ€ìƒì´ ë 수 있다. * p.395 * 테스트 í™˜ê²½ì„ ë§Œë“¤ì–´ì£¼ê¸° 위해, 테스트 대ìƒì´ ë˜ëŠ” 오브ì íŠ¸ì˜ ê¸°ëŠ¥ì—만 충실하게 수행하면서 ë¹ ë¥´ê²Œ, ìžì£¼ 테스트를 ì‹¤í–‰í• ìˆ˜ 있ë„ë¡ ì‚¬ìš©í•˜ëŠ” ì´ëŸ° 오브ì 트를 통틀어서 테스트 대ì—(test double)ì´ë¼ê³ 부른다. * SEì—서는 테스트 대ì—ì´ ì•„ë‹ˆë¼ stubì´ë¼ê³ í–ˆëŠ”ë° ì—¬ê¸°ì—서는 stub 오브ì 트와 mock 오브ì 트로 ë˜ ë‚˜ëˆ ì§„ë‹¤. - [서지혜] * p.396 * 목 오브ì 트는 스í…처럼 테스트 오브ì 트가 ì •ìƒì 으로 실행ë˜ë„ë¡ ë„와주면서, 테스트 오브ì 트와 ìžì‹ ì˜ ì‚¬ì´ì—ì„œ ì¼ì–´ë‚˜ëŠ” 커뮤니케ì´ì…˜ ë‚´ìš©ì„ ì €ìž¥í•´ë’€ë‹¤ê°€ 테스트 결과를 ê²€ì¦í•˜ëŠ” ë° í™œìš©í• ìˆ˜ 있게 해준다. * p.400 * 목 오브ì 트를 ì´ìš©í•œ 테스트ë¼ëŠ” 게, 작성하기는 ê°„ë‹¨í•˜ë©´ì„œë„ ê¸°ëŠ¥ì„ ìƒë‹¹ížˆ 막강하다는 ì‚¬ì‹¤ì„ ì•Œ 수 ìžˆì„ ê²ƒì´ë‹¤. ë³´í†µì˜ í…ŒìŠ¤íŠ¸ 방법으로는 ê²€ì¦í•˜ê¸°ê°€ 매우 까다로운 테스트 ëŒ€ìƒ ì˜¤ë¸Œì íŠ¸ì˜ ë‚´ë¶€ì—ì„œ ì¼ì–´ë‚˜ëŠ” ì¼ì´ë‚˜ 다른 오브ì 트 사ì´ì—ì„œ ì£¼ê³ ë°›ëŠ” ì •ë³´ê¹Œì§€ ê²€ì¦í•˜ëŠ” ì¼ì´ ì†ì‰½ê¸° 때문ì´ë‹¤. * 목 오브ì 트를 ì´ìš©í•œ 테스트가 작성하기 간단하…지 않았었는ë°. - [김수경] * ì´ì§€ëª©ê°™ì€ê±° 안ì¨ë„ 목 오브ì 트를 만들어 쓸 수 있구나.. - [서지혜] == ì„ íƒ == ---- [í† ë¹„ì˜ìŠ¤í”„ë§3], [Spring/íƒí—˜ìŠ¤í„°ë””]