글 작성 페이지 만들기

 

[header.jsp]

<ul class="navbar-nav">
    <li class="nav-item"><a class="nav-link" href="/board/saveForm">글쓰기</a></li>
    <li class="nav-item"><a class="nav-link" href="/user/updateForm">회원정보</a></li>
    <li class="nav-item"><a class="nav-link" href="/logout">로그아웃</a></li>
</ul>

 

 <li class="nav-item"><a class="nav-link" href="/board/saveForm">글쓰기</a></li> 

글쓰기 버튼을 눌렀을때 /board/saveForm 주소 Controller 만들기

 

 

[BoardController]

// USER 권한이 필요
@GetMapping("/board/saveForm")
public String saveForm() {
    return "board/saveForm";
}

 

 

리턴시 saveForm 뷰화면 생성하기

 

[saveForm]

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ include file="../layout/header.jsp"%>

<div class="container">

	<form>
		<div class="form-group">
			<input type="text" class="form-control" placeholder="Enter title" id="title">
		</div>

		<div class="form-group">
			<textarea class="form-control summernote" rows="5" id="content"></textarea>
		</div>
	</form>
	<button id="btn-save" class="btn btn-primary">글쓰기완료</button>
</div>

<script src="/js/board.js"></script>
<%@ include file="../layout/footer.jsp"%>

* 주의 ../layout/header.jsp 폴더위치 잘보자!  ../ 는 board 폴더는 layout폴더 위의 폴더

 

 

- 결과 화면

 

 

 

 

글쓰기 페이지에서 내용부분에 summernote 를 적용해보자  

 

 

써머노트란?

 

 

 

https://summernote.org/getting-started/#for-bootstrap-4

 

Summernote - Super Simple WYSIWYG editor

Super Simple WYSIWYG Editor on Bootstrap Summernote is a JavaScript library that helps you create WYSIWYG editors online.

summernote.org

 

▼ 썸머노트 홈페이지 - Gettring started - Installation - For bootstrap4 태그 

<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Summernote with Bootstrap 4</title>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

    <link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>
  </head>
  <body>
    <div id="summernote"></div>
    <script>
      $('#summernote').summernote({
        placeholder: 'Hello Bootstrap 4',
        tabsize: 2,
        height: 100
      });
    </script>
  </body>
</html>

 

위의 전체 태그에서 필요한 태그만 가져간다

 

1. 두 링크만 header.jsp 의 <head>태그 안에 추가해주기. (나머지는 jquery, bootstrap..있는거라서 필요없음)

<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote-bs4.min.js"></script>

 

 

2. script 부분은 글쓰기 페이지[saveForm] 에 넣어주기

<script>
    $('.summernote').summernote({
      tabsize: 2,
      height: 300
    });
</script>

 

[saveForm] 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ include file="../layout/header.jsp"%>

<div class="container">

	<form>
		<div class="form-group">
			<input type="text" class="form-control" placeholder="Enter title" id="title">
		</div>

		<div class="form-group">
			<textarea class="form-control summernote" rows="5" id="content"></textarea>
		</div>
	</form>
	<button id="btn-save" class="btn btn-primary">글쓰기완료</button>
</div>

<script>
  $('.summernote').summernote({
    tabsize: 2,
    height: 300
  });
</script>

<script src="/js/board.js"></script>
<%@ include file="../layout/footer.jsp"%>

 

 

<textarea class="form-control summernote" rows="5" id="content"></textarea>

 

script 태그의 .suumernote 는 textarea태그의 클래스이다.

 

 

 

- 써머 노트 적용됨

써머 노트 적용

 

 

글 작성해보기

 

글쓰기는 form 태그로 요청하지 않고 자바스크립트를 써서 제이슨으로 요청을 할것이다.

** 버튼 태그를 form밖으로 꺼내야 정상실행. 

 

 

 

1. 글쓰기 완료 버튼을 누르면 Title과 Content 의 id를 가지고 <script src="/js/board.js"></script>자바스크립트로 이동한다

<form>
    <div class="form-group">
        <input type="text" class="form-control" placeholder="Enter title" id="title">
    </div>

    <div class="form-group">
        <textarea class="form-control summernote" rows="5" id="content"></textarea>
    </div>
</form>
<button id="btn-save" class="btn btn-primary">글쓰기완료</button>

 

 

board.js 파일만들기

 

 

 

 

2.  #title, #content 두개의 data를 가지고 제이슨으로 데이터로 변경하고 url:"/api/board" 주소인 Controller 로 보낸다.

 

