게시판 작업
1.클래스 구성
1) 게시판 데이터 1개를 저장할 클래스(글번호, 제목, 내용)
2) 게시판 작업을 위한 클래스
- 게시판 전체 목록을 리턴하는 메소드
- 글 번호를 받아서 글 번호에 해당하는 데이터 1개를 리턴하는 메소드
- 게시판 데이터를 매개변수로 받아서 저장하는 메소드
- 게시판 데이터를 매개변수로 받아서 수정하는 메소드
글 번호를 받아서 글 번호에 해당하는 데이터를 삭제하는 메소드
이러한 5가지 작업을 CRUD(Create, Read, Update, Delete)라고 합니다.
3) 실행 클래스(나중에는 UI를 담당하는 부분(View)과 이벤트를 처리하는 부분(EventHandler , Controller)으로 분할)
2.게시판 데이터를 저장할 클래스를 생성
- 글번호, 제목, 내용을 저장하는 클래스
- 글번호는 1번부터 순서대로 자동으로 생성
- 출력하는 메소드에 인스턴스를 대입하면 인스턴스의 내용을 출력해주도록 하는 메소드
public class Board {
//저장할 항목을 private 변수로 생성
//글번호, 제목, 내용
private int num;
private String title;
private String content;
//인스턴스 변수 사용을 위한 접근자 메소드
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
//디버깅을 위한 메소드
//출력하는 메소드에 인스턴스를 대입했을 때 호출되는 메소드
//자바는 인스턴스를 출력하는 메소드에 대입하면 toString 이라는 메소드가 호출됩니다.
//인스턴스 변수의 값을 전부 확인하고자 할 때 일일이 get 메소드를 부르는 것은 코드의 낭비
//이런 경우에는 toString()을 호출해서 한번에 확인
@Override
public String toString() {
return "Board [num=" + num + ", title=" + title + ", content=" + content + "]";
}
}
3.Java 단위 테스트
- Java Application을 실행할려면 main 메소드를 갖는 클래스가 필요
- Java Web Application을 실행할려면 WAS 가 필요
- 부분적으로 로직을 만들고 로직을 테스트하기 위해서 main을 만드는 것이나 WAS를 이용해서 실행하는 것은 자원의 낭비
- Java 로직을 테스트하기 위한 라이브러리가 이클립스에서 제공되는데 이름은 JUnit
- JUnit 라이브러리를 추가하고 클래스를 만든 후 메소드 위에 @Test라고만 붙이면 단위 테스트가 가능
1) JUnit 라이브러리를 프로젝트에 추가(Java 버전 변경도 동일한 메뉴)
- 프로젝트 선택하고 마우스 오른쪽을 클릭하고 [Build Path] - [Configure Build Path]를 선택
- Libraries 탭에서 [add library] 버튼을 클릭하고 JUnit을 선택
- 4나 5 버전을 선택하고 Apply
2) 테스트를 위한 클래스를 생성 - 클래스이름은 Test 만 아니면 됩니다.
public class BoardTest {
//테스트 메소드 만들기
@Test
public void testMethod() {
Board board = new Board();
System.out.println(board);
}
}
3) 테스트를 할 때는 클래스 내부 아무곳에나 커서를 두고 마우스 오른쪽을 클릭하고 [Run As] - [JUnit Test]를 클릭하면 됩니다.
현재 결과는 num=0 title=null content=null
로 출력
4.static 변수와 생성자를 이용해서 num의 값을 일련번호로 대입
- static 변수는 1번 만들어지면 소멸되지 않고 계속 사용할 수 있습니다.
- instance 변수는 instance가 생성될 때 마다 별도로 생성됩니다.
- Board 클래스에 코드를 작성하고 Test 메소드를 수정한 후 확인
1) Board 클래스에 코드 추가
//일련번호 생성을 위한 static 변수를 1개 생성
private static int sequence;
//생성자
public Board() {
//static 변수는 이전에 수정한 내용을 가지고 있기 때문에 1씩 증가
sequence = sequence + 1;
//num은 인스턴스 변수라서 생성자를 호출할 때 마다 매번 새로 생성
//새로 생성되는 num에 sequence의 값을 대입하면 일련번호가 됩니다.
num = sequence;
}
2) Test 메소드 수정하고 실행
//테스트 메소드 만들기
@Test
public void testMethod() {
Board board = new Board();
System.out.println(board);
Board board1 = new Board();
System.out.println(board1);
}
5.작업을 위한 클래스 - BoardService
//게시판 작업을 위한 메소드
public class BoardService {
//Board 100개를 저장할 수 있는 공간을 100개 생성해서 이름을 list라고 붙임
Board [] list = new Board[100];
//전체 목록이나 일부 목록을 리턴하는 메소드
//리턴 타입은 배열이나 List
//일부 목록을 가져올 때는 매개변수로 페이지 번호를 갖는 경우가 많습니다.
public Board[] getList() {
return list;
}
//페이지 번호에 해당하는 데이터를 가져오는 메소드
public Board[] getList(int pageNo) {
Board [] r = new Board[10];
//한 페이지에 10개씩 있다고 가정
//pageNo가 1일 때는 0과 9, pageNo가 2일 때는 10과 19
int start = (pageNo-1) * 10;
int end =pageNo * 10 - 1;
for(int i=0; i<10; i=i+1) {
r[i] = list[start + i];
}
return r;
}
//글번호에 해당하는 데이터를 1개 가져오는 메소드
//기본키를 매개변수로 받아서 처리
//상세보기를 처리하는 메소드
public Board getBoard(int num) {
//list에서 num이라는 글번호를 가진 데이터를 찾아서 리턴
Board board = null;
//list를 순회하면서 num 과 같은 글번호를 가진 데이터를 board 에 대입
for(Board temp : list) {
if(temp != null) {
//동일한 글번호를 찾으면 더 이상 반복문을 수행할 필요가 없어서 break
if(temp.getNum() == num) {
board = temp;
break;
}
}
}
//동일한 글번호가 없으면 null을 리턴
return board;
}
//글쓰기를 처리하는 메소드
//데이터 삽입을 처리하는 메소드
//수행 결과를 알려주고자 할 때는 boolean 이나 int 로 리턴
//수행 결과를 알려주지 않고자 할 때는 void(실패는 없다라는 가정)
//매개변수는 데이터 1개
//현재 작성된 글의 개수를 저장하기 위한 변수 - List를 사용하게 되면 필요없음
private int cnt;
public boolean insertBoard(Board board) {
//맨 마지막 위치에 데이터를 대입
list[cnt] = board;
cnt = cnt + 1;
return true;
}
//글 수정을 처리하는 메소드
//리턴 타입은 삽입과 동일
//매개변수도 삽입과 동일
//수정을 할 때는 기본키(글번호)의 값이 자동으로 설정되는 것이 다릅니다.
public boolean updateBoard(Board board) {
//글번호에 해당하는 데이터를 찾아서 데이터를 찾으면 board로 대체
for(int i=0; i<cnt; i=i+1) {
Board imsi = list[i];
//글번호 비교
if(imsi != null) {
if(imsi.getNum() == board.getNum()) {
list[i] = board;
break;
}
}
}
return true;
}
//삭제를 처리하는 메소드
//삭제를 할 때는 데이터 전체가 필요하지 않고 일반적으로 기본키만 필요합니다.
public boolean deleteBoard(int num) {
//list에 모든 데이터를 순회해서 글번호가 num 인 데이터를 찾아서 그 위치에 null을 대입
for(int i=0; i<cnt; i=i+1) {
Board imsi = list[i];
//글번호 비교
if(imsi != null) {
if(imsi.getNum() == num) {
list[i] = null;
break;
}
}
}
return true;
}
}
6.실행 클래스를 만들어서 실행
- main 메소드를 소유한 클래스를 생성