Wecode -기업협업 인턴 (부트캠프)/기업협업 인턴(프로젝트)

기업협업 2번째 프로젝트- 3일차 shorturl 생성 기능 api 작성 (service, controller)

JBS 12 2023. 11. 8. 14:46

Entity

\

 

 


service 

 

  const today = new Date();
        today.setHours(0,0,0,0); 




    const urlCount = await this.urlRepo                 
            .createQueryBuilder('url')
            .where('url.userIp = :userIp', { userIp })
            .andWhere('url.createAt >= :today', { today }) 
            .getCount();  
             
            ---> userIp로 하루 short URL 변환 횟수 확인



       const urlCount = await this.urlRepo                          
              .createQueryBuilder('url')
              .where('url.userIp = :userIp', { userIp })     
              .andWhere('url.createAt >= :today', { today }) 
              .getCount();     

await = this.urlRepo 객체의 createQueryBuilder 메서드가 반환한 Promise를 대기하고 있음
그런 다음 getCount() 메서드를 호출하여 해당 카운트를 얻는다.

promise 가 뭐니
JavaScript에서 비동기 작업의 결과를 나타내는 객체
비동기 작업: 일반적으로 시간이 걸리는 작업 또는 외부 리소스에 액세스하는 작업과 관련이 있으며 작업이 완료되기를 기다리지 않고 다른 작업을 수행할 수 있게 해줍니다.

await 키워드를 사용하면 해당 비동기 작업이 완료될 때까지 대기하고 그 결과를 가져옵니다. 이 때 await 키워드를 사용하는 메서드는 Promise를 반환합니다. Promise는 작업이 완료되면 두 가지 상태 중 하나를 갖습니다: 이행(Fulfilled) 또는 거부(Rejected).

작업이 성공적으로 완료되면 Promise는 이행 상태가 되고 결과 값을 제공합니다. 작업이 오류로 실패하면 Promise는 거부 상태가 되고 오류를 전파합니다. 이렇게 Promise는 비동기 작업을 효과적으로 처리하는 방법 중 하나입니다.

따라서 await this.urlRepo.createQueryBuilder('url') 부분은 this.urlRepo.createQueryBuilder('url') 메서드가 반환하는 Promise를 대기하고, 그 후 .getCount() 메서드를 호출하여 이러한 Promise를 해결하고 값을 가져오는 것을 의미

 

 

 

이거는 4일차에 한 건데, 

short url 생성 시에,

localhost:3000/ 뒤에 위치에, 도메인을 제외하고 생성하도록할 건데, 이러한 로직이 구현되어있니?

그리고 이건 service, repo 중에 어디에 존재해야 하니? 

 

 

 

 

    async findOriginalUrlByShorten(shortUrl: string): Promise<string | undefined> {
           const urlEntity = await this.urlRepo.findOne({ where:{shortUrl: shortUrl}});   
           return urlEntity ? urlEntity.originalUrl : undefined;

     }


return urlEntity ? urlEntity.originalUrl : undefined;

초기세팅에서 service.js에서 있었던 코드가 사라진 이유

 

나머지 service 

데이터베이스에 original url, short url, user ip를 저장하는 코드
typerom을 쓰는 경우에 그런데, mysql 써도 되고 마음대로!


Repository 패턴과 TypeORM과 같은 ORM(Object-Relational Mapping) 라이브러리를 사용하는 경우,
Repository 클래스를 통해 데이터베이스와 상호작용하고
쿼리 빌더를 사용





function generateUniqueShortUrl(): string {
            return 'uniqueShortUrl'; }. 는

@Injectable()
export class UrlService {
     constructor(
                @InjectRepository(UrlEntity)
                private urlRepo : Repository<UrlEntity> 
     ){}  안에

왜 안 들어가니?

--> generateUniqueShortUrl 함수는 서비스 클래스의 메소드가 아니며,
서비스 클래스가 아닌 독립적인 함수로 정의.
서비스 클래스와 독립적으로 작동, 서비스 클래스에 직접 종속되지 않는다.

 

 

UrlService 클래스가 중복
->하나의 클래스를 여러 번 정의 -> 하나의 클래스 안에 함수 선언 여러번으로 넣기 

 

const urlEntity = await this.urlRepo.findOne({ where: { shortUrl: shortUrl } });
 --> findOne 메서드를 사용할 때 해당 엔터티의 속성과 일치하는 조건을 전달해야 


 

 

 

 

 

이거도 4일차에 한 건데,

 여기에서 generateUniqueShortUrl은 어디에서 만드니? 

절대 중복되지 않는 영문 대소문자와 가끔 포함되는 숫자 하나로 



중복되지 않는 영문 대소문자와 가끔 포함되는 숫자를 생성하는 로직을 service, repo중 어디에서 구현하니

--> 중복되지 않는 영문 대소문자와 가끔 포함되는 숫자를 생성하는 로직은 일반적으로 서비스(Service)나 독립적인 유틸리티 함수에서 구현.
이러한 로직은 데이터베이스와 직접적으로 관련이 없기 때문에 Repository에 구현하는 것은 부적절



"간단하게 바꿀 수 있는 다른 방법"을 물어보면, 새로운 걸 알려준다! (이렇게 새로운 것을 배우는 방법!) 
----> 영어표현도 마찬가지

 
아래의 경우, npm install alum 
모듈 설치 여부 확인: 프로젝트에 필요한 패키지 또는 모듈이 설치되어 있는지 확인. 필요한 모듈이 설치되어 있지 않다면 해당 모듈을 설치

npm install alum

 

 

 


controller 

 

 

 

urlService: UrlService 각각이 뭔지 알려줘
인스턴스: 클래스

클래스: 객체를 만들어 내기 위한 설계도 혹은 틀 -> UrlService 
인스턴스: 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체 -> urlService
작성 순서= 인스턴스: 클래스 

실제로도, controller에서 UrlService를 누르면, service에 연결되어 있다.
service에서,  export class 로 선언되어있다.  

 


api 짜다보니, 칼럼이름을 잘못 짰단 생각 들어서 바꾸기 

 

너무 급했다. 데이터베이스 선택 후 

 


short url을 눌렀을 때, original url에 mapping돼서, redirect하게

 

 

 

controller 에서 추가하는 부분 

원래 나는 
shortUrlController.ts 
redirectUrlController.ts 로 두개로 나누었는데 

차장님께서 하나의 UrlController.ts 에 하길 추천하셔서! 


매핑한다는게 어떤 뜻이니? 

 

 

합한 controller 

 

별개의 controller 메소드로 해줘야 한다 
그러기에 { }를 닫아주고 나서, 
다시 { }를 해야 에러가 한번에 다 해결된다!      ----- 1)


그리고, 잠재적인 에러는, 데코레이터가 없다는 것인데, 
추가된 Get, Param을 첫줄에 import해주는 곳에 추가!   ------2) 
Redirect은 자동으로 기입 되어 있었다. (자동 기입 되는 것도 있고, 가끔 기입 안되는 것도 있기에!)

Nestjs, TypeScript에서 에러 나면 대부분은 
위 두개 1),2) 이다.
1) '괄호'와  2)'데코레이터 import! '

 

 

 

 

 

sevice 에서 추가하는 부분