board.domain.Board 클래스 변경
domain.Member 클래스 변경
Board class
package com.bitcamp.board.domain;
public class Board implements Serializable {
// java.io.Serializable 인터페이스 구현
// - Board 클래스의 필드 값을 통째로 입출력 할 수 있다고 설정하는 용도이다.
private static final long serialVersionUID = 1L;
// serialVersionUID 필드 설정
...
}
package com.bitcamp.board.domain;
import java.io.Serializable;
public class Member implements Serializable {
private static final long serialVersionUID = 1L;
...
}
// 게시글 목록을 관리하는 역할
//
public class BoardDao {
...
public void load() throws Exception {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
int size = in.readInt();
for (int i = 0; i < size; i++) {
Board board = (Board) in.readObject();
list.add(board);
boardNo = board.no;
}
}
}
public void save() throws Exception {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
out.writeInt(list.size());
for (Board board : list) {
out.writeObject(board);
}
}
}
...
}
// 회원 목록을 관리하는 역할
//
public class MemberDao {
...
public void load() throws Exception {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
int size = in.readInt();
for (int i = 0; i < size; i++) {
Member member = (Member) in.readObject();
list.add(member);
}
} // try () ==> try 블록을 벗어나기 전에 in.close()가 자동으로 실행된다.
}
public void save() throws Exception {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename))) {
out.writeInt(list.size());
for (Member member : list) {
out.writeObject(member);
}
} // try () ==> try 블록을 벗어나기 전에 out.close()가 자동으로 실행된다.
}
...
}
⇒ XML, JSON 형식을 많이 사용한다.
dao.XxxDao 클래스 변경
board.App 클래스 변경
BoardDao class
public class BoardDao {
...
public void load() throws Exception {
try (BufferedReader in = new BufferedReader(new FileReader(filename))) {
String str;
while ((str = in.readLine()) != null) {
String[] values = str.split(",");
Board board = new Board();
board.no = Integer.parseInt(values[0]);
board.title = values[1];
board.content = values[2];
board.writer = values[3];
board.password = values[4];
board.viewCount = Integer.parseInt(values[5]);
board.createdDate = Long.parseLong(values[6]);
list.add(board);
boardNo = board.no;
}
}
}
public void save() throws Exception {
try (FileWriter out = new FileWriter(filename)) {
for (Board board : list) {
out.write(String.format("%d,%s,%s,%s,%s,%d,%d\n",
board.no,
board.title,
board.content,
board.writer,
board.password,
board.viewCount,
board.createdDate));
}
}
}
...
}
public class MemberDao {
...
public void load() throws Exception {
try (BufferedReader in = new BufferedReader(new FileReader(filename))) {
String str;
while ((str = in.readLine()) != null) {
String[] values = str.split(",");
Member member = new Member();
member.no = Integer.parseInt(values[0]);
member.name = values[1];
member.email = values[2];
member.password = values[3];
member.createdDate = Long.parseLong(values[4]);
list.add(member);
}
}
}
public void save() throws Exception {
try (FileWriter out = new FileWriter(filename)) {
for (Member member : list) {
out.write(String.format("%d,%s,%s,%s,%d\n",
member.no,
member.name,
member.email,
member.password,
member.createdDate));
}
}
}
...
}
public class App {
...
public static void main(String[] args) {
try {
// 핸들러를 담을 레퍼런스 배열을 준비한다.
Handler[] handlers = new Handler[] {
new BoardHandler("board.csv"), // 게시판
new BoardHandler("reading.csv"), // 독서록
new BoardHandler("visit.csv"), // 방명록
new BoardHandler("notice.csv"), // 공지사항
new BoardHandler("daily.csv"), // 일기장
new MemberHandler("member.csv") // 회원
};
...
} // main
...
}
객체 생성은 그 객체를 가장 잘 아는 객체에게 맡긴다.
2. Board 객체 → CSV Data 변환
정보를 다루는 것은 그 정보를 갖고 있는 전문가에게 맡기는 것이 좋다.
CSV 데이터를 가지고 Board객체를 생성하는 일은 Board 클래스에 맡긴다.
객체 생성은 메서드를 통해 수행한다. → Factory Method 패턴
Board 객체의 값을 CSV 형식으로 변환하는 일은 Board 클래스에 맡긴다.
CSV 데이터 생성은 Board 메서드를 통해 수행한다. → Information Expert 패턴
- GoF의 Factory Method 패턴
→ 객체 생성 과정이 복잡할 때 별도의 메서드로 캡슐화 한다.
public class Board implements Serializable {
...
// GoF의 Factory Method 패턴
// - 객체 생성 과정이 복잡할 때 별도의 메서드로 캡슐화 한다.
//
public static Board create(String csv) {
String[] values = csv.split(",");
Board board = new Board();
board.no = Integer.parseInt(values[0]);
board.title = values[1];
board.content = values[2];
board.writer = values[3];
board.password = values[4];
board.viewCount = Integer.parseInt(values[5]);
board.createdDate = Long.parseLong(values[6]);
return board;
}
}
public class BoardDao {
...
public void load() throws Exception {
try (BufferedReader in = new BufferedReader(new FileReader(filename))) {
String str;
while ((str = in.readLine()) != null) {
Board board = Board.create(str);
list.add(board);
boardNo = board.no;
}
}
}
...
}
- GRASP 패턴의 Information Expert 패턴
→ 정보 생성은 그 데이터를 갖고 있는 전문가에게 맡긴다.
public class Board implements Serializable {
...
// GRASP 패턴의 Information Expert 패턴
// => 정보 생성은 그 데이터를 갖고 있는 전문가에게 맡긴다.
public String toCsv() {
return String.format("%d,%s,%s,%s,%s,%d,%d",
this.no,
this.title,
this.content,
this.writer,
this.password,
this.viewCount,
this.createdDate);
}
}
public class BoardDao {
...
public void save() throws Exception {
try (FileWriter out = new FileWriter(filename)) {
for (Board board : list) {
out.write(board.toCsv() + "\n");
}
}
}
...
}
domain.Member 클래스 변경
dao.MemberDao 클래스 변경
Member class
public class Member implements Serializable {
...
//GoF의 Factory Method 패턴
// - 객체 생성 과정이 복잡할 때 별도의 메서드로 캡슐화 한다.
//
public static Member create(String csv) {
String[] values = csv.split(",");
Member member = new Member();
member.no = Integer.parseInt(values[0]);
member.name = values[1];
member.email = values[2];
member.password = values[3];
member.createdDate = Long.parseLong(values[4]);
return member;
}
// GRASP 패턴의 Information Expert 패턴
// => 정보 생성은 그 데이터를 갖고 있는 전문가에게 맡긴다.
public String toCsv() {
return String.format("%d,%s,%s,%s,%d",
this.no,
this.name,
this.email,
this.password,
this.createdDate);
}
}
public class MemberDao {
...
public void load() throws Exception {
try (BufferedReader in = new BufferedReader(new FileReader(filename))) {
String str;
while ((str = in.readLine()) != null) {
list.add(Member.create(str));
}
}
}
public void save() throws Exception {
try (FileWriter out = new FileWriter(filename)) {
for (Member member : list) {
out.write(member.toCsv() + "\n");
}
}
}
...
}
Integer a = new Integer(100); <- deprecated
->
Integer a = Integer.valueOf(100);
Wrapper 클래스의 가장 큰 목적!
primitive 값을 포함하여 모든 값을 쉽게 주고 받기 위함이다.