본격적으로 게시판을 만들기 전 게시판에 필요한 테이블을 먼저 생성해보겠습니다.
SQL 문을 따로 관리하기 위해 프로젝트 내에 ERD 폴더를 만든 뒤, 폴더 내에 ddl.sql이라는 파일을 생성하였습니다.

처음에 sql 파일을 생성할 때 위의 데이터베이스 그림 옆에 <N/A>가 떠 있습니다.
<N/A>를 클릭하면 DBeaver로 연결했던 데이터베이스가 뜹니다.

사용할 데이터베이스를 클릭하고 Select를 누르면 연결이 완료됩니다.

아까와 다르게 boards가 떠 있는 것을 확인할 수 있습니다.
테이블 생성
DROP TABLE IF EXISTS book CASCADE;
CREATE TABLE book(
bk_uid int PRIMARY KEY auto_increment ,
bk_title varchar(20) NOT NULL ,
bk_summary text ,
bk_price int DEFAULT 0 CHECK (bk_price >= 0) ,
bk_viewcnt int DEFAULT 0 CHECK (bk_viewcnt >= 0) ,
bk_regdate datetime DEFAULT now()
);
uid는 글의 고유 번호로 글이 하나 작성될 때마다 자동으로 1씩 증가하게 설정하였습니다.
title은 책 제목이고, summary는 책에 대한 간단한 설명입니다.
price는 책 가격, viewcnt는 해당 게시글의 조회수를 뜻합니다.
regdate는 게시글이 등록된 날짜와 시간입니다.
데이터 추가
일일이 insert문을 사용해서 데이터를 삽입하기에는 번거로움이 있으니 JUnit의 Test Case 클래스를 사용하겠습니다.

프로젝트 오른쪽 클릭 - Build Path - Configure Build Path... 에 들어갑니다.

Libraries에서 Classpath에 JUnit 라이브러리를 추가해줍니다.
src/main/java 폴더 내에 com.source.test라는 패키지를 생성해주었습니다.

해당 패키지 내에서 New - Other...을 클릭하여 BookBatch라는 이름의 JUnit Test Case를 생성해줍니다.
JUnit에서 데이터베이스 연결 시 mysql-connector-java.8.0.27.jar 파일을 lib 폴더 내에 넣어주어야 합니다.

