BoardDB.java - interface
interface
로 설정되어 설계도의 역할만 한다.
- 추상화된 메소드만을 만들어서 App으로 던지는 역할만 한다.
- 실제 메소드의 수행은 자식 클래스(BoardDBImpl.java)에서 한다.
// 설계 : 못바꿈, 바꾸기 까다로움
public interface BoardDB {
// 게시판 글쓰기
// 외부에서 쓰니까 public
// public int insertBoard(전달해주고싶은것)
public int insertBoard(Board board);
// 게시판 삭제
public int deleteBoard(Board board);
// 게시판 수정
public int updateBoard(Board board);
// 게시판 한개 조회
public Board selectOneBoard(Board board);
// 게시판 목록(ArrayList <- List)
public List<Board> selectListBoard();
}
BoardDBImpl.java
- 부모 클래스(BoardDB.java) 의 추상화된 메소드를 직접 수행하는 부분
- 부모 클래스를
implment
한다.
- Override 해서 새롭게 부모 클래스의 추상화된 메소드를 구체화시켜서 수행한다.
1. insertBoard - 추가
@Override
public int insertBoard(Board board) {
// 오류처리 직접 해도 됨
try {
// 2. 필요하니까 Document 생성
Document document = new Document();
// 3. 추가하려고 doc. 까지 치고 명령어를 보니까 append 가 있네 // 추가 : set..., add, append 등을 사용
document.append("_id", board.getNo());
document.append("title", board.getTitle());
document.append("content", board.getContent());
document.append("writer", board.getWriter());
document.append("hit", board.getHit());
// 1. 컬렉션에 추가하려고 하니까 Document타입이 필요
InsertOneResult result = this.collection.insertOne(document);
System.out.println("BoardDB => insertData => result ===> " + result);
// String aa = "aa"; => if(aa.euals("aa")) {}
// long aa = 1L => if(aa == 2) {}
if (result.getInsertedId().asInt64().getValue() == board.getNo()) {
return 1; // 성공
}
return 0; // 실패
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
2. deleteBoard - 삭제
@Override
// throws Exception => App한테 오류처리 던짐
// public int deleteBoard(Board board) throws Exception {
public int deleteBoard(Board board) {
try {
// 2. bson이 없으니 생성
// eq, gt, gte, lt, lte 등 사용 가능
// eq("비교하고자하는키값",실제값)
Bson bson = Filters.eq("_id", board.getNo());
// 1. 삭제수행하려고 보니 파라미터의 형식이 bson임
DeleteResult result = this.collection.deleteOne(bson);
// 위에서 안만들고 바로 넣어도 됨
// DeleteResult result = this.collection.deleteOne(Filters.eq("_id",
// board.getNo()));
System.out.println("BoardDB => deleteData => result ===> " + result);
if (result.getDeletedCount() == 1L) {
return 1; // 성공
}
return 0; // 실패
} catch (Exception e) {
e.printStackTrace(); // 오류출력
return -1;
}
}
3. updateBoard - 수정
@Override
public int updateBoard(Board board) {
try {
Bson bson = Filters.eq("_id", board.getNo());
Bson bson1 = Updates.set("title", board.getTitle());
Bson bson2 = Updates.set("content", board.getContent());
Bson bson3 = Updates.set("writer", board.getWriter());
// Bson을 합침 => updateOne에서 하나로 만들어 넣기를 원해서
Bson bson0 = Updates.combine(bson1, bson2, bson3);
// updateOne(조건, 변경값)
UpdateResult result = this.collection.updateOne(bson, bson0);
System.out.println("BoardDB => updateData => result ===> " + result);
if (result.getModifiedCount() == 1L) {
return 1;
}
return 0;
} catch (Exception e) {
e.printStackTrace(); // 오류출력
return -1;
}
}
4. selectOneBoard - 한개 조회
@Override
public Board selectOneBoard(Board board) {
try {
Bson bson = Filters.eq("_id", board.getNo());
FindIterable<Document> document = this.collection.find(bson);
Board board1 = new Board();
for (Document tmp : document) { // 1번만 반복
return new Board(
tmp.getLong("_id"),
tmp.getString("title"),
tmp.getString("content"),
tmp.getString("writer"),
tmp.getInteger("hit")
);
// 같음. 변수설정없이 바로 리턴값으로 넘김
// board1.setNo(tmp.getLong("_id"));
// board1.setTitle(tmp.getString("title"));
// board1.setContent(tmp.getString("content"));
// board1.setWriter(tmp.getString("writer"));
// board1.setHit(tmp.getInteger("hit"));
}
} catch (Exception e) {
e.printStackTrace(); // 오류출력
return null;
}
}
5. selectListBoard - 여러개 조회
- List = 가변길이배열
: List<Board>
= Board를 n개 보관 한다는 뜻
- List가 부모 컴포넌트, ArrayList가 자식 컴포넌트.
- List는 부모 컴포넌트라서 객체생성이 불가능 하다.
- List의 추상화된(빈) 메소드(설계도)를 ArrayList가 수행함.
: List<Board> list = new ArrayList<Board>();
- for문
5-1. Board board = new Board();
: Board 생성자 중에 모든 변수를 담은 생성자가 있으니, 그 생성자를 이용해서 한번에 Board타입의 board를 생성함.
: Board(long no, String title, String content, String writer, int hit)
5-2. 반복문으로 n개의 Board타입의 board 생성
5-3. list.add(board);
로 위에서 설정한 변수 list에 생성한 board를 넣음
- Override 할때 설정한 타입인
List<Board>
타입으로 리턴값을 설정함.
: return list;
// 게시판 목록(ArrayList <- List)
@Override
public List<Board> selectListBoard() {
try {
FindIterable<Document> document = this.collection.find();
// Board를 n개 보관할 수 있는 list변수
// 가변길이배열 [{},{},{}] 늘렸다 줄였다
// List => ArrayList의 부모 컴포넌트 ==> 객체생성X
// 부모인 List에 있는 빈 메소드를 자식인 ArrayList가 수행함
// 이 시점의 list ===> null;
List<Board> list = new ArrayList<Board>();
for (Document tmp : document) {
// 여러개를 보관할때는 객체를 for문 안에 둔다
Board board = new Board(
tmp.getLong("_id"),
tmp.getString("title"),
tmp.getString("content"),
tmp.getString("writer"),
tmp.getInteger("hit"));
list.add(board);
// System.out.println(board.toString());
}
// System.out.println("BoardDBImpl => selectListBoard => toString() ===> " +
// board.toString());
return list;
} catch (Exception e) {
e.printStackTrace(); // 오류출력
return null;
}
}
AppBoard.java - insert 수행
1. insertBoard - 추가
- 추상화된 설계도만 가지고 있는 BoardDB의 메소드를 자식클래스인 BoardDBImpl에서 수행한다고 정의하고 변수명을 obj로 둔다.
: BoardDB obj = new BoardDBImpl();
- Board의 생성자를 이용해서 내용을 한번에 넣음
: Board board = new Board(2L, "제목2", "내용2", "작성자2", 102);
- 결과값을 int로 받는다.
: int response = obj.insertBoard(board);
public class AppBoard {
public static void main(String[] args) {
// 클래스명 객체명 = new 생성자();
BoardDB obj = new BoardDBImpl();
// Board의 생성자를 이용해서 내용을 한번에 넣음
Board board = new Board(2L, "제목2", "내용2", "작성자2", 102);
int response = obj.insertBoard(board);
System.out.println(response);
if (response == 1) {
System.out.println("추가성공");
} else {
System.out.println("추가실패");
}
}
}
2. deleteBoard - 삭제
public class AppBoard {
public static void main(String[] args) {
BoardDB obj = new BoardDBImpl();
Board board = new Board();
board.setNo(101L);
int response = obj.deleteBoard(board);
System.out.println("AppBoard.java => deleteData => response ===> " + response);
if (response == 1) {
System.out.println("삭제성공");
} else {
System.out.println("삭제실패");
}
}
}
3. updateBoard - 수정
public class AppBoard {
public static void main(String[] args) {
BoardDB obj = new BoardDBImpl();
// 5개짜리 생성자 사용 마지막은 안쓰니까 0으로
Board board = new Board(1L, "제목2", "내용2", "작성자2", 0);
int response = obj.updateBoard(board);
System.out.println("AppBoard.java => updateData => response ===> " + response);
if (response == 1) {
System.out.println("수정성공");
} else {
System.out.println("수정실패");
}
}
}
4. selectOneBoard - 한개 조회
public class AppBoard {
public static void main(String[] args) {
BoardDB obj = new BoardDBImpl();
Board board = new Board();
board.setNo(103L);
Board board1 = obj.selectOneBoard(board);
if (board1 != null) {
System.out.println("==========결과==========");
System.out.println("AppBoard.java => selectOneBoard => board1 ===> " + board1);
}
else {
System.out.println("게시판 한개 조회 실패");
}
}
}
5. selectListBoard - 여러개 조회
public class AppBoard {
public static void main(String[] args) {
BoardDB obj = new BoardDBImpl();
List<Board> result = obj.selectListBoard();
for (Board tmp : result) {
System.out.println(tmp.toString());
}
System.out.println("result ===> " + result);
}
}