[문제] 게시판
1. 테이블 작성
테이블 명 : board_java
컬럼 : seq number
컬럼 : id varchar2(30)
컬럼 : name varchar2(15)
컬럼 : subject varchar2(100)
컬럼 : content varchar2(500)
컬럼 : logtime date
시퀀스 명 : board_java_seq
: 값이 중복되지 않고, 캐쉬는 사용하지 않는다.
2. DTO 클래스 작성
필드 : 글번호, 아이디, 이름, 제목, 내용, 날짜
3. BoardWriteService 클래스
- 글번호는 시권스 객체로 부터 값을 얻어온다.
- 날짜도 시스템의 기본 날짜를 사용한다.
- 내용을 입력시 공백이 들어가야 하므로 nextLine() 를 사용한다.
4. BoardListService 클래스
- DB의 내용을 모두 꺼내올때는 최신순으로 가져온다.
- 꺼내온 날짜는 yyyy.MM.dd 형식으로 출력한다.
5. BoardViewService 클래스
- 글번호를 입력하여 해당 글번호의 내용을 DB로부터 꺼내와서 보여준다.
[실행결과]
IndexMain.java --- menu()
******************
1. 글쓰기
2. 목록
3. 작성한 글 내용 보기
4. 끝
******************
번호 :
BoardWriteService
아이디 입력 :
이름 입력 :
제목 입력 :
내용 입력 :
작성하신 글을 등록하였습니다.
BoardListService
---------------------------------------------------------
글번호 제목 아이디 날짜
---------------------------------------------------------
5 과일 hong 2024.07.26
3 야채 hong 2024.07.26
BoardViewService
글번호 : 5 아이디 : hong 이름 : 홍길동
날짜 : 2024.07.26
내용 : 여름에는 역시 복숭아가 맛있다
Java Project : board
Package : board.main
Class : IndexMain.java - main()
Package : board.service
Interface : Board.java ===> public void execute();
Class : BoardWriteService.java
BoardListService.java
BoardViewService.java
Package : board.bean
Class : BoardDTO.java
Package : board.dao
Class : BoardDAO.java
Folder : lib
File : ojdbc11.jar
lombok.jar
Folder : sql
File : board.sql
사진 설명을 입력하세요.
사진 설명을 입력하세요.
board.sql
CREATE TABLE board_java(
seq number,
id VARCHAR2(30),
name VARCHAR2(15),
subject VARCHAR2(100),
content VARCHAR2(500),
logtime date);
CREATE SEQUENCE board_java_seq
START WITH 1
INCREMENT BY 1
MAXVALUE 1000
NOCACHE;
나를 위해서도 있지만 다른 개발자들을 위해서 이렇게 sql문을 올리는게 좋다. (습관화 들이기)
BoardDTO.java
package board.bean;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BoardDTO {
private String seq;
private String id;
private String name;
private String subject;
private String content;
private String logtime;
@Override
public String toString() {
return seq + "\t"
+ subject + "\t"
+ id + "\t"
+ logtime + "\t";
}
}
lombok에서 지원해주는 것을 이용하여 Getter / Setter 메소드를 생성하였다.
나중을 위하여 toString 메소드도 오버라이딩 해주었다.
IndexMain.java
package board.main;
import java.util.Scanner;
import board.service.Board;
import board.service.BoardListService;
import board.service.BoardViewService;
import board.service.BoardWriteService;
public class IndexMain {
public void menu() {
Scanner scan = new Scanner(System.in);
int num;
Board board = null;
while(true) {
System.out.println();
System.out.println("************************");
System.out.println(" 1. 글쓰기");
System.out.println(" 2. 목록");
System.out.println(" 3. 작성한 글 내용 보기");
System.out.println(" 4. 끝");
System.out.println("************************");
System.out.print(" 번호 입력 : ");
num = scan.nextInt();
if(num == 4 )
break;
if(num == 1)
board = new BoardWriteService();
else if(num == 2)
board = new BoardListService();
else if(num == 3)
board = new BoardViewService();
board.execute();
}
}
public static void main(String[] args) {
IndexMain indexMain = new IndexMain();
indexMain.menu();
System.out.println("프로그램을 종료합니다.");
}
}
메인함수에서는 menu메소드만 생성하여 다른 클래스들을 부를 수 있도록한다.
Board.java - 인터페이스
package board.service;
public interface Board {
public void execute();
}
인터페이스를 구현하여 다른 클래스들이 전부 execute를 오버라이딩 해주도록 한다.
BoardWriteService.java
package board.service;
import java.util.Scanner;
import board.bean.BoardDTO;
import board.dao.BoardDAO;
public class BoardWriteService implements Board{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
//DB - 싱글톤
BoardDAO boardDAO = BoardDAO.getInstance();
System.out.print("아이디 입력 : ");
String id = scan.next();
System.out.print("이름 입력 : ");
String name = scan.next();
System.out.print("제목 입력 : ");
String subject = scan.next();
scan.nextLine();
System.out.print("내용 입력 : ");
String content = scan.nextLine();
BoardDTO boardDTO = new BoardDTO();
boardDTO.setId(id);
boardDTO.setName(name);
boardDTO.setSubject(subject);
boardDTO.setContent(content);
boardDAO.write(boardDTO);
System.out.println("작성하신 글을 등록하였습니다.");
}
}
작성할 글을 입력하고 boardDTO에 하나씩 다 담는다.
boardDTO를 매개변수로 하여 boardDAO에 있는 write 메소드로 넘긴다.
BoardDAO.java
package board.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import board.bean.BoardDTO;
public class BoardDAO {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:xe";
private String username = "C##JAVA";
private String password = "1234";
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
private static BoardDAO instance = new BoardDAO();
public BoardDAO() {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static BoardDAO getInstance() {
return instance;
}
public void getConnection() {
try {
con = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
연결 과정
public void write(BoardDTO boardDTO) {
getConnection();
String sql = "insert into board_java values(board_java_seq.NEXTVAL,?,?,?,?,sysdate)";
try {
pstmt = con.prepareStatement(sql);
//?에 데이터 매핑
pstmt.setString(1, boardDTO.getId());
pstmt.setString(2, boardDTO.getName());
pstmt.setString(3, boardDTO.getSubject());
pstmt.setString(4, boardDTO.getContent());
pstmt.executeUpdate();
}catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
매개변수로 받은 boardDTO를 가지고 sql문에 하나씩 값을 매핑시켜준다.
매핑시켜줌으로써 board_java 테이블에 데이터가 들어가게 된다.
BoardListService.java
package board.service;
import java.util.ArrayList;
import java.util.Scanner;
import board.bean.BoardDTO;
import board.dao.BoardDAO;
public class BoardListService implements Board{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
//DB - 싱글톤
BoardDAO boardDAO = BoardDAO.getInstance();
ArrayList<BoardDTO> boardDTO = boardDAO.list();
글들의 리스트를 출력하는 클래스이다.
먼저 boardDAO에 있는 list 메소드로 간다.
BoardDAO.java
public ArrayList<BoardDTO> list() {
ArrayList<BoardDTO> boardDTO = new ArrayList<>();
getConnection();
String sql = "select * from board_java order by logtime desc";
- BoardDTO 객체들을 저장할 ArrayList를 생성한다.
- SQL 쿼리 "select * from board_java order by logtime desc"를 준비한다. 이 쿼리는 board_java 테이블에서 모든 행을 logtime 기준 내림차순으로 정렬하여 선택한다.
try {
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
while(rs.next()) {
BoardDTO dto = new BoardDTO();
String date = sdf.format(rs.getDate("logtime"));
dto.setSeq(rs.getString("seq"));
dto.setSubject(rs.getString("subject"));
dto.setId(rs.getString("id"));
dto.setLogtime(date);
boardDTO.add(dto);
- 가져온 데이터들을 하나하나 boardDTO에 담는다.
- SimpleDateFormat을 사용하여 날짜를 원하는 형식(yyyy.MM.dd)으로 포맷한다.
- while(rs.next()) 루프는 결과 집합의 각 행에 대해 반복하며, 각 행의 데이터를 BoardDTO 객체에 저장하고 이를 리스트에 추가한다.
BoardListService.java
System.out.println("---------------------------------------------------------");
System.out.println("글번호" + "\t" + "제목" + "\t" + "아이디" + "\t" + "날짜");
for(BoardDTO dto : boardDTO) {
System.out.println(dto);
}
System.out.println("---------------------------------------------------------");
}
}
- list 메서드는 BoardDTO 객체들의 리스트를 반환하며, 이를 통해 게시물의 정보(글번호, 제목, 아이디, 날짜)를 출력한다.
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs != null)
rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return boardDTO;
}
BoardViewService.java
package board.service;
import java.util.Scanner;
import board.bean.BoardDTO;
import board.dao.BoardDAO;
public class BoardViewService implements Board{
@Override
public void execute() {
System.out.println();
Scanner scan = new Scanner(System.in);
//DB - 싱글톤
BoardDAO boardDAO = BoardDAO.getInstance();
System.out.print("글번호 : " + "\t");
int seq = scan.nextInt();
BoardDTO boardDTO = boardDAO.view(seq);
- BoardDAO의 인스턴스를 싱글톤 패턴으로 가져와 view 메서드를 호출하여 사용자가 입력한 seq(게시물 번호)를 기반으로 게시물 정보를 조회한다.
BoardDAO.java
public BoardDTO view(int seq) {
BoardDTO boardDTO = null;
getConnection();
String sql = "select * from board_java where seq = ?";
- view 메서드는 특정 seq(글번호)를 받아 그에 해당하는 게시물 정보를 데이터베이스에서 조회하여 BoardDTO 객체로 반환한다.
- SQL 쿼리 "select * from board_java where seq = ?"를 사용하여 특정 글번호에 해당하는 게시물을 조회한다.
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, seq);
rs = pstmt.executeQuery();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
if(rs.next()) {
boardDTO = new BoardDTO();
String date = sdf.format(rs.getDate("logtime"));
boardDTO.setSeq(rs.getString("seq"));
boardDTO.setId(rs.getString("id"));
boardDTO.setName(rs.getString("name"));
boardDTO.setLogtime(date);
boardDTO.setContent(rs.getString("content"));
}
}
- pstmt.setInt(1, seq)를 통해 첫 번째 매개변수에 seq 값을 설정한다.
- if (rs.next()) 블록에서는 결과가 존재하는 경우 BoardDTO 객체를 생성하여 데이터를 설정한다.
- SimpleDateFormat을 사용하여 날짜를 원하는 형식(yyyy.MM.dd)으로 포맷한다.
catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs != null)
rs.close();
if(pstmt != null)
pstmt.close();
if(con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return boardDTO;
}
BoardViewService.java
if(boardDTO != null) {
System.out.println("글번호 : " + boardDTO.getSeq() + "\t"
+ "아이디 : " + boardDTO.getId() + "\t"
+ "이름 : " + boardDTO.getName());
System.out.println("날짜 : " + boardDTO.getLogtime());
System.out.println("내용 : " + boardDTO.getContent());
}else
System.out.println("해당하는 글번호가 없습니다.");
}
}
- 조회된 BoardDTO 객체가 null이 아니면 게시물의 정보를 출력한다.
- if 문에서 boardDTO가 null인 경우, "해당하는 글번호가 없습니다."라는 메시지를 출력한다.
'HOMEWORK' 카테고리의 다른 글
DAY 28 - ORACLE DB HOMEWORK (2024.08.09) (0) | 2024.08.11 |
---|---|
DAY 28 - CSS HOMEWORK (2024.08.09) (0) | 2024.08.11 |
DAY 16 SCHOOL HOMEWORK (2024.07.24) (0) | 2024.08.08 |
DAY 27 - HTML 과제 (2024.08.08) (0) | 2024.08.08 |
DAY 26 - HTML 과제 (2024.08.07) (0) | 2024.08.07 |