[board.js]

** user.js 복붙해서 수정하기

let index = {
	init: function() {
		$("#btn-save").on("click", () => {  //function(){}, ()=>{} this를 바인딩하기 위해서
			this.save();
		});
		
	},
	//글쓰기
	save: function() {
		let data = {
			title: $("#title").val(),
			content: $("#content").val(),
		}
		
		$.ajax({
			//글쓰기 수행 요청
			type:"POST",
			url:"/api/board",
			data:JSON.stringify(data), 
			contentType:"application/json; charset=utf-8",
			dataType: "json" 
		}).done(function(resp){
			alert("글쓰기가 완료되었습니다.");
			location.href="/"; 
		}).fail(function(error){
			alert(JSON.stringify(error));
			});
	},
}

index.init();

 

 

 

 

3.  [BoardApiController]

현재 title, content만 들고 있는 상태에서 글쓰기()넘어가면 안되니까 user객체도 추가하기 (누가 썼는지 알수있음)

 

 @AuthenticationPrincipal PrincipalDetail principal 추가하여 user 객체도 함께 가져오도록

@RestController
public class BoardApiController {

@Autowired
private BoardService boardService;

@PostMapping("/api/board")
public ResponseDto<Integer> save(@RequestBody Board board,@AuthenticationPrincipal PrincipalDetail principal) { 
      boardService.글쓰기(board, principal.getUser());
      return new ResponseDto<Integer>(HttpStatus.OK.value(), 1);   //자바 오브젝트를 JSON으로 변환해서 리턴
   }
}

 boardService.글쓰기() 에는 title, content, user정보가 넘어간다

 

 

 

이때 중요한것! principal.getUser() 을 하기위해서는 

 

PrincipalDetail 클래스에 @Getter 어노테이션이 있어야 user객체를 꺼내쓸 수 있는데 

@Getter @Setter 가 포함된 @Data 어노테이션을 썼다

 

@Data
public class PrincipalDetail implements UserDetails{ 

}

 

 

 

4. [BoardRepository]

public interface BoardRepository extends JpaRepository<Board, Integer>{

}

 

 

5. [BoardService]

@Service
public class BoardService {

private final BoardRepository boardRepository;

@Transactional
public void 글쓰기(Board board,User user) { 
        board.setCount(0);
        board.setUser(user);
        boardRepository.save(board);
   }
}
  • boardService.글쓰기(board, principal.getUser()); 유저객체를 담아 보냈으니 글쓰기() 에도 User객체를 받아준다.
  • count는 @ColumnDefalut("0") 어노테이션을 지우고 직접 값을 가져옴 board.setCount(0);

@ColumnDefault("0")

private int count; 

 

 

 

 

[Board]

public class Board {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY) //auto_increment
	private int id;
	
	@Column(nullable = false, length=100)
	private String title;
	
	@Lob //대용량 데이터
	private String content; 	// 섬머노트 라이브러리 <html>태그가 섞여서 디자인이 됨.

	private int count; //조회수
	
	@ManyToOne(fetch = FetchType.EAGER) // Many=Board , One=User (한명의 유저는 여러개 게시글을 쓸수있다.)
	@JoinColumn(name="userId")
	private User user; // DB는 오브젝트를 저장할 수없다. FK,자바는 오브젝트를 저장할 수 있다.
	
	// 무조건 들고와야하면 EAGER , 댓글펼치기 기능처럼 필요하지 않을 수도 있다면 LAZY전략
	@OneToMany(mappedBy = "board",fetch = FetchType.EAGER) //mappedBy 연관관계의 주인이 아니다(난 FK가 아니다 ,DB에 칼럼을 만들지 마세요)
	private List<Reply> reply;
	
	@CreationTimestamp // insert,update 될 때 시간이 자동 입력 (비워놔도 됨)
	private Timestamp createDate; 
}
  • title,content는 이미 들고있고
  • id, userId, reply, createDate 는 DB에서 처리. 가져올 필요없음
  • count 값 강제로 넣음
  • user 정보는 @AuthenticationPrincipal PrincipalDetail principal 써서 가져옴

 

 

 

 

6. 글과 이미지도 DB저장된 것을 볼 수 있다

(2~11을 에 삭제해버려서 id가 1,12 인 것)

 

* p태그는 써머노트가 만들어줌

 

 

 

 

 

반응형
LIST

+ Recent posts