-
007_NestJS_Service 와 Repository> Backend/NestJS 2022. 5. 18. 09:32
이번 장에는 Service와 Repository에 대해 이해해보겠습니다.
NestJS 진행 순서 위의 사진을 보시면, Controller에서 Service로, Service에서 Repository로 이동되는 걸 알 수 있습니다.
Service와 Repository의 차이를 보시면, 아래 표와 같은데,
Service와 Repository의 가장 큰 차이는 Service는 비즈니스 로직을 수행하는 부분이고, Repository는 DB관련 로직을 수행한다는 점입니다. 쉽게 말하면, 일반적인 코딩을 Service에 & DB에 접속해서 정보를 가져오는건 Repository에 적으면 됩니다. 여기서 Repository는 Spring의 경우 DAO와 비슷한 역할을 한다고 생각하시면 됩니다.
차이점
바로, Repository부터 작성해봅시다.
우선, src 폴더 내부에 messages.repository.ts 라는 파일을 만듭니다.
그리고, 해당 파일 내에 아래와 같이 우선 코드를 작성합니다.
messages.repository.ts 우선 중요하게 아셔야될 부분이, Repository의 같은 경우 DB에 접속해서, DB 정보를 읽고, 해당 내용에서 Service로 Return할 부분을 골라서 Service로 Return 해야됩니다.
그렇게 되면, 순서는 우선 DB에 접속해서 DB정보를 읽는게 1번이고, 해당 부분을 Return해줘야 하는게 2번이 되게됩니다. 그렇게 때문에, 각 function 앞에 async라는 비동기 표현을 해줘야합니다.
Repository의 세부내용을 적기 전에, src 밖, 메인폴더 안에 messages.json 라는 파일을 만들고, 해당 파일안에 아래와 같이 코드를 작성합니다. 현재 프로젝트는 DB를 따로 안만들고, messages.json라는 파일을 DB 대용으로 사용할 예정입니다.
messages.json 이제, 다시 messages.repository.ts 로 이동해서, 해당 코드내에서 messages.json 파일을 읽거나, 추가해봅시다.
messages.repository.ts 내, findeOne 우선, fs/promises 에서 readFile & writeFile을 import 해줍니다. (messages.json를 읽고 쓸 예정이기 때문)
이후, 위의 사진과 같이 코드를 작성한다. findOne(id: string)이라는 Method안에 id (e.g: 12)가 params 로 넘어오고, messages.json을 읽고, 해당 contents를 JSON.parse로 JSON형태로 만들어주고, 여기서 id가 12인 친구를 찾아서 return 해주는 코드이다.
messages.repository.ts 내, findeAll 같은 의미로 findAll Method의 경우 아무런 params가 필요없고 (전체다 읽어오기 때문) findOne과 같이 JSON 형태로 만들어주고, JSON 를 Return 해준다.
messages.repository.ts 내, create 마지막으로 create Method의 경우,
우선 파일을 읽고, 여기서는 messages.json에 Create 해줄 예정이기 때문에, id라는 변수를 만들고, 이름 아래의 형태와 같이 만든다.
{ 13: { id: 13 , content: service에서 넘겨져 온 content} }
이것으로 사용할 repository는 완성되었고, 이제는 messages.service.ts를 src 폴더 내에 만들고, 코드를 작성해 봅시다.
****** 바로 다음 장부터, IOC와 DI를 통해 service 와 repository를 refactor를 진행할 예정이고, 이번 장에서는 앞으로 하면 안되는 방법으로 진행할 예정입니다 ******
messages.service.ts 우선, MessagesRepository를 객체로 활용할 예정이기 때문에, MessagesRepository 를 import 하고, 위의 사진과 같이
messagesRepo: MesagesRepository 및 constructor 코드를 작성합니다. 이번 장까지만, 이런 방식으로 작성할 예정입니다.
( MessagesService 는 Constructor에 MessagesRepository을 사용하기에 messagesRepo라는 property를 갖게 됩니다 )
( Construcotr: 클래스의 인스턴스 객체를 생성하고 초기화하는 매서드 )
이제, messages.service.ts내 상세 매서드를 작성해봅시다.
messages.service.ts 해당 메서드를 사용하기 위해, Controller에, Messages.service.ts를 import하고, 여기서도 Constructor를 생성해서 MessagesService 객체를 생성하고 초기화 해줍니다.
messages.controller.ts 여기서 NotFoundException은 Controller 내에서 getMessage 매서드에서 결과가 없는 경우, 에러를 발생하게 해주는 내용입니다. Controller 작업 및 Error Handling 작업을 동시에 진행할 예정입니다.
Messages.Controller.ts 이제, MassagesController 내용을 아래와 같이 작성하시면 됩니다.
Messages.Controller.ts Methods 여기 getMessage 매서드에서 결과가 없는 경우, 에러를 발생하게 해주는 내용입니다. Service에서, Repository에서 Returned 되는 message가 없는 경우 throw new NotFoundException('원하는 에러메시지 입력') 해줍니다.
이렇게 해서, 우선 Controller, Service, Repository 작업은 완료했습니다.
다음 장부터는 일전에 이야기한 IOC & DI 에 대해 이야기해보겠습니다.'> Backend > NestJS' 카테고리의 다른 글
20221221Wed_공부 일지 (0) 2022.12.22 009_TypeORM을 NestJS에 연결 - 1 (0) 2022.05.27 006_NestJS_Pipes를 활용한 Validation Check (0) 2022.05.16 005_NestJS_NestJS CLI를 사용한 Controller 만들기 (0) 2022.05.16 004_NestJS_BasicSetup(using NestCLI) (0) 2022.05.16