U E D R , A S I H C RSS

토비�스프�3/밑줄긋기

1. 들어가며

  • p.44
    • 스프ë§�ì�„ 사용하는 개발ìž�들ì�€ ìž�연스럽게 ìž�바와 엔터프ë�¼ì�´ì¦ˆ 개발ì�˜ 기본ì—� 충실한 베스트 프랙티스를 ì �용할 수 있고, ì�´ìƒ�ì �ì�¸ 개발 철학과 프로그래ë°� 모ë�¸ì�„ ì�´í•´í•˜ê²Œ ë�˜ê³ , 좋ì�€ 개발 습관ì�„ ì²´ë“�하게 ë�œë‹¤.
    • 스프ë§�ì�„ 사용하는 개발ìž�들ì�´ 스프ë§�ì�„ 통해 얻게 ë�˜ëŠ” ë‘� 가지 중요한 가치가 있다면 그것ì�€ 단순함과 유연성ì�´ë‹¤.

2. �해

2.1. 오브�트와 �존관계

  • p.61
    • 잘 ë�™ìž‘하는 코드를 êµ³ì�´ 수정하고 개선해야 하는 ì�´ìœ ëŠ” 뭘까?
      • ì�´ëŸ° ë§�ì�´ ìƒ�ê°�나네요 컴퓨터가 ì�´í•´í• ìˆ˜ 있는 코드는 ì–´ëŠ� 바보나 다 작성할 수 있다. 좋ì�€ 프로그래머는 사람ì�´ ì�´í•´í•  수 있는 코드를 짠다 - 마틴파울러 - 서지혜


  • p.62
    • 가장 좋ì�€ 대책ì�€ 변화ì�˜ í�­ì�„ 최소한으로 줄여주는 것ì�´ë‹¤.

  • p.70
    • 그런ë�° ë””ìž�ì�¸ 패턴ì�€ 설계 ì „ëžµì�´ê¸°ë�„ 하지만 굉장히 편리한 커뮤니케ì�´ì…˜ 수단ì�´ê¸°ë�„ 하다.

  • p.73
    • 변화ì�˜ 성격ì�´ 다르다는 ê±´ 변화ì�˜ ì�´ìœ ì™€ 시기, 주기 등ì�´ 다르다는 뜻ì�´ë‹¤.

2.2. 테스트

2.3. 템플릿

  • 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

2.4. 예외

  • p.283
    • 예외는 처리ë�¼ì•¼ 한다.
    • 예외를 처리할 때 반드시 지켜야 í•  핵심 ì›�ì¹™ì�€ 한 가지다. 모든 예외는 ì �절하게 복구ë�˜ë“ ì§€ 아니면 작업ì�„ 중단시키고 ìš´ì˜�ìž� ë˜�는 개발ìž�ì—�게 분명하게 통보ë�¼ì•¼ 한다.
  • p.284
    • êµ³ì�´ 예외를 잡아서 뭔가 조치를 취할 방법ì�´ 없다면 잡지 ë§�아야 한다.
  • p.290
    • 예외를 회피하는 것ì�€ 예외를 복구하는 것처럼 ì�˜ë�„ê°€ 분명해야 한다.
  • p.317
    • 애플리케ì�´ì…˜ì�˜ 로ì§�ì�„ 담기 위한 예외는 ì²´í�¬ 예외로 만든다.

2.5. 서비스 추�화

2.5.1. 사용� 레벨 관리 기능 추가

  • 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
    • 한 가지 변경 ì�´ìœ ê°€ ë°œìƒ�í–ˆì�„ 때 여러 êµ°ë�°ë¥¼ 고치게 만든다면 중복ì�´ë‹¤.

