728x90
1. Done
1.1 복습 - 개인프로젝트 firebase admin 코드 분석
1. 인터페이스
/** 인터페이스: 기본 명세를 정의한다. */
interface Config {
credential: {
privateKey: string;
clientEmail: string;
projectId: string;
};
}
2. 싱글톤 패턴
/** 싱글톤 패턴으로 FirebaseAdmin 인스턴스를 어디서든 불러올 수 있도록 export default. */
export default class FirebaseAdmin {
public static instance: FirebaseAdmin;
private init = false;
public static getInstance(): FirebaseAdmin {
if (
FirebaseAdmin.instance === undefined ||
FirebaseAdmin.instance === null
) {
FirebaseAdmin.instance = new FirebaseAdmin();
}
return FirebaseAdmin.instance;
}
// ... 중략
}
3. 인스턴스, 메서드 정의
public static getInstance(): FirebaseAdmin {
// getInstance 메서드 정의하기: FirebaseAdmin 클래스를 받아와서 인스턴스 생성
if (
FirebaseAdmin.instance === undefined ||
FirebaseAdmin.instance === null
) {
// 인스턴스가 undefined 이거나 null 일 경우 초기화를 진행한다.
FirebaseAdmin.instance = new FirebaseAdmin();
}
// getInstance 메서드를 호출하면 인스턴스를 반환한다.
return FirebaseAdmin.instance;
}
/** 환경을 초기화하는 메서드를 bootstrap 이란 이름의 메서드로 정의함 */
private bootstrap(): void {
/** haveApp: 앱이 등록되어 있는지 확인한다. */
const haveApp = admin.apps.length !== 0; // haveApp이 true면 앱이 등록된 것임.
if (haveApp) {
this.init = true;
return; // 앱이 등록되어있으면 초기화 상태를 확인하는 init의 값을 true로 변경하고 코드 종료
}
// ... 중략
}
4. 앱 초기화 시 인증정보 전달
/** 기존에 정의한 Config 인터페이스를 이용하여 그 값을 객체에 할당 */
const config: Config = {
credential: {
projectId: process.env.projectId || '',
clientEmail: process.env.clientEmail || '',
privateKey: (process.env.privateKey || '').replace(/\\\\n/g, '\\n'),
// json에 작성된 개행문자를 인식해서 실제로 개행처리를 하도록 replace 메서드 사용
},
};
// 환경변수에 등록된 값을 담은 credential 객체의 값을 앱 초기화시 전달하여 인증할 정보 전달
admin.initializeApp({
credential: admin.credential.cert(config.credential),
});
console.info('bootstrap firebase admin'); // 잘 전달되었는지 확인용
}
public static getInstance(): FirebaseAdmin {
// getInstance 메서드 정의하기: FirebaseAdmin 클래스를 받아와서 인스턴스 생성
if (
FirebaseAdmin.instance === undefined ||
FirebaseAdmin.instance === null
) {
// 인스턴스가 undefined 이거나 null 일 경우 초기화를 진행한다.
FirebaseAdmin.instance = new FirebaseAdmin();
**// 환경을 초기화한다.
FirebaseAdmin.instance.bootstrap(); // 추가된 부분**
}
// getInstance 메서드를 호출하면 인스턴스를 반환한다.
return FirebaseAdmin.instance;
}
2. 프로그래머스 0단계
✍️ 문제: 분수의 덧셈
- 의사코드
- 통분하기
- 두 분수를 더하기 위해 분모끼리 곱한다. → num1 * num2
- 두 분수를 더하기 위해 분자에 상대의 분모를 곱한다. → denum1 * num2, denum2 * num1
- 분자와 분모의 최대공약수로 나누어 기약분수로 만들기2-2. 작은수로 분자를 나눈 나머지가 0 && 분모를 나눈 나머지가 0이면 작은수(나눈 수)가 최대공약수이다.
- 2-3. 안 나누어 떨어지면 작은 수를 1 줄이고 2번부터 다시 시작.
- 2-1. 두 수 중 큰 수를 작은 수로 나누기 위해 작은 수를 찾는다.
- 통분하기
처음 풀이
function solution(denum1, num1, denum2, num2) {
// num: 분모
const num = num1 * num2;
// denum: 분자
const denum = denum1 * num2 + denum2 * num1;
// 분자, 분모 둘 다 둘 중 작은수로 나눈 나머지가 0이어야 함.
let minNumber = Math.max(num, denum);
while (true) {
if (denum % minNumber === 0 && num % minNumber === 0) {
return [denum / minNumber, num / minNumber];
}
minNumber = minNumber - 1;
}
}
리팩토링 - 유클리드 호제법 사용
나머지 = 큰 수 - 작은수
- 두 수 중 큰 수를 작은 수로 나눈다.
- 만약 나눈 나머지가 0이라면 작은 수가 두 수의 최대공약수이다.
- 나머지가 0이 아니라면 작은 수를 다시 나머지로 나눈다.
- 나머지와 작은 수를 인수로 재귀 호출을 반복하여 1~3을 실행 후, 나머지가 0이 되면 리턴값이 두 수의 최대공약수이다.
function solution(denum1, num1, denum2, num2) {
// num: 분모
const num = num1 * num2;
// denum: 분자
const denum = denum1 * num2 + denum2 * num1;
// 유클리드 호제법 - 두 수의 최대공약수를 구하는 알고리즘
const gcd = (x, y) => {
const rest = x % y;
if (rest === 0) return y;
return gcd(y, rest);
}
// divider: 최대공약수
const divider = num > denum ? gcd(num, denum) : gcd(denum, num);
return [denum / divider, num / divider];
}
✍️ 문제: 중앙값 구하기
- 중앙값 구하는 방법
- 데이터를 내림차순으로 정렬
- 데이터의 개수가 홀수라면 중앙값은 결과의 가운데 수
- 데이터의 개수가 짝수라면 중앙값은 가운데 두 수의 평균
const solution = (array) => {
// 중앙값 구하는 방법
// 1. 데이터를 내림차순으로 정렬
// 2. 데이터의 개수가 홀수라면 중앙값은 결과의 가운데 수
// 3. 데이터의 개수가 짝수라면 중앙값은 가운데 두 수의 평균
array.sort((a, b) => b - a);
return Math.ceil(array[Math.floor(array.length / 2)]);
};
728x90
'기록 > Today I learned' 카테고리의 다른 글
22.10.26 TIL (0) | 2022.10.26 |
---|---|
22.10.25 TIL (0) | 2022.10.25 |
22.10.21 TIL (0) | 2022.10.21 |
TIL 220416 (0) | 2022.04.17 |
TIL 220408 (0) | 2022.04.08 |