본문 바로가기

카테고리 없음

MCV

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

class Main {
public static void main(String[] args) {
App app = new App();
app.start();
}
}

// Session
// 현재 사용자가 이용중인 정보
// 이 안의 정보는 사용자가 프로그램을 사용할 때 동안은 계속 유지된다.
class Session {
private Member loginedMember;
private Board currentBoard;

public Member getLoginedMember() {
return loginedMember;
}

public void setLoginedMember(Member loginedMember) {
this.loginedMember = loginedMember;
}

public Board getCurrentBoard() {
return currentBoard;
}

public void setCurrentBoard(Board currentBoard) {
this.currentBoard = currentBoard;
}

public boolean isLogined() {
return loginedMember != null;
}
}

// Factory
// 프로그램 전체에서 공유되는 객체 리모콘을 보관하는 클래스
class Factory {
private static Session session;
private static DB db;
private static ArticleService articleService;
private static ArticleDao articleDao;
private static MemberService memberService;
private static MemberDao memberDao;
private static Scanner scanner;

public static Session getSession() {
if (session == null) {
session = new Session();
}

return session;
}

public static Scanner getScanner() {
if (scanner == null) {
scanner = new Scanner(System.in);
}

return scanner;
}

public static DB getDB() {
if (db == null) {
db = new DB();
}

return db;
}

public static ArticleService getArticleService() {
if (articleService == null) {
articleService = new ArticleService();
}

return articleService;
}

public static ArticleDao getArticleDao() {
if (articleDao == null) {
articleDao = new ArticleDao();
}

return articleDao;
}

public static MemberService getMemberService() {
if (memberService == null) {
memberService = new MemberService();
}
return memberService;
}

public static MemberDao getMemberDao() {
if (memberDao == null) {
memberDao = new MemberDao();
}

return memberDao;
}
}

// App
class App {
private Map<String, Controller> controllers;

void initControllers() {
controllers = new HashMap<>();
controllers.put("article", new ArticleController());
controllers.put("member", new MemberController());
}

public App() {
// 컨트롤러 등록
initControllers();

// 관리자 회원 생성
Factory.getMemberService().join("admin", "admin", "관리자");
// 공지사항 게시판 생성
Factory.getArticleService().makeBoard("공지시항", "notice");

// 현재 게시판을 1번 게시판으로 선택
Factory.getSession().setCurrentBoard(Factory.getArticleService().getBoard(1));
// 임시 : 현재 로그인 된 회원은 1번 회원으로 지정, 이건 나중에 회원가입, 로그인 추가되면 제거해야함
Factory.getSession().setLoginedMember(Factory.getMemberService().getMember(1));
}

public void start() {

while (true) {
System.out.printf("명령어 : ");
String command = Factory.getScanner().nextLine().trim();

if (command.length() == 0) {
continue;
} else if (command.equals("exit")) {
break;
}

Request reqeust = new Request(command);

if (reqeust.isValidRequest() == false) {
continue;
}

if (controllers.containsKey(reqeust.getControllerName()) == false) {
continue;
}

controllers.get(reqeust.getControllerName()).doAction(reqeust);
}

Factory.getScanner().close();
}
}

// Request
class Request {
private String requestStr;
private String controllerName;
private String actionName;
private String arg1;
private String arg2;
private String arg3;

boolean isValidRequest() {
return actionName != null;
}

Request(String requestStr) {
this.requestStr = requestStr;
String[] requestStrBits = requestStr.split(" ");
this.controllerName = requestStrBits[0];

if (requestStrBits.length > 1) {
this.actionName = requestStrBits[1];
}

if (requestStrBits.length > 2) {
this.arg1 = requestStrBits[2];
}

if (requestStrBits.length > 3) {
this.arg2 = requestStrBits[3];
}

if (requestStrBits.length > 4) {
this.arg3 = requestStrBits[4];
}
}

public String getControllerName() {
return controllerName;
}

public void setControllerName(String controllerName) {
this.controllerName = controllerName;
}

public String getActionName() {
return actionName;
}

public void setActionName(String actionName) {
this.actionName = actionName;
}

public String getArg1() {
return arg1;
}

public void setArg1(String arg1) {
this.arg1 = arg1;
}

public String getArg2() {
return arg2;
}

public void setArg2(String arg2) {
this.arg2 = arg2;
}

public String getArg3() {
return arg3;
}

public void setArg3(String arg3) {
this.arg3 = arg3;
}
}

// Controller
abstract class Controller {
abstract void doAction(Request reqeust);
}

class ArticleController extends Controller {
private ArticleService articleService;

ArticleController() {
articleService = Factory.getArticleService();
}

public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}