2.5.2. 트랜잭션 서비스 추�화

  • p.351
    • 게다가 테스트ì�˜ 기본ì�€ ìž�ë�™í™”ë�œ 테스트여야 하니 사람ì�´ 간섭하는 것ì�€ 좋ì�€ ìƒ�ê°�ì�´ 아니다.
    • 테스트를 위해 코드를 함부로 건드리는 것ì�€ 좋ì�€ ìƒ�ê°�ì�´ 아니다.
  • p.355
    • 트랜잭션ì�´ëž€ ë�” ì�´ìƒ� 나눌 수 없는 단위 작업ì�„ ë§�한다. 작업ì�„ 쪼개서 ìž‘ì�€ 단위로 만들 수 없다는 것ì�€ 트랜잭션ì�˜ 핵심 ì†�성ì�¸ ì›�ìž�성ì�„ ì�˜ë¯¸í•œë‹¤.
    • ë”°ë�¼ì„œ 중간ì—� 예외가 ë°œìƒ�해서 작업ì�„ 완료할 수 없다면 아예 작업ì�´ 시작ë�˜ì§€ 않ì�€ 것처럼 초기 ìƒ�태로 ë�Œë ¤ë†”야 한다. ì�´ê²ƒì�´ 바로 트랜잭션ì�´ë‹¤.
    • 하지만 여러 ê°œì�˜ SQLì�´ 사용ë�˜ëŠ” 작업ì�„ 하나ì�˜ 트랜잭션으로 취급해야 하는 경우ë�„ 있다.
  • p.356
    • 모든 트랜잭션ì�€ 시작하는 ì§€ì �ê³¼ ë��나는 ì§€ì �ì�´ 있다. 시작하는 방법ì�€ 한 가지ì�´ì§€ë§Œ ë��나는 방법ì�€ ë‘� 가지다. 모든 작업ì�„ 무효화하는 롤백과 모든 작업ì�„ 다 확정하는 커밋ì�´ë‹¤.
  • p.362
    • 비즈니스 로ì§�ì�„ ë‹´ê³  있는 UserService 메소드 안ì—�서 트랜잭션ì�˜ 경계를 설정해 관리하려면 지금까지 만들었ë�˜ ê¹”ë�”하게 정리ë�œ 코드를 í�¬ê¸°í•´ì•¼ 할까? 아니면, 트랜잭션 기능ì�„ í�¬ê¸°í•´ì•¼ 할까? 물론 둘 다 아니다. 스프ë§�ì�€ ì�´ 딜레마를 í•´ê²°í•  수 있는 ë©‹ì§„ 방법ì�„ 제공해준다.
  • p.370
    • UserService는 ìž�ì‹ ì�˜ 로ì§�ì�´ 바뀌지 않았ì�Œì—�ë�„ 기술환경ì—� ë”°ë�¼ì„œ 코드가 바뀌는 코드가 ë�¼ë²„리고 ë§�았다.
  • p.371
    • ì�´ë ‡ê²Œ 여러 기술ì�˜ 사용 방법ì—� 공통ì �ì�´ 있다면 ì¶”ìƒ�화를 ìƒ�ê°�í•´ë³¼ 수 있다. ì¶”ìƒ�화란 하위 시스템ì�˜ 공통ì �ì�„ 뽑아내서 분리시키는 것ì�„ ë§�한다. 그렇게 하면 하위 시스템ì�´ ì–´ë–¤ 것ì�¸ì§€ 알지 못해ë�„, ë˜�는 하위 시스템ì�´ 바뀌ë�”ë�¼ë�„ ì�¼ê´€ë�œ 방법으로 접근할 수가 있다.
  • p.374
    • ì–´ë–¤ í�´ëž˜ìŠ¤ë“  스프ë§�ì�˜ 빈으로 등ë¡�í•  때 먼저 검토해야 í•  것ì�€ 싱글톤으로 만들어져 여러 스레드ì—�서 ë�™ì‹œì—� 사용해ë�„ 괜찮ì�€ê°€ 하는 ì �ì�´ë‹¤. ìƒ�태를 ê°–ê³  있고, 멀티스레드 환경ì—�서 안전하지 않ì�€ í�´ëž˜ìŠ¤ë¥¼ 빈으로 무작정 등ë¡�하면 심ê°�한 문제가 ë°œìƒ�하기 때문ì�´ë‹¤.

