본문 바로가기
개인 공부/연결, 설치

[Spring] CKEditor5 연결 ~ 사용

by 육츠 2024. 10. 10.
Contents 접기

CKEditor

 

CKEditor 5 - Download Latest Version

Download a ready-to-use CKEditor 5 Build. Install, download or serve a ready-to-use rich text editor of your choice.

ckeditor.com

 

어떻게 가져와 사용할 것인지는 자유

 

내가 사용한 방법

1. head 태그 안에 CDN 을 복사해 넣는다.

<!--ckeditor -->
<script src="https://cdn.ckeditor.com/ckeditor5/41.4.2/classic/ckeditor.js"></script>

 

2. 사용할 부분에 div 태그 id 로 생성 =  id로 ckeditor 를 넣어줄 거다.

hidden 타입의 input 태그는 ckeditor를 통해 적은 글을 넘기는데 사용하기 때문에
당연하게 form 태그가 나머지 태그를 감싸고 있어야 한다.

<table>
    <tr>
        <td colspan="4">
            <div name="editor" id="noticeEditor">
                <img name="noticeImage" id="noticeImage" src="#" alt="">
            </div>
        </td>
        <input type="hidden" name="detail" id="noticeDetail">
</table>
<div class="button">
    <button class="submit" id="noticeSubmit" type="submit">제출</button>
</div>

 

3. javascript

editor를 선언하고, 초기화를 진행한다.

document.addEventListener("DOMContentLoaded", function() {
    let ckEditorInstanceNotice;
    
    // noticeEditor 초기화
    const noticeEditorElement = document.querySelector('#noticeEditor');
    if (noticeEditorElement) {
        ClassicEditor
            .create(noticeEditorElement, {
            	// 이거는 필수로 안해줘도 되는 거 같긴 하다.
                language: 'ko',
                enterMode: 'paragraph',
                removePlugins: ['AutoFormat']
            })
            .then(editor => {
				
                ckEditorInstanceNotice = editor;
		        
            })
            .catch(error => {
                console.error('Error initializing noticeEditor:', error);
            });
        }
        
 });

그러면 이렇게 내가 꾸려놓은 페이지에 ckeditor 가 제대로 뜨는지 확인하면 된다.

 

3-1. 데이터 가져오기

controller

	@PostMapping("/noticeWrite")
	public String noticeWrite(@RequestParam(value = "detail", required = false) String details,
	@ModelAttribute NoticeDTO noticeDTO, RedirectAttributes rttr) {
		
		try{
            noticeDTO.setDetail(details);
            noticeService.writeNotice(noticeDTO);
            rttr.addFlashAttribute("message", "notice 작성 완료");				
		
		} catch (Exception e) {
			rttr.addFlashAttribute("message", "notice 작성 중 오류가 발생했습니다.");
		}
		
		return "redirect:/admin/___";

 

헷갈리지 말아야 할 것 ::

아래 코드는 document.addEventListener("DOMContentLoaded", function() {}); 안에서 쓰여지고 있다.

$('#noticeSubmit').click(function(e) {
    e.preventDefault(); // 기본 제출 동작 방지

    if (!ckEditorInstanceNotice) {
        console.error("CKEditor 인스턴스가 초기화되지 않았습니다.");
        return;
    }
    
    // CKEditor에서 텍스트 가져오기
    let contents = ckEditorInstanceNotice.getData().trim();
    
    // 숨겨진 필드에 값 설정
    $("#noticeDetail").val(contents);

    if (confirm("제출하시겠습니까?")) { // 사용자 확인 요청
        $('#noticeSubmitForm').submit(); // 폼 제출
    }

$("#noticeDetail").val(contents); --> 이 부분이 input hidden 타입의 태그 이다.

 

+) 사용 시 태그를 없애고 싶다면?

이렇게 DB로 보낸 데이터를 사용할때 태그도 함께 저장이 된다.

이 때 replace 를 사용해서 태그가 나올 애들을 지워도 되지만, th:utext 를 사용하면 태그가 보이지 않는다.

th:utext 는 th:text 를 사용하는 태그에서 사용하면 되며, input 태그는 th:text 를 사용하지 않기 때문에 th:value 를 사용하면 된다.

 

 

++ 이미 했던 걸 다시 복기하며 적다보니 빠진 부분이 있을수도 있다.. 
때문에 공식 문서를 보며 오류를 잡거나, 다른 블로그, 혹은 지피티 같이 챗봇의 도움을 받는 것도 추천한다.

'개인 공부 > 연결, 설치' 카테고리의 다른 글

[M1] MySQL 설치하기  (0) 2024.11.07
[Node, TypeScript] nodemon 설치  (0) 2024.10.19
[PyTorch] 에어 M1 파이토치(PyTorch) 설치  (0) 2024.09.03
M1 labelImg 설치  (0) 2024.09.03