From 242328e700965ed02d419fd3f32a476689d5295b Mon Sep 17 00:00:00 2001 From: Lined1 <108262570+Lined1@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:22:37 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[BE5]=EC=9D=B4=EC=9D=80=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 명언 게시판 10단계까지 --- "[BE5]\354\235\264\354\235\200\354\244\200" | 263 ++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200" diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200" "b/[BE5]\354\235\264\354\235\200\354\244\200" new file mode 100644 index 0000000..9a29d71 --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200" @@ -0,0 +1,263 @@ +package Solution; +import java.io.*; +import java.util.Scanner; + +class Solution { + public static void main(String args[]) { + Scanner sc = new Scanner(System.in); + + System.out.println("== 명언 앱 =="); + + // 명령에 따른 동작 + while (true) { + System.out.print("명령) "); + String command = sc.nextLine(); // 명령어 + + // 명언 등록 + if (command.equals("등록")) { + System.out.print("명언 : "); + String quote = sc.nextLine(); // 명언 입력 + + System.out.print("작가 : "); + String author = sc.nextLine(); // 작가 입력 + + int idCounter = loadLastId(); // 마지막 사용된 ID 가져오기 + Quote Quote = new Quote(idCounter, quote, author); // 새 명언 객체 생성 + + saveQuoteToFile(Quote); // 명언을 파일에 저장 + saveLastId(idCounter + 1); // ID 증가 후 저장 + + System.out.println(idCounter + "번 명언이 등록되었습니다."); + + // 명언 목록 출력 + } else if (command.equals("목록")) { + System.out.println("번호 / 작가 / 명언"); + System.out.println("----------------------"); + + File folder = new File("db/wiseSaying"); + if (folder.exists()) { // 폴더가 존재하고 디렉터리인지 확인 + + /*FilenameFilter대신 람다식으로 .json확장자를 가지는 파일만 가져옴, 메모*/ + File[] files = folder.listFiles((dir, name) -> { + if (name.endsWith(".json")) { // 확장자 확인, 파일의 이름이 숫자인 경우만 + String checknum = name.substring(0, name.lastIndexOf('.')); // 확장자 제거 + for (char ch : checknum.toCharArray()) { + if (!Character.isDigit(ch)) { // 문자가 숫자가 아니면 제외 + return false; + } + } + return true; // 모든 문자가 숫자라면 true 반환 + } + return false; + }); + + if (files != null) { + for (int i = files.length - 1; i >= 0; i--) { // 최신 순으로 출력 + Quote quote = loadQuoteFromFile(files[i]); // 파일에서 명언 로드 + if (quote != null) { + System.out.println(quote.id + " / " + quote.author + " / " + quote.quote); + } + } + } + } else { + System.out.println("등록된 명언이 없습니다."); + } + + // 명언 삭제 + } else if (command.startsWith("삭제?id=")) { + try { + int idToDelete = Integer.parseInt(command.split("=")[1]); // 삭제할 ID 추출 + if (deleteQuoteFile(idToDelete)) { // 파일 삭제 + System.out.println(idToDelete + "번 명언이 삭제되었습니다."); + } else { + System.out.println(idToDelete + "번 명언은 존재하지 않습니다."); + } + } catch (NumberFormatException e) { + System.out.println("삭제 오류"); + } + + // 명언 수정 + } else if (command.startsWith("수정?id=")) { + try { + int idToFix = Integer.parseInt(command.split("=")[1]); // 수정할 명언 ID 추출 + Quote Quote = loadQuoteFromFile(new File("db/wiseSaying/" + idToFix + ".json")); // 파일에서 명언 로드 + + if (Quote != null) { + System.out.println("명언(기존) : " + Quote.quote); + System.out.print("명언 : "); + String quote = sc.nextLine(); // 새로운 명언 입력 + + System.out.println("작가(기존) : " + Quote.author); + System.out.print("작가 : "); + String author = sc.nextLine(); // 새로운 작가 입력 + + Quote.quote = quote; // 명언 업데이트 + Quote.author = author; + + saveQuoteToFile(Quote); // 수정된 명언을 파일에 저장 + } else { + System.out.println(idToFix + "번 명언은 존재하지 않습니다."); + } + } catch (NumberFormatException e) { + System.out.println("수정 오류"); + } + + // 빌드 명령 + } else if (command.equals("빌드")) { + buildDataJson(); + System.out.println("data.json 파일의 내용이 갱신되었습니다."); + + // 프로그램 종료 + } else if (command.equals("종료")) { + break; + } else { + System.out.println("알 수 없는 명령"); + } + } + + sc.close(); // 리소스 해제 + } + + // 명언 데이터를 파일로 저장 + private static void saveQuoteToFile(Quote quote) { + try { + File folder = new File("db/wiseSaying"); + if (!folder.exists()) { // 디렉터리가 없으면 생성 + folder.mkdirs(); + } + + File file = new File("db/wiseSaying/" + quote.id + ".json"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write("{\n"); + writer.write("\"id\": " + quote.id + ",\n"); + writer.write("\"content\": \"" + quote.quote + "\",\n"); + writer.write("\"author\": \"" + quote.author + "\"\n"); + writer.write("}"); + } + } catch (IOException e) { + System.out.println("파일 저장 오류"); + } + } + + // 파일에서 명언을 읽어와 Quote 객체로 반환 + private static Quote loadQuoteFromFile(File file) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + StringBuilder json = new StringBuilder(); + String line; + + while ((line = reader.readLine()) != null) { // JSON 데이터 줄읽기 + json.append(line); // StringBuilder로 전체 문자열 결합 + } + + return parseJsonToQuote(json.toString()); // JSON 데이터를 Quote 객체로 변환 + } catch (IOException e) { + return null; // 실패시 null 반환 + } + } + + // 특정 ID의 명언 파일 삭제 + private static boolean deleteQuoteFile(int id) { + File file = new File("db/wiseSaying/" + id + ".json"); + if(file.exists()) { + file.delete(); + return true; + } + return false; + } + + // 마지막 ID 값을 파일에서 읽어옴 + private static int loadLastId() { + File file = new File("db/wiseSaying/lastId.txt"); + if (file.exists()) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + return Integer.parseInt(reader.readLine().trim()); + } catch (IOException | NumberFormatException e) { + System.out.println("lastId.txt 파일을 읽는 중 오류가 발생했습니다."); + } + } + return 1; // 파일이 없으면 초기값으로 1 반환 + } + + // 마지막 ID 값을 파일에 저장 + private static void saveLastId(int lastId) { + try { + File folder = new File("db/wiseSaying"); + if (!folder.exists()) { // 디렉터리가 없으면 생성 + folder.mkdirs(); + } + + File file = new File("db/wiseSaying/lastId.txt"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write(String.valueOf(lastId)); + } + } catch (IOException e) { + System.out.println("lastId.txt 파일 저장 중 오류가 발생했습니다."); + } + } + + // JSON 데이터를 Quote 객체로 변환 + private static Quote parseJsonToQuote(String json) { + try { + // JSON 데이터에서 중괄호, 공백 제거 + json = json.trim().replace("{", "").replace("}", "").replace("\n", "").replace("\r", ""); + + // JSON 데이터의 필드별 분리 + String[] lines = json.split(","); + + // 필드 값 추출 + int id = Integer.parseInt(lines[0].split(":")[1].trim()); + String quote = lines[1].split(":")[1].trim().replace("\"", ""); + String author = lines[2].split(":")[1].trim().replace("\"", ""); + // Quote 객체 생성 + return new Quote(id, quote, author); + } catch (Exception e) { + System.out.println("JSON 파싱 오류"); + return null; + } + } + //기존의 .json 명언들 합침 + private static void buildDataJson() { + File folder = new File("db/wiseSaying"); + File[] files = folder.listFiles((dir, name) -> { + if (name.endsWith(".json")) { // 확장자 확인, 파일의 이름이 숫자인 경우만 + String checknum = name.substring(0, name.lastIndexOf('.')); // 확장자 제거 + for (char ch : checknum.toCharArray()) { + if (!Character.isDigit(ch)) { // 문자가 숫자가 아니면 제외 + return false; + } + } + return true; // 모든 문자가 숫자라면 true 반환 + } + return false; + }); + try (BufferedWriter writer = new BufferedWriter(new FileWriter("db/wiseSaying/data.json"))) { + writer.write("[\n"); // JSON 배열 시작 + for (int i = 0; i < files.length; i++) { + try (BufferedReader reader = new BufferedReader(new FileReader(files[i]))) { + String line; + while ((line = reader.readLine()) != null) { + writer.write(" " + line); // 들여쓰기 추가 + } + } + if (i < files.length - 1) writer.write(",\n"); // , 추가 + } + writer.write("\n]\n"); // JSON 배열 종료 + } catch (IOException e) { + System.out.println("빌드 오류" + e.getMessage()); + } + } +} + +// 명언 데이터를 나타내는 클래스 +class Quote { + int id; // 명언 ID + String quote; // 명언 내용 + String author; // 명언 작가 + + // 생성자 + Quote(int id, String quote, String author) { + this.id = id; + this.quote = quote; + this.author = author; + } +} From dcb8d484b41be9dfec8f6b6d296445017aa42906 Mon Sep 17 00:00:00 2001 From: Lined1 <108262570+Lined1@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:32:12 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[BE5]=EC=9D=B4=EC=9D=80=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 구현 : TDD제외 1~14단계 MVC구조 구현 미흡 하드코딩 --- .../devcourse/com/ll/wiseSaying/App.class | Bin 0 -> 1868 bytes .../devcourse/com/ll/wiseSaying/Main.class | Bin 0 -> 453 bytes .../com/ll/wiseSaying/PageResponse.class | Bin 0 -> 1164 bytes .../com/ll/wiseSaying/WiseSaying.class | Bin 0 -> 944 bytes .../ll/wiseSaying/WiseSayingController.class | Bin 0 -> 5331 bytes .../ll/wiseSaying/WiseSayingRepository.class | Bin 0 -> 6910 bytes .../com/ll/wiseSaying/WiseSayingService.class | Bin 0 -> 4370 bytes src/src/com/ll/wiseSaying/App.java | 40 ++++++ src/src/com/ll/wiseSaying/Main.java | 7 + src/src/com/ll/wiseSaying/PageResponse.java | 32 +++++ src/src/com/ll/wiseSaying/WiseSaying.java | 33 +++++ .../ll/wiseSaying/WiseSayingController.java | 120 ++++++++++++++++ .../ll/wiseSaying/WiseSayingRepository.java | 130 ++++++++++++++++++ .../com/ll/wiseSaying/WiseSayingService.java | 77 +++++++++++ 14 files changed, 439 insertions(+) create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/App.class create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/Main.class create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/PageResponse.class create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class create mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class create mode 100644 src/src/com/ll/wiseSaying/App.java create mode 100644 src/src/com/ll/wiseSaying/Main.java create mode 100644 src/src/com/ll/wiseSaying/PageResponse.java create mode 100644 src/src/com/ll/wiseSaying/WiseSaying.java create mode 100644 src/src/com/ll/wiseSaying/WiseSayingController.java create mode 100644 src/src/com/ll/wiseSaying/WiseSayingRepository.java create mode 100644 src/src/com/ll/wiseSaying/WiseSayingService.java diff --git a/src/out/production/devcourse/com/ll/wiseSaying/App.class b/src/out/production/devcourse/com/ll/wiseSaying/App.class new file mode 100644 index 0000000000000000000000000000000000000000..c179134bb3efc50941840245b30da4c428a161ad GIT binary patch literal 1868 zcmah}ZBrXn6n-u**=1QMY@np{Ero(f78|woH4TVpZENTYsUWq!Y?5tRy4ekz4Vq8R z=(OWF%=n>VZLKq?A2N2v4|Hs>GUE^MuOz>~any4+1VYQuFUj6}&wb8wp7Wgh*S~-K z319+?5}ME~phZS2d<}#y9~aQhGn>;49%hNv;dKz+Y2hVh8az! zHOtbSHb`g}Aj{}L=QfmNG4JYGh9<*e=uLPx4Lf?q$`#zC>*!iGCP6?K&)>}u2<;dW zo^FF5Jpy`V>_s0TrR{9gG^3vwc|EBW4dOeV%P|P~8X*RM4XBZ2Ou#;d;U}-oY@$r* zIXiE-wo{Z4;KCeW7~JhbQg;@Ov@T&k4)GceGpM1&Za214#JHYEp2BFtwp_823d$78^8jQy!Jcs86yddK^PEe!jo@ls9jm&WzlbdG45}ql^GSq7l zPQ*(LBH>n69)*J(@)a4ca=cdWCO1_~#!18}%+fz~6NaTT^n}7SO&ZZejFHVNw^l1Z z{vcr-ZwQ!>@h0Bd?qn}D1?me0&CEYWtTrvN@MYemw`H8>)8tE&!ChU%S&o1I7s3~j zpyF!ZV?5b88Rv0t3R#)zg85vSG zh#490@c>^&H+7!-G7tIkyXwkvJ>-gv54@19oiVN!MSR5RJzA>Vy2lYT87a=bHB~Uo zjED@KR)4xt`FTmiRpM4%UJ4RmuzLGu<*RRaZ>a~wXu{5r!h5*T=L*@B?p)GRChaH* zJFS`1nq%g6v$=* z&1_b)s95DmhcI*`T`hfmQp;`dmy&kDN$aN!UZF^ok8vC02t89x^s+WV;SUvkDSXhp z9a0oNFkGY6P5N%8{}Yilu*f=u*#~G_!=8sw))AOpLw{l&`)AcP9Gs-%;Ot1`Hz;cu zc!;4@4{eTq`w0(dLkrELf_7TV7^EloI67g_NwAg!^SJIs_rpY%7!0Bt7Hne4kgIcI zBedq+zkh(R@@yGV{{LbbFZ0x8yp~Xv(K24YgAUplD&tfMwyK<=t-Fv_<()Dn@1T>P zsbyR&VM6j;H5W%mwuKC z29+VA2VLl;$GVTi573*m4{;LWG(E@{aR66v5IPP~nTJs%LB61?-#-D&aAZM)Zo+WTLYtwt;7{C3csBQLqJ@Y{hW44vWO>e@ zkH(>iErwy7r(TkH&vGRK{vxUQV!5` zTvur%id!BfRO$P9%#)B8QssX|qkNPrh68^yZc4ng#=4_>zj;Sc7Bt~>9FotAIS~dM zYz8aHt0EScQVq~i15OkK$JnMFsiT3ZEs=I9^C&Wkt&=s_Yi;*Pl?~|FC3Suq(8qwX p4)!plin@GS!vOmO=G_{dH&_iq{Rwel5v;-3aIsHy+5oAB!yhbwSdRbz literal 0 HcmV?d00001 diff --git a/src/out/production/devcourse/com/ll/wiseSaying/PageResponse.class b/src/out/production/devcourse/com/ll/wiseSaying/PageResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..d4bca93fd97345ad84f3584d0bbb038432f15254 GIT binary patch literal 1164 zcma)4U2hUm5IvXg&$duN#X_lC1#0A72uVY#AtBlb;lUTP;0ABAEX{J!)L-C_@j(-b zi4Xn&f0XguU8pNH+7R~MId|sF%$fP|^V@d-9Xw1RfM67%6vBuI?3@{IjfQ2|lg9JW znK@Phk(RWjY6}FbwP74F#G^>0kVHzLJf2M(meqJC=VsrykPJIDCguxsem=A3ra)LK zb2=w)&m~?cX*GIsu9})?D}`+?ChvAn z+UB#xbYwaMV`LG@_GV+l8XAt&_6iKCH$1gnR+ofiN2R_Y{w6*+w`JP%-TZ6}565ozA+gBk@ zu0LBiWAlmB8fN@!@ks9i4mjliM-t+f%LIWOtpM`;b1mFESAb^`1)l81#cpy_xmdVG zzao(jJVQKl^{){1qa~vCy(QB1(h`}^#DloaZ-EhDo)9y|k;WE(yUepkwC=^DgfcBM zt?JP?U5TzTr`M5O`@9!cNC_2Mo`3$b{sZ3b;O?rrV_Jef;rbUuKk?#~6LG<;n_jn0 zhgEu=;5SmC<;il7UWd5PuWs5;oBl|^Pg}Sat-yo7(q%U3ir1oxqk2hKbUWfOW1362 S1MoU7Qx>nE8fDkxKKcb%{?Hr% literal 0 HcmV?d00001 diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class new file mode 100644 index 0000000000000000000000000000000000000000..f7f04b4a17ea03247d0f1f63fdcd525880bce558 GIT binary patch literal 944 zcmaKq-EPxB5QWb=j*X4mv`HF%0{w#v$NcyKiYlQkCE)c-I$ zkHTEQcq0>;9}6_x!PLS%SSD--_u&XU3DXNdj{Pe+k0!xqN!zEJP(YI>0%D|0n+{so z5-`Iw$)kjM+v8QONuJSrq=an;9VIk^MShlM0clj>Yu>iLw^IMu7 zcU_`jEhc(f^=Q#>9ov(1k%iGaslZ#SalTgL!U0F5@#z{|`2>tKHP~Y3+_)PcGP+!M zc#8SI&b{mXfbjZDnBL1JHoR9$Y=0|UJ+3`Ez|1-<{%mYAcZb;@@YXB+c!){i?FhU8$PhcbH!oXe?9WfygSgQwplo{G9N##=Px>Z(iit%Kes3##(HQgzdrQA|=%@7IEC-v#N{f*jO?+!}WYvPY2pe}JfQ LDv-mX^=E$p7b}r% literal 0 HcmV?d00001 diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class new file mode 100644 index 0000000000000000000000000000000000000000..777104853841e90d8a198a2d896436f4c9211016 GIT binary patch literal 5331 zcmbVQ3wRXO89g_d-I;7A1XhEtA}$D+2auY^v}_1qKqNLqbZHRK>SQyJh0Si<-2iE| zQWZq7K5D^Wg@VPVK4>9@HAJ+nR@++Zqwm(fYaf!O@Ahl`YSVM?Y?56Q(?@V;=H9vY z|Nndb^PfA{7yi}%G=RnUn+JKw*P)qk!7VUxgSE-3j9Ah2l~=TEutP}!_xx})oLnG~ zUs~2&00RX&JSGZZ3d{<{+AAZG%FW?~9kjZ_oVIHCad9k~jK?AoJ1(Fn?D(c|$QGE{ zINqF~GpttnnP8$A6Xo2H6^%+OXEdttI+Ni@Wzgy5NH5ONai)n9OwL(Auq%X>5UJWQoOQsK9K23;qlIn6(hsm!yX!V?;UHW!bn{sr6tkDs{Ze#6_qQm@-}n1ZcgT zY-m-4Y4DO})g~@Rjlfy$)<&DG2wBNh;ba@15=kqXOh_mj#=t>l&mVUTDh7?WI8-pgS9%YF>x(EFhn%P z#fE6oUN7s#=&<4mo6UD1YlDI71t!lK^Un)`7MZya>wGLEvO>;)DOUDOId3X`&#gdRZf9eAvXz*h;=gop`%OWY}Tg7J;If ztweZcLR~zP5Vx7whV3-E$%=H^S1=Qkb4x434OP)QOxz(gs(>h5(wS_F#burEGI6Ku z^{`h;xE)Q(LcGhw-MELGRfR~y^T*&sc5w{R*hyoqh*EbyMtMDbS9f~fv2>4Axy&jI ze4Ie6z35s4dss~u$&7ZJ*ek24h!L%fC9Q}|V#14jRLg35(8NCMXJqSQ@pg-V&HJAs z%a(7+&I2Y6;vt%AwIjAvP>l$#@j^qjmz!j@j!z4muQI8oHg&eQ*zu*x_oZ7xc1JQC zqfC8<@uqJ%oIdcNKiz$3;Nflqj|xC~c-+Kce3l;CW3AzJT>_W>|MVZ(Zfm`8qs0qd zmSC^+zN0&RV0Xs5^n1+2akc>Q+9@-H?by{ipA|GrjL*dSADH z;Fe?Q2OeQ|{HKl_P47A|a8Gyo{vGL^#|L)p7}#}au0U<+xO>LXPVS^XXUi_5tZ7me z1&ZZ1=peY#YKgGN+ZYR3k!C9%mhDWZmTU{NM#uLk$?AM>aEs8T{FA!U;7G1AIz{L$ z#dorNKFy%%t zBw7OgG2CYB6dhB^*Hg&X#aPg}0C8K$fVAj8n3+Gu`z-n_pqrv#(h6-{ZgnV=I-b+< z&9|*FQ`X!x!*Vr*U|JTyV-^DqyA(=!CZPXWG;HO-m z)0^IN%<1~M6dOUY`Q>QiPW6s9{wsm9oH(}n(+7{G_dkAmcem8C^zNM_bzo?f%Y>wIe#cm9Ekj7~pzmuEq?*(Rz@HZUY6x(Q5Iy@t0{E}K~g}4Jz zM7pz8FEh}=ZW)Oeu@f^IW3i2$9kp5M$`CfICugGk<``pmHsy0wUI}8x#9}KF337*I z_RR+Q{k}M2B@#9_)ISmHQEM72R2_d|QI0>9Mdqvv(|BgcyKabB+(Um*iGSN-syQlF5M&#$_{Y5_I zv1cN_gl8C+z_XajE92Di7;zCGp493@lL%-P-arcT_u{1rZ+!|&v?}j1-U2S4E8zCI zpRUpKYm5@3M1Kg6``jf)RiMCE;JsW9@%TLXRe{318q-&pLgQl$nSWREm*4w<_AKw! zFL$2z2JcHy-EueYGkk^KD^j>}FJ|S}m_6{b{eIP+tjYF7wpXdP+f`$hn2&N!6@T(i zrrO8f4E|>OJX%#BR@e1ll6-9HL4mvnwA&2PGZ>unJj#69^OzyAzmCvKr2AnhnEC9} z`q4Vn@Y>D*HBcsJ${e4T!g>io3L8)01_24h32YYpFbT+~n*=eQ8_=cwkGP*g-s*gx z&Q$i{*5GPQKHeT&?UMJM!4y8as%P+-p-{Z{y43h7+5s5e`+DH=?&h2+(%Jn72!Xu! zlTPSCp=wB@efUJcEhBelh@vU#?!ipLaW27`LOPsB+W49DX*eI#Nt6pvPq4{x#C>byQP)F2>(^UUOldC_+G#V7{1+g<=U7i7R>9x(4;4mB*$w zwj)>~Vpu9RW0|;_$Dq4#xwxO_phIXBhuPPQ<)WWwAz3~hESGxRN8it}u;$@GJWpB{ zFt(G79A3!YB8_OVUm0$EQ@a^q|;j9?CS$<&xGt zijzc%#dCx`Sx2X*EO8=ZSqr= z`@$hk@X6r>^GSKu{>lGi@+J!Fbv$fvF^7j1BQ9eVxH)F~sKt06@jjBmV@;HXAY-QP z?(E0shBY8dumhU&{`P(x8Gb)=M8E?sg^o{?#rfE(cfjQ6FeY8NaTt?&Rwr;BF}a>> zXko>MSdFc$LYpU>^=L#JkqYyOzY!bc;go7-2zQ)l- zO7dN_+n&MEM-Ptp-;{;u_F+V~XCXQX+FNL6Wz7A@2&ms3-r4Gz44K@Ca@{F>UZy;i zks)UXoxqfXr)C|SxNB`zA+iwVoQ%VKe2=X>d>=pHy^0~7;`<+}>yOm+C+hk$b^V39 YzOJsnR@dL+51i-WoIm2v_$z$>25y~;-~a#s literal 0 HcmV?d00001 diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..62c8726df4f18609bdbf13769ad142b8b8d1dad7 GIT binary patch literal 6910 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 E0otF07XSbN literal 0 HcmV?d00001 diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class new file mode 100644 index 0000000000000000000000000000000000000000..31e3dcfc06af34a03c93152865f0101445fd6ae6 GIT binary patch literal 4370 zcmb_giCYxs8UGE;?(B{OQV{A&ybuEmC?*=Ltdb%g*#=GG8Z7p5*d1YX+1<>{qNJBS z?UAPUVbc51rcGPZCMepb>1B_ne^DNvw7+*|WJj@Eo<0S3_xs-OJ%8^p-|~;QZoCd) z41d?rfJP0fff(WnTF#hr=3vn*O%FaXb;inj3gUb1lI@KsXzWc-B#}T;gKl6I3A z<=Mevaqyh&S~+vxrr3$4WzKTu?7XEwcdSa;wY{=4ub_9lp3Jc&&Ww&`tk%$C;B9DC z@ZieC6eOoDZ`^dfY{7Rqt6`0T2kJ@dXhVkp@OHY_n;oxVkn+CgY^e zWb_#5MVeW1Ez`-*C>ZKp?(K3)Iv`a&yEr&*yPl7Bzkva4qm|QksW4hBDroIp#@Ncb z88om150R0mR!oPXuf2ncxDxLVwZ+T3=Cnnf@UAvC9?uu*x5){_d_qY?U$Q(!{FF$HZkP(~fcoR?D_PoYsvJ#AnDCln-X&vFD(1s!*Roek-P zdJ-o!yvM+MrF>dzTJNyX;Th9CYMu9l_x%PwfK!aNM1n*R`XA~3OafDWnoFKlqEDMq zFks;{>&<$mY8KsETu~`0%{I&!uyKZk&WwzeeGT_o3HwVF7Y)pUASd!1M_&6j0LM` zd8`)cJ38Bp4;lC{K0@ib-C@P1X~P8rAH&C`og-1+NwyD47^IYP8$M~^ zQ^KAkd(E$l20kO>H#t?ci-iNGXA1A<418WnH^vymq5k^wB{DnH6AW#vTwsK&$L*4J zv^qOwImgYZA}Ouo<-A#(FdbX=AyM^aY$CX|ZouJ0&k(@8W0?ZrfoP8Y^SG?5mik(k zk0=EVHiK5!etPZs!U^!-bZLYuXv)JY9On1Y7#%9~Z&l3$qSSJ4qZ924XAb$!TJz`1 zPT}}`g*z?Wv8?1+MiPVZ%AQ#i{nVtpp6PhmQo%Y;CaY8km%8v5*tfG}>bN^$R2?R5 z$31@Ry-y&u=W%9)fi&ejGk^AoSqW7nbM|z}^r|w%r~f~2t-yS_h4(D6VR5TIXhJ_yThXE-l5>p`hA+IpQSVl zUNQONqp7+mI}7nzWf z&aRGQQEn194EzdLTX2G=E`TS!Erxo+A~j^`QT=^ zYBsw2XViQs6u9@8St=AQw|l%?K3lCseOf+0?h=%yin6c#FfdtPHv04nHIK1ObA0YH z%|^CVvYfG^>AIGy;V&GO%P_fLcpCo7kyW3S<21m6kHG}*;{XSuT(G%Ha2>;QeE$M> zhj=RIdfzoDef_UNdxg6OJkR%LH1a(G6-oZ;_#$^50XM#cFLOsZUn^@1U%^*HozGE! zjAwm)uR>cu)5uM7@6&Qi*eZy)>y@Bn(A|7tQb-ZIJmQok7Pr=3Z*v0a7 zyz}{?c&A!ukIf8e?OJ>6RCs(HhlUa#aRJ}; z(U8^mxN4-NIA6KdQ<9f8%$ zv>IrWRls$bTvy1IM8oFWNN802Q*ImZ5?}l-5rRL&PmT1s5Zj|S@zmrs`TWPT~ugX4cMLLQ6_b#TQX-z=Th*?j+AhC z0Y_7W<6kcYB^E%woe+ZGOA^?|!W!i74h-WVUf>_*6?rG`y1NL(BZPW41Ki`oK0=rV zG3u98Tw+*)ea;74V4w5BmLe?SXN0bi+AaLtPn3WttrMJGUOE#H1-f-m-$IJW`G1qQ zv0Fpio7nIsWdbZ;W@>rUDFK1 zm!YZ`DJR|96RP^4)ch^1O{oO(qbZdw@d-Kdn>N6)(J$R~#011d$9^{I7}|+oC(ElF zha>IUvt+y{G)_}~EFQ#|Sz7ao4|q&-U?ExEHvM5#V&Z!Vw}rI)2R+zZl>*+%@1; byv9$l^IOsuI2mr@Pd=Z5KjRkuhSa|SOm|Eb literal 0 HcmV?d00001 diff --git a/src/src/com/ll/wiseSaying/App.java b/src/src/com/ll/wiseSaying/App.java new file mode 100644 index 0000000..29b93e7 --- /dev/null +++ b/src/src/com/ll/wiseSaying/App.java @@ -0,0 +1,40 @@ +package com.ll.wiseSaying; + +import java.util.Scanner; + +public class App { + private final Scanner scanner; + private final WiseSayingController controller; + + public App() { + this.scanner = new Scanner(System.in); + WiseSayingRepository repository = new WiseSayingRepository(); + WiseSayingService service = new WiseSayingService(repository); + this.controller = new WiseSayingController(service, scanner); + } + + public void run() { + System.out.println("== 명언 앱 =="); + + while (true) { + System.out.print("명령) "); + String command = scanner.nextLine(); + + if (command.equals("등록")) { + controller.create(); + } else if (command.equals("목록") || command.startsWith("목록?")) { + controller.list(command); + } else if (command.startsWith("삭제?id=")) { + controller.delete(command); + } else if (command.startsWith("수정?id=")) { + controller.modify(command); + } else if (command.equals("빌드")) { + controller.build(); + } else if (command.equals("종료")) { + break; + } else { + System.out.println("알 수 없는 명령"); + } + } + } +} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/Main.java b/src/src/com/ll/wiseSaying/Main.java new file mode 100644 index 0000000..afa68df --- /dev/null +++ b/src/src/com/ll/wiseSaying/Main.java @@ -0,0 +1,7 @@ +package com.ll.wiseSaying; + +public class Main { + public static void main(String[] args) { + new App().run(); + } +} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/PageResponse.java b/src/src/com/ll/wiseSaying/PageResponse.java new file mode 100644 index 0000000..6b7a545 --- /dev/null +++ b/src/src/com/ll/wiseSaying/PageResponse.java @@ -0,0 +1,32 @@ +package com.ll.wiseSaying; + +import java.util.List; + +public class PageResponse { + private List items; + private int currentPage; + private int totalPages; + private static final int PAGE_SIZE = 5; + + public PageResponse(List items, int currentPage, int totalPages) { + this.items = items; + this.currentPage = currentPage; + this.totalPages = totalPages; + } + + public List getItems() { + return items; + } + + public int getCurrentPage() { + return currentPage; + } + + public int getTotalPages() { + return totalPages; + } + + public static int getPageSize() { + return PAGE_SIZE; + } +} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSaying.java b/src/src/com/ll/wiseSaying/WiseSaying.java new file mode 100644 index 0000000..53a1b99 --- /dev/null +++ b/src/src/com/ll/wiseSaying/WiseSaying.java @@ -0,0 +1,33 @@ +package com.ll.wiseSaying; + +public class WiseSaying { + private int id; + private String content; + private String author; + + public WiseSaying(int id, String content, String author) { + this.id = id; + this.content = content; + this.author = author; + } + + public int getId() { + return id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSayingController.java b/src/src/com/ll/wiseSaying/WiseSayingController.java new file mode 100644 index 0000000..2f6db27 --- /dev/null +++ b/src/src/com/ll/wiseSaying/WiseSayingController.java @@ -0,0 +1,120 @@ +package com.ll.wiseSaying; + +import java.util.*; + +public class WiseSayingController { + private final WiseSayingService service; + private final Scanner scanner; + + public WiseSayingController(WiseSayingService service, Scanner scanner) { + this.service = service; + this.scanner = scanner; + } + + public void create() { + System.out.print("명언 : "); + String content = scanner.nextLine(); + + System.out.print("작가 : "); + String author = scanner.nextLine(); + + WiseSaying wiseSaying = service.create(content, author); + System.out.println(wiseSaying.getId() + "번 명언이 등록되었습니다."); + } + + public void list(String command) { + // 기본값 설정 + int page = 1; + String keywordType = null; + String keyword = null; + + // 명령어에 파라미터가 있는 경우 파싱 + if (command.contains("?")) { + String[] params = command.split("\\?")[1].split("&"); + for (String param : params) { + String[] keyValue = param.split("="); + switch (keyValue[0]) { + case "page": + page = Integer.parseInt(keyValue[1]); + break; + case "keywordType": + keywordType = keyValue[1]; + break; + case "keyword": + keyword = keyValue[1]; + break; + } + } + } + + // 검색 조건이 있는 경우 출력 + if (keywordType != null && keyword != null) { + System.out.println("----------------------"); + System.out.println("검색타입 : " + keywordType); + System.out.println("검색어 : " + keyword); + } + + System.out.println("번호 / 작가 / 명언"); + System.out.println("----------------------"); + + PageResponse pageResponse = service.getList(page, keywordType, keyword); + + // 아이템 출력 + for (WiseSaying wiseSaying : pageResponse.getItems()) { + System.out.printf("%d / %s / %s\n", + wiseSaying.getId(), + wiseSaying.getAuthor(), + wiseSaying.getContent()); + } + + System.out.println("----------------------"); + // 페이지 정보 출력 + String pageInfo = String.format("페이지 : %s / %s", + page == 1 ? "[1]" : "1", + page == pageResponse.getTotalPages() ? + "[" + pageResponse.getTotalPages() + "]" : + pageResponse.getTotalPages()); + System.out.println(pageInfo); + } + + public void delete(String command) { + try { + int id = Integer.parseInt(command.split("=")[1]); + if (service.delete(id)) { + System.out.println(id + "번 명언이 삭제되었습니다."); + } else { + System.out.println(id + "번 명언은 존재하지 않습니다."); + } + } catch (NumberFormatException e) { + System.out.println("삭제 오류"); + } + } + + public void modify(String command) { + try { + int id = Integer.parseInt(command.split("=")[1]); + WiseSaying wiseSaying = service.modify(id, "", ""); + + if (wiseSaying != null) { + System.out.println("명언(기존) : " + wiseSaying.getContent()); + System.out.print("명언 : "); + String content = scanner.nextLine(); + + System.out.println("작가(기존) : " + wiseSaying.getAuthor()); + System.out.print("작가 : "); + String author = scanner.nextLine(); + + service.modify(id, content, author); + } else { + System.out.println(id + "번 명언은 존재하지 않습니다."); + } + } catch (NumberFormatException e) { + System.out.println("수정 오류"); + } + } + + public void build() { + service.buildData(); + System.out.println("data.json 파일의 내용이 갱신되었습니다."); + } +} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSayingRepository.java b/src/src/com/ll/wiseSaying/WiseSayingRepository.java new file mode 100644 index 0000000..39f8578 --- /dev/null +++ b/src/src/com/ll/wiseSaying/WiseSayingRepository.java @@ -0,0 +1,130 @@ +package com.ll.wiseSaying; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class WiseSayingRepository { + private static final String BASE_PATH = "db/wiseSaying/"; + + public WiseSayingRepository() { + File folder = new File(BASE_PATH); + if (!folder.exists()) { + folder.mkdirs(); + } + } + + public void save(WiseSaying wiseSaying) { + try { + File file = new File(BASE_PATH + wiseSaying.getId() + ".json"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write("{\n"); + writer.write("\"id\": " + wiseSaying.getId() + ",\n"); + writer.write("\"content\": \"" + wiseSaying.getContent() + "\",\n"); + writer.write("\"author\": \"" + wiseSaying.getAuthor() + "\"\n"); + writer.write("}"); + } + } catch (IOException e) { + throw new RuntimeException("Failed to save wise saying", e); + } + } + + public WiseSaying findById(int id) { + File file = new File(BASE_PATH + id + ".json"); + if (!file.exists()) return null; + return loadFromFile(file); + } + + public List findAll() { + List wiseSayings = new ArrayList<>(); + File folder = new File(BASE_PATH); + File[] files = folder.listFiles((dir, name) -> name.matches("\\d+\\.json")); + + if (files != null) { + for (File file : files) { + WiseSaying wiseSaying = loadFromFile(file); + if (wiseSaying != null) { + wiseSayings.add(wiseSaying); + } + } + } + return wiseSayings; + } + + public boolean delete(int id) { + File file = new File(BASE_PATH + id + ".json"); + return file.exists() && file.delete(); + } + + private WiseSaying loadFromFile(File file) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + StringBuilder json = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + json.append(line); + } + return parseJson(json.toString()); + } catch (IOException e) { + return null; + } + } + + private WiseSaying parseJson(String json) { + try { + json = json.trim().replace("{", "").replace("}", "").replace("\n", "").replace("\r", ""); + String[] lines = json.split(","); + int id = Integer.parseInt(lines[0].split(":")[1].trim()); + String content = lines[1].split(":")[1].trim().replace("\"", ""); + String author = lines[2].split(":")[1].trim().replace("\"", ""); + return new WiseSaying(id, content, author); + } catch (Exception e) { + return null; + } + } + + public int getLastId() { + File file = new File(BASE_PATH + "lastId.txt"); + if (file.exists()) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + return Integer.parseInt(reader.readLine().trim()); + } catch (IOException | NumberFormatException e) { + return 1; + } + } + return 1; + } + + public void saveLastId(int lastId) { + try { + File file = new File(BASE_PATH + "lastId.txt"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write(String.valueOf(lastId)); + } + } catch (IOException e) { + throw new RuntimeException("Failed to save last ID", e); + } + } + + public void buildData() { + try { + List wiseSayings = findAll(); + File dataFile = new File(BASE_PATH + "data.json"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFile))) { + writer.write("[\n"); + for (int i = 0; i < wiseSayings.size(); i++) { + WiseSaying ws = wiseSayings.get(i); + writer.write(" {\n"); + writer.write(" \"id\": " + ws.getId() + ",\n"); + writer.write(" \"content\": \"" + ws.getContent() + "\",\n"); + writer.write(" \"author\": \"" + ws.getAuthor() + "\"\n"); + writer.write(" }"); + if (i < wiseSayings.size() - 1) writer.write(","); + writer.write("\n"); + } + writer.write("]\n"); + } + } catch (IOException e) { + throw new RuntimeException("Failed to build data", e); + } + } +} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSayingService.java b/src/src/com/ll/wiseSaying/WiseSayingService.java new file mode 100644 index 0000000..74c222e --- /dev/null +++ b/src/src/com/ll/wiseSaying/WiseSayingService.java @@ -0,0 +1,77 @@ +package com.ll.wiseSaying; + +import java.util.*; + +public class WiseSayingService { + private final WiseSayingRepository repository; + + public WiseSayingService(WiseSayingRepository repository) { + this.repository = repository; + } + + public WiseSaying create(String content, String author) { + int id = repository.getLastId(); + WiseSaying wiseSaying = new WiseSaying(id, content, author); + repository.save(wiseSaying); + repository.saveLastId(id + 1); + return wiseSaying; + } + + public PageResponse getList(int page, String keywordType, String keyword) { + List wiseSayings; + + // 검색 조건이 있는 경우 + if (keywordType != null && !keywordType.isEmpty() && keyword != null && !keyword.isEmpty()) { + wiseSayings = search(keywordType, keyword); + } else { + wiseSayings = repository.findAll(); + } + + // 최신순 정렬 + wiseSayings.sort((a, b) -> b.getId() - a.getId()); + + // 페이징 처리 + int pageSize = PageResponse.getPageSize(); + int totalPages = (int) Math.ceil((double) wiseSayings.size() / pageSize); + int startIndex = (page - 1) * pageSize; + int endIndex = Math.min(startIndex + pageSize, wiseSayings.size()); + + List pagedItems = wiseSayings.subList(startIndex, endIndex); + return new PageResponse<>(pagedItems, page, totalPages); + } + + private List search(String keywordType, String keyword) { + List allWiseSayings = repository.findAll(); + List searchResults = new ArrayList<>(); + + for (WiseSaying wiseSaying : allWiseSayings) { + if (keywordType.equals("content") && + wiseSaying.getContent().contains(keyword)) { + searchResults.add(wiseSaying); + } else if (keywordType.equals("author") && + wiseSaying.getAuthor().contains(keyword)) { + searchResults.add(wiseSaying); + } + } + + return searchResults; + } + + public boolean delete(int id) { + return repository.delete(id); + } + + public WiseSaying modify(int id, String content, String author) { + WiseSaying wiseSaying = repository.findById(id); + if (wiseSaying != null) { + wiseSaying.setContent(content); + wiseSaying.setAuthor(author); + repository.save(wiseSaying); + } + return wiseSaying; + } + + public void buildData() { + repository.buildData(); + } +} \ No newline at end of file From b71679f0f33a184e405d5eb9b5b0e021cacfee71 Mon Sep 17 00:00:00 2001 From: Lined1 <108262570+Lined1@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:33:26 +0900 Subject: [PATCH 3/5] Delete src directory --- .../devcourse/com/ll/wiseSaying/App.class | Bin 1868 -> 0 bytes .../devcourse/com/ll/wiseSaying/Main.class | Bin 453 -> 0 bytes .../com/ll/wiseSaying/PageResponse.class | Bin 1164 -> 0 bytes .../com/ll/wiseSaying/WiseSaying.class | Bin 944 -> 0 bytes .../ll/wiseSaying/WiseSayingController.class | Bin 5331 -> 0 bytes .../ll/wiseSaying/WiseSayingRepository.class | Bin 6910 -> 0 bytes .../com/ll/wiseSaying/WiseSayingService.class | Bin 4370 -> 0 bytes src/src/com/ll/wiseSaying/App.java | 40 ------ src/src/com/ll/wiseSaying/Main.java | 7 - src/src/com/ll/wiseSaying/PageResponse.java | 32 ----- src/src/com/ll/wiseSaying/WiseSaying.java | 33 ----- .../ll/wiseSaying/WiseSayingController.java | 120 ---------------- .../ll/wiseSaying/WiseSayingRepository.java | 130 ------------------ .../com/ll/wiseSaying/WiseSayingService.java | 77 ----------- 14 files changed, 439 deletions(-) delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/App.class delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/Main.class delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/PageResponse.class delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class delete mode 100644 src/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class delete mode 100644 src/src/com/ll/wiseSaying/App.java delete mode 100644 src/src/com/ll/wiseSaying/Main.java delete mode 100644 src/src/com/ll/wiseSaying/PageResponse.java delete mode 100644 src/src/com/ll/wiseSaying/WiseSaying.java delete mode 100644 src/src/com/ll/wiseSaying/WiseSayingController.java delete mode 100644 src/src/com/ll/wiseSaying/WiseSayingRepository.java delete mode 100644 src/src/com/ll/wiseSaying/WiseSayingService.java diff --git a/src/out/production/devcourse/com/ll/wiseSaying/App.class b/src/out/production/devcourse/com/ll/wiseSaying/App.class deleted file mode 100644 index c179134bb3efc50941840245b30da4c428a161ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1868 zcmah}ZBrXn6n-u**=1QMY@np{Ero(f78|woH4TVpZENTYsUWq!Y?5tRy4ekz4Vq8R z=(OWF%=n>VZLKq?A2N2v4|Hs>GUE^MuOz>~any4+1VYQuFUj6}&wb8wp7Wgh*S~-K z319+?5}ME~phZS2d<}#y9~aQhGn>;49%hNv;dKz+Y2hVh8az! zHOtbSHb`g}Aj{}L=QfmNG4JYGh9<*e=uLPx4Lf?q$`#zC>*!iGCP6?K&)>}u2<;dW zo^FF5Jpy`V>_s0TrR{9gG^3vwc|EBW4dOeV%P|P~8X*RM4XBZ2Ou#;d;U}-oY@$r* zIXiE-wo{Z4;KCeW7~JhbQg;@Ov@T&k4)GceGpM1&Za214#JHYEp2BFtwp_823d$78^8jQy!Jcs86yddK^PEe!jo@ls9jm&WzlbdG45}ql^GSq7l zPQ*(LBH>n69)*J(@)a4ca=cdWCO1_~#!18}%+fz~6NaTT^n}7SO&ZZejFHVNw^l1Z z{vcr-ZwQ!>@h0Bd?qn}D1?me0&CEYWtTrvN@MYemw`H8>)8tE&!ChU%S&o1I7s3~j zpyF!ZV?5b88Rv0t3R#)zg85vSG zh#490@c>^&H+7!-G7tIkyXwkvJ>-gv54@19oiVN!MSR5RJzA>Vy2lYT87a=bHB~Uo zjED@KR)4xt`FTmiRpM4%UJ4RmuzLGu<*RRaZ>a~wXu{5r!h5*T=L*@B?p)GRChaH* zJFS`1nq%g6v$=* z&1_b)s95DmhcI*`T`hfmQp;`dmy&kDN$aN!UZF^ok8vC02t89x^s+WV;SUvkDSXhp z9a0oNFkGY6P5N%8{}Yilu*f=u*#~G_!=8sw))AOpLw{l&`)AcP9Gs-%;Ot1`Hz;cu zc!;4@4{eTq`w0(dLkrELf_7TV7^EloI67g_NwAg!^SJIs_rpY%7!0Bt7Hne4kgIcI zBedq+zkh(R@@yGV{{LbbFZ0x8yp~Xv(K24YgAUplD&tfMwyK<=t-Fv_<()Dn@1T>P zsbyR&VM6j;H5W%mwuKC z29+VA2VLl;$GVTi573*m4{;LWG(E@{aR66v5IPP~nTJs%LB61?-#-D&aAZM)Zo+WTLYtwt;7{C3csBQLqJ@Y{hW44vWO>e@ zkH(>iErwy7r(TkH&vGRK{vxUQV!5` zTvur%id!BfRO$P9%#)B8QssX|qkNPrh68^yZc4ng#=4_>zj;Sc7Bt~>9FotAIS~dM zYz8aHt0EScQVq~i15OkK$JnMFsiT3ZEs=I9^C&Wkt&=s_Yi;*Pl?~|FC3Suq(8qwX p4)!plin@GS!vOmO=G_{dH&_iq{Rwel5v;-3aIsHy+5oAB!yhbwSdRbz diff --git a/src/out/production/devcourse/com/ll/wiseSaying/PageResponse.class b/src/out/production/devcourse/com/ll/wiseSaying/PageResponse.class deleted file mode 100644 index d4bca93fd97345ad84f3584d0bbb038432f15254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1164 zcma)4U2hUm5IvXg&$duN#X_lC1#0A72uVY#AtBlb;lUTP;0ABAEX{J!)L-C_@j(-b zi4Xn&f0XguU8pNH+7R~MId|sF%$fP|^V@d-9Xw1RfM67%6vBuI?3@{IjfQ2|lg9JW znK@Phk(RWjY6}FbwP74F#G^>0kVHzLJf2M(meqJC=VsrykPJIDCguxsem=A3ra)LK zb2=w)&m~?cX*GIsu9})?D}`+?ChvAn z+UB#xbYwaMV`LG@_GV+l8XAt&_6iKCH$1gnR+ofiN2R_Y{w6*+w`JP%-TZ6}565ozA+gBk@ zu0LBiWAlmB8fN@!@ks9i4mjliM-t+f%LIWOtpM`;b1mFESAb^`1)l81#cpy_xmdVG zzao(jJVQKl^{){1qa~vCy(QB1(h`}^#DloaZ-EhDo)9y|k;WE(yUepkwC=^DgfcBM zt?JP?U5TzTr`M5O`@9!cNC_2Mo`3$b{sZ3b;O?rrV_Jef;rbUuKk?#~6LG<;n_jn0 zhgEu=;5SmC<;il7UWd5PuWs5;oBl|^Pg}Sat-yo7(q%U3ir1oxqk2hKbUWfOW1362 S1MoU7Qx>nE8fDkxKKcb%{?Hr% diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class deleted file mode 100644 index f7f04b4a17ea03247d0f1f63fdcd525880bce558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmaKq-EPxB5QWb=j*X4mv`HF%0{w#v$NcyKiYlQkCE)c-I$ zkHTEQcq0>;9}6_x!PLS%SSD--_u&XU3DXNdj{Pe+k0!xqN!zEJP(YI>0%D|0n+{so z5-`Iw$)kjM+v8QONuJSrq=an;9VIk^MShlM0clj>Yu>iLw^IMu7 zcU_`jEhc(f^=Q#>9ov(1k%iGaslZ#SalTgL!U0F5@#z{|`2>tKHP~Y3+_)PcGP+!M zc#8SI&b{mXfbjZDnBL1JHoR9$Y=0|UJ+3`Ez|1-<{%mYAcZb;@@YXB+c!){i?FhU8$PhcbH!oXe?9WfygSgQwplo{G9N##=Px>Z(iit%Kes3##(HQgzdrQA|=%@7IEC-v#N{f*jO?+!}WYvPY2pe}JfQ LDv-mX^=E$p7b}r% diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class deleted file mode 100644 index 777104853841e90d8a198a2d896436f4c9211016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5331 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 YzOJsnR@dL+51i-WoIm2v_$z$>25y~;-~a#s diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class deleted file mode 100644 index 62c8726df4f18609bdbf13769ad142b8b8d1dad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6910 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 E0otF07XSbN diff --git a/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class b/src/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class deleted file mode 100644 index 31e3dcfc06af34a03c93152865f0101445fd6ae6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4370 zcmb_giCYxs8UGE;?(B{OQV{A&ybuEmC?*=Ltdb%g*#=GG8Z7p5*d1YX+1<>{qNJBS z?UAPUVbc51rcGPZCMepb>1B_ne^DNvw7+*|WJj@Eo<0S3_xs-OJ%8^p-|~;QZoCd) z41d?rfJP0fff(WnTF#hr=3vn*O%FaXb;inj3gUb1lI@KsXzWc-B#}T;gKl6I3A z<=Mevaqyh&S~+vxrr3$4WzKTu?7XEwcdSa;wY{=4ub_9lp3Jc&&Ww&`tk%$C;B9DC z@ZieC6eOoDZ`^dfY{7Rqt6`0T2kJ@dXhVkp@OHY_n;oxVkn+CgY^e zWb_#5MVeW1Ez`-*C>ZKp?(K3)Iv`a&yEr&*yPl7Bzkva4qm|QksW4hBDroIp#@Ncb z88om150R0mR!oPXuf2ncxDxLVwZ+T3=Cnnf@UAvC9?uu*x5){_d_qY?U$Q(!{FF$HZkP(~fcoR?D_PoYsvJ#AnDCln-X&vFD(1s!*Roek-P zdJ-o!yvM+MrF>dzTJNyX;Th9CYMu9l_x%PwfK!aNM1n*R`XA~3OafDWnoFKlqEDMq zFks;{>&<$mY8KsETu~`0%{I&!uyKZk&WwzeeGT_o3HwVF7Y)pUASd!1M_&6j0LM` zd8`)cJ38Bp4;lC{K0@ib-C@P1X~P8rAH&C`og-1+NwyD47^IYP8$M~^ zQ^KAkd(E$l20kO>H#t?ci-iNGXA1A<418WnH^vymq5k^wB{DnH6AW#vTwsK&$L*4J zv^qOwImgYZA}Ouo<-A#(FdbX=AyM^aY$CX|ZouJ0&k(@8W0?ZrfoP8Y^SG?5mik(k zk0=EVHiK5!etPZs!U^!-bZLYuXv)JY9On1Y7#%9~Z&l3$qSSJ4qZ924XAb$!TJz`1 zPT}}`g*z?Wv8?1+MiPVZ%AQ#i{nVtpp6PhmQo%Y;CaY8km%8v5*tfG}>bN^$R2?R5 z$31@Ry-y&u=W%9)fi&ejGk^AoSqW7nbM|z}^r|w%r~f~2t-yS_h4(D6VR5TIXhJ_yThXE-l5>p`hA+IpQSVl zUNQONqp7+mI}7nzWf z&aRGQQEn194EzdLTX2G=E`TS!Erxo+A~j^`QT=^ zYBsw2XViQs6u9@8St=AQw|l%?K3lCseOf+0?h=%yin6c#FfdtPHv04nHIK1ObA0YH z%|^CVvYfG^>AIGy;V&GO%P_fLcpCo7kyW3S<21m6kHG}*;{XSuT(G%Ha2>;QeE$M> zhj=RIdfzoDef_UNdxg6OJkR%LH1a(G6-oZ;_#$^50XM#cFLOsZUn^@1U%^*HozGE! zjAwm)uR>cu)5uM7@6&Qi*eZy)>y@Bn(A|7tQb-ZIJmQok7Pr=3Z*v0a7 zyz}{?c&A!ukIf8e?OJ>6RCs(HhlUa#aRJ}; z(U8^mxN4-NIA6KdQ<9f8%$ zv>IrWRls$bTvy1IM8oFWNN802Q*ImZ5?}l-5rRL&PmT1s5Zj|S@zmrs`TWPT~ugX4cMLLQ6_b#TQX-z=Th*?j+AhC z0Y_7W<6kcYB^E%woe+ZGOA^?|!W!i74h-WVUf>_*6?rG`y1NL(BZPW41Ki`oK0=rV zG3u98Tw+*)ea;74V4w5BmLe?SXN0bi+AaLtPn3WttrMJGUOE#H1-f-m-$IJW`G1qQ zv0Fpio7nIsWdbZ;W@>rUDFK1 zm!YZ`DJR|96RP^4)ch^1O{oO(qbZdw@d-Kdn>N6)(J$R~#011d$9^{I7}|+oC(ElF zha>IUvt+y{G)_}~EFQ#|Sz7ao4|q&-U?ExEHvM5#V&Z!Vw}rI)2R+zZl>*+%@1; byv9$l^IOsuI2mr@Pd=Z5KjRkuhSa|SOm|Eb diff --git a/src/src/com/ll/wiseSaying/App.java b/src/src/com/ll/wiseSaying/App.java deleted file mode 100644 index 29b93e7..0000000 --- a/src/src/com/ll/wiseSaying/App.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.ll.wiseSaying; - -import java.util.Scanner; - -public class App { - private final Scanner scanner; - private final WiseSayingController controller; - - public App() { - this.scanner = new Scanner(System.in); - WiseSayingRepository repository = new WiseSayingRepository(); - WiseSayingService service = new WiseSayingService(repository); - this.controller = new WiseSayingController(service, scanner); - } - - public void run() { - System.out.println("== 명언 앱 =="); - - while (true) { - System.out.print("명령) "); - String command = scanner.nextLine(); - - if (command.equals("등록")) { - controller.create(); - } else if (command.equals("목록") || command.startsWith("목록?")) { - controller.list(command); - } else if (command.startsWith("삭제?id=")) { - controller.delete(command); - } else if (command.startsWith("수정?id=")) { - controller.modify(command); - } else if (command.equals("빌드")) { - controller.build(); - } else if (command.equals("종료")) { - break; - } else { - System.out.println("알 수 없는 명령"); - } - } - } -} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/Main.java b/src/src/com/ll/wiseSaying/Main.java deleted file mode 100644 index afa68df..0000000 --- a/src/src/com/ll/wiseSaying/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.ll.wiseSaying; - -public class Main { - public static void main(String[] args) { - new App().run(); - } -} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/PageResponse.java b/src/src/com/ll/wiseSaying/PageResponse.java deleted file mode 100644 index 6b7a545..0000000 --- a/src/src/com/ll/wiseSaying/PageResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ll.wiseSaying; - -import java.util.List; - -public class PageResponse { - private List items; - private int currentPage; - private int totalPages; - private static final int PAGE_SIZE = 5; - - public PageResponse(List items, int currentPage, int totalPages) { - this.items = items; - this.currentPage = currentPage; - this.totalPages = totalPages; - } - - public List getItems() { - return items; - } - - public int getCurrentPage() { - return currentPage; - } - - public int getTotalPages() { - return totalPages; - } - - public static int getPageSize() { - return PAGE_SIZE; - } -} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSaying.java b/src/src/com/ll/wiseSaying/WiseSaying.java deleted file mode 100644 index 53a1b99..0000000 --- a/src/src/com/ll/wiseSaying/WiseSaying.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ll.wiseSaying; - -public class WiseSaying { - private int id; - private String content; - private String author; - - public WiseSaying(int id, String content, String author) { - this.id = id; - this.content = content; - this.author = author; - } - - public int getId() { - return id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } -} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSayingController.java b/src/src/com/ll/wiseSaying/WiseSayingController.java deleted file mode 100644 index 2f6db27..0000000 --- a/src/src/com/ll/wiseSaying/WiseSayingController.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.ll.wiseSaying; - -import java.util.*; - -public class WiseSayingController { - private final WiseSayingService service; - private final Scanner scanner; - - public WiseSayingController(WiseSayingService service, Scanner scanner) { - this.service = service; - this.scanner = scanner; - } - - public void create() { - System.out.print("명언 : "); - String content = scanner.nextLine(); - - System.out.print("작가 : "); - String author = scanner.nextLine(); - - WiseSaying wiseSaying = service.create(content, author); - System.out.println(wiseSaying.getId() + "번 명언이 등록되었습니다."); - } - - public void list(String command) { - // 기본값 설정 - int page = 1; - String keywordType = null; - String keyword = null; - - // 명령어에 파라미터가 있는 경우 파싱 - if (command.contains("?")) { - String[] params = command.split("\\?")[1].split("&"); - for (String param : params) { - String[] keyValue = param.split("="); - switch (keyValue[0]) { - case "page": - page = Integer.parseInt(keyValue[1]); - break; - case "keywordType": - keywordType = keyValue[1]; - break; - case "keyword": - keyword = keyValue[1]; - break; - } - } - } - - // 검색 조건이 있는 경우 출력 - if (keywordType != null && keyword != null) { - System.out.println("----------------------"); - System.out.println("검색타입 : " + keywordType); - System.out.println("검색어 : " + keyword); - } - - System.out.println("번호 / 작가 / 명언"); - System.out.println("----------------------"); - - PageResponse pageResponse = service.getList(page, keywordType, keyword); - - // 아이템 출력 - for (WiseSaying wiseSaying : pageResponse.getItems()) { - System.out.printf("%d / %s / %s\n", - wiseSaying.getId(), - wiseSaying.getAuthor(), - wiseSaying.getContent()); - } - - System.out.println("----------------------"); - // 페이지 정보 출력 - String pageInfo = String.format("페이지 : %s / %s", - page == 1 ? "[1]" : "1", - page == pageResponse.getTotalPages() ? - "[" + pageResponse.getTotalPages() + "]" : - pageResponse.getTotalPages()); - System.out.println(pageInfo); - } - - public void delete(String command) { - try { - int id = Integer.parseInt(command.split("=")[1]); - if (service.delete(id)) { - System.out.println(id + "번 명언이 삭제되었습니다."); - } else { - System.out.println(id + "번 명언은 존재하지 않습니다."); - } - } catch (NumberFormatException e) { - System.out.println("삭제 오류"); - } - } - - public void modify(String command) { - try { - int id = Integer.parseInt(command.split("=")[1]); - WiseSaying wiseSaying = service.modify(id, "", ""); - - if (wiseSaying != null) { - System.out.println("명언(기존) : " + wiseSaying.getContent()); - System.out.print("명언 : "); - String content = scanner.nextLine(); - - System.out.println("작가(기존) : " + wiseSaying.getAuthor()); - System.out.print("작가 : "); - String author = scanner.nextLine(); - - service.modify(id, content, author); - } else { - System.out.println(id + "번 명언은 존재하지 않습니다."); - } - } catch (NumberFormatException e) { - System.out.println("수정 오류"); - } - } - - public void build() { - service.buildData(); - System.out.println("data.json 파일의 내용이 갱신되었습니다."); - } -} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSayingRepository.java b/src/src/com/ll/wiseSaying/WiseSayingRepository.java deleted file mode 100644 index 39f8578..0000000 --- a/src/src/com/ll/wiseSaying/WiseSayingRepository.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.ll.wiseSaying; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -public class WiseSayingRepository { - private static final String BASE_PATH = "db/wiseSaying/"; - - public WiseSayingRepository() { - File folder = new File(BASE_PATH); - if (!folder.exists()) { - folder.mkdirs(); - } - } - - public void save(WiseSaying wiseSaying) { - try { - File file = new File(BASE_PATH + wiseSaying.getId() + ".json"); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { - writer.write("{\n"); - writer.write("\"id\": " + wiseSaying.getId() + ",\n"); - writer.write("\"content\": \"" + wiseSaying.getContent() + "\",\n"); - writer.write("\"author\": \"" + wiseSaying.getAuthor() + "\"\n"); - writer.write("}"); - } - } catch (IOException e) { - throw new RuntimeException("Failed to save wise saying", e); - } - } - - public WiseSaying findById(int id) { - File file = new File(BASE_PATH + id + ".json"); - if (!file.exists()) return null; - return loadFromFile(file); - } - - public List findAll() { - List wiseSayings = new ArrayList<>(); - File folder = new File(BASE_PATH); - File[] files = folder.listFiles((dir, name) -> name.matches("\\d+\\.json")); - - if (files != null) { - for (File file : files) { - WiseSaying wiseSaying = loadFromFile(file); - if (wiseSaying != null) { - wiseSayings.add(wiseSaying); - } - } - } - return wiseSayings; - } - - public boolean delete(int id) { - File file = new File(BASE_PATH + id + ".json"); - return file.exists() && file.delete(); - } - - private WiseSaying loadFromFile(File file) { - try (BufferedReader reader = new BufferedReader(new FileReader(file))) { - StringBuilder json = new StringBuilder(); - String line; - while ((line = reader.readLine()) != null) { - json.append(line); - } - return parseJson(json.toString()); - } catch (IOException e) { - return null; - } - } - - private WiseSaying parseJson(String json) { - try { - json = json.trim().replace("{", "").replace("}", "").replace("\n", "").replace("\r", ""); - String[] lines = json.split(","); - int id = Integer.parseInt(lines[0].split(":")[1].trim()); - String content = lines[1].split(":")[1].trim().replace("\"", ""); - String author = lines[2].split(":")[1].trim().replace("\"", ""); - return new WiseSaying(id, content, author); - } catch (Exception e) { - return null; - } - } - - public int getLastId() { - File file = new File(BASE_PATH + "lastId.txt"); - if (file.exists()) { - try (BufferedReader reader = new BufferedReader(new FileReader(file))) { - return Integer.parseInt(reader.readLine().trim()); - } catch (IOException | NumberFormatException e) { - return 1; - } - } - return 1; - } - - public void saveLastId(int lastId) { - try { - File file = new File(BASE_PATH + "lastId.txt"); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { - writer.write(String.valueOf(lastId)); - } - } catch (IOException e) { - throw new RuntimeException("Failed to save last ID", e); - } - } - - public void buildData() { - try { - List wiseSayings = findAll(); - File dataFile = new File(BASE_PATH + "data.json"); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFile))) { - writer.write("[\n"); - for (int i = 0; i < wiseSayings.size(); i++) { - WiseSaying ws = wiseSayings.get(i); - writer.write(" {\n"); - writer.write(" \"id\": " + ws.getId() + ",\n"); - writer.write(" \"content\": \"" + ws.getContent() + "\",\n"); - writer.write(" \"author\": \"" + ws.getAuthor() + "\"\n"); - writer.write(" }"); - if (i < wiseSayings.size() - 1) writer.write(","); - writer.write("\n"); - } - writer.write("]\n"); - } - } catch (IOException e) { - throw new RuntimeException("Failed to build data", e); - } - } -} \ No newline at end of file diff --git a/src/src/com/ll/wiseSaying/WiseSayingService.java b/src/src/com/ll/wiseSaying/WiseSayingService.java deleted file mode 100644 index 74c222e..0000000 --- a/src/src/com/ll/wiseSaying/WiseSayingService.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.ll.wiseSaying; - -import java.util.*; - -public class WiseSayingService { - private final WiseSayingRepository repository; - - public WiseSayingService(WiseSayingRepository repository) { - this.repository = repository; - } - - public WiseSaying create(String content, String author) { - int id = repository.getLastId(); - WiseSaying wiseSaying = new WiseSaying(id, content, author); - repository.save(wiseSaying); - repository.saveLastId(id + 1); - return wiseSaying; - } - - public PageResponse getList(int page, String keywordType, String keyword) { - List wiseSayings; - - // 검색 조건이 있는 경우 - if (keywordType != null && !keywordType.isEmpty() && keyword != null && !keyword.isEmpty()) { - wiseSayings = search(keywordType, keyword); - } else { - wiseSayings = repository.findAll(); - } - - // 최신순 정렬 - wiseSayings.sort((a, b) -> b.getId() - a.getId()); - - // 페이징 처리 - int pageSize = PageResponse.getPageSize(); - int totalPages = (int) Math.ceil((double) wiseSayings.size() / pageSize); - int startIndex = (page - 1) * pageSize; - int endIndex = Math.min(startIndex + pageSize, wiseSayings.size()); - - List pagedItems = wiseSayings.subList(startIndex, endIndex); - return new PageResponse<>(pagedItems, page, totalPages); - } - - private List search(String keywordType, String keyword) { - List allWiseSayings = repository.findAll(); - List searchResults = new ArrayList<>(); - - for (WiseSaying wiseSaying : allWiseSayings) { - if (keywordType.equals("content") && - wiseSaying.getContent().contains(keyword)) { - searchResults.add(wiseSaying); - } else if (keywordType.equals("author") && - wiseSaying.getAuthor().contains(keyword)) { - searchResults.add(wiseSaying); - } - } - - return searchResults; - } - - public boolean delete(int id) { - return repository.delete(id); - } - - public WiseSaying modify(int id, String content, String author) { - WiseSaying wiseSaying = repository.findById(id); - if (wiseSaying != null) { - wiseSaying.setContent(content); - wiseSaying.setAuthor(author); - repository.save(wiseSaying); - } - return wiseSaying; - } - - public void buildData() { - repository.buildData(); - } -} \ No newline at end of file From ef442fbd6e4f50bc5b8c97ccba8a8931b884c666 Mon Sep 17 00:00:00 2001 From: Lined1 <108262570+Lined1@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:59:32 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Delete=20[BE5]=EC=9D=B4=EC=9D=80=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 폴더 변경 --- "[BE5]\354\235\264\354\235\200\354\244\200" | 263 -------------------- 1 file changed, 263 deletions(-) delete mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200" diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200" "b/[BE5]\354\235\264\354\235\200\354\244\200" deleted file mode 100644 index 9a29d71..0000000 --- "a/[BE5]\354\235\264\354\235\200\354\244\200" +++ /dev/null @@ -1,263 +0,0 @@ -package Solution; -import java.io.*; -import java.util.Scanner; - -class Solution { - public static void main(String args[]) { - Scanner sc = new Scanner(System.in); - - System.out.println("== 명언 앱 =="); - - // 명령에 따른 동작 - while (true) { - System.out.print("명령) "); - String command = sc.nextLine(); // 명령어 - - // 명언 등록 - if (command.equals("등록")) { - System.out.print("명언 : "); - String quote = sc.nextLine(); // 명언 입력 - - System.out.print("작가 : "); - String author = sc.nextLine(); // 작가 입력 - - int idCounter = loadLastId(); // 마지막 사용된 ID 가져오기 - Quote Quote = new Quote(idCounter, quote, author); // 새 명언 객체 생성 - - saveQuoteToFile(Quote); // 명언을 파일에 저장 - saveLastId(idCounter + 1); // ID 증가 후 저장 - - System.out.println(idCounter + "번 명언이 등록되었습니다."); - - // 명언 목록 출력 - } else if (command.equals("목록")) { - System.out.println("번호 / 작가 / 명언"); - System.out.println("----------------------"); - - File folder = new File("db/wiseSaying"); - if (folder.exists()) { // 폴더가 존재하고 디렉터리인지 확인 - - /*FilenameFilter대신 람다식으로 .json확장자를 가지는 파일만 가져옴, 메모*/ - File[] files = folder.listFiles((dir, name) -> { - if (name.endsWith(".json")) { // 확장자 확인, 파일의 이름이 숫자인 경우만 - String checknum = name.substring(0, name.lastIndexOf('.')); // 확장자 제거 - for (char ch : checknum.toCharArray()) { - if (!Character.isDigit(ch)) { // 문자가 숫자가 아니면 제외 - return false; - } - } - return true; // 모든 문자가 숫자라면 true 반환 - } - return false; - }); - - if (files != null) { - for (int i = files.length - 1; i >= 0; i--) { // 최신 순으로 출력 - Quote quote = loadQuoteFromFile(files[i]); // 파일에서 명언 로드 - if (quote != null) { - System.out.println(quote.id + " / " + quote.author + " / " + quote.quote); - } - } - } - } else { - System.out.println("등록된 명언이 없습니다."); - } - - // 명언 삭제 - } else if (command.startsWith("삭제?id=")) { - try { - int idToDelete = Integer.parseInt(command.split("=")[1]); // 삭제할 ID 추출 - if (deleteQuoteFile(idToDelete)) { // 파일 삭제 - System.out.println(idToDelete + "번 명언이 삭제되었습니다."); - } else { - System.out.println(idToDelete + "번 명언은 존재하지 않습니다."); - } - } catch (NumberFormatException e) { - System.out.println("삭제 오류"); - } - - // 명언 수정 - } else if (command.startsWith("수정?id=")) { - try { - int idToFix = Integer.parseInt(command.split("=")[1]); // 수정할 명언 ID 추출 - Quote Quote = loadQuoteFromFile(new File("db/wiseSaying/" + idToFix + ".json")); // 파일에서 명언 로드 - - if (Quote != null) { - System.out.println("명언(기존) : " + Quote.quote); - System.out.print("명언 : "); - String quote = sc.nextLine(); // 새로운 명언 입력 - - System.out.println("작가(기존) : " + Quote.author); - System.out.print("작가 : "); - String author = sc.nextLine(); // 새로운 작가 입력 - - Quote.quote = quote; // 명언 업데이트 - Quote.author = author; - - saveQuoteToFile(Quote); // 수정된 명언을 파일에 저장 - } else { - System.out.println(idToFix + "번 명언은 존재하지 않습니다."); - } - } catch (NumberFormatException e) { - System.out.println("수정 오류"); - } - - // 빌드 명령 - } else if (command.equals("빌드")) { - buildDataJson(); - System.out.println("data.json 파일의 내용이 갱신되었습니다."); - - // 프로그램 종료 - } else if (command.equals("종료")) { - break; - } else { - System.out.println("알 수 없는 명령"); - } - } - - sc.close(); // 리소스 해제 - } - - // 명언 데이터를 파일로 저장 - private static void saveQuoteToFile(Quote quote) { - try { - File folder = new File("db/wiseSaying"); - if (!folder.exists()) { // 디렉터리가 없으면 생성 - folder.mkdirs(); - } - - File file = new File("db/wiseSaying/" + quote.id + ".json"); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { - writer.write("{\n"); - writer.write("\"id\": " + quote.id + ",\n"); - writer.write("\"content\": \"" + quote.quote + "\",\n"); - writer.write("\"author\": \"" + quote.author + "\"\n"); - writer.write("}"); - } - } catch (IOException e) { - System.out.println("파일 저장 오류"); - } - } - - // 파일에서 명언을 읽어와 Quote 객체로 반환 - private static Quote loadQuoteFromFile(File file) { - try (BufferedReader reader = new BufferedReader(new FileReader(file))) { - StringBuilder json = new StringBuilder(); - String line; - - while ((line = reader.readLine()) != null) { // JSON 데이터 줄읽기 - json.append(line); // StringBuilder로 전체 문자열 결합 - } - - return parseJsonToQuote(json.toString()); // JSON 데이터를 Quote 객체로 변환 - } catch (IOException e) { - return null; // 실패시 null 반환 - } - } - - // 특정 ID의 명언 파일 삭제 - private static boolean deleteQuoteFile(int id) { - File file = new File("db/wiseSaying/" + id + ".json"); - if(file.exists()) { - file.delete(); - return true; - } - return false; - } - - // 마지막 ID 값을 파일에서 읽어옴 - private static int loadLastId() { - File file = new File("db/wiseSaying/lastId.txt"); - if (file.exists()) { - try (BufferedReader reader = new BufferedReader(new FileReader(file))) { - return Integer.parseInt(reader.readLine().trim()); - } catch (IOException | NumberFormatException e) { - System.out.println("lastId.txt 파일을 읽는 중 오류가 발생했습니다."); - } - } - return 1; // 파일이 없으면 초기값으로 1 반환 - } - - // 마지막 ID 값을 파일에 저장 - private static void saveLastId(int lastId) { - try { - File folder = new File("db/wiseSaying"); - if (!folder.exists()) { // 디렉터리가 없으면 생성 - folder.mkdirs(); - } - - File file = new File("db/wiseSaying/lastId.txt"); - try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { - writer.write(String.valueOf(lastId)); - } - } catch (IOException e) { - System.out.println("lastId.txt 파일 저장 중 오류가 발생했습니다."); - } - } - - // JSON 데이터를 Quote 객체로 변환 - private static Quote parseJsonToQuote(String json) { - try { - // JSON 데이터에서 중괄호, 공백 제거 - json = json.trim().replace("{", "").replace("}", "").replace("\n", "").replace("\r", ""); - - // JSON 데이터의 필드별 분리 - String[] lines = json.split(","); - - // 필드 값 추출 - int id = Integer.parseInt(lines[0].split(":")[1].trim()); - String quote = lines[1].split(":")[1].trim().replace("\"", ""); - String author = lines[2].split(":")[1].trim().replace("\"", ""); - // Quote 객체 생성 - return new Quote(id, quote, author); - } catch (Exception e) { - System.out.println("JSON 파싱 오류"); - return null; - } - } - //기존의 .json 명언들 합침 - private static void buildDataJson() { - File folder = new File("db/wiseSaying"); - File[] files = folder.listFiles((dir, name) -> { - if (name.endsWith(".json")) { // 확장자 확인, 파일의 이름이 숫자인 경우만 - String checknum = name.substring(0, name.lastIndexOf('.')); // 확장자 제거 - for (char ch : checknum.toCharArray()) { - if (!Character.isDigit(ch)) { // 문자가 숫자가 아니면 제외 - return false; - } - } - return true; // 모든 문자가 숫자라면 true 반환 - } - return false; - }); - try (BufferedWriter writer = new BufferedWriter(new FileWriter("db/wiseSaying/data.json"))) { - writer.write("[\n"); // JSON 배열 시작 - for (int i = 0; i < files.length; i++) { - try (BufferedReader reader = new BufferedReader(new FileReader(files[i]))) { - String line; - while ((line = reader.readLine()) != null) { - writer.write(" " + line); // 들여쓰기 추가 - } - } - if (i < files.length - 1) writer.write(",\n"); // , 추가 - } - writer.write("\n]\n"); // JSON 배열 종료 - } catch (IOException e) { - System.out.println("빌드 오류" + e.getMessage()); - } - } -} - -// 명언 데이터를 나타내는 클래스 -class Quote { - int id; // 명언 ID - String quote; // 명언 내용 - String author; // 명언 작가 - - // 생성자 - Quote(int id, String quote, String author) { - this.id = id; - this.quote = quote; - this.author = author; - } -} From 2e21a095090b2344164109ce5ca9f414382be5c6 Mon Sep 17 00:00:00 2001 From: Lined1 <108262570+Lined1@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:59:46 +0900 Subject: [PATCH 5/5] Add files via upload --- .../devcourse/com/ll/wiseSaying/App.class" | Bin 0 -> 1868 bytes .../devcourse/com/ll/wiseSaying/Main.class" | Bin 0 -> 453 bytes .../com/ll/wiseSaying/PageResponse.class" | Bin 0 -> 1164 bytes .../com/ll/wiseSaying/WiseSaying.class" | Bin 0 -> 944 bytes .../ll/wiseSaying/WiseSayingController.class" | Bin 0 -> 5331 bytes .../ll/wiseSaying/WiseSayingRepository.class" | Bin 0 -> 6910 bytes .../ll/wiseSaying/WiseSayingService.class" | Bin 0 -> 4370 bytes .../src/com/ll/wiseSaying/App.java" | 40 ++++++ .../src/com/ll/wiseSaying/Main.java" | 7 + .../src/com/ll/wiseSaying/PageResponse.java" | 32 +++++ .../src/com/ll/wiseSaying/WiseSaying.java" | 33 +++++ .../ll/wiseSaying/WiseSayingController.java" | 120 ++++++++++++++++ .../ll/wiseSaying/WiseSayingRepository.java" | 130 ++++++++++++++++++ .../com/ll/wiseSaying/WiseSayingService.java" | 77 +++++++++++ 14 files changed, 439 insertions(+) create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/App.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/Main.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/PageResponse.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/App.java" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/Main.java" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/PageResponse.java" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSaying.java" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingController.java" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingRepository.java" create mode 100644 "[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingService.java" diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/App.class" "b/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/App.class" new file mode 100644 index 0000000000000000000000000000000000000000..c179134bb3efc50941840245b30da4c428a161ad GIT binary patch literal 1868 zcmah}ZBrXn6n-u**=1QMY@np{Ero(f78|woH4TVpZENTYsUWq!Y?5tRy4ekz4Vq8R z=(OWF%=n>VZLKq?A2N2v4|Hs>GUE^MuOz>~any4+1VYQuFUj6}&wb8wp7Wgh*S~-K z319+?5}ME~phZS2d<}#y9~aQhGn>;49%hNv;dKz+Y2hVh8az! zHOtbSHb`g}Aj{}L=QfmNG4JYGh9<*e=uLPx4Lf?q$`#zC>*!iGCP6?K&)>}u2<;dW zo^FF5Jpy`V>_s0TrR{9gG^3vwc|EBW4dOeV%P|P~8X*RM4XBZ2Ou#;d;U}-oY@$r* zIXiE-wo{Z4;KCeW7~JhbQg;@Ov@T&k4)GceGpM1&Za214#JHYEp2BFtwp_823d$78^8jQy!Jcs86yddK^PEe!jo@ls9jm&WzlbdG45}ql^GSq7l zPQ*(LBH>n69)*J(@)a4ca=cdWCO1_~#!18}%+fz~6NaTT^n}7SO&ZZejFHVNw^l1Z z{vcr-ZwQ!>@h0Bd?qn}D1?me0&CEYWtTrvN@MYemw`H8>)8tE&!ChU%S&o1I7s3~j zpyF!ZV?5b88Rv0t3R#)zg85vSG zh#490@c>^&H+7!-G7tIkyXwkvJ>-gv54@19oiVN!MSR5RJzA>Vy2lYT87a=bHB~Uo zjED@KR)4xt`FTmiRpM4%UJ4RmuzLGu<*RRaZ>a~wXu{5r!h5*T=L*@B?p)GRChaH* zJFS`1nq%g6v$=* z&1_b)s95DmhcI*`T`hfmQp;`dmy&kDN$aN!UZF^ok8vC02t89x^s+WV;SUvkDSXhp z9a0oNFkGY6P5N%8{}Yilu*f=u*#~G_!=8sw))AOpLw{l&`)AcP9Gs-%;Ot1`Hz;cu zc!;4@4{eTq`w0(dLkrELf_7TV7^EloI67g_NwAg!^SJIs_rpY%7!0Bt7Hne4kgIcI zBedq+zkh(R@@yGV{{LbbFZ0x8yp~Xv(K24YgAUplD&tfMwyK<=t-Fv_<()Dn@1T>P zsbyR&VM6j;H5W%mwuKC z29+VA2VLl;$GVTi573*m4{;LWG(E@{aR66v5IPP~nTJs%LB61?-#-D&aAZM)Zo+WTLYtwt;7{C3csBQLqJ@Y{hW44vWO>e@ zkH(>iErwy7r(TkH&vGRK{vxUQV!5` zTvur%id!BfRO$P9%#)B8QssX|qkNPrh68^yZc4ng#=4_>zj;Sc7Bt~>9FotAIS~dM zYz8aHt0EScQVq~i15OkK$JnMFsiT3ZEs=I9^C&Wkt&=s_Yi;*Pl?~|FC3Suq(8qwX p4)!plin@GS!vOmO=G_{dH&_iq{Rwel5v;-3aIsHy+5oAB!yhbwSdRbz literal 0 HcmV?d00001 diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/PageResponse.class" "b/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/PageResponse.class" new file mode 100644 index 0000000000000000000000000000000000000000..d4bca93fd97345ad84f3584d0bbb038432f15254 GIT binary patch literal 1164 zcma)4U2hUm5IvXg&$duN#X_lC1#0A72uVY#AtBlb;lUTP;0ABAEX{J!)L-C_@j(-b zi4Xn&f0XguU8pNH+7R~MId|sF%$fP|^V@d-9Xw1RfM67%6vBuI?3@{IjfQ2|lg9JW znK@Phk(RWjY6}FbwP74F#G^>0kVHzLJf2M(meqJC=VsrykPJIDCguxsem=A3ra)LK zb2=w)&m~?cX*GIsu9})?D}`+?ChvAn z+UB#xbYwaMV`LG@_GV+l8XAt&_6iKCH$1gnR+ofiN2R_Y{w6*+w`JP%-TZ6}565ozA+gBk@ zu0LBiWAlmB8fN@!@ks9i4mjliM-t+f%LIWOtpM`;b1mFESAb^`1)l81#cpy_xmdVG zzao(jJVQKl^{){1qa~vCy(QB1(h`}^#DloaZ-EhDo)9y|k;WE(yUepkwC=^DgfcBM zt?JP?U5TzTr`M5O`@9!cNC_2Mo`3$b{sZ3b;O?rrV_Jef;rbUuKk?#~6LG<;n_jn0 zhgEu=;5SmC<;il7UWd5PuWs5;oBl|^Pg}Sat-yo7(q%U3ir1oxqk2hKbUWfOW1362 S1MoU7Qx>nE8fDkxKKcb%{?Hr% literal 0 HcmV?d00001 diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class" "b/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSaying.class" new file mode 100644 index 0000000000000000000000000000000000000000..f7f04b4a17ea03247d0f1f63fdcd525880bce558 GIT binary patch literal 944 zcmaKq-EPxB5QWb=j*X4mv`HF%0{w#v$NcyKiYlQkCE)c-I$ zkHTEQcq0>;9}6_x!PLS%SSD--_u&XU3DXNdj{Pe+k0!xqN!zEJP(YI>0%D|0n+{so z5-`Iw$)kjM+v8QONuJSrq=an;9VIk^MShlM0clj>Yu>iLw^IMu7 zcU_`jEhc(f^=Q#>9ov(1k%iGaslZ#SalTgL!U0F5@#z{|`2>tKHP~Y3+_)PcGP+!M zc#8SI&b{mXfbjZDnBL1JHoR9$Y=0|UJ+3`Ez|1-<{%mYAcZb;@@YXB+c!){i?FhU8$PhcbH!oXe?9WfygSgQwplo{G9N##=Px>Z(iit%Kes3##(HQgzdrQA|=%@7IEC-v#N{f*jO?+!}WYvPY2pe}JfQ LDv-mX^=E$p7b}r% literal 0 HcmV?d00001 diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class" "b/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingController.class" new file mode 100644 index 0000000000000000000000000000000000000000..777104853841e90d8a198a2d896436f4c9211016 GIT binary patch literal 5331 zcmbVQ3wRXO89g_d-I;7A1XhEtA}$D+2auY^v}_1qKqNLqbZHRK>SQyJh0Si<-2iE| zQWZq7K5D^Wg@VPVK4>9@HAJ+nR@++Zqwm(fYaf!O@Ahl`YSVM?Y?56Q(?@V;=H9vY z|Nndb^PfA{7yi}%G=RnUn+JKw*P)qk!7VUxgSE-3j9Ah2l~=TEutP}!_xx})oLnG~ zUs~2&00RX&JSGZZ3d{<{+AAZG%FW?~9kjZ_oVIHCad9k~jK?AoJ1(Fn?D(c|$QGE{ zINqF~GpttnnP8$A6Xo2H6^%+OXEdttI+Ni@Wzgy5NH5ONai)n9OwL(Auq%X>5UJWQoOQsK9K23;qlIn6(hsm!yX!V?;UHW!bn{sr6tkDs{Ze#6_qQm@-}n1ZcgT zY-m-4Y4DO})g~@Rjlfy$)<&DG2wBNh;ba@15=kqXOh_mj#=t>l&mVUTDh7?WI8-pgS9%YF>x(EFhn%P z#fE6oUN7s#=&<4mo6UD1YlDI71t!lK^Un)`7MZya>wGLEvO>;)DOUDOId3X`&#gdRZf9eAvXz*h;=gop`%OWY}Tg7J;If ztweZcLR~zP5Vx7whV3-E$%=H^S1=Qkb4x434OP)QOxz(gs(>h5(wS_F#burEGI6Ku z^{`h;xE)Q(LcGhw-MELGRfR~y^T*&sc5w{R*hyoqh*EbyMtMDbS9f~fv2>4Axy&jI ze4Ie6z35s4dss~u$&7ZJ*ek24h!L%fC9Q}|V#14jRLg35(8NCMXJqSQ@pg-V&HJAs z%a(7+&I2Y6;vt%AwIjAvP>l$#@j^qjmz!j@j!z4muQI8oHg&eQ*zu*x_oZ7xc1JQC zqfC8<@uqJ%oIdcNKiz$3;Nflqj|xC~c-+Kce3l;CW3AzJT>_W>|MVZ(Zfm`8qs0qd zmSC^+zN0&RV0Xs5^n1+2akc>Q+9@-H?by{ipA|GrjL*dSADH z;Fe?Q2OeQ|{HKl_P47A|a8Gyo{vGL^#|L)p7}#}au0U<+xO>LXPVS^XXUi_5tZ7me z1&ZZ1=peY#YKgGN+ZYR3k!C9%mhDWZmTU{NM#uLk$?AM>aEs8T{FA!U;7G1AIz{L$ z#dorNKFy%%t zBw7OgG2CYB6dhB^*Hg&X#aPg}0C8K$fVAj8n3+Gu`z-n_pqrv#(h6-{ZgnV=I-b+< z&9|*FQ`X!x!*Vr*U|JTyV-^DqyA(=!CZPXWG;HO-m z)0^IN%<1~M6dOUY`Q>QiPW6s9{wsm9oH(}n(+7{G_dkAmcem8C^zNM_bzo?f%Y>wIe#cm9Ekj7~pzmuEq?*(Rz@HZUY6x(Q5Iy@t0{E}K~g}4Jz zM7pz8FEh}=ZW)Oeu@f^IW3i2$9kp5M$`CfICugGk<``pmHsy0wUI}8x#9}KF337*I z_RR+Q{k}M2B@#9_)ISmHQEM72R2_d|QI0>9Mdqvv(|BgcyKabB+(Um*iGSN-syQlF5M&#$_{Y5_I zv1cN_gl8C+z_XajE92Di7;zCGp493@lL%-P-arcT_u{1rZ+!|&v?}j1-U2S4E8zCI zpRUpKYm5@3M1Kg6``jf)RiMCE;JsW9@%TLXRe{318q-&pLgQl$nSWREm*4w<_AKw! zFL$2z2JcHy-EueYGkk^KD^j>}FJ|S}m_6{b{eIP+tjYF7wpXdP+f`$hn2&N!6@T(i zrrO8f4E|>OJX%#BR@e1ll6-9HL4mvnwA&2PGZ>unJj#69^OzyAzmCvKr2AnhnEC9} z`q4Vn@Y>D*HBcsJ${e4T!g>io3L8)01_24h32YYpFbT+~n*=eQ8_=cwkGP*g-s*gx z&Q$i{*5GPQKHeT&?UMJM!4y8as%P+-p-{Z{y43h7+5s5e`+DH=?&h2+(%Jn72!Xu! zlTPSCp=wB@efUJcEhBelh@vU#?!ipLaW27`LOPsB+W49DX*eI#Nt6pvPq4{x#C>byQP)F2>(^UUOldC_+G#V7{1+g<=U7i7R>9x(4;4mB*$w zwj)>~Vpu9RW0|;_$Dq4#xwxO_phIXBhuPPQ<)WWwAz3~hESGxRN8it}u;$@GJWpB{ zFt(G79A3!YB8_OVUm0$EQ@a^q|;j9?CS$<&xGt zijzc%#dCx`Sx2X*EO8=ZSqr= z`@$hk@X6r>^GSKu{>lGi@+J!Fbv$fvF^7j1BQ9eVxH)F~sKt06@jjBmV@;HXAY-QP z?(E0shBY8dumhU&{`P(x8Gb)=M8E?sg^o{?#rfE(cfjQ6FeY8NaTt?&Rwr;BF}a>> zXko>MSdFc$LYpU>^=L#JkqYyOzY!bc;go7-2zQ)l- zO7dN_+n&MEM-Ptp-;{;u_F+V~XCXQX+FNL6Wz7A@2&ms3-r4Gz44K@Ca@{F>UZy;i zks)UXoxqfXr)C|SxNB`zA+iwVoQ%VKe2=X>d>=pHy^0~7;`<+}>yOm+C+hk$b^V39 YzOJsnR@dL+51i-WoIm2v_$z$>25y~;-~a#s literal 0 HcmV?d00001 diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class" "b/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingRepository.class" new file mode 100644 index 0000000000000000000000000000000000000000..62c8726df4f18609bdbf13769ad142b8b8d1dad7 GIT binary patch literal 6910 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 E0otF07XSbN literal 0 HcmV?d00001 diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class" "b/[BE5]\354\235\264\354\235\200\354\244\200/out/production/devcourse/com/ll/wiseSaying/WiseSayingService.class" new file mode 100644 index 0000000000000000000000000000000000000000..31e3dcfc06af34a03c93152865f0101445fd6ae6 GIT binary patch literal 4370 zcmb_giCYxs8UGE;?(B{OQV{A&ybuEmC?*=Ltdb%g*#=GG8Z7p5*d1YX+1<>{qNJBS z?UAPUVbc51rcGPZCMepb>1B_ne^DNvw7+*|WJj@Eo<0S3_xs-OJ%8^p-|~;QZoCd) z41d?rfJP0fff(WnTF#hr=3vn*O%FaXb;inj3gUb1lI@KsXzWc-B#}T;gKl6I3A z<=Mevaqyh&S~+vxrr3$4WzKTu?7XEwcdSa;wY{=4ub_9lp3Jc&&Ww&`tk%$C;B9DC z@ZieC6eOoDZ`^dfY{7Rqt6`0T2kJ@dXhVkp@OHY_n;oxVkn+CgY^e zWb_#5MVeW1Ez`-*C>ZKp?(K3)Iv`a&yEr&*yPl7Bzkva4qm|QksW4hBDroIp#@Ncb z88om150R0mR!oPXuf2ncxDxLVwZ+T3=Cnnf@UAvC9?uu*x5){_d_qY?U$Q(!{FF$HZkP(~fcoR?D_PoYsvJ#AnDCln-X&vFD(1s!*Roek-P zdJ-o!yvM+MrF>dzTJNyX;Th9CYMu9l_x%PwfK!aNM1n*R`XA~3OafDWnoFKlqEDMq zFks;{>&<$mY8KsETu~`0%{I&!uyKZk&WwzeeGT_o3HwVF7Y)pUASd!1M_&6j0LM` zd8`)cJ38Bp4;lC{K0@ib-C@P1X~P8rAH&C`og-1+NwyD47^IYP8$M~^ zQ^KAkd(E$l20kO>H#t?ci-iNGXA1A<418WnH^vymq5k^wB{DnH6AW#vTwsK&$L*4J zv^qOwImgYZA}Ouo<-A#(FdbX=AyM^aY$CX|ZouJ0&k(@8W0?ZrfoP8Y^SG?5mik(k zk0=EVHiK5!etPZs!U^!-bZLYuXv)JY9On1Y7#%9~Z&l3$qSSJ4qZ924XAb$!TJz`1 zPT}}`g*z?Wv8?1+MiPVZ%AQ#i{nVtpp6PhmQo%Y;CaY8km%8v5*tfG}>bN^$R2?R5 z$31@Ry-y&u=W%9)fi&ejGk^AoSqW7nbM|z}^r|w%r~f~2t-yS_h4(D6VR5TIXhJ_yThXE-l5>p`hA+IpQSVl zUNQONqp7+mI}7nzWf z&aRGQQEn194EzdLTX2G=E`TS!Erxo+A~j^`QT=^ zYBsw2XViQs6u9@8St=AQw|l%?K3lCseOf+0?h=%yin6c#FfdtPHv04nHIK1ObA0YH z%|^CVvYfG^>AIGy;V&GO%P_fLcpCo7kyW3S<21m6kHG}*;{XSuT(G%Ha2>;QeE$M> zhj=RIdfzoDef_UNdxg6OJkR%LH1a(G6-oZ;_#$^50XM#cFLOsZUn^@1U%^*HozGE! zjAwm)uR>cu)5uM7@6&Qi*eZy)>y@Bn(A|7tQb-ZIJmQok7Pr=3Z*v0a7 zyz}{?c&A!ukIf8e?OJ>6RCs(HhlUa#aRJ}; z(U8^mxN4-NIA6KdQ<9f8%$ zv>IrWRls$bTvy1IM8oFWNN802Q*ImZ5?}l-5rRL&PmT1s5Zj|S@zmrs`TWPT~ugX4cMLLQ6_b#TQX-z=Th*?j+AhC z0Y_7W<6kcYB^E%woe+ZGOA^?|!W!i74h-WVUf>_*6?rG`y1NL(BZPW41Ki`oK0=rV zG3u98Tw+*)ea;74V4w5BmLe?SXN0bi+AaLtPn3WttrMJGUOE#H1-f-m-$IJW`G1qQ zv0Fpio7nIsWdbZ;W@>rUDFK1 zm!YZ`DJR|96RP^4)ch^1O{oO(qbZdw@d-Kdn>N6)(J$R~#011d$9^{I7}|+oC(ElF zha>IUvt+y{G)_}~EFQ#|Sz7ao4|q&-U?ExEHvM5#V&Z!Vw}rI)2R+zZl>*+%@1; byv9$l^IOsuI2mr@Pd=Z5KjRkuhSa|SOm|Eb literal 0 HcmV?d00001 diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/App.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/App.java" new file mode 100644 index 0000000..29b93e7 --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/App.java" @@ -0,0 +1,40 @@ +package com.ll.wiseSaying; + +import java.util.Scanner; + +public class App { + private final Scanner scanner; + private final WiseSayingController controller; + + public App() { + this.scanner = new Scanner(System.in); + WiseSayingRepository repository = new WiseSayingRepository(); + WiseSayingService service = new WiseSayingService(repository); + this.controller = new WiseSayingController(service, scanner); + } + + public void run() { + System.out.println("== 명언 앱 =="); + + while (true) { + System.out.print("명령) "); + String command = scanner.nextLine(); + + if (command.equals("등록")) { + controller.create(); + } else if (command.equals("목록") || command.startsWith("목록?")) { + controller.list(command); + } else if (command.startsWith("삭제?id=")) { + controller.delete(command); + } else if (command.startsWith("수정?id=")) { + controller.modify(command); + } else if (command.equals("빌드")) { + controller.build(); + } else if (command.equals("종료")) { + break; + } else { + System.out.println("알 수 없는 명령"); + } + } + } +} \ No newline at end of file diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/Main.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/Main.java" new file mode 100644 index 0000000..afa68df --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/Main.java" @@ -0,0 +1,7 @@ +package com.ll.wiseSaying; + +public class Main { + public static void main(String[] args) { + new App().run(); + } +} \ No newline at end of file diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/PageResponse.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/PageResponse.java" new file mode 100644 index 0000000..6b7a545 --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/PageResponse.java" @@ -0,0 +1,32 @@ +package com.ll.wiseSaying; + +import java.util.List; + +public class PageResponse { + private List items; + private int currentPage; + private int totalPages; + private static final int PAGE_SIZE = 5; + + public PageResponse(List items, int currentPage, int totalPages) { + this.items = items; + this.currentPage = currentPage; + this.totalPages = totalPages; + } + + public List getItems() { + return items; + } + + public int getCurrentPage() { + return currentPage; + } + + public int getTotalPages() { + return totalPages; + } + + public static int getPageSize() { + return PAGE_SIZE; + } +} \ No newline at end of file diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSaying.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSaying.java" new file mode 100644 index 0000000..53a1b99 --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSaying.java" @@ -0,0 +1,33 @@ +package com.ll.wiseSaying; + +public class WiseSaying { + private int id; + private String content; + private String author; + + public WiseSaying(int id, String content, String author) { + this.id = id; + this.content = content; + this.author = author; + } + + public int getId() { + return id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingController.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingController.java" new file mode 100644 index 0000000..2f6db27 --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingController.java" @@ -0,0 +1,120 @@ +package com.ll.wiseSaying; + +import java.util.*; + +public class WiseSayingController { + private final WiseSayingService service; + private final Scanner scanner; + + public WiseSayingController(WiseSayingService service, Scanner scanner) { + this.service = service; + this.scanner = scanner; + } + + public void create() { + System.out.print("명언 : "); + String content = scanner.nextLine(); + + System.out.print("작가 : "); + String author = scanner.nextLine(); + + WiseSaying wiseSaying = service.create(content, author); + System.out.println(wiseSaying.getId() + "번 명언이 등록되었습니다."); + } + + public void list(String command) { + // 기본값 설정 + int page = 1; + String keywordType = null; + String keyword = null; + + // 명령어에 파라미터가 있는 경우 파싱 + if (command.contains("?")) { + String[] params = command.split("\\?")[1].split("&"); + for (String param : params) { + String[] keyValue = param.split("="); + switch (keyValue[0]) { + case "page": + page = Integer.parseInt(keyValue[1]); + break; + case "keywordType": + keywordType = keyValue[1]; + break; + case "keyword": + keyword = keyValue[1]; + break; + } + } + } + + // 검색 조건이 있는 경우 출력 + if (keywordType != null && keyword != null) { + System.out.println("----------------------"); + System.out.println("검색타입 : " + keywordType); + System.out.println("검색어 : " + keyword); + } + + System.out.println("번호 / 작가 / 명언"); + System.out.println("----------------------"); + + PageResponse pageResponse = service.getList(page, keywordType, keyword); + + // 아이템 출력 + for (WiseSaying wiseSaying : pageResponse.getItems()) { + System.out.printf("%d / %s / %s\n", + wiseSaying.getId(), + wiseSaying.getAuthor(), + wiseSaying.getContent()); + } + + System.out.println("----------------------"); + // 페이지 정보 출력 + String pageInfo = String.format("페이지 : %s / %s", + page == 1 ? "[1]" : "1", + page == pageResponse.getTotalPages() ? + "[" + pageResponse.getTotalPages() + "]" : + pageResponse.getTotalPages()); + System.out.println(pageInfo); + } + + public void delete(String command) { + try { + int id = Integer.parseInt(command.split("=")[1]); + if (service.delete(id)) { + System.out.println(id + "번 명언이 삭제되었습니다."); + } else { + System.out.println(id + "번 명언은 존재하지 않습니다."); + } + } catch (NumberFormatException e) { + System.out.println("삭제 오류"); + } + } + + public void modify(String command) { + try { + int id = Integer.parseInt(command.split("=")[1]); + WiseSaying wiseSaying = service.modify(id, "", ""); + + if (wiseSaying != null) { + System.out.println("명언(기존) : " + wiseSaying.getContent()); + System.out.print("명언 : "); + String content = scanner.nextLine(); + + System.out.println("작가(기존) : " + wiseSaying.getAuthor()); + System.out.print("작가 : "); + String author = scanner.nextLine(); + + service.modify(id, content, author); + } else { + System.out.println(id + "번 명언은 존재하지 않습니다."); + } + } catch (NumberFormatException e) { + System.out.println("수정 오류"); + } + } + + public void build() { + service.buildData(); + System.out.println("data.json 파일의 내용이 갱신되었습니다."); + } +} \ No newline at end of file diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingRepository.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingRepository.java" new file mode 100644 index 0000000..39f8578 --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingRepository.java" @@ -0,0 +1,130 @@ +package com.ll.wiseSaying; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class WiseSayingRepository { + private static final String BASE_PATH = "db/wiseSaying/"; + + public WiseSayingRepository() { + File folder = new File(BASE_PATH); + if (!folder.exists()) { + folder.mkdirs(); + } + } + + public void save(WiseSaying wiseSaying) { + try { + File file = new File(BASE_PATH + wiseSaying.getId() + ".json"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write("{\n"); + writer.write("\"id\": " + wiseSaying.getId() + ",\n"); + writer.write("\"content\": \"" + wiseSaying.getContent() + "\",\n"); + writer.write("\"author\": \"" + wiseSaying.getAuthor() + "\"\n"); + writer.write("}"); + } + } catch (IOException e) { + throw new RuntimeException("Failed to save wise saying", e); + } + } + + public WiseSaying findById(int id) { + File file = new File(BASE_PATH + id + ".json"); + if (!file.exists()) return null; + return loadFromFile(file); + } + + public List findAll() { + List wiseSayings = new ArrayList<>(); + File folder = new File(BASE_PATH); + File[] files = folder.listFiles((dir, name) -> name.matches("\\d+\\.json")); + + if (files != null) { + for (File file : files) { + WiseSaying wiseSaying = loadFromFile(file); + if (wiseSaying != null) { + wiseSayings.add(wiseSaying); + } + } + } + return wiseSayings; + } + + public boolean delete(int id) { + File file = new File(BASE_PATH + id + ".json"); + return file.exists() && file.delete(); + } + + private WiseSaying loadFromFile(File file) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + StringBuilder json = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + json.append(line); + } + return parseJson(json.toString()); + } catch (IOException e) { + return null; + } + } + + private WiseSaying parseJson(String json) { + try { + json = json.trim().replace("{", "").replace("}", "").replace("\n", "").replace("\r", ""); + String[] lines = json.split(","); + int id = Integer.parseInt(lines[0].split(":")[1].trim()); + String content = lines[1].split(":")[1].trim().replace("\"", ""); + String author = lines[2].split(":")[1].trim().replace("\"", ""); + return new WiseSaying(id, content, author); + } catch (Exception e) { + return null; + } + } + + public int getLastId() { + File file = new File(BASE_PATH + "lastId.txt"); + if (file.exists()) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + return Integer.parseInt(reader.readLine().trim()); + } catch (IOException | NumberFormatException e) { + return 1; + } + } + return 1; + } + + public void saveLastId(int lastId) { + try { + File file = new File(BASE_PATH + "lastId.txt"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write(String.valueOf(lastId)); + } + } catch (IOException e) { + throw new RuntimeException("Failed to save last ID", e); + } + } + + public void buildData() { + try { + List wiseSayings = findAll(); + File dataFile = new File(BASE_PATH + "data.json"); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(dataFile))) { + writer.write("[\n"); + for (int i = 0; i < wiseSayings.size(); i++) { + WiseSaying ws = wiseSayings.get(i); + writer.write(" {\n"); + writer.write(" \"id\": " + ws.getId() + ",\n"); + writer.write(" \"content\": \"" + ws.getContent() + "\",\n"); + writer.write(" \"author\": \"" + ws.getAuthor() + "\"\n"); + writer.write(" }"); + if (i < wiseSayings.size() - 1) writer.write(","); + writer.write("\n"); + } + writer.write("]\n"); + } + } catch (IOException e) { + throw new RuntimeException("Failed to build data", e); + } + } +} \ No newline at end of file diff --git "a/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingService.java" "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingService.java" new file mode 100644 index 0000000..74c222e --- /dev/null +++ "b/[BE5]\354\235\264\354\235\200\354\244\200/src/com/ll/wiseSaying/WiseSayingService.java" @@ -0,0 +1,77 @@ +package com.ll.wiseSaying; + +import java.util.*; + +public class WiseSayingService { + private final WiseSayingRepository repository; + + public WiseSayingService(WiseSayingRepository repository) { + this.repository = repository; + } + + public WiseSaying create(String content, String author) { + int id = repository.getLastId(); + WiseSaying wiseSaying = new WiseSaying(id, content, author); + repository.save(wiseSaying); + repository.saveLastId(id + 1); + return wiseSaying; + } + + public PageResponse getList(int page, String keywordType, String keyword) { + List wiseSayings; + + // 검색 조건이 있는 경우 + if (keywordType != null && !keywordType.isEmpty() && keyword != null && !keyword.isEmpty()) { + wiseSayings = search(keywordType, keyword); + } else { + wiseSayings = repository.findAll(); + } + + // 최신순 정렬 + wiseSayings.sort((a, b) -> b.getId() - a.getId()); + + // 페이징 처리 + int pageSize = PageResponse.getPageSize(); + int totalPages = (int) Math.ceil((double) wiseSayings.size() / pageSize); + int startIndex = (page - 1) * pageSize; + int endIndex = Math.min(startIndex + pageSize, wiseSayings.size()); + + List pagedItems = wiseSayings.subList(startIndex, endIndex); + return new PageResponse<>(pagedItems, page, totalPages); + } + + private List search(String keywordType, String keyword) { + List allWiseSayings = repository.findAll(); + List searchResults = new ArrayList<>(); + + for (WiseSaying wiseSaying : allWiseSayings) { + if (keywordType.equals("content") && + wiseSaying.getContent().contains(keyword)) { + searchResults.add(wiseSaying); + } else if (keywordType.equals("author") && + wiseSaying.getAuthor().contains(keyword)) { + searchResults.add(wiseSaying); + } + } + + return searchResults; + } + + public boolean delete(int id) { + return repository.delete(id); + } + + public WiseSaying modify(int id, String content, String author) { + WiseSaying wiseSaying = repository.findById(id); + if (wiseSaying != null) { + wiseSaying.setContent(content); + wiseSaying.setAuthor(author); + repository.save(wiseSaying); + } + return wiseSaying; + } + + public void buildData() { + repository.buildData(); + } +} \ No newline at end of file