public void doAction(Request reqeust) {
if (reqeust.getActionName().equals("list")) {
actionList(reqeust);
} else if (reqeust.getActionName().equals("write")) {
actionWrite(reqeust);
}
}

private void actionList(Request reqeust) {
List<Article> articles = articleService.getArticles();
}

private void actionWrite(Request reqeust) {
System.out.printf("제목 : ");
String title = Factory.getScanner().nextLine();
System.out.printf("내용 : ");
String body = Factory.getScanner().nextLine();

// 현재 게시판 id 가져오기
int boardId = Factory.getSession().getCurrentBoard().getId();

// 현재 로그인한 회원의 id 가져오기
int memberId = Factory.getSession().getLoginedMember().getId();
int newId = articleService.write(boardId, memberId, title, body);

System.out.printf("%d번 글이 생성되었습니다.\n", newId);
}
}

class MemberController extends Controller {
void doAction(Request reqeust) {

}
}

// Service
class ArticleService {
private ArticleDao articleDao;

ArticleService() {
articleDao = Factory.getArticleDao();
}

public void makeBoard(String name, String code) {
Board board = new Board(name, code);
articleDao.saveBoard(board);
}

public Board getBoard(int id) {
return articleDao.getBoard(id);
}

public int write(int boardId, int memberId, String title, String body) {
Article article = new Article(boardId, memberId, title, body);
return articleDao.save(article);
}

public List<Article> getArticles() {
return articleDao.getArticles();
}

}

class MemberService {
private MemberDao memberDao;

MemberService() {
memberDao = Factory.getMemberDao();
}

public int join(String loginId, String loginPw, String name) {
Member member = new Member(loginId, loginPw, name);
return memberDao.save(member);
}

public Member getMember(int id) {
return memberDao.getMember(id);
}
}

// Dao
class ArticleDao {
DB db;

ArticleDao() {
db = Factory.getDB();
}

public int saveBoard(Board board) {
return db.saveBoard(board);
}

public int save(Article article) {
return db.saveArticle(article);
}

public Board getBoard(int id) {
return db.getBoard(id);
}

public List<Article> getArticles() {
return db.getArticles();
}

}

class MemberDao {
DB db;

MemberDao() {
db = Factory.getDB();
}

public Member getMember(int id) {
return db.getMember(id);
}

public int save(Member member) {
return db.saveMember(member);
}
}

// DB
class DB {
private Map<String, Table> tables;

public DB() {
String dbDirPath = getDirPath();
Util.makeDir(dbDirPath);

tables = new HashMap<>();

tables.put("board", new Table<Board>(Board.class, dbDirPath));
tables.put("article", new Table<Article>(Article.class, dbDirPath));
tables.put("member", new Table<Member>(Member.class, dbDirPath));
}

public Member getMember(int id) {
return (Member) tables.get("member").getRow(id);
}

public int saveBoard(Board board) {
return tables.get("board").saveRow(board);
}

public String getDirPath() {
return "db";
}

public int saveMember(Member member) {
return tables.get("member").saveRow(member);
}

public Board getBoard(int id) {
return (Board) tables.get("board").getRow(id);
}

public List<Article> getArticles() {
return tables.get("article").getRows();
}

public int saveArticle(Article article) {
return tables.get("article").saveRow(article);
}

public void backup() {
for (String tableName : tables.keySet()) {
Table table = tables.get(tableName);
table.backup();
}
}
}

// Table
class Table<T> {
private Class<T> dataCls;
private String tableName;
private String tableDirPath;

public Table(Class<T> dataCls, String dbDirPath) {
this.dataCls = dataCls;
this.tableName = Util.lcfirst(dataCls.getCanonicalName());
this.tableDirPath = dbDirPath + "/" + this.tableName;

Util.makeDir(tableDirPath);
}

private String getTableName() {
return tableName;
}

public int saveRow(T data) {
Dto dto = (Dto) data;

if (dto.getId() == 0) {
int lastId = getLastId();
int newId = lastId + 1;
((Dto) data).setId(newId);
setLastId(newId);
}

String rowFilePath = getRowFilePath(dto.getId());

Util.writeJsonFile(rowFilePath, data);

return dto.getId();
};

private String getRowFilePath(int id) {
return tableDirPath + "/" + id + ".json";
}

private void setLastId(int lastId) {
String filePath = getLastIdFilePath();
Util.writeFileContents(filePath, lastId);
}

private int getLastId() {
String filePath = getLastIdFilePath();

if (Util.isFileExists(filePath) == false) {
int lastId = 0;
Util.writeFileContents(filePath, lastId);
return lastId;
}

return Integer.parseInt(Util.getFileContents(filePath));
}

private String getLastIdFilePath() {
return this.tableDirPath + "/lastId.txt";
}

public T getRow(int id) {
return (T) Util.getObjectFromJson(getRowFilePath(id), dataCls);
}

public void backup() {

}

void delete(int id) {
/* 구현 */
};

List<T> getRows( /* 구현 */ ) {
return null;
};
}

