React의 State
이번 시간에는 리액트(React)의 상태(State)에 대해서 알아보도록 하겠습니다. 이 state는 고정적인 데이터가 아니라 변경될 수 있는 데이터를 처리할 때 효율적으로 사용될 수 있습니다. 재미있는 점은 실제로 state 값을 변경해서 화면(View)이 변경되면 render() 함수가 다시 실행되어 실제로 화면에 적용을 해준다는 점입니다.
또한 state를 사용하기 위해서는 이전 시간까지 작성했던 함수형 컴포넌트 대신에 클래스형 컴포넌트를 사용하셔야 합니다. props만 이용하고자 한다면 함수형 컴포넌트를 그대로 사용하세요. 다시 말해서 내부 객체의 값이 변경될 여지가 있다면 클래스형 컴포넌트로 state를 사용하고, 그렇지 않다면 props를 사용하시면 됩니다.
이전 시간에는 예제로 초 시계 렌더링(Rendering) 사례를 다룬 적 있습니다.
※ HTML 소스코드 ※
<div id="root"></div>
※ JavaScript 소스코드 ※
function tick() {
const element = (
<h3>현재 시각은 [{new Date().toLocaleTimeString()}] 입니다.</h3>
);
ReactDOM.render(element, document.getElementById('root'));
}
setInterval(tick, 1000);
일단 이 구성을 지난 시간에 배운 props를 활용해 보다 객체지향적으로 바꾸어 봅시다.
※ JavaScript 소스코드 ※
function Clock(props) {
return (
<h3>현재 시각은 [{props.date.toLocaleTimeString()}] 입니다.</h3>
);
}
function tick() {
ReactDOM.render(
<Clock date={new Date()}/>,
document.getElementById('root')
);
}
setInterval(tick, 1000);
현재 보이는 이러한 구성은 tick()이라는 특정한 함수 안에서 ReactDOM의 렌더링 함수를 불러오는 형식입니다. 이러한 방식보다 더 체계적인 구현 방식은 특정한 컴포넌트 안에서 render() 함수를 이용하여 렌더링이 수행되도록 하는 것입니다. 그러기 위해서는 Component 클래스를 상속 받아야 합니다. Component 클래스에는 내부적으로 render() 함수가 포함되어 있습니다.
※ JavaScript 소스코드 ※
class Clock extends React.Component {
render() {
return (
<h3>현재 시각은 [{this.props.date.toLocaleTimeString()}] 입니다.</h3>
);
}
}
function tick() {
ReactDOM.render(
<Clock date={new Date()}/>,
document.getElementById('root')
);
}
setInterval(tick, 1000);
이로써 Clock 클래스의 인스턴스 하나만 사용되는 형태로 구현이 완료되었습니다. 다만 여기에서 생성자(Constructor)를 이용해서 Clock 클래스 멤버 변수로서 Date 객체를 처리하도록 하면 더욱 객체 지향적일 것입니다. 바로 이 때 상태(State)가 사용됩니다.
또한 state를 사용할 때는 반드시 생성자를 만들어 주어서 state에 대한 초기화를 진행해주셔야 합니다.
※ JavaScript 소스코드 ※
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<h3>현재 시각은 [{this.state.date.toLocaleTimeString()}] 입니다.</h3>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
위 코드를 보시면 props가 state로 대체된 것을 확인할 수 있습니다. 실제로 이와 같이 특정한 값이 계속 변경되는 형태를 보일 때는 보통 state을 사용하게 됩니다. 하지만 현재 state 값이 변경되는 로직이 코드에 없습니다. state는 props와 다르게 부모 컴포넌트에서 값을 넘겨주는 형태로 사용되지 않기 때문이에요. 그래서 위 소스코드는 실행했을 때 실제로 시간이 변경되지 않습니다. 또한 추가적으로 알아두어야 할 것은 state 값을 수정하고자 할 때는 setState() 함수를 이용해야 한다는 점입니다.
따라서 컴포넌트 라이프 사이클 함수를 이용하시면 됩니다. 이전에 props를 사용할 때는 미리 Date 객체를 생성해서 자식 컴포넌트인 Clock 컴포넌트에게 데이터를 보내주어야 했지만 state를 이용하게 되면 내부적으로 데이터를 함수에 의해서 처리하게 됩니다. 반면에 props는 컴포넌트 내부 함수를 이용해서 변경될 수 없다는 특징이 있어요. 결과적으로 우리는 state 값을 변경하기 위해서 컴포넌트 라이프 사이클을 이용하게 될 것입니다. 컴포넌트 라이프 사이클에 대한 자세한 내용은 다음 시간에 진행하게 되며, 일단 간단히 예제를 알아보도록 해요.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
componentDidMount() {
this.timerID = setInterval(() => this.tick(), 1000);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
return (
<h3>현재 시각은 [{this.state.date.toLocaleTimeString()}] 입니다.</h3>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
결과적으로 다시 다음과 같이 1초에 한 번씩 시간 데이터가 갱신되는 것을 확인할 수 있습니다.
따라서 state를 사용하는 이유에 대해서 더욱 자세히 알아보기 위해 버튼 이벤트가 발생할 때마다 특정한 객체의 값이 변경되는 사례를 확인해보도록 하겠습니다. 현재 시각을 처음에 한 번 기록해 놓은 뒤에, 특정 버튼을 누를 때마다 시각이 10초씩 뒤로 밀려나도록 처리하겠습니다.
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {
date: new Date()
}
}
goBack() {
let nextDate = this.state.date;
nextDate.setSeconds(nextDate.getSeconds() - 10);
this.setState({
date: nextDate
});
}
render() {
return (
<div>
<h3>현재 시각은 [{this.state.date.toLocaleTimeString()}] 입니다.</h3>
<button onClick={this.goBack.bind(this)}>10초 뒤로가기</button>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
기본적으로 우리가 사용하고 있는 ES6 문법에서는 자동으로 함수가 바인딩 처리 되지 않습니다. 그래서 직접 메소드를 바인딩 처리 해주셔야 하며 바인딩을 하지 않는 경우 리액트 객체가 정상적으로 처리되지 않습니다.
(+ 추가)
state의 개념을 지금 한 번에 이해할 필요는 없습니다. 추후에 프로젝트 예제를 다루면서 state를 사용하면 보다 깔끔하게 이해할 수 있을 거예요. 대략 이런 개념이 있다는 것 정도만 이해하고 넘어가세요.
'리액트(React)' 카테고리의 다른 글
| React 이벤트 처리(Event Handling) (2) | 2019.01.04 |
|---|---|
| React의 LifeCycle과 API 호출 (3) | 2019.01.04 |
| React의 Component와 Props (0) | 2018.12.25 |
| React에서 JSX란? (0) | 2018.12.25 |
| 코드펜(Codepen)을 이용한 React 개발환경 구축하기 (0) | 2018.12.25 |
React의 Component와 Props
리액트(React)에서 컴포넌트(Component)는 자바스크립트 함수와 흡사하다고 보시면 됩니다. 또한 이러한 컴포넌트는 프롭스(Props)를 입력으로 받아서 리액트 요소(React Element)를 반환하는 형태로 동작합니다. 이러한 구조를 따르면 사용자가 보는 웹 페이지의 화면을 효과적으로 구성할 수 있습니다. 프롭스(Props)는 속성(Property)의 약자입니다. 흔히 자바(Java), 파이썬(Python) 등의 객체 지향 프로그래밍에서 사용하는 그 '속성'의 의미와 동일하다고 보시면 이해하기 쉽습니다.
간단한 예제를 통해서 Component와 Props에 대해서 알아보도록 합시다. 또한 일단 함수형 컴포넌트를 이용할 것입니다.
※ HTML 소스코드 ※
<div id="root"></div>
※ JavaScript 소스코드 ※
function Show(props) {
return (
<h3>
Name is {props.name}
</h3>
);
}
const element = <Show name="나동빈"/>;
ReactDOM.render(element, document.getElementById('root'));
보시면 아까 언급했듯이 컴포넌트 형태로 사용되는 Show가 자바스크립트 함수처럼 props를 입력으로 받아서 리액트 요소를 반환하는 것을 알 수 있습니다. ReactDOM.render() 함수는 첫 번째 매개변수로 특정한 컴포넌트(Component)를 받습니다. 그래서 자신이 원하는 컴포넌트를 넣어주기만 하면 되는 것입니다. 그렇기 때문에 다음과 같은 형태로도 사용할 수 있습니다.
ReactDOM.render(<Show name="나동빈"/>, document.getElementById('root'));
또한 특정한 컴포넌트(Component)의 props는 디폴트(Default) 값을 설정할 수 있습니다.
※ JavaScript 소스코드 ※
function Show(props) {
return (
<h3>
Name is {props.name}
</h3>
);
}
Show.defaultProps = {
name: '홍길동'
};
ReactDOM.render(<Show/>, document.getElementById('root'));
또한 기본적으로 특정한 컴포넌트가 다른 컴포넌트의 결과를 반환하도록 할 수도 있으며, 매우 다양하게 활용할 수 있습니다. 아래 예제를 보시면 실제로 컴포넌트를 두 번 거치면서 많은 내용들이 추가되는 것을 알 수 있습니다. 다시 말해서 이와 같이 리액트를 활용하면 뷰(View)를 표현할 때 보다 효과적으로 코딩할 수 있는 것입니다.
※ JavaScript 소스코드 ※
function Show(props) {
return (
<h3>
Name is {props.name}
</h3>
);
}
function App() {
return (
<main>
<Show name="나동빈"/>
<Show name="홍길동"/>
<Show name="이순신"/>
</main>
);
}
ReactDOM.render(<App/>, document.getElementById('root'));
여기까지 이해하셨다면 이제 실제로 리액트(React)를 이용해서 뷰(View)를 그럴싸하게 만들어보는 예제를 다루어 봅시다.
※ JavaScript 소스코드 ※
function User(props) {
return (
<div>
<img src={props.user.imageUrl}/>
<strong>{props.user.name}</strong>
</div>
);
}
function Board(props) {
return (
<section>
<User user={props.user}/>
{props.title}
<hr/>
{props.content}
</section>
);
}
const board = {
title: '게시글 제목입니다.',
content: '게시글 내용입니다. 반갑습니다.',
user: {
name: '나동빈',
imageUrl: 'https://placeimg.com/32/32/any'
}
}
ReactDOM.render(
<Board
title={board.title}
content={board.content}
user={board.user}
/>,
document.getElementById('root')
);
'리액트(React)' 카테고리의 다른 글
| React의 LifeCycle과 API 호출 (3) | 2019.01.04 |
|---|---|
| React의 State (0) | 2018.12.25 |
| React에서 JSX란? (0) | 2018.12.25 |
| 코드펜(Codepen)을 이용한 React 개발환경 구축하기 (0) | 2018.12.25 |
| React JS의 개요와 Hello World (0) | 2018.12.25 |
React에서 JSX란?
JSX는 자바스크립트(JavaScript) 문법의 확장판입니다. JSX는 리액트(React)에서의 요소(Element)를 제공합니다. 또한 향후 리액트의 컴포넌트(Component)에 대해서 공부하게 될 것입니다. 이러한 컴포넌트는 항상 렌더링을 수행한다는 특징이 있습니다. render() 함수로 이를 구현하게 됩니다.
다음의 소스코드를 실행해 봅시다.
※ HTML 코드 ※
<div id="root"></div>
※ CSS 코드 ※
.blue {
color: blue;
}
.red {
color: red;
}
※ JavaScript 코드 ※
function formatInfo(student) {
return student.name + "[" + student.id + "]";
}
const student = {
id: '20153157',
name: 'Dongbin Na',
color: 'blue'
};
const element = (
<h3 class={student.color}>
{formatInfo(student)}
</h3>
);
ReactDOM.render(element, document.getElementById('root'));
기본적으로 element라는 변수에는 HTML 태그가 포함되어 있고 문자열도 포함되어 있습니다. 이런 것들을 JSX라고 이해하시면 됩니다. 우리가 지난 시간에 설정했던 바벨(Babel)이 JSX 로더를 이용하여 실질적으로 JSX가 동작하게 해줍니다.
위 소스코드를 보면 알 수 있듯이 JSX에서는 중괄호를 이용하여 자바스크립트(JavaScript) 구문을 실행할 수 있습니다. 이러한 중괄호는 속성의 값으로도 들어갈 수 있다는 점에서 사용이 편리합니다.
또한 React DOM은 렌더링을 하기 전에 JSX에 포함된 값을 이스케이프 처리합니다. 그래서 XSS로부터 안전합니다. 또한 기본적으로 JSX는 카멜 케이스(Camel Case)를 사용한다는 점에서 기존의 자바(Java) 개발자들에게 익숙하다는 특징이 있습니다.
리액트에서 요소(Element)를 렌더링하는 것은 매우 간단합니다. 일반적인 브라우저의 DOM 객체와는 다르게 리액트의 객체는 가볍고 강력하다는 특징이 있습니다. React DOM은 브라우저의 DOM이 리액트 요소와 매칭될 수 있도록 관리합니다.
실제로 React DOM이 얼마나 효율적인지는 다음의 소스코드로 확인해 볼 수 있습니다.
※ HTML 코드 ※
<div id="root"></div>
※ JavaScript 코드 ※
function tick() {
const element = (
<h3>현재 시각은 [{new Date().toLocaleTimeString()}] 입니다.</h3>
);
ReactDOM.render(element, document.getElementById('root'));
}
setInterval(tick, 1000);
실제로 크롬(Chrome) 브라우저에서 렌더링 되는 것을 확인해 보시면 시각에 해당하는 부분만 다시 렌더링 되는 것을 확인할 수 있습니다.
'리액트(React)' 카테고리의 다른 글
| React의 LifeCycle과 API 호출 (3) | 2019.01.04 |
|---|---|
| React의 State (0) | 2018.12.25 |
| React의 Component와 Props (0) | 2018.12.25 |
| 코드펜(Codepen)을 이용한 React 개발환경 구축하기 (0) | 2018.12.25 |
| React JS의 개요와 Hello World (0) | 2018.12.25 |
코드펜(Codepen)을 이용한 React 개발환경 구축하기
코드펜(Codepen)은 프론트 엔드(Front-End) 개발에 있어서 매우 유용한 사이트입니다. 굳이 우리의 로컬 컴퓨터에 개발환경을 구축하지 않아도 빠르고 효과적으로 웹 사이트 상에서 소스코드를 작성하여 테스트 해 볼 수 있습니다.
▶ 코드펜 사이트: https://codepen.io/
앞으로 작성할 다양한 프로젝트를 손쉽게 관리하기 위해서 가장 먼저 '회원가입'부터 진행해주도록 합시다. [Sign Up for Free] 버튼을 누르시면 회원가입 페이지로 이동합니다.
저는 위와 같이 제 이메일 주소로 회원가입을 진행했습니다.
회원가입 이후에는 메인 페이지로 이동해서 바로 프로젝트를 만들어서 코딩을 시작할 수 있습니다. 저는 생성(Create) 버튼을 눌러서 프로젝트를 만들어 보도록 하겠습니다.
프로젝트를 만드실 때에는 [Pen]으로 만드시면 됩니다.
저는 바로 제목을 바꾸어주었고, 간단한 HTML 소스코드를 작성하여 저장(Save) 해보았습니다. 소스코드를 수정하면 알아서 화면이 새로고침 되면서 정상적으로 동작하는 것을 확인할 수 있습니다.
이제 리액트(React) 개발환경을 구축하기 위해 설정(Settings) 탭을 열어봅시다.
기본적으로 리액트는 자바스크립트 라이브러리이므로 JavaScript 탭을 확인하시면 됩니다.
바로 검색창에서 [react]와 [react-dom]을 검색하여 추가합니다.
- React: 컴포넌트를 처리합니다.
- React Dom: 웹 문서의 Dom에 렌더링을 진행합니다.
추가를 해보시면 다음과 같이 성공적으로 CDN 경로를 불러옵니다.
이어서 JSX 등의 기능을 이용하기 위해 바벨(Babel)로 설정합니다.
일단 세팅이 완료되었다면 정상적으로 동작하는지 여부를 확인하기 위해서 Hello React예제를 만들어 보겠습니다. 다음과 같이 소스코드를 작성해주세요.
※ HTML 코드 ※
<div id="root"></div>
※ JavaScript 코드 ※
class HelloReact extends React.Component {
render() {
return (
<h1>Hello React!</h1>
);
}
}
ReactDOM.render(<HelloReact/>, document.getElementById('root'));
이 때 컴포넌트는 자바스크립트 클래스 중 하나입니다. React.Component라는 이름으로 준비되어 있습니다. 기본적으로 리액트를 이용한다는 것은 이러한 다양한 리액트 라이브러리를 상속 받아서 활용하는 것이라고 이해하시면 됩니다. (자바스크립트 ES6 버전부터 클래스가 도입되었으며 일반적인 객체 지향 프로그래밍과 동일하게 클래스를 사용하시면 됩니다.)
'리액트(React)' 카테고리의 다른 글
| React의 LifeCycle과 API 호출 (3) | 2019.01.04 |
|---|---|
| React의 State (0) | 2018.12.25 |
| React의 Component와 Props (0) | 2018.12.25 |
| React에서 JSX란? (0) | 2018.12.25 |
| React JS의 개요와 Hello World (0) | 2018.12.25 |
React JS의 개요와 Hello World
리액트(React)는 UI를 효과적으로 구축하기 위해 사용하는 자바스크립트(JavaScript) 기반의 라이브러리입니다. 그러므로 HTML과 자바스크립트를 할 수 있다면 리액트도 어렵지 않게 사용할 수 있습니다. 또한 리액트는 라이브러리라는 점에서 다른 라이브러리들과 함께 사용할 수 있어 효율적입니다. 무엇보다 리액트는 오픈소스 커뮤니티가 매우 방대하다는 장점이 있습니다.
다시 말해서 리액트(React)를 배우기 전의 선행 과정은 JavaScript입니다. 또한 추가적으로 jQuery와 같은 다른 라이브러리를 사용해 본 경험이 있다면 리액트의 장점 및 필요성에 대해서 보다 쉽게 이해할 수 있을 것이라고 생각합니다.
이 강좌는 초반부에는 리액트의 개요 및 사용 방법에 대해서 다루기 때문에 조금 지루할 수 있습니다. 다만 1시간 가량만 실습을 하더라도 기본적인 사용 방법에 대해서 알 수 있으며, 이후에는 바로 실습을 진행하며 공부하게 되므로 재미있게 학습하실 수 있습니다.
▶ 리액트 오픈소스: https://github.com/facebook/react
리액트(React) 오픈소스는 별점이 10만 개가 넘는 유명한 프로젝트입니다. (그래서 리액트를 제대로 다룰 줄 모르는 저는 마치 저만 쓸 줄 모르는 것 같은 소외감을 느끼곤 했습니다.) 또한 MIT 라이센스를 따른다는 점에서 상당히 자유롭게 사용할 수 있는 편입니다.
※ 리액트의 특징 ※
- 선언적(Declarative): 리액트는 대화형 UI를 작성하기에 유리합니다. 데이터가 변경되었을 때 효율적으로 렌더링을 수행할 수 있도록 합니다.
- 컴포넌트 기반(Component-Based): 캡슐화된(Encapsulated) 컴포넌트가 상태를 관리하고 UI를 효과적으로 구성할 수 있습니다.
- 한 번 배워서 어디에서나 사용하기(Learn Once, Write Anywhere): 기존의 소스코드를 불필요하게 다시 작성하지 않고 새로운 기능을 개발할 수 있습니다.
이러한 리액트는 공식 문서를 읽으면서 바로 공부를 시작해 볼 수 있습니다.
▶ 리액트 학습 사이트: https://reactjs.org/docs/getting-started.html
또한 기본적으로 리액트는 단순히 웹 환경에서 돌릴 수 있다는 점에서 굳이 우리 로컬(Local) 컴퓨터에 개발 환경을 구축하지 않아도 충분히 온라인 상에서 소스코드를 테스트 해 볼 수 있습니다.
▶ 리액트 사용해보기: https://reactjs.org/redirect-to-codepen/hello-world
※ 리액트의 장점과 단점 ※
리액트는 뛰어난 성능을 가지고 있으며 클라이언트 렌더링 뿐만 아니라 서버 사이드 렌더링도 지원합니다. 그래서 Ajax 등과 같은 비동기 방식과 비교했을 때 검색 엔진 최적화(SEO) 등에 있어서 유리한 형태로 소스코드를 작성할 수 있습니다. 이러한 검색 엔진 최적화 문제는 상당수 SPA 프로젝트가 가지는 문제입니다.
또한 리액트는 이미 많은 웹 서비스가 채택한 기술이라는 점에서 그에 따라서 오는 부가적인 장점이 있습니다.
▶ 리액트를 사용한 서비스들: https://github.com/facebook/react/wiki/Sites-Using-React
확인을 해보시면 페이스북(Facebook), 인스타그램(Instagram) 등 유명한 서비스가 포함되어 있습니다.
(+ 추가)
또한, 리액트를 시작하기 전에 자바(Java), C++ 등을 해 본 사람을 위해서 이것이 무슨 라이브러리인지 쉽게 설명해드리겠습니다. 기존에 웹 사이트를 만들 때에는 보통 프론트 엔드 부분을 객체 지향적으로 작성하지는 않았어요. 백 엔드에서나 객체 지향 기법을 적절히 따르면서 개발했죠. 하지만 리액트는 프론트 엔드 또한 매우 객체 지향적으로 작성하도록 해주는 라이브러리라고 보시면 됩니다.
그리고 기존에 JavaScript 및 jQuery까지 사용해보신 분들이라면 리액트(React) 과정은 하루에서 이틀 정도 잡으시고 빠르게 끝내시는 것을 추천드립니다. 어렵게 생각하지 마시고 단순한 라이브러리 따위 하루만에 정복하겠다는 거만한(?) 마인드로 공부하시면 좋아요.
'리액트(React)' 카테고리의 다른 글
| React의 LifeCycle과 API 호출 (3) | 2019.01.04 |
|---|---|
| React의 State (0) | 2018.12.25 |
| React의 Component와 Props (0) | 2018.12.25 |
| React에서 JSX란? (0) | 2018.12.25 |
| 코드펜(Codepen)을 이용한 React 개발환경 구축하기 (0) | 2018.12.25 |
슬랙 챗봇 만들기 [협업 메신저 끝판왕 슬랙(Slack) 7강]
슬랙(Slack) 챗봇(Chat Bot)은 사용자가 슬랙 봇에게 말을 걸었을 때 그에 대한 적절한 응답을 수행하는 봇을 의미합니다. 그래서 슬랙 챗봇을 구현하고자 한다면 사용자가 챗봇을 부르는 과정을 이벤트(Event)로 받아들여 슬랙 챗봇이 동작하도록 해야 합니다. 따라서 이전 시간에 이어서 슬랙 챗봇을 구현해보도록 하겠습니다. 가장 먼저 이벤트 구독(Event Subscriptions) 탭에 들어갑니다.
이후에 [Enable Events]를 활성화(On)로 설정할 수 있습니다.
활성화로 설정한 이후에는 다음과 같이 요청 URL을 입력하는 부분이 활성화 됩니다.
이후에 아래쪽에서 봇 이벤트(Bot Events)로 app_mention을 설정할 수 있습니다. app_mention을 설정하면 해당 슬랙 앱이 멘션(Mention) 되었을 때 이벤트가 발생합니다.
이벤트가 발생하면 특정한 URL로 요청(Request)을 보내게 되는 것입니다. 이제 실제로 요청이 들어왔을 때 이를 처리하는 파이썬 챗봇 모듈을 개발해보겠습니다.
# -*- coding: utf-8 -*-
import json
from slacker import Slacker
from flask import Flask, request, make_response
token = "봇 유저 토큰 값"
slack = Slacker(token)
app = Flask(__name__)
def get_answer():
return "안녕하세요."
# 이벤트 핸들하는 함수
def event_handler(event_type, slack_event):
if event_type == "app_mention":
channel = slack_event["event"]["channel"]
text = get_answer()
slack.chat.post_message(channel, text)
return make_response("앱 멘션 메시지가 보내졌습니다.", 200, )
message = "[%s] 이벤트 핸들러를 찾을 수 없습니다." % event_type
return make_response(message, 200, {"X-Slack-No-Retry": 1})
@app.route("/slack", methods=["GET", "POST"])
def hears():
slack_event = json.loads(request.data)
if "challenge" in slack_event:
return make_response(slack_event["challenge"], 200, {"content_type": "application/json"})
if "event" in slack_event:
event_type = slack_event["event"]["type"]
return event_handler(event_type, slack_event)
return make_response("슬랙 요청에 이벤트가 없습니다.", 404, {"X-Slack-No-Retry": 1})
if __name__ == '__main__':
app.run('0.0.0.0', port=8080)
이제 테스트를 위해서 엔그록(Ngrok)을 이용해 공인 URL을 일시적으로 만들어보도록 하겠습니다.
이제 만들어진 공인 URL을 슬랙 봇의 요청 URL로 설정할 수 있습니다.
설정했을 때 Verified라고 메시지가 출력되면 성공입니다. 이제 한 번 챗봇을 불러보도록 합시다.
초대한 이후에 다시 챗봇을 불러보면 챗봇이 성공적으로 응답합니다.
Ngrok의 로그를 확인해 보았을 때에도 성공적으로 슬랙 API와 통신한 것을 확인할 수 있습니다.
'기타' 카테고리의 다른 글
| Freenom 서비스로 무료 도메인 호스팅 이용하기! (2) | 2018.12.31 |
|---|---|
| Xshell 6 개인 무료 라이센스로 설치하여 사용하는 방법 (0) | 2018.12.31 |
| 슬래커(Slacker)로 슬랙 봇 이용하기 [협업 메신저 끝판왕 슬랙(Slack) 6강] (1) | 2018.12.23 |
| 슬랙 앱 추가하여 사용해보기 [협업 메신저 끝판왕 슬랙(Slack) 5강] (0) | 2018.12.23 |
| 슬랙 기본 설정하기 [협업 메신저 끝판왕 슬랙(Slack) 4강] (0) | 2018.12.23 |
슬래커(Slacker)로 슬랙 봇 이용하기 [협업 메신저 끝판왕 슬랙(Slack) 6강]
슬랙에서는 자신이 직접 슬랙 봇(Slack Bot)을 개발하여 슬랙 앱(Slack App)으로 이용할 수 있습니다. 더불어 파이썬의 슬래커(Slacker) 라이브러리를 이용하여 자신이 만든 슬랙 봇을 매우 쉽고 효과적으로 활용할 수 있습니다. 기본적으로 슬랙 앱(Slack App)을 만들기 위해서는 슬랙 앱 API 페이지로 이동해야 합니다.
▶ 슬랙 앱 API 페이지: https://api.slack.com/apps
해당 API 페이지에서 하나의 앱(App)을 새롭게 만들 수 있습니다.
저는 다음과 같이 하나의 슬랙 앱을 만들어보도록 하겠습니다.
가장 먼저 [Bots] 탭으로 이동하여 봇 유저(Bot User)를 만들어 볼 수 있습니다.
이후에 [OAuth & Permissions] 탭으로 이동해서 워크스페이스에 앱을 설치(Install)할 수 있습니다. 우리가 만든 슬랙 앱을 실제로 프로젝트 상에서 사용할 수 있는 것입니다.
결과적으로 [Bot User OAuth Access Token] 값이 나옵니다. 이 토큰 값을 이용해서 우리가 만든 슬랙 봇이 슬랙 워크스페이스에서 말을 하게 하는 등의 다양한 기능을 수행할 수 있습니다.
저는 해당 슬랙 봇이 말을 할 수 있도록 하기 위해서 범위(Scopes)에 chat:write:user 권한을 줬습니다.
이제 슬래커(Slacker) 라이브러리를 이용해서 슬랙 토큰 값을 활용해 특정 채널에 메시지를 전송할 수 있습니다.
from slacker import Slacker
# 슬랙 토큰으로 객체 생성
token = '슬랙 토큰 값'
slack = Slacker(token)
# 메시지 전송 (#채널명, 내용)
slack.chat.post_message('#random', 'Slacker 테스트')
실제로 소스코드를 구동시켜 보면 다음과 같이 슬랙 봇이 메시지를 전송한 것을 알 수 있습니다.
'기타' 카테고리의 다른 글
| Xshell 6 개인 무료 라이센스로 설치하여 사용하는 방법 (0) | 2018.12.31 |
|---|---|
| 슬랙 챗봇 만들기 [협업 메신저 끝판왕 슬랙(Slack) 7강] (2) | 2018.12.23 |
| 슬랙 앱 추가하여 사용해보기 [협업 메신저 끝판왕 슬랙(Slack) 5강] (0) | 2018.12.23 |
| 슬랙 기본 설정하기 [협업 메신저 끝판왕 슬랙(Slack) 4강] (0) | 2018.12.23 |
| 슬랙(Slack)에서 다양한 메시지 보내기 [협업 메신저 끝판왕 슬랙(Slack) 3강] (0) | 2018.12.23 |
슬랙 앱 추가하여 사용해보기 [협업 메신저 끝판왕 슬랙(Slack) 5강]
슬랙(Slack)에서는 슬랙 앱(Slack App) 기능을 이용하여 프로젝트를 더욱 효과적으로 관리할 수 있습니다. 이번 시간에는 다른 사람들이 만들어 놓은 슬랙 앱을 간단히 사용해 보며 슬랙 앱을 어떻게 이용할 수 있는지에 대해서 알아보도록 하겠습니다. 기본적으로 슬랙 앱을 관리하고자 한다면 [Manage apps] 탭으로 이동하여 슬랙 앱을 관리할 수 있습니다.
처음에는 어떠한 앱도 설치가 안 되어 있습니다. [Browse the App Directory]에 들어가서 앱을 찾을 수 있습니다.
이후에 웹 페이지 환경에서 슬랙 앱을 검색하여 설치를 진행할 수 있습니다. 저는 가장 먼저 지피(Giphy)를 사용해보도록 하겠습니다. 지피는 자동으로 이미지를 검색하여 슬랙 채널에 이미지를 출력해주는 역할을 수행합니다.
설치 이후에는 설정을 수행할 수 있습니다. 저는 모든 GIF 이미지를 찾아오도록 설정을 진행했습니다.
설치 이후에는 [Apps] 탭에서 설치된 앱을 확인할 수 있습니다.
설치된 지피(Giphy)를 사용할 때는 단순히 /giphy {이미지 이름}의 형태로 사용할 수 있습니다.
이어서 할 일 목록을 관리해주는 투두이스트(Todoist)를 사용해보도록 하겠습니다.
투두이스트는 관련 사이트에서 설치를 진행해야 사용할 수 있습니다.
따라서 사용법 글에 있는 링크를 타고 들어가서 연동을 진행하시면 됩니다.
연동까지 마치고 나면 다음과 같이 /todoist {해야 할 일} 명령어 형태로 투두이스트를 사용할 수 있습니다.
명령어 실행 결과 다음과 같이 해야 할 일 항목이 작성된 것을 확인할 수 있습니다.
'기타' 카테고리의 다른 글
| 슬랙 챗봇 만들기 [협업 메신저 끝판왕 슬랙(Slack) 7강] (2) | 2018.12.23 |
|---|---|
| 슬래커(Slacker)로 슬랙 봇 이용하기 [협업 메신저 끝판왕 슬랙(Slack) 6강] (1) | 2018.12.23 |
| 슬랙 기본 설정하기 [협업 메신저 끝판왕 슬랙(Slack) 4강] (0) | 2018.12.23 |
| 슬랙(Slack)에서 다양한 메시지 보내기 [협업 메신저 끝판왕 슬랙(Slack) 3강] (0) | 2018.12.23 |
| 슬랙에서 채널 생성 및 관리하기 [협업 메신저 끝판왕 슬랙(Slack) 2강] (0) | 2018.12.23 |
슬랙 기본 설정하기 [협업 메신저 끝판왕 슬랙(Slack) 4강]
이번 시간에는 슬랙(Slack) 기본 설정을 하는 방법에 대해서 알아보도록 하겠습니다. 처음 슬랙을 시작했을 때 초기 설정을 하는 방법에 대해서 잘 모르면 슬랙을 바르게 이용할 수 없습니다. 따라서 개인 프로필 설정을 하는 방법부터, 원하는 기능에 대한 알람을 적절히 받고 방해 금지 모드(Do not disturb mode)를 사용하는 방법 등에 대해서 다루어보도록 하겠습니다.
맨 처음에 슬랙 워크스페이스에 초대되면 다음과 같은 화면이 등장합니다. 맨 처음에는 계정 정보를 저장하는 것부터 진행하시는게 좋습니다. 'Save Your Account' 버튼을 눌러서 초기 정보를 입력합니다.
※ 프로필 설정 ※
다음과 같이 이름 및 비밀번호를 설정하고, 팀 정보를 확인할 수 있습니다.
이후에는 가장 먼저 프로필 설정을 진행해서 자신이 어떤 사람인지 팀 구성원에게 알리는 것이 좋습니다.
따라서 'Profile & account' 탭에 들어가도록 합니다.
이후에 프로필 편집을 진행하시면 됩니다.
저는 다음과 같이 프로필 사진을 설정해보았습니다.
※ 슬랙 워크스페이스 기본 설정 ※
슬랙 워크스페이스 자체에 대한 기본 설정을 하고자 한다면 관리자(Administration) 탭에서 'Workspace settings'에 들어가시면 됩니다.
워크스페이스 설정 페이지에서는 워크스페이스의 아이콘(Icon) 등을 설정할 수 있습니다.
저는 위와 같이 워크스페이스의 아이콘도 설정을 진행해보았습니다.
※ 슬랙 알림 설정 ※
슬랙 알림 설정을 할 때는 Preferences 탭에 들어가서 진행하면 됩니다.
일반적으로 알림이 발생했을 때 우리 컴퓨터에서 바로 알림을 확인할 떄는 'Enable desktop notifications'를 누르시면 됩니다.
크롬(Chrome) 브라우저를 이용하는 경우 위와 같이 알림을 허용하여 알림을 쉽게 받을 수 있습니다. 이후에는 다음과 같이 구체적으로 어떤 상황에서 알림을 받을지 설정할 수 있습니다. 저는 개인 쪽지(Direct Messages) 혹은 멘션 등에 대해서만 알림을 받도록 했습니다.
또한 방해 금지(Do Not Disturb) 모드를 설정하면 특정한 시간에 대해서는 알림(Notification)을 띄우지 않습니다.
'기타' 카테고리의 다른 글
| 슬래커(Slacker)로 슬랙 봇 이용하기 [협업 메신저 끝판왕 슬랙(Slack) 6강] (1) | 2018.12.23 |
|---|---|
| 슬랙 앱 추가하여 사용해보기 [협업 메신저 끝판왕 슬랙(Slack) 5강] (0) | 2018.12.23 |
| 슬랙(Slack)에서 다양한 메시지 보내기 [협업 메신저 끝판왕 슬랙(Slack) 3강] (0) | 2018.12.23 |
| 슬랙에서 채널 생성 및 관리하기 [협업 메신저 끝판왕 슬랙(Slack) 2강] (0) | 2018.12.23 |
| 슬랙의 개요 및 시작하기 [협업 메신저 끝판왕 슬랙(Slack) 1강] (0) | 2018.12.23 |
슬랙(Slack)에서 다양한 메시지 보내기 [협업 메신저 끝판왕 슬랙(Slack) 3강]
슬랙(Slack)을 이용하면 다양한 채널에서 사용자들이 서로 대화를 나눌 수 있습니다. 이 때 채널에 보낼 수 있는 메시지는 굉장히 다양한데요. 단순히 문자열만 보낼 수 있는 것이 아니라 소스코드, 멘션(Mention), 이모티콘 등의 다양한 메시지를 전송할 수 있습니다.
메시지를 전송하는 방법에 대해서 하나씩 알아보도록 하겠습니다.
※ 다른 사용자 언급하기 ※
다른 사용자를 언급할 때는 @ 기호를 사용합니다.
메시지 창에서 오른쪽에 있는 멘션 기호 @를 이용하여 특정 대상을 지칭할 수 있습니다. 흔히 말하는 태그(Tag)와 같습니다.
※ 이미지 첨부 ※
슬랙에서 이미지 첨부는 매우 간단합니다. 단순히 원하는 이미지를 복사하여 클립보드(Clipboard)에 담은 이후에 슬랙 대화 창에서 붙여넣기(Paste)를 진행하시면 됩니다.
※ 코드 붙여넣기 ※
코드를 붙여넣고자 할 때는 왼쪽의 (+) 버튼을 눌러서 'Code or text snippet' 탭을 누르시면 됩니다.
소스코드를 올릴 때는 소스코드의 언어 유형 등을 함께 입력하여 소스코드를 안정적으로 기입할 수 있습니다.
또한 업로드가 된 소스코드에 대해서는 'More actions' 탭에서 'View details'로 들어가면 구체적인 소스코드를 확인할 수 있습니다.
※ 이모티콘 전송하기 ※
이모티콘을 전송하고자 할 때는 텍스트 입력창의 오른쪽에 있는 이모티콘 버튼을 누르면 됩니다.
또한 특정한 댓글에 대해서 감정을 표시할 수 있습니다. 좋아요를 누르듯이 감정을 표시하는 거예요.
※ 이모티콘 추가하기 ※
슬랙(Slack)은 원하는 이미지를 이용하여 특정한 이모티콘을 추가할 수 있습니다. 'add custom emoji here' 버튼을 누르면 됩니다.
이모티콘 추가 페이지로 이동해서 실제로 특정한 이미지를 추가하면 됩니다.
저는 한 번 패럿(Parrot) 이미지를 추가해보도록 하겠습니다.
일단 위와 같이 저는 .gif 형태로 이미지를 저장했습니다.
업로드 이후에 저장(Save)을 수행하면 다음과 같이 이모티콘이 등록됩니다.
이후에 슬랙에서 편하게 이모티콘을 사용할 수 있습니다.
'기타' 카테고리의 다른 글
| 슬랙 앱 추가하여 사용해보기 [협업 메신저 끝판왕 슬랙(Slack) 5강] (0) | 2018.12.23 |
|---|---|
| 슬랙 기본 설정하기 [협업 메신저 끝판왕 슬랙(Slack) 4강] (0) | 2018.12.23 |
| 슬랙에서 채널 생성 및 관리하기 [협업 메신저 끝판왕 슬랙(Slack) 2강] (0) | 2018.12.23 |
| 슬랙의 개요 및 시작하기 [협업 메신저 끝판왕 슬랙(Slack) 1강] (0) | 2018.12.23 |
| Ngrok을 이용하여 공인 IP 없이 웹 서버 운영하기 (0) | 2018.12.19 |
