React 환경에서 Toast UI Editor를 사용하여 게시글을 작성하고 업로드하는 기능을 구현하는 방법을 소개해 보려고 합니다. 특히, 사용자가 이미지를 업로드할 수 있게 하는
addImageBlobHook
을 이용한 처리 방법을 중점적으로 다룹니다. 설치부터 추가 플러그인 설정까지 알아보도록 하겠습니다!
Toast UI Editor는 다양한 기능과 플러그인을 지원하는 강력한 텍스트 편집기입니다. 시작하기 전에, 다음 패키지들을 설치해야 합니다.
npm install @toast-ui/react-editor
npm install @toast-ui/editor-plugin-color-syntax
그리고 스타일링을 위해 CSS 파일도 포함시켜야 합니다.
import '@toast-ui/editor/dist/toastui-editor.css';
import 'tui-color-picker/dist/tui-color-picker.css';
import '@toast-ui/editor-plugin-color-syntax/dist/toastui-editor-plugin-color-syntax.css';
Toast UI Editor의 세부 설정은 사용자 경험을 향상시키고 편집기의 기능을 최대한 활용할 수 있도록 도와줍니다. 다양한 툴바 아이템, 플러그인 설정, 그리고 커스텀 훅을 추가할 수 있습니다. 이를 통해 에디터를 보다 유연하게 사용자의 요구에 맞게 조정할 수 있습니다.
<Editor
ref={editorRef}
initialValue=" " // 에디터 초기에 표시될 값
previewStyle="vertical" // 편집과 미리보기가 세로로 분할되는 스타일
height="500px" // 에디터의 높이 설정
initialEditType="wysiwyg" // 에디터 초기 입력 모드 설정 ('wysiwyg' 또는 'markdown')
useCommandShortcut={true} // 키보드 단축키 사용 여부
/>
toolbarItems={[
['heading', 'bold', 'italic', 'strike'], // 텍스트 스타일링 옵션
['hr', 'quote'], // 구분선과 인용구 삽입
['ul', 'ol', 'task', 'indent', 'outdent'], // 리스트와 들여쓰기 옵션
['table', 'link', 'image'] // 테이블, 링크, 이미지 삽입
]}
npm install @toast-ui/editor-plugin-color-syntax // 설치
import "tui-color-picker/dist/tui-color-picker.css";
import "@toast-ui/editor-plugin-color-syntax/dist/toastui-editor-plugin-color-syntax.css";
import colorSyntax from "@toast-ui/editor-plugin-color-syntax";
// 스타일 임포트
plugins={[colorSyntax]} // 플러그인 추가
addImageBlobHook: 사용자가 이미지를 에디터에 삽입할 때 호출되는 훅입니다. 이 함수는 이미지를 서버로 업로드하고, 업로드된 이미지의 URL을 에디터에 자동으로 삽입하는 작업을 수행합니다.
addImageBlobHook
을 설정하는 방법은 아래와 같이 Editor 컴포넌트의 hooks
prop을 사용하여 지정할 수 있습니다.
<Editor
hooks={{
addImageBlobHook: addImageBlobHook
}}
/>
addImageBlobHook
은 사용자가 에디터에 이미지를 드래그 앤 드롭하거나 직접 삽입할 때 호출됩니다. 이 훅은 이미지 파일을 서버로 업로드 후, 이미지 URL을 에디터에 자동으로 삽입하는 역할을 합니다. 구현 방법은 다음과 같습니다.
const addImageBlobHook = async (blob, callback) => {
const token = localStorage.getItem('token');
if (!token) {
alert('로그인이 필요합니다.');
return;
}
try {
const response = await axios.post('https://api.yourdomain.com/api/upload', { /* 메타데이터 설정 */ }, {
headers: { 'Authorization': `Bearer ${token}` }
});
const presignedUrl = response.data.url;
await axios.put(presignedUrl, blob, { headers: { 'Content-Type': blob.type } });
callback(presignedUrl.split('?')[0], 'Image');
} catch (error) {
console.error('Image upload failed:', error);
alert('이미지 업로드 실패');
}
};
이렇게 살펴본 세부 설정을 통해 Toast UI Editor를 사용한 게시글 업로드 기능을 효과적으로 구현할 수 있습니다!