오늘의 내용은 ~ !
- 슬랙봇이란?
- 슬랙봇의 기본 원리
- API
- 제네릭
특정 이벤트가 발생 시 그에 맞는 유저 동작이나 알림을 컴퓨터가 자동으로 하는 것
특정 입력을 하면 메세지가 출력되는 기능에 대해 알아봅시다!
import {App} from "@slack/bolt"
import "dotenv/config";
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET,
socketMode: true,
appToken: process.env.SLACK_APP_TOKEN,
port: Number(process.env.PORT) || 3000,
});
App
: 슬랙봇을 생성하기 위한 생성자, 즉 틀역할을 한다!token
, signingSecret
,soketMode
,appToken
,port
를 key로 넣어준다.이렇게 봇을 생성했으니 간단한 기능으로 메시지를 입력받아 랜덤 숫자를 반환해주는 기능을 만들어보자!
// 랜덤 값 생성
const randomInteger = (): Number => {
return Math.floor(Math.random() * 101 + 1);
};
// 메시지 입력 시 say안에 있는 내용 출력
app.message("number!", async({say}) => {
// dice라는 변수는 randomInteger로 반환받은 숫자
const dice = randomInteger();
// say함수는 채널에 메시지를 보냄
await say(`숫자는 ${dice}입니다!`);
});
app.message(...)
;message
라는 기능이 있음say
: 메시지를 받으면 응답await 함수명
의 실행이 끝날 때 까지 그 아래는 실행X즉시 실행 함수
(async () => {
await app.start(Number(process.env.PORT) || 3000);
console.log("Good");
})();
start
기능 실행async/await
이기 때문에 app.start가 실행되기 전까지는 이후 코드가 실행X즉시 실행 함수 ?-?
- 함수의 정의와 동시에 호출되는 함수
- 단 한 번만 호출되고 다시 호출될 수 x
- 즉시 실행 함수는 익명 함수를 사용하는 것이 일반적!
💡 Application Programming Interface, 프로그램들이 서로 상호작용하는 것을 도와주는 매개체.
→ private API를 사용할 경우 개발자들이 애플리케이션 코드를 작성하는 방법을 표준화함으로써 간소화되고 빠른 프로세스 처리를 가능하게 한다!
찌르기란?-?
API를 찌른다는 것은 데이터를 호출해 응답을 받아오는 것을 의미!
async function request() {
const response = await fetch('https://api.github.com/orgs/nodejs',
{
method: 'GET',
});
const data = await response.json();
console.log(data);
}
request();
function request() {
fetch('https://api.github.com/orgs/nodejs', {
method: 'GET',
})
.then(response => {
return response.json();
})
.then(data => {
console.log(data);
});
}
request();
제네릭이란?
제네릭이란 데이터의 타입을 일반화한다는 것을 의미. 제네릭은 자료형을 정하지 않고 여러 타입을 사용할 수 있게 해준다. 이는 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하는 기법. 한 번의 선언으로 다양한 타입에 재사용이 가능하다는 장점이 있다~! 제네릭을 사용하면 따로 타입 변환을 할 필요가 없어 서능 향상 Good!
const example = <T>(arg: T):T => {
return arg;
}
여기서 <T>
는 Type의 약자로 제네릭을 선언할 때 T를 관용적으로 사용한다.
위의 예시에서 example
은 T라는 타입 변수를 가지게 된다.
그리고 arg
와 반환값의 타입은 T라는 타입변수로 동일하다.
위의 예시를 좀 더 활용해보면
const example = <T>(arg: T[]):T[] => {
console.log(arg.length);
return arg;
}
이제 이 함수는 T라는 변수 타입을 받고 파라미터로는 배열 형태의 T를 받는다.
example([1,2,3])
이런 식의 형태로 사용할 수 있다.
const example2 = <T, U>(v: T, u: U):[T, U] => {
return [v, u];
}
두 변수의 타입이 다를 경우 두 가지의 타입 변수가 필요하다.
이런 경우 관용적으로 사용하는 T
다음으로 오는 알파벳을 순서대로 사용한다.
잘못된 예시
function logTextLength<T>(text: T): T {
console.log(text.length);
return text;
}
logTextLength('hi');
위의 코드의 경우 length
부분에 T
형식에 length
속성이 없기 때문에 error!
💡올바른 예시
function logTextLength<T>(text: T[]): T[] {
console.log(text.length);
text.forEach(function(text) {
console.log(text);
});
return text;
}
logTextLength<string>(['hi', 'abc', 'def']);
interface LengthType {
length: number;
}
function logTextLength<T extends LengthType>(text: T): T {
text.length;
return text;
}
logTextLength("abc"); // 가능
logTextLength(10); // '10' 형식의 인수는 'LengthType' 형식의 매개 변수에 할당될 수 없습니다.ts(2345)
logTextLength({ length: 10 });
interface ShoppingItem {
name: string;
price: number;
stock: number;
}
function getShoppingItemOption<T extends keyof ShoppingItem>(itemOption: T): T {
return itemOption;
}
getShoppingItemOption(10); //'10' 형식의 인수는 '"name" | "price" | "stock"' 형식의 매개 변수에 할당될 수 없습니다.ts(2345)
getShoppingItemOption<string>('a'); // 'string' 형식이 '"name" | "price" | "stock"' 제약 조건을 만족하지 않습니다.ts(2344)
getShoppingItemOption('name'); // OK