// DTO
abstract class Dto {
private int id;
private String regDate;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getRegDate() {
return regDate;
}

public void setRegDate(String regDate) {
this.regDate = regDate;
}

Dto() {
this(0);
}

Dto(int id) {
this(id, Util.getNowDateStr());
}

Dto(int id, String regDate) {
this.id = id;
this.regDate = regDate;
}
}

class Board extends Dto {
private String name;
private String code;

public Board() {
}

public Board(String name, String code) {
this.name = name;
this.code = code;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

}

class Article extends Dto {
private int boardId;
private int memberId;
private String title;
private String body;

public Article() {

}

public Article(int boardId, int memberId, String title, String body) {
this.boardId = boardId;
this.memberId = memberId;
this.title = title;
this.body = body;
}

public int getBoardId() {
return boardId;
}

public void setBoardId(int boardId) {
this.boardId = boardId;
}

public int getMemberId() {
return memberId;
}

public void setMemberId(int memberId) {
this.memberId = memberId;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getBody() {
return body;
}

public void setBody(String body) {
this.body = body;
}
}

class ArticleReply extends Dto {
private int id;
private String regDate;
private int articleId;
private int memberId;
private String body;

ArticleReply() {

}

public int getArticleId() {
return articleId;
}

public void setArticleId(int articleId) {
this.articleId = articleId;
}

public int getMemberId() {
return memberId;
}

public void setMemberId(int memberId) {
this.memberId = memberId;
}

public String getBody() {
return body;
}

public void setBody(String body) {
this.body = body;
}

}

class Member extends Dto {
private String loginId;
private String loginPw;
private String name;

public Member() {

}

public Member(String loginId, String loginPw, String name) {
this.loginId = loginId;
this.loginPw = loginPw;
this.name = name;
}

public String getLoginId() {
return loginId;
}

public void setLoginId(String loginId) {
this.loginId = loginId;
}

public String getLoginPw() {
return loginPw;
}

public void setLoginPw(String loginPw) {
this.loginPw = loginPw;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

// Util
class Util {
// 현재날짜문장
public static String getNowDateStr() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat Date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = Date.format(cal.getTime());
return dateStr;
}

// 파일에 내용쓰기
public static void writeFileContents(String filePath, int data) {
writeFileContents(filePath, data + "");
}

// 첫 문자 소문자화
public static String lcfirst(String str) {
String newStr = "";
newStr += str.charAt(0);
newStr = newStr.toLowerCase();

return newStr + str.substring(1);
}

// 파일이 존재하는지
public static boolean isFileExists(String filePath) {
File f = new File(filePath);
if (f.isFile()) {
return true;
}

return false;
}

// 파일내용 읽어오기
public static String getFileContents(String filePath) {
String rs = null;
try {
// 바이트 단위로 파일읽기
FileInputStream fileStream = null; // 파일 스트림

fileStream = new FileInputStream(filePath);// 파일 스트림 생성
// 버퍼 선언
byte[] readBuffer = new byte[fileStream.available()];
while (fileStream.read(readBuffer) != -1) {
}

rs = new String(readBuffer);

fileStream.close(); // 스트림 닫기
} catch (Exception e) {
e.getStackTrace();
}

return rs;
}

// 파일 쓰기
public static void writeFileContents(String filePath, String contents) {
BufferedOutputStream bs = null;
try {
bs = new BufferedOutputStream(new FileOutputStream(filePath));
bs.write(contents.getBytes()); // Byte형으로만 넣을 수 있음
} catch (Exception e) {
e.getStackTrace();
} finally {
try {
bs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

// Json안에 있는 내용을 가져오기
public static Object getObjectFromJson(String filePath, Class cls) {
ObjectMapper om = new ObjectMapper();
Object obj = null;
try {
obj = om.readValue(new File(filePath), cls);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {

} catch (IOException e) {
e.printStackTrace();
}

return obj;
}

public static void writeJsonFile(String filePath, Object obj) {
ObjectMapper om = new ObjectMapper();
try {
om.writeValue(new File(filePath), obj);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void makeDir(String dirPath) {
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdir();
}
}
}