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
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions .idea/code-review.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 42 additions & 0 deletions TDD/Proverb.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package TDD;

public class Proverb {

private int id; // 명언 ID
private String proverb; // 명언 내용
private String author; // 작가 이름

// 생성자
public Proverb(int id, String proverb, String author) {
this.id = id;
this.proverb = proverb;
this.author = author;
}

// Getter와 Setter
public int getId() {
return id;
}

public String getProverb() {
return proverb;
}

public void setProverb(String proverb) {
this.proverb = proverb;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

// toString 메서드 (목록 출력용)
@Override
public String toString() {
return id + " / " + author + " / " + proverb;
}
}
42 changes: 42 additions & 0 deletions TDD/main/controller/ProverbController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package TDD.main.controller;


import TDD.main.service.ProverbService;

public class ProverbController {

private final ProverbService service;

public ProverbController() {
this.service = new ProverbService();
}

public String registerProverb(String proverb, String author) {
if (proverb == null || proverb.isBlank() || author == null || author.isBlank()) {
return "명언과 작가는 반드시 입력해야 합니다.";
}
return service.addProverb(proverb, author);
}

public String listProverbs(int page) {
return service.getProverbsByPage(page);
}

public String searchProverb(String keywordType, String keyword) {
return service.searchProverb(keywordType, keyword);
}

public String deleteProverb(int id) {
return service.deleteProverb(id);
}

public String updateProverb(int id, String newProverb, String newAuthor) {
return service.updateProverb(id, newProverb, newAuthor);
}

public String saveDataToFile() {
service.saveProverbsToData();
return "data.json 파일이 생성되었습니다.";
}

}
108 changes: 108 additions & 0 deletions TDD/main/repository/ProverbRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package TDD.main.repository;

import TDD.Proverb;

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

public class ProverbRepository {
private static final String DB_FOLDER = "src/미니과제/db/";
private static final String LAST_ID_FILE = DB_FOLDER + "lastId.txt";
private static final String DATA_FILE = DB_FOLDER + "data.json";

public int readLastId() {
File file = new File(LAST_ID_FILE);
if (!file.exists()) return 1;

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
return Integer.parseInt(br.readLine());
} catch (IOException e) {
e.printStackTrace();
return 1;
}
}

public void saveLastId(int id) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(LAST_ID_FILE))) {
bw.write(String.valueOf(id));
} catch (IOException e) {
e.printStackTrace();
}
}

public void saveProverb(Proverb proverb) {
File file = new File(DB_FOLDER + proverb.getId() + ".json");
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
String json = "{ \"id\": " + proverb.getId() + ", \"proverb\": \"" + proverb.getProverb() + "\", \"author\": \"" + proverb.getAuthor() + "\" }";
bw.write(json);
} catch (IOException e) {
e.printStackTrace();
}
}

public int getNextId() {
int lastId = readLastId();
saveLastId(lastId + 1);
return lastId;
}


public void deleteProverbFile(int id) {
File file = new File(DB_FOLDER + id + ".json");
if (file.exists()) file.delete();
}

public List<Proverb> loadProverbs() {
List<Proverb> proverbs = new ArrayList<>();
File folder = new File(DB_FOLDER);

File[] files = folder.listFiles((dir, name) -> name.endsWith(".json"));
if (files != null) {
for (File file : files) {
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String json = br.readLine();
if (json == null || json.isBlank()) {
System.out.println("빈 파일을 무시합니다: " + file.getName());
continue;
}

try {
String idString = json.substring(json.indexOf(":") + 1, json.indexOf(",")).trim();
String proverb = json.substring(json.indexOf("proverb") + 11, json.indexOf(",", json.indexOf("proverb")) - 1).trim();
String author = json.substring(json.indexOf("author") + 11, json.lastIndexOf("\"")).trim();

int id = Integer.parseInt(idString);
proverbs.add(new Proverb(id, proverb, author));
} catch (StringIndexOutOfBoundsException | NumberFormatException e) {
System.out.println("JSON 형식 오류로 파일을 무시합니다: " + file.getName());
}
} catch (IOException e) {
System.out.println("파일 읽기 실패: " + file.getName());
e.printStackTrace();
}
}
}
return proverbs;
}