src/main/webapp/WEB-INF/lib 폴더 내에 jar 파일을 넣습니다.
package com.source.test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import java.sql.*;
class BookBatch {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
int cnt = 0;
public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/boards";
public static final String USERID =
public static final String USERPW =
public static final String SQL_WRITE_INSERT =
"INSERT INTO book"
+ "(bk_title, bk_summary, bk_price)"
+ "VALUES(?, ?, ?)";
@Test
void genDate() {
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERID, USERPW);
// Data 삽입
pstmt = conn.prepareStatement(SQL_WRITE_INSERT);
int num = 10;
for (int i = 0; i < num; i++) {
pstmt.setString(1, String.format("제목%03d", i));
pstmt.setString(2, String.format("요약%03d", i));
pstmt.setInt(3, i * 20000);
cnt += pstmt.executeUpdate();
}
System.out.println(cnt + "개의 데이터 INSERT");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Driver는 8.0 버전부터 제공하는 드라이버를 사용합니다.
URL의 가장 뒷 부분 boards 부분에는 자신이 사용하는 데이터베이스 명을 작성해주면 됩니다.
USERID와 USERPW도 자신이 사용할 사용자 계정과 비밀번호를 작성하면 됩니다.
URL, USERID, USERPW에 들어가는 값을 지금처럼 변수에 저장하지 않고 곧바로 사용해도 되지만, 변수로 작성하여 쓰는 게 가독성이 좋고 유지 보수하기에도 쉽습니다.
데이터 삽입만 할 것이니 INSERT 문만 작성하였습니다.
book 테이블에 bk_title(제목), bk_summary(내용), bk_price(가격) 세 가지 컬럼 값을 추가할 것입니다.
bk_uid는 auto_increment 설정이 되어있으므로 자동으로 1부터 1씩 증가할 것이고, bk_regdate는 default now()로 설정하였으므로 데이터가 삽입될 때의 시간이 저장될 것입니다.
SQL을 사용하는 것은 예외 처리를 해주어야 하므로 try~catch문을 사용하였습니다.
Class.forName(DRIVER); 코드를 통해 앞전에 작성한 드라이버를 사용한다는 것을 알려줍니다.
아까 저장한 URL, USERID, USERPW를 사용해 Connection을 생성합니다.
그리고 해당 Connection을 사용해 아까 작성한 SQL_WRITE_INSERT에 저장된 쿼리문을 보냅니다.
데이터 10개를 삽입할 것이므로 for문을 사용하였습니다.
pstmt.setString()과 pstmt.setInt()의 첫 번째 매개변수는 쿼리문의 ?를 의미합니다.
VALUES(?,?,?)로 총 3개의 값을 넣기로 하였으니 순서대로 1, 2, 3이 될 것입니다.
쿼리문을 INSERT INTO book (bk_title, bk_summary, bk_price) VALUES (?, ?, ?)로 작성하였으니 첫 번째 물음표는 bk_title이 될 것이고, 두 번째 물음표는 bk_summary가 될 것이고, 마지막 물음표는 bk_price가 될 것입니다.
pstmt.executeUpdate();는 앞에서 설정한 값을 쿼리문에 넣어 실행시키고, 성공하면 성공한 쿼리의 개수를 리턴합니다. SELECT 쿼리에는 쓰이지 않고, INSERT, UPDATE, DELETE에 사용됩니다.
for문이 한 번 돌아갈 때마다 한 개의 데이터가 삽입, 즉 하나의 INSERT 문이 실행되므로 pstmt.executeUpdate();의 값은 항상 1이 반환될 것입니다.
10개의 데이터가 모두 올바르게 삽입되면 cnt 값은 10이 될 것입니다. 이를 확인하기 위해 print를 사용해 cnt 값을 출력합니다.
데이터 삽입이 완료되면 사용한 자원들을 모두 close() 해주어야 하므로 finally문에 close() 문을 몽땅 집어넣었습니다.
Run As - JUnit Test를 클릭하여 실행시킵니다.

SELECT 문으로 확인해보도록 하겠습니다.

10개의 데이터가 올바르게 추가된 것을 확인할 수 있습니다.
Github
https://github.com/MJKim99/JSP_Board_Book.git
GitHub - MJKim99/JSP_Board_Book: JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판
JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판. Contribute to MJKim99/JSP_Board_Book development by creating an account on GitHub.
github.com
본격적으로 게시판을 만들기 전 게시판에 필요한 테이블을 먼저 생성해보겠습니다.
SQL 문을 따로 관리하기 위해 프로젝트 내에 ERD 폴더를 만든 뒤, 폴더 내에 ddl.sql이라는 파일을 생성하였습니다.

처음에 sql 파일을 생성할 때 위의 데이터베이스 그림 옆에 <N/A>가 떠 있습니다.
<N/A>를 클릭하면 DBeaver로 연결했던 데이터베이스가 뜹니다.

사용할 데이터베이스를 클릭하고 Select를 누르면 연결이 완료됩니다.

아까와 다르게 boards가 떠 있는 것을 확인할 수 있습니다.
테이블 생성
DROP TABLE IF EXISTS book CASCADE;
CREATE TABLE book(
bk_uid int PRIMARY KEY auto_increment ,
bk_title varchar(20) NOT NULL ,
bk_summary text ,
bk_price int DEFAULT 0 CHECK (bk_price >= 0) ,
bk_viewcnt int DEFAULT 0 CHECK (bk_viewcnt >= 0) ,
bk_regdate datetime DEFAULT now()
);
uid는 글의 고유 번호로 글이 하나 작성될 때마다 자동으로 1씩 증가하게 설정하였습니다.
title은 책 제목이고, summary는 책에 대한 간단한 설명입니다.
price는 책 가격, viewcnt는 해당 게시글의 조회수를 뜻합니다.
regdate는 게시글이 등록된 날짜와 시간입니다.
데이터 추가
일일이 insert문을 사용해서 데이터를 삽입하기에는 번거로움이 있으니 JUnit의 Test Case 클래스를 사용하겠습니다.

프로젝트 오른쪽 클릭 - Build Path - Configure Build Path... 에 들어갑니다.

Libraries에서 Classpath에 JUnit 라이브러리를 추가해줍니다.
src/main/java 폴더 내에 com.source.test라는 패키지를 생성해주었습니다.

해당 패키지 내에서 New - Other...을 클릭하여 BookBatch라는 이름의 JUnit Test Case를 생성해줍니다.
JUnit에서 데이터베이스 연결 시 mysql-connector-java.8.0.27.jar 파일을 lib 폴더 내에 넣어주어야 합니다.

src/main/webapp/WEB-INF/lib 폴더 내에 jar 파일을 넣습니다.
package com.source.test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import java.sql.*;
class BookBatch {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
int cnt = 0;
public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/boards";
public static final String USERID =
public static final String USERPW =
public static final String SQL_WRITE_INSERT =
"INSERT INTO book"
+ "(bk_title, bk_summary, bk_price)"
+ "VALUES(?, ?, ?)";
@Test
void genDate() {
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, USERID, USERPW);
// Data 삽입
pstmt = conn.prepareStatement(SQL_WRITE_INSERT);
int num = 10;
for (int i = 0; i < num; i++) {
pstmt.setString(1, String.format("제목%03d", i));
pstmt.setString(2, String.format("요약%03d", i));
pstmt.setInt(3, i * 20000);
cnt += pstmt.executeUpdate();
}
System.out.println(cnt + "개의 데이터 INSERT");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Driver는 8.0 버전부터 제공하는 드라이버를 사용합니다.
URL의 가장 뒷 부분 boards 부분에는 자신이 사용하는 데이터베이스 명을 작성해주면 됩니다.
USERID와 USERPW도 자신이 사용할 사용자 계정과 비밀번호를 작성하면 됩니다.
URL, USERID, USERPW에 들어가는 값을 지금처럼 변수에 저장하지 않고 곧바로 사용해도 되지만, 변수로 작성하여 쓰는 게 가독성이 좋고 유지 보수하기에도 쉽습니다.
데이터 삽입만 할 것이니 INSERT 문만 작성하였습니다.
book 테이블에 bk_title(제목), bk_summary(내용), bk_price(가격) 세 가지 컬럼 값을 추가할 것입니다.
bk_uid는 auto_increment 설정이 되어있으므로 자동으로 1부터 1씩 증가할 것이고, bk_regdate는 default now()로 설정하였으므로 데이터가 삽입될 때의 시간이 저장될 것입니다.
SQL을 사용하는 것은 예외 처리를 해주어야 하므로 try~catch문을 사용하였습니다.
Class.forName(DRIVER); 코드를 통해 앞전에 작성한 드라이버를 사용한다는 것을 알려줍니다.
아까 저장한 URL, USERID, USERPW를 사용해 Connection을 생성합니다.
그리고 해당 Connection을 사용해 아까 작성한 SQL_WRITE_INSERT에 저장된 쿼리문을 보냅니다.
데이터 10개를 삽입할 것이므로 for문을 사용하였습니다.
pstmt.setString()과 pstmt.setInt()의 첫 번째 매개변수는 쿼리문의 ?를 의미합니다.
VALUES(?,?,?)로 총 3개의 값을 넣기로 하였으니 순서대로 1, 2, 3이 될 것입니다.
쿼리문을 INSERT INTO book (bk_title, bk_summary, bk_price) VALUES (?, ?, ?)로 작성하였으니 첫 번째 물음표는 bk_title이 될 것이고, 두 번째 물음표는 bk_summary가 될 것이고, 마지막 물음표는 bk_price가 될 것입니다.
pstmt.executeUpdate();는 앞에서 설정한 값을 쿼리문에 넣어 실행시키고, 성공하면 성공한 쿼리의 개수를 리턴합니다. SELECT 쿼리에는 쓰이지 않고, INSERT, UPDATE, DELETE에 사용됩니다.
for문이 한 번 돌아갈 때마다 한 개의 데이터가 삽입, 즉 하나의 INSERT 문이 실행되므로 pstmt.executeUpdate();의 값은 항상 1이 반환될 것입니다.
10개의 데이터가 모두 올바르게 삽입되면 cnt 값은 10이 될 것입니다. 이를 확인하기 위해 print를 사용해 cnt 값을 출력합니다.
데이터 삽입이 완료되면 사용한 자원들을 모두 close() 해주어야 하므로 finally문에 close() 문을 몽땅 집어넣었습니다.
Run As - JUnit Test를 클릭하여 실행시킵니다.

SELECT 문으로 확인해보도록 하겠습니다.

10개의 데이터가 올바르게 추가된 것을 확인할 수 있습니다.
Github
https://github.com/MJKim99/JSP_Board_Book.git
GitHub - MJKim99/JSP_Board_Book: JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판
JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판. Contribute to MJKim99/JSP_Board_Book development by creating an account on GitHub.
github.com