Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.idea
.out
74 changes: 74 additions & 0 deletions com/ll/wiseSaying/src/App.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.ll.wiseSaying.src;

import java.util.Scanner;

public class App {
public Scanner sc;
static String[] commands = {"등록", "목록", "빌드", "종료"};
static String patternDelete = "삭제\\?id=\\d+";
static String patternUpdate = "수정\\?id=\\d+";

static boolean commandNeedId = false;

WiseSayingController wiseSayingController;

public void run(Scanner sc) {

this.sc = sc;
wiseSayingController = new WiseSayingController(sc);
System.out.println("== 명언 앱 ==");
while (true) {
System.out.printf("명령) ");
String commandInput = sc.nextLine();
String command = "";
int id = 0;
if(!validCommand(commandInput)) {
System.out.println("올바른 명령어가 아닙니다.");
continue;
}
if(commandNeedId){
command = commandInput.split("\\?")[0];
id = Integer.parseInt(commandInput.split("=")[1]);
}else{
command = commandInput;
}
switch (command) {
case "등록":
wiseSayingController.addWiseSaying();
break;
case "목록":
wiseSayingController.showWiseSaying();
break;
case "빌드":
wiseSayingController.buildJson();
break;
case "삭제":
wiseSayingController.removeWiseSaying(id);
break;
case "수정":
wiseSayingController.updateWiseSaying(id);
break;
case "종료":
wiseSayingController.terminate();
sc.close();
return;
}
}
}

public boolean validCommand(String command) {
if(command.length() == 2) {
commandNeedId = false;
for (String c : commands) {
if (c.equals(command)) {
return true;
}
}
} else if (command.matches(patternDelete) || command.matches(patternUpdate)) {
commandNeedId = true;
return true;
}
return false;
}

}
11 changes: 11 additions & 0 deletions com/ll/wiseSaying/src/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.ll.wiseSaying.src;

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
App app = new App();
Scanner scanner = new Scanner(System.in);
app.run(scanner);
}
}
23 changes: 23 additions & 0 deletions com/ll/wiseSaying/src/WiseSaying.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.ll.wiseSaying.src;

import org.json.simple.JSONObject;

public class WiseSaying {
int id;
String content;
String author;

public WiseSaying(int id, String content, String author) {
this.id = id;
this.content = content;
this.author = author;
}

public JSONObject toJson() {
JSONObject obj = new JSONObject();
obj.put("id", this.id);
obj.put("quote", this.content);
obj.put("author", this.author);
return obj;
}
}
59 changes: 59 additions & 0 deletions com/ll/wiseSaying/src/WiseSayingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.ll.wiseSaying.src;

import java.util.Scanner;

public class WiseSayingController {
WiseSayingService wiseSayingService = new WiseSayingService();
Scanner sc;

public WiseSayingController(Scanner sc) {
this.sc = sc;
}
public void addWiseSaying() {
System.out.printf("명언 : ");
String content = sc.nextLine();
System.out.printf("작가 : ");
String author = sc.nextLine();
int id = wiseSayingService.addWiseSaying(content, author);
System.out.println(id + "번 명언이 등록되었습니다.");
}

public void removeWiseSaying(int id) {
try {
wiseSayingService.removeWiseSaying(id);
System.out.println(id + "번째 명언이 삭제되었습니다.");
}catch (Exception e){
System.out.println(e);
}

}

public void updateWiseSaying(int id) {
try {
System.out.printf("명언 : ");
String content = sc.nextLine();
System.out.printf("작가 : ");
String author = sc.nextLine();
wiseSayingService.updateWiseSaying(id, content, author);
System.out.println(id + "번 명언이 수정되었습니다.");
} catch (Exception e){
System.out.println(e);
}

}

public void showWiseSaying() {
System.out.println("번호 / 작가 / 명언");
System.out.println("----------------------");
System.out.println(wiseSayingService.getAllWiseSaying());
}

public void buildJson() {
wiseSayingService.buildJson();
System.out.println("data.json 파일의 내용이 갱신되었습니다.");
}

public void terminate(){
wiseSayingService.saveLastId();
}
}
32 changes: 32 additions & 0 deletions com/ll/wiseSaying/src/WiseSayingRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.ll.wiseSaying.src;
import java.util.HashMap;
import java.util.Map;

public class WiseSayingRepository {
public Map<Integer, WiseSaying> wiseSayingList = new HashMap<>();
public int lastId = 0;

public void addWiseSaying(WiseSaying wiseSaying) {
wiseSayingList.put(wiseSaying.id, wiseSaying);
}

public void removeWiseSaying(int id) {
wiseSayingList.remove(id);
}

public WiseSaying getWiseSaying(int id) {
return wiseSayingList.get(id);
}

public Map<Integer, WiseSaying> getAllWiseSayings() {
return wiseSayingList;
}

public void updateWiseSaying(int id, String quote, String author) {
wiseSayingList.put(id, new WiseSaying(id, quote, author));
}

public int getLastId() {
return lastId;
}
}
79 changes: 79 additions & 0 deletions com/ll/wiseSaying/src/WiseSayingService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.ll.wiseSaying.src;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