public void saveProverbsToData(List<Proverb> proverbsList) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(DATA_FILE))) {
bw.write("[\n");
for (int i = 0; i < proverbsList.size(); i++) {
Proverb proverb = proverbsList.get(i);
String json = " {\n" +
" \"id\": " + proverb.getId() + ",\n" +
" \"proverb\": \"" + proverb.getProverb() + "\",\n" +
" \"author\": \"" + proverb.getAuthor() + "\"\n" +
" }";
bw.write(json);
if (i < proverbsList.size() - 1) {
bw.write(",\n");
}
}
bw.write("\n]");
} catch (IOException e) {
e.printStackTrace();
}
}
}
92 changes: 92 additions & 0 deletions TDD/main/service/ProverbService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package TDD.main.service;

import TDD.Proverb;
import TDD.main.repository.ProverbRepository;

import java.util.ArrayList;
import java.util.List;

public class ProverbService {
private final ProverbRepository repository;
private final List<Proverb> proverbList;

public ProverbService() {
this.repository = new ProverbRepository();
this.proverbList = repository.loadProverbs();
}

public String addProverb(String proverb, String author) {
int id = repository.getNextId();
Proverb newProverb = new Proverb(id, proverb, author);
proverbList.add(newProverb);
repository.saveProverb(newProverb);
return id + "번 명언이 등록되었습니다.";
}

public String getProverbsByPage(int page) {
int itemsPerPage = 5;
int startIndex = (page - 1) * itemsPerPage;
int endIndex = Math.min(startIndex + itemsPerPage, proverbList.size());

if (startIndex >= proverbList.size() || startIndex < 0) {
return "존재하지 않는 페이지입니다.";
}

StringBuilder result = new StringBuilder("번호 / 작가 / 명언\n----------------\n");
for (int i = startIndex; i < endIndex; i++) {
Proverb proverb = proverbList.get(i);
result.append(proverb.getId()).append(" / ").append(proverb.getAuthor())
.append(" / ").append(proverb.getProverb()).append("\n");
}
return result.toString();
}

public String searchProverb(String keywordType, String keyword) {
List<Proverb> results = new ArrayList<>();
for (Proverb proverb : proverbList) {
if ("content".equals(keywordType) && proverb.getProverb().contains(keyword)) {
results.add(proverb);
} else if ("author".equals(keywordType) && proverb.getAuthor().contains(keyword)) {
results.add(proverb);
}
}

if (results.isEmpty()) {
return "검색 결과가 없습니다.";
}

StringBuilder result = new StringBuilder("번호 / 작가 / 명언\n----------------\n");
for (Proverb proverb : results) {
result.append(proverb.getId()).append(" / ").append(proverb.getAuthor())
.append(" / ").append(proverb.getProverb()).append("\n");
}
return result.toString();
}

public String deleteProverb(int id) {
for (int i = 0; i < proverbList.size(); i++) {
if (proverbList.get(i).getId() == id) {
proverbList.remove(i);
repository.deleteProverbFile(id);
return id + "번 명언이 삭제되었습니다.";
}
}
return id + "번 명언은 존재하지 않습니다.";
}

public String updateProverb(int id, String newProverb, String newAuthor) {
for (Proverb proverb : proverbList) {
if (proverb.getId() == id) {
proverb.setProverb(newProverb);
proverb.setAuthor(newAuthor);
repository.saveProverb(proverb);
return id + "번 명언이 수정되었습니다.";
}
}
return id + "번 명언은 존재하지 않습니다.";
}

public void saveProverbsToData() {
repository.saveProverbsToData(proverbList);
}
}
Loading