[작성일: 2023. 04. 23]
게시판(Board) 만들기
게시판 메인 테이블 생성
- 각 row(게시물)마다 달라져야 하는 번호가 key가 되어야 하며, 이를 채번하는 2가지 방법이 있음.
- 가장 큰 번호를 찾아 +1 하기
- 단점 : 게시물이 많아질수록 채번 속도가 느려짐.
- 시퀀스에서 채번하기
- 물리 Object인 시퀀스에서 숫자를 하나씩 꺼내옴.
- 시퀀스는 꺼내갈 경우 1씩 증가함.
- 가장 큰 번호를 찾아 +1 하기
테이블 및 시퀀스 생성
-- 시퀀스를 만들 때는 seq를 붙이는 것이 일반적임.
CREATE SEQUENCE seq_board nocache;
-- 테이블 생성 시 TB 또는 TBL을 붙이는 경우가 많음.
-- 단, 대형 사이트의 경우는 거의 붙이지 않음.
CREATE TABLE tbl_board
(
BNO INT(10),
TITLE VARCHAR(200) NOT NULL,
CONTENT VARCHAR(2000) NOT NULL,
WRITER VARCHAR(50) NOT NULL,
REGDATE DATE DEFAULT SYSDATE(),
UPDATEDATE DATE DEFAULT SYSDATE()
)
-- Primary Key 생성하기
ALTER TABLE TBL_BOARD ADD CONSTRAINT TBL_BOARD_PK PRIMARY KEY(BNO);
샘플 데이터 입력
INSERT INTO TBL_BOARD(BNO, TITLE, CONTENT, WRITER)
VALUES(NEXTVAL(SEQ_BOARD), '테스트 제목', '테스트 내용', 'user00');
SELECT * FROM TBL_BOARD;
VO 생성
- 테이블 컬럼과 동일한 VO 생성
- @Component, @Data annotation 추가
@Component
@Data
public class BoardVO {
private Long bno;
private String title;
private String content;
private String writer;
private String regdate;
private String updatedate;
}
Mapper Interface 생성
- 게시글 리스트를 가져올 Interface 생성
Mapper XML에 SQL 생성(alias 사용)
Resources/config/config.xml에 alias 추가
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="boardVO" type="com.it.example.beans.vo.BoardVO"></typeAlias>
</typeAliases>
</configuration>
MyBatisConfig.java에 config 디렉토리 추가
- setConfigLocation
MapperTest
- 게시물 결과가 1건 나오는 것 확인
package com.it.example.mappers;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.it.example.beans.vo.BoardVO;
import lombok.extern.slf4j.Slf4j;
@SpringBootTest
@Slf4j
@RunWith( SpringJUnit4ClassRunner.class )
public class BoardMapperTest {
@Autowired
private BoardMapper mapper;
@Test
public void testGetList() {
mapper.getList().forEach(board -> log.info(board.toString()));
}
@Test
public void testInsert() {
BoardVO board = new BoardVO();
board.setTitle("새로 작성");
board.setContent("새로 작성한 글의 내용");
board.setWriter("user01");
mapper.insert(board);
}
insert
- Mapper Interface > Mapper XML(SQL) > JUnit test
- insert
- insetSelectKey_bno
- read
@Test
public void testInsert() {
BoardVO board = new BoardVO();
board.setTitle("새로 작성");
board.setContent("새로 작성한 글의 내용");
board.setWriter("user01");
mapper.insert(board);
}
@Test
public void testInsertSelectKey_bno() {
BoardVO board = new BoardVO();
board.setTitle("새로 작성");
board.setContent("새로 작성한 글의 내용");
board.setWriter("user02");
mapper.insertSelectKey_bno(board);
}
@Test
public void testRead() {
long bno = 2L;
log.info(mapper.read(bno).toString());
}
delete
[실습] delete 삭제 완료 된 건 수 리턴, 실패 시 0 리턴
- Mapper Interface > Mapper XML(SQL) > JUnit test
@Test
public void testDelete() {
long bno = 3L;
log.info("[Delete Count] " + mapper.delete(bno));
}
update
[실습] update 첫 줄에 Long bno = 2L(예시)
이 bno가 tbl_board에 있으면 수정하고 없으면 없다는 메시지 출력
@Test
public void testUpdate() {
Long bno = 3L;
if(mapper.read(bno) != null) {
BoardVO board = new BoardVO();
// 실행 전에 존재하는 데이터 확인
board.setBno(1L);
board.setTitle("수정된 제목");
board.setContent("수정된 내용");
board.setWriter("user00");
log.info("[Update Count] " + mapper.update(board));
} else {
log.info("[update Count] No Such Board!!! ");
}
}
2023.04.30 추가
게시판 구현하기
list.html
- list 형태의 데이터가 넘어왔을 때 처리 방식으로 th:each 사용
- 집합 객체(list 등)에서 하나씩 데이터를 꺼내와서 처리하는 방식
register.html
- Controller에 get 방식의 register() 개발
get.html
- modify를 get 방식으로 이동하는 기능(javascript)
modify.html
- Controller에 get 방식의 modify() 개발
remove 기능 구현(self 과제)
- get.html에 삭제 버튼 생성
- 삭제 버튼 클릭 시 remove 기능 호출
🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.