본문 바로가기

책/토비의 스프링 3.1(1권, 완)

5장 서비스 추상화

5.1 사용자 레벨 관리 기능

  • DB에 varchar 타입으로 선언하고 “BASIC”, “SILVER”, “GOLD”처럼 문자를 넣는 방법도 있겠지만 이렇게 일정한 종류의 정보를 문자열로 넣는 것은 별로 좋아 보이지 않다.
  • 대신 각 레벨을 코드화해서 숫자로 넣으면 DB용량도 많이 차지하지 않고 가벼워서 좋다.
  • Enum 타입사용
  • 빠르게 실행 가능한 포괄적인 테스트를 만들어두면 기능의 추가나 수정이 일어날 때 그 위력을 발휘한다.
  • 데이터 액세스 로직이 바뀌었다고 비즈니스 로직를 수정하는 일이 있어서는 안된다.
  • UserDaoJDBC는 주어진 User 오브젝트를 DB에 정보를 넣고 읽는 방법에만 관심을 가져야지 비즈니스적인 의미를 지닌 정보를 설정하는 책임을 지는 것은 바람직하지 않다. → 생성자에서 초기 설정 정보를 만드는 것은 나쁘지는 않지만 처음 가입을 할 때만 이용되기 때문에 문제 존재 →초기화 역할을 담당하는 메서드를 생성해 초기화를 한다.
  • else 문을 지양하자
  • 함수는 하나의 동작만을 하도록 작성하자
  • UserService, User, level이 내부 정보를 다루는 자신의 책임에 충실한 기능을 갖고 있으면서 필요가 생기면 이런 작업을 수행해달라고 서로 요청하는 구조다.
  • 각자 자기 책임에 충실한 작업만 하고 있으니 코드를 이해하기도 쉽다.
  • 객체지향적인 코드는 다른 오브젝트의 데이터를 가져와서 작업하는 대신 데이터를 갖고 있는 다른 오브젝트에게 작업을 해달라고 요청한다.
  • 오브젝트에게 데이터를 요구하지 말고 작업을 요청하라는 것이 객체지향 프로그래밍의 가장 기본이 되는 원리이기도 하다.
  • 테스트와 애플리케이션 코드에 나타난 이런 숫자의 중복도 제거해줘야 할까? 당연하다. 한가지 변경 이유가 발생했을 때 여러 군데를 고치게 만든다면 중복이기 때문이다.
    • 가장 좋은 방법은 정수형 상수로 만들어 관리하는 것
    • 혹은 enum 타입으로 관리

5.2 트랜잭션 서비스 추상화

  • 테스트용 확장 클래스는 테스트를 하고자 하는 클래스를 상속해서 테스트에 필요한 기능을 추가하도록 일부 메소드를 오버라이딩해서 구현할 수 있다.
    • 내부 클래스로 작성
  • 트랜잭션이란 더 이상 나눌수 업는 단위 작업을 말한다. 작업을 쪼개서 작은 단위로 만들 수 없다는 것은 트랜잭션의 핵심 속성인 원자성을 의미한다.
  • 모든 트랜잭션은 시작하는 지점과 끝나는 지점이 있다.
  • 시작하는 방법은 한 가지이지만 끝나는 방법은 두가지다.
    1. 모든 작업을 무효화하는 롤백
    2. 모든 작업을 다 확정하는 커밋
  • 애플리케이션 내에서 트랜잭션이 시작되고 끝나는 위치를 트랜잭션의 경계라고 부른다.
  • JDBC의 기본 설정은 DB 작업을 수행한 직후에 자동으로 커밋이 되도록 되어 있다.
  • commit, rollback으로 트랜잭션을 종료하는 하나의 작업을 트랜잭션의 경계설정이라고 한다.
  • 하나의 DB 커넥션 안에서 만들어지는 트랜잭션을 로컬 트랜잭션이라고 한다.
  • 템플릿 메서드가 호출될 때마다 트랜잭션이 새로 만들어지고 메소드를 빠져나오기 전에 종료된다.
  • 트랜잭션 동기화로 트랜잭션 경계를 설정하면서 트랜잭션 기능을 가져갈 수 있다.
  • 서로 다른 DB에 동일한 트랜잭션을 적용하기 위해 JTA라는 것을 이용해야 한다. (글로벌 트랜잭션)

5.3 서비스 추상화와 단일 책임 원칙

  • 단일 책임 원칙은 하나의 모듈은 한 가지 책임을 가져야 한다는 의미다.
  • 하나의 모듈이 바뀌는 이유는 한 가지여야 한다고 설명할 수도 있다.
  • 단일 책임을 잘지키고 있다면 어떤 변경이 필요할때 수정 대상이 명확해진다.
  • 스프링의 DI가 없었다면 인터페이스를 도입해서 나름 추상화를 했더라도 적지 않은 코드 사이의 결합이 남아있게 된다.
  • 객체지향 설계와 프로그래밍의 원칙은 서로 긴밀하게 관련이 있다. 단일 책임 원칙뿐 아니라 개방 폐쇄 원칙도 잘 지키고, 모듈 간에 결합도가 낮아서 서로의 변경이 영향을 주지 않고, 같은 이율 변경이 단일 책임에 집중되는 응집도 높은 코드가 나오니까 말이다.

5.4 메일 서비스 추상화

  • 테스트 환경을 만들어주기 위해 테스트 대상이 되는 오브젝트의 기능에만 충실하게 수행하면서 빠르게, 자주 테스트를 실행할 수 있도록 사용하는 이러한 오브젝트를 통틀어서 테스트 대역이라고 한다.
    • 대표적인 테스트 대역은 테스트 스텁이다.

궁금한 점

  • 질문 1
  • ❓ add는 유저를 추가할 때 이외에 호출되는 경우가 있나요? 만약 없다면 생성자를 통해서 초기화를 하는 방법도 충분히 괜찮아 보이는 방법 같은데 어떻게 생각하시나요?

' > 토비의 스프링 3.1(1권, 완)' 카테고리의 다른 글

6장 AOP  (2) 2023.11.23
4장 예외  (1) 2023.11.02
3장 템플릿  (0) 2023.10.12
2장 테스트  (1) 2023.10.05
1장 오브젝트와 의존관계  (0) 2023.09.27