import org.json.simple.JSONArray;
public class WiseSayingService {
WiseSayingRepository wiseSayingRepository = new WiseSayingRepository();
static String dirName = "db/wiseSaying/";

/*
* @return 생성된 명언의 id
* */
public int addWiseSaying(String content, String author) {
WiseSaying wiseSaying = new WiseSaying(++wiseSayingRepository.lastId, content, author);
wiseSayingRepository.addWiseSaying(wiseSaying);
saveWiseSayingAsFile(wiseSaying);
return wiseSaying.id;
}

public void removeWiseSaying(int id) {
if(wiseSayingRepository.getWiseSaying(id) != null){
wiseSayingRepository.removeWiseSaying(id);
} else {
throw new IllegalArgumentException(String.format("%d번 명언은 존재하지 않습니다.", id));
}
}

public void updateWiseSaying(int id, String content, String author) {
if(wiseSayingRepository.getWiseSaying(id) != null){
wiseSayingRepository.updateWiseSaying(id, content, author);
} else {
throw new IllegalArgumentException(String.format("%d번 명언은 존재하지 않습니다.", id));
}
}

public String getAllWiseSaying() {
StringBuilder sb = new StringBuilder();
Map<Integer, WiseSaying> wiseSayingList = wiseSayingRepository.wiseSayingList;
String result = "";
for (int i : wiseSayingList.keySet()) {
WiseSaying ws = wiseSayingList.get(i);
result = sb.append(ws.id).append(" / ").append(ws.author).append(" / ").append(ws.content).append("\n").toString();
}
return result;
}

public void buildJson() {
String fileName = dirName + "data.json";
Map<Integer, WiseSaying> wiseSayingList = wiseSayingRepository.wiseSayingList;
JSONArray jsonList = new JSONArray();
for (int i : wiseSayingList.keySet()) {
jsonList.add(wiseSayingList.get(i).toJson());
}
saveFile(fileName, jsonList.toJSONString());
}



public void saveWiseSayingAsFile(WiseSaying wiseSaying) {
String fileName = String.format("%s%d.json", dirName, wiseSaying.id);
saveFile(fileName, wiseSaying.toJson().toJSONString());
}
public void saveFile(String fileName, String content) {
try {
FileWriter file = new FileWriter(fileName);
file.write(content);
file.flush();
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public void saveLastId() {
String fileName = dirName + "lastId.txt";
saveFile(fileName, String.valueOf(wiseSayingRepository.lastId));
}
}
32 changes: 32 additions & 0 deletions com/ll/wiseSaying/test/TestUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.ll.wiseSaying.test;

import java.io.*;
import java.util.Scanner;

public class TestUtil {
// gen == generate 생성하다.
// 테스트용 스캐너 생성
public static Scanner genScanner(final String input) {
final InputStream in = new ByteArrayInputStream(input.getBytes());

return new Scanner(in);
}

// System.out의 출력을 스트림으로 받기
public static ByteArrayOutputStream setOutToByteArray() {
final ByteArrayOutputStream output = new ByteArrayOutputStream();
System.setOut(new PrintStream(output));

return output;
}

// setOutToByteArray 함수의 사용을 완료한 후 정리하는 함수, 출력을 다시 정상화 하는 함수
public static void clearSetOutToByteArray(final ByteArrayOutputStream output) {
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
try {
output.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
75 changes: 75 additions & 0 deletions com/ll/wiseSaying/test/WiseSayingControllerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.ll.wiseSaying.test;

import com.ll.wiseSaying.src.App;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import java.util.*;
import java.io.ByteArrayOutputStream;

public class WiseSayingControllerTest {
App app;
@BeforeEach
void beforeEach() {
app = new App();
}

@Test
@DisplayName("등록 명령 처리")
void addWiseSaying() {
String input = """
등록
현재를 사랑하라.
작자미상
종료
""";

Scanner scanner = TestUtil.genScanner(input);

ByteArrayOutputStream outputStream = TestUtil.setOutToByteArray();

app.run(scanner);
String output = outputStream.toString().trim();
assertThat(output)
.contains("== 명언 앱 ==")
.contains("명언 :")
.contains("작가 :")
.contains("1번 명언이 등록되었습니다.");
TestUtil.clearSetOutToByteArray(outputStream);
}

@Test
@DisplayName("목록 명령 처리")
void showWiseSaying() {
String input = """
등록
현재를 사랑하라.
작자미상
등록
과거에 집착하지 마라.
작자미상
목록
삭제?id=1
삭제?id=1
""";

Scanner scanner = TestUtil.genScanner(input);

ByteArrayOutputStream outputStream = TestUtil.setOutToByteArray();

app.run(scanner);
String output = outputStream.toString().trim();

assertThat(output)
.contains("== 명언 앱 ==")
.contains("1 / 작자미상 / 현재를 사랑하라.")
.contains("2 / 작자미상 / 과거에 집착하지 마라.")
.contains("1번 명언이 삭제되었습니다.")
.contains("1번 명언은 존재하지 않습니다.");

TestUtil.clearSetOutToByteArray(outputStream);
}

}
1 change: 1 addition & 0 deletions db/wiseSaying/1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"quote":"현재를 사랑하라.","author":"작자미상","id":1}
Loading