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.0474 sec