JAVA #11 - implement

김형우·2022년 2월 24일
0

JAVA

목록 보기
11/12

BoardDB.java - interface

  1. interface로 설정되어 설계도의 역할만 한다.
  2. 추상화된 메소드만을 만들어서 App으로 던지는 역할만 한다.
  3. 실제 메소드의 수행은 자식 클래스(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

  1. 부모 클래스(BoardDB.java) 의 추상화된 메소드를 직접 수행하는 부분
  2. 부모 클래스를 implment 한다.
  3. 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 - 여러개 조회

  1. List = 가변길이배열
    : List<Board> = Board를 n개 보관 한다는 뜻
  2. List가 부모 컴포넌트, ArrayList가 자식 컴포넌트.
  3. List는 부모 컴포넌트라서 객체생성이 불가능 하다.
  4. List의 추상화된(빈) 메소드(설계도)를 ArrayList가 수행함.
    : List<Board> list = new ArrayList<Board>();
  5. 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를 넣음
  6. 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 - 추가

  1. 추상화된 설계도만 가지고 있는 BoardDB의 메소드를 자식클래스인 BoardDBImpl에서 수행한다고 정의하고 변수명을 obj로 둔다.
    : BoardDB obj = new BoardDBImpl();
  2. Board의 생성자를 이용해서 내용을 한번에 넣음
    : Board board = new Board(2L, "제목2", "내용2", "작성자2", 102);
  3. 결과값을 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);
    }
}    
profile
The best

0개의 댓글