View


이제 다음 스텝으로 데이터 베이스에 데이터를 저장시키는 것을 해보려고 합니다.

당시 VoiceService는 아래와 같았으며,

@Injectable()
export class VoiceService {

    constructor(private prisma: PrismaService) {}
    
    createVoice(voiceData: Prisma.VoiceCreateInput): boolean {
      console.log(voiceData)
      this.prisma.voice.create({data:voiceData});
      
      return true;
    }
}

 

아래와 같이 voiceController가 작성되어있는 상태에서 데이터가 DB에 들어가지 않는 상황이었습니다.

  @Post('submit')
    createVoice(@Query('sentence_id') sentence_id: string, @Body() voiceData:VoiceDTO):Promise<boolean> { 
        return this.voiceServicve.createVoice(sentence_id, voiceData);
    }

일단 service를 제외하고 controller까지만 가도 기능구현이 될 수 있도록 코드를 짜보기로 했습니다.\

아래와 같이 수정이 되었고,

   @Post('submit')
    createVoice(@Body() voiceData:{fileSize, url, user, sentence} ): boolean {
        const {fileSize, url, user, sentence} = voiceData;
        
        return this.voiceServicve.createVoice({
            fileSize,
            url,
            user,
            sentence
        });
    }

 

 요청을 보냈을 때, 오류 없이, 반환값으로 true를 보내주었지만, 여전히 DB는 비어있었다...

여러번 시도해도 안되자, 공식문서의 create를 구현한 CRUD에 관한 자료를 찾아 보았다.

그리곤 아래와 같은 CRUD generator를 발견였다. 하지만 정작 중요한 Service부분은 나와있지 않았다.

https://docs.nestjs.com/recipes/crud-generator

recipes/prisma에 들어가니 service부분을 찾을 수 있었고, 아래의 코드들을 보고 데이터를 생성하는 코드를 짜보기로 하였다.

https://docs.nestjs.com/recipes/prisma

    @Post('submit')
    createVoice(@Body() voiceData:{fileSize, url} ): boolean {
        const {fileSize, url} = voiceData;

        return this.voiceServicve.createVoice({
            fileSize,
            url,
            user:{connect : {id : 1}},
            sentence :{connect : {id : 1}}
        });
	}

 

 @Post('submit')
    createVoice(@Body() voiceData:{fileSize, url} ): boolean {
        const {fileSize, url} = voiceData;

        // return this.voiceServicve.createVoice({
        //     fileSize,
        //     url,
        //     user:{connect : {id : 1}},
        //     sentence :{connect : {id : 1}}
        // });
        return this.voiceServicve.createVoice({
            fileSize,
            url,
            user:{connect : {id : 1}},
            sentence :{connect : {id : 1}}
        });
    }
    @Post('submit')
    createVoice(@Body() voiceData:VoiceDTO ){
        const {fileSize, url} = voiceData;

         return this.voiceServicve.createVoice({
             fileSize,
             url,
             user:{connect : {id : 1}},
             sentence :{connect : {id : 1}}
         });
        
    }

이때쯤 되니 혼자 삽질을 하고 있는 것을 알아차렸다,,,, service전인 controller에서만 기능구현을 해보려 하였으면서, 

자꾸 service쪽으로 접속을 시도하고 있다는 것을 깨달았다.

그리하여 아래와 같이 service를 지우고 prisma.voice.create로 바꾸었고, 


 

 	@Post('submit')
    createVoice(@Body() voiceData:{fileSize, url} ) {
        const {fileSize, url} = voiceData;

        this.prisma.voice.create ({
            data: {

                fileSize,
                url,
                user:{connect : {id : 1}},
                sentence :{connect : {id : 1}}
                }
            });
        }

여기서 안되자, 

외국인이 올려놓은 youtube의 프리즈마 강의를 들었다.

데이터 베이스에 값을 생성하기 위해 아래와 같은 방법으로 코드를 짜고 있었다.

https://www.youtube.com/watch?v=E37-33M6Ypk 

 위 강의를 참고하여 결국 나는 아래의 코드로 예쁜 결과물을 얻을 수 있었다.


// 성공

	@Post('submit')
    createVoice(@Body() voiceData:VoiceDTO ){
        const {fileSize, url} = voiceData;
;
        const newVoice = this.prisma.voice.create ({
            data: {
                    fileSize : fileSize,
                    url : url,
                    user:{connect : {id : 1}},
                    sentence :{connect : {id : 1}}
            }
        });
            return newVoice;
    }

 

 

자 그럼 이제  DB에 데이터 저장까지 완료하였으니, VoiceService로 이 코드를 옮겨 보도록 하자!!


코드의 작동 원리를 이해하니, 이후부터는 service로 코드를  옮겨 기능을 구현하는 것이 어렵지 않았다.

@Controller('user/voice')
export class VoiceController {
    constructor(
        private readonly voiceService: VoiceService,
        private readonly prisma: PrismaService
    ) {}

	@Post('submit')
    createVoice(@Query('sentence_id') sentence_id :number, @Body() voiceData:VoiceDTO){
        return this.voiceService.createVoice(sentence_id,voiceData);
    }
}
@Injectable()
export class VoiceService {
  
  constructor(private prisma: PrismaService) {}

  async createVoice(sentence_id:number, voiceData: VoiceDTO):Promise<VoiceDTO> {
    const {fileSize, url} = voiceData;
    const newVoice = await this.prisma.voice.create ({
        data: {
                fileSize : fileSize,
                url : url,
                user:{connect : {id : 1}},
                sentence :{connect : {id : sentence_id}}
        }
    });
      return newVoice;
  }
}

Share Link
reply
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31