2.5.3. 서비스 추�화와 단� 책임 �칙

  • p.377
    • ì�´ë ‡ê²Œ 기술과 서비스ì—� 대한 ì¶”ìƒ�í™” 기법ì�„ ì�´ìš”하면 특정 기술환경ì—� 종ì†�ë�˜ì§€ 않는 í�¬í„°ë¸”한 코드를 만들 수 있다.
  • p.379
    • 단ì�¼ ì±…ìž„ ì›�ì¹™ì�€ 하나ì�˜ 모듈ì�€ 한 가지 ì±…ìž„ì�„ 가져야 한다는 ì�˜ë¯¸ë‹¤. 하나ì�˜ 모듈ì�´ 바뀌는 ì�´ìœ ëŠ” 한 가지여야 한다고 설명할 수ë�„ 있다.
    • 단ì�¼ ì±…ìž„ ì›�ì¹™ì�„ 잘 지키고 있다면, ì–´ë–¤ 변경ì�´ 필요할 때 수정 대ìƒ�ì�´ 명확해진다.
  • p.380
    • ë§Žì�€ 코드를 수정하는 작업ì—�ì„  그만í�¼ 실수가 ì�¼ì–´ë‚  확률ì�´ 높다. 치명ì �ì�¸ 버그가 ë�„ìž…ë�  가능성ë�„ 있다.
  • p.381
    • 패턴ì�´ë‚˜ 설계 ì›�ì¹™ì�„ 공부하는 ì�´ìœ ëŠ” í�¼ë‚˜ëŠ” 용어를 외우고 기계ì �ì�¸ ì§€ì‹�ì�„ 습ë“�하면 저절로 ê¹”ë�”하고 유연한 코드가 나오기 때문ì�´ 아니다. 좋ì�€ 코드를 만들기 위한 개발ìž� 스스로ì�˜ 노력과 고민ì�´ 있ì�„ 때 ë�„움ì�„ 주기 때문ì�´ë‹¤.
    • 스프ë§�ì�„ DI 프레임워í�¬ë�¼ê³  부르는 ì�´ìœ ëŠ” 외부 설정정보를 통한 런타임 오브ì �트 DIë�¼ëŠ” 단순한 기능ì�„ 제공하기 때문ì�´ 아니다. 오히려 스프ë§�ì�´ DIì—� 담긴 ì›�칙과 ì�´ë¥¼ ì�‘용하는 프로그래ë°� 모ë�¸ì�„ ìž�ë°” 엔터프ë�¼ì�´ì¦ˆ 기술ì�˜ ë§Žì�€ 문제를 해결하는 ë�° ì �ê·¹ì �으로 활용하고 있기 때문ì�´ë‹¤. ë˜�, 스프ë§�ê³¼ 마찬가지로 스프ë§�ì�„ 사용하는 개발ìž�ê°€ 만드는 애플리케ì�´ì…˜ 코드 ë˜�한 ì�´ëŸ° DI를 활용해서 ê¹”ë�”하고 유연한 코드와 설계를 만들어낼 수 있ë�„ë¡� ì§€ì›�하고 지지해주기 때문ì�´ë‹¤.

2.5.4. 메� 서비스 추�화

  • p.384
    • 그런ë�°, 과연 테스트를 하면서 매번 ë©”ì�¼ì�´ 발송ë�˜ëŠ” 것ì�´ 바람ì§�한가? 대개는 바람ì§�하지 못하다.
      • 여기서 ì§€ì �하지 않았다면 ê·¸ 부분ì—� 대해 딱히 문제ë�¼ê³  ìƒ�ê°�하지 않았ì�„ 것 같다. - 김수경
      • 나ë�„ 테스트 켜놓고 놀러갔ì�„ 거같다 - 서지혜
  • p.391
    • 서비스 ì¶”ìƒ�í™”ì—�는 기능ì�€ 유사하나 사용 방법ì�´ 다른 로우레벨ì�˜ 다양한 기술ì—� 대해 ì¶”ìƒ� ì�¸í„°íŽ˜ì�´ìŠ¤ì™€ ì�¼ê´€ì„± 있는 ì ‘ê·¼ 방법ì�„ 제공해주는 것ì�„ ë§�한다. 반면ì—� 테스트를 어렵게 만드는 건전하지 않ì�€ ë°©ì‹�으로 설계ë�œ API를 사용할 때ë�„ 유용하게 ì“°ì�¼ 수 있다.
  • p.392
    • 서비스 ì¶”ìƒ�화란 ì�´ë ‡ê²Œ ì›�활한 테스트만ì�„ 위해서ë�„ 충분히 가치가 있다. 기술ì�´ë‚˜ 환경ì�´ 바뀔 가능성ì�´ 있ì�Œì—�ë�„, JavaMail처럼 확장ì�´ 불가능하게 설계해놓ì�€ API를 사용해야 하는 경우ë�¼ë©´ ì¶”ìƒ�í™” 계층ì�˜ ë�„ìž…ì�„ ì �ê·¹ 고려해볼 필요가 있다. 특별히 외부ì�˜ 리소스와 ì—°ë�™í•˜ëŠ” 대부분 작업ì�€ ì¶”ìƒ�í™”ì�˜ 대ìƒ�ì�´ ë�  수 있다.
  • p.395
    • 테스트 환경ì�„ 만들어주기 위해, 테스트 대ìƒ�ì�´ ë�˜ëŠ” 오브ì �트ì�˜ 기능ì—�ë§Œ 충실하게 수행하면서 빠르게, ìž�주 테스트를 실행할 수 있ë�„ë¡� 사용하는 ì�´ëŸ° 오브ì �트를 통틀어서 테스트 대역(test double)ì�´ë�¼ê³  부른다.
      • SEì—�서는 테스트 대역ì�´ 아니ë�¼ stubì�´ë�¼ê³  했는ë�° 여기ì—�서는 stub 오브ì �트와 mock 오브ì �트로 ë˜� 나눠진다. - 서지혜
  • p.396
    • 목 오브ì �트는 스í…�처럼 테스트 오브ì �트가 ì •ìƒ�ì �으로 실행ë�˜ë�„ë¡� ë�„와주면서, 테스트 오브ì �트와 ìž�ì‹ ì�˜ 사ì�´ì—�서 ì�¼ì–´ë‚˜ëŠ” 커뮤니케ì�´ì…˜ ë‚´ìš©ì�„ 저장해뒀다가 테스트 결과를 ê²€ì¦�하는 ë�° 활용할 수 있게 해준다.
  • p.400
    • 목 오브ì �트를 ì�´ìš©í•œ 테스트ë�¼ëŠ” 게, 작성하기는 간단하면서ë�„ 기능ì�„ ìƒ�당히 막강하다는 사실ì�„ 알 수 있ì�„ 것ì�´ë‹¤. 보통ì�˜ 테스트 방법으로는 ê²€ì¦�하기가 매우 까다로운 테스트 대ìƒ� 오브ì �트ì�˜ ë‚´ë¶€ì—�서 ì�¼ì–´ë‚˜ëŠ” ì�¼ì�´ë‚˜ 다른 오브ì �트 사ì�´ì—�서 주고받는 정보까지 ê²€ì¦�하는 ì�¼ì�´ ì†�쉽기 때문ì�´ë‹¤.
      • 목 오브ì �트를 ì�´ìš©í•œ 테스트가 작성하기 간단하…지 않았었는ë�°. - 김수경
      • ì�´ì§€ëª©ê°™ì�€ê±° 안ì�¨ë�„ 목 오브ì �트를 만들어 쓸 수 있구나.. - 서지혜
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:21
Processing time 0.0876 sec