애플리케이션에 서비스 레이어를 생성해야 하는 좋은 이유

많은 개발자는 애플리케이션 코드를 모델/엔티티 계층, 리포지토리 계층, 서비스 계층 및 컨트롤러로 나누는 디자인 패턴에 익숙합니다.

엔터티 계층의 이유는 매우 간단합니다. 응용 프로그램에서 엔터티의 필드(및 해당 유형)를 선언해야 합니다. 일부 애플리케이션에서는 엔티티 클래스에서 데이터베이스 스키마를 설명할 수도 있습니다. 리포지토리 계층에 쿼리를 배치하고 이를 사용하여 데이터를 검색하는 반면 컨트롤러에는 각 경로 및 HTTP 메서드에 대한 핸들러가 포함됩니다. 그러나 서비스는 어떻습니까?

내 저장소 앞에 서비스 계층이 있어야 한다는 필요성을 충족시키는 것 외에는 아무 용도가 없는 것처럼 보이는 서비스 클래스가 가끔 있습니다.

나는 최근에 서비스 계층 클래스가 있어야 하는 큰 이유를 발견했습니다. 내가 작업하고 있던 프로젝트에는 명확하게 정의된 서비스 레이어가 없었습니다. 다른 리포지토리에서 데이터를 가져오고 처리하고 결과를 반환하는 코드를 작성해야 했습니다. 이 기사의 편의를 위해 컨트롤러 클래스에서 이 코드를 처음 작성했다고 가정해 보겠습니다.

const repo1 = new Repo1()
const repo2 = new Repo2()

@rest('/demo')
class DemoController {

  @get('/result')
  getResult(req) {
    // handler for GET /demo/result

    const stuff = repo1.findById(req.body.id)
    const moreStuff = repo2.findAllCreatedBefore(req.body.time)
    // do some processing here
    return { result } 
  }

}


그런 다음 다른 곳에 필요하다는 것을 깨달았고 다른 파일로 전송하고 코드를 함수로 래핑했습니다.

// process-data file
const repo1 = new Repo1()
const repo2 = new Repo2()

export function processData(id, time) {
  const stuff = repo1.findById(id)
  const moreStuff = repo2.findAllCreatedBefore(time)
  // do some processing here
  return result;
}


이제 어디서나 사용할 수 있으므로 작업이 완료되지 않았습니까? 아니, 정확히는 아니야. 한 가지 문제가 있습니다. 이 기능을 어떻게 테스트할 것인가?

함수에는 테스트를 어렵게 만드는 매개 변수의 일부가 아닌 종속성(저장소)이 있습니다. 이 함수는 내 테스트 사례에서 모의 ​​종속성 집합을 사용해야 합니다. 이 작업을 수행하려면 어떻게 해야 합니까? 여기에 수업이 적합하지 않을까요?

// process-data file

export class DataProcessor {
  private repo1
  private repo2

  constructor(repo1, repo2) {
    this.repo1 = repo1
    this.repo2 = repo2
  }

  processDataByIdCreatedBeforeTime(id, time) {
    const stuff = this.repo1.findById(id)
    const moreStuff = this.repo2.findAllCreatedBefore(time)
    // do some processing here
    return result;
  }

}

export const processor = new DataProcessor(new Repo1(), new Repo2())




// test DataProcessor

it('should process the data correctly', () => {
  const processor = new DataProcessor(mock1, mock2)
  // ...some testing code
  const result = processor.processDataByIdCreatedBeforeTime(id, time)
  assert.equal(result, expectedResult)
})



위의 예에서 DataProcessor 클래스는 서비스 계층 클래스처럼 보이지 않습니까? 데이터 처리 논리를 테스트해야 하는 필요성으로 인해 결국 서비스 계층 클래스가 생성되었습니다. 그래서 우리는 무엇을 빼야 할까요?
  • 비즈니스 논리 코드를 단위 테스트할 수 있도록 리포지토리 및 컨트롤러와 별도로 서비스 계층이 필요합니다
  • .
  • 애플리케이션의 다른 부분에서 비즈니스 논리 코드를 재사용할 수 있도록 서비스 계층도 필요합니다
  • .
  • 테스트 주도 개발을 사용하시겠습니까?

  • 이것이 제 의견입니다. 상반된 생각이 있을 수 있거나 내가 놓친 것이 있을 수 있다고 의심됩니다. 이 경우 자유롭게 의견을 공유하십시오.
    읽어 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기