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
데이터베이스에 original url, short url, user ip를 저장하는 코드
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
모듈 설치 여부 확인: 프로젝트에 필요한 패키지 또는 모듈이 설치되어 있는지 확인. 필요한 모듈이 설치되어 있지 않다면 해당 모듈을 설치
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 에서 추가하는 부분
'Wecode -기업협업 인턴 (부트캠프) > 기업협업 인턴(프로젝트)' 카테고리의 다른 글
기업협업 2번째 프로젝트- 4일차 shorturl 생성 기능 api 작성 (service 추가,repository)+ 에러 모음 (0) | 2023.11.09 |
---|---|
기업협업 1번째 프로젝트 - 프론트와 통신 (0) | 2023.11.08 |
기업협업 - 2번째 프로젝트: 3일차 [전체 초기세팅 하는법]-추가 ormconfig.js (0) | 2023.11.08 |
기업협업 2번째 프로젝트: 깃허브 브랜치 에러 해결 (0) | 2023.11.07 |
기업협업 2번째 프로젝트: 서버 구동 후엔, 데이터베이스 연결 (0) | 2023.11.07 |