From a18a91582409393af1cf5026abf0d9f1bbead713 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 14 Nov 2023 11:11:19 +0900 Subject: [PATCH 001/190] =?UTF-8?q?[BE]=20(REFACTOR)=20lastweek=20commit?= =?UTF-8?q?=20=EB=B9=84=EA=B5=90=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지난주에 작성한 코드를 수정, 보완할 것이기에 비교용으로 올려둡니다. --- 2 WEEK/SON/.gitignore | 37 +++ 2 WEEK/SON/build.gradle | 29 ++ 2 WEEK/SON/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + 2 WEEK/SON/gradlew | 249 ++++++++++++++++++ 2 WEEK/SON/gradlew.bat | 92 +++++++ 2 WEEK/SON/settings.gradle | 1 + .../com/myMission/yebin/YebinApplication.java | 37 +++ .../com/myMission/yebin/grade/GradeVO.java | 10 + .../com/myMission/yebin/item/ItemDAO.java | 23 ++ .../com/myMission/yebin/item/ItemMap.java | 14 + .../java/com/myMission/yebin/item/ItemVO.java | 20 ++ .../myMission/yebin/order/DiscountPolicy.java | 17 ++ .../java/com/myMission/yebin/order/Order.java | 27 ++ .../com/myMission/yebin/users/UserDAO.java | 37 +++ .../com/myMission/yebin/users/UserList.java | 15 ++ .../com/myMission/yebin/users/UserVO.java | 34 +++ .../src/main/resources/application.properties | 1 + .../yebin/YebinApplicationTests.java | 13 + 19 files changed, 663 insertions(+) create mode 100644 2 WEEK/SON/.gitignore create mode 100644 2 WEEK/SON/build.gradle create mode 100644 2 WEEK/SON/gradle/wrapper/gradle-wrapper.jar create mode 100644 2 WEEK/SON/gradle/wrapper/gradle-wrapper.properties create mode 100644 2 WEEK/SON/gradlew create mode 100644 2 WEEK/SON/gradlew.bat create mode 100644 2 WEEK/SON/settings.gradle create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/YebinApplication.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/grade/GradeVO.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemDAO.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemMap.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemVO.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/order/DiscountPolicy.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/order/Order.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserDAO.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserList.java create mode 100644 2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserVO.java create mode 100644 2 WEEK/SON/src/main/resources/application.properties create mode 100644 2 WEEK/SON/src/test/java/com/myMission/yebin/YebinApplicationTests.java diff --git a/2 WEEK/SON/.gitignore b/2 WEEK/SON/.gitignore new file mode 100644 index 00000000..c2065bc2 --- /dev/null +++ b/2 WEEK/SON/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/2 WEEK/SON/build.gradle b/2 WEEK/SON/build.gradle new file mode 100644 index 00000000..c3c6e5d7 --- /dev/null +++ b/2 WEEK/SON/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '2.7.17' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' +} + +group = 'com.myMission' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '11' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + + // lombok (Getter, Setter등 반복되는 메서드를 Annotation으로 사용) + implementation 'org.projectlombok:lombok' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/2 WEEK/SON/gradle/wrapper/gradle-wrapper.jar b/2 WEEK/SON/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 zcmb5Wb9gP!wgnp7wrv|bwr$&XvSZt}Z6`anZSUAlc9NHKf9JdJ;NJVr`=eI(_pMp0 zy1VAAG3FfAOI`{X1O)&90s;U4K;XLp008~hCjbEC_fbYfS%6kTR+JtXK>nW$ZR+`W ze|#J8f4A@M|F5BpfUJb5h>|j$jOe}0oE!`Zf6fM>CR?!y@zU(cL8NsKk`a z6tx5mAkdjD;J=LcJ;;Aw8p!v#ouk>mUDZF@ zK>yvw%+bKu+T{Nk@LZ;zkYy0HBKw06_IWcMHo*0HKpTsEFZhn5qCHH9j z)|XpN&{`!0a>Vl+PmdQc)Yg4A(AG-z!+@Q#eHr&g<9D?7E)_aEB?s_rx>UE9TUq|? z;(ggJt>9l?C|zoO@5)tu?EV0x_7T17q4fF-q3{yZ^ipUbKcRZ4Qftd!xO(#UGhb2y>?*@{xq%`(-`2T^vc=#< zx!+@4pRdk&*1ht2OWk^Z5IAQ0YTAXLkL{(D*$gENaD)7A%^XXrCchN&z2x+*>o2FwPFjWpeaL=!tzv#JOW#( z$B)Nel<+$bkH1KZv3&-}=SiG~w2sbDbAWarg%5>YbC|}*d9hBjBkR(@tyM0T)FO$# zPtRXukGPnOd)~z=?avu+4Co@wF}1T)-uh5jI<1$HLtyDrVak{gw`mcH@Q-@wg{v^c zRzu}hMKFHV<8w}o*yg6p@Sq%=gkd~;`_VGTS?L@yVu`xuGy+dH6YOwcP6ZE`_0rK% zAx5!FjDuss`FQ3eF|mhrWkjux(Pny^k$u_)dyCSEbAsecHsq#8B3n3kDU(zW5yE|( zgc>sFQywFj5}U*qtF9Y(bi*;>B7WJykcAXF86@)z|0-Vm@jt!EPoLA6>r)?@DIobIZ5Sx zsc@OC{b|3%vaMbyeM|O^UxEYlEMHK4r)V-{r)_yz`w1*xV0|lh-LQOP`OP`Pk1aW( z8DSlGN>Ts|n*xj+%If~+E_BxK)~5T#w6Q1WEKt{!Xtbd`J;`2a>8boRo;7u2M&iOop4qcy<)z023=oghSFV zST;?S;ye+dRQe>ygiJ6HCv4;~3DHtJ({fWeE~$H@mKn@Oh6Z(_sO>01JwH5oA4nvK zr5Sr^g+LC zLt(i&ecdmqsIJGNOSUyUpglvhhrY8lGkzO=0USEKNL%8zHshS>Qziu|`eyWP^5xL4 zRP122_dCJl>hZc~?58w~>`P_s18VoU|7(|Eit0-lZRgLTZKNq5{k zE?V=`7=R&ro(X%LTS*f+#H-mGo_j3dm@F_krAYegDLk6UV{`UKE;{YSsn$ z(yz{v1@p|p!0>g04!eRSrSVb>MQYPr8_MA|MpoGzqyd*$@4j|)cD_%^Hrd>SorF>@ zBX+V<@vEB5PRLGR(uP9&U&5=(HVc?6B58NJT_igiAH*q~Wb`dDZpJSKfy5#Aag4IX zj~uv74EQ_Q_1qaXWI!7Vf@ZrdUhZFE;L&P_Xr8l@GMkhc#=plV0+g(ki>+7fO%?Jb zl+bTy7q{w^pTb{>(Xf2q1BVdq?#f=!geqssXp z4pMu*q;iiHmA*IjOj4`4S&|8@gSw*^{|PT}Aw~}ZXU`6=vZB=GGeMm}V6W46|pU&58~P+?LUs%n@J}CSrICkeng6YJ^M? zS(W?K4nOtoBe4tvBXs@@`i?4G$S2W&;$z8VBSM;Mn9 zxcaEiQ9=vS|bIJ>*tf9AH~m&U%2+Dim<)E=}KORp+cZ^!@wI`h1NVBXu{@%hB2Cq(dXx_aQ9x3mr*fwL5!ZryQqi|KFJuzvP zK1)nrKZ7U+B{1ZmJub?4)Ln^J6k!i0t~VO#=q1{?T)%OV?MN}k5M{}vjyZu#M0_*u z8jwZKJ#Df~1jcLXZL7bnCEhB6IzQZ-GcoQJ!16I*39iazoVGugcKA{lhiHg4Ta2fD zk1Utyc5%QzZ$s3;p0N+N8VX{sd!~l*Ta3|t>lhI&G`sr6L~G5Lul`>m z{!^INm?J|&7X=;{XveF!(b*=?9NAp4y&r&N3(GKcW4rS(Ejk|Lzs1PrxPI_owB-`H zg3(Rruh^&)`TKA6+_!n>RdI6pw>Vt1_j&+bKIaMTYLiqhZ#y_=J8`TK{Jd<7l9&sY z^^`hmi7^14s16B6)1O;vJWOF$=$B5ONW;;2&|pUvJlmeUS&F;DbSHCrEb0QBDR|my zIs+pE0Y^`qJTyH-_mP=)Y+u^LHcuZhsM3+P||?+W#V!_6E-8boP#R-*na4!o-Q1 zVthtYhK{mDhF(&7Okzo9dTi03X(AE{8cH$JIg%MEQca`S zy@8{Fjft~~BdzWC(di#X{ny;!yYGK9b@=b|zcKZ{vv4D8i+`ilOPl;PJl{!&5-0!w z^fOl#|}vVg%=n)@_e1BrP)`A zKPgs`O0EO}Y2KWLuo`iGaKu1k#YR6BMySxQf2V++Wo{6EHmK>A~Q5o73yM z-RbxC7Qdh0Cz!nG+7BRZE>~FLI-?&W_rJUl-8FDIaXoNBL)@1hwKa^wOr1($*5h~T zF;%f^%<$p8Y_yu(JEg=c_O!aZ#)Gjh$n(hfJAp$C2he555W5zdrBqjFmo|VY+el;o z=*D_w|GXG|p0**hQ7~9-n|y5k%B}TAF0iarDM!q-jYbR^us(>&y;n^2l0C%@2B}KM zyeRT9)oMt97Agvc4sEKUEy%MpXr2vz*lb zh*L}}iG>-pqDRw7ud{=FvTD?}xjD)w{`KzjNom-$jS^;iw0+7nXSnt1R@G|VqoRhE%12nm+PH?9`(4rM0kfrZzIK9JU=^$YNyLvAIoxl#Q)xxDz!^0@zZ zSCs$nfcxK_vRYM34O<1}QHZ|hp4`ioX3x8(UV(FU$J@o%tw3t4k1QPmlEpZa2IujG&(roX_q*%e`Hq|);0;@k z0z=fZiFckp#JzW0p+2A+D$PC~IsakhJJkG(c;CqAgFfU0Z`u$PzG~-9I1oPHrCw&)@s^Dc~^)#HPW0Ra}J^=|h7Fs*<8|b13ZzG6MP*Q1dkoZ6&A^!}|hbjM{2HpqlSXv_UUg1U4gn z3Q)2VjU^ti1myodv+tjhSZp%D978m~p& z43uZUrraHs80Mq&vcetqfQpQP?m!CFj)44t8Z}k`E798wxg&~aCm+DBoI+nKq}&j^ zlPY3W$)K;KtEajks1`G?-@me7C>{PiiBu+41#yU_c(dITaqE?IQ(DBu+c^Ux!>pCj zLC|HJGU*v+!it1(;3e`6igkH(VA)-S+k(*yqxMgUah3$@C zz`7hEM47xr>j8^g`%*f=6S5n>z%Bt_Fg{Tvmr+MIsCx=0gsu_sF`q2hlkEmisz#Fy zj_0;zUWr;Gz}$BS%Y`meb(=$d%@Crs(OoJ|}m#<7=-A~PQbyN$x%2iXP2@e*nO0b7AwfH8cCUa*Wfu@b)D_>I*%uE4O3 z(lfnB`-Xf*LfC)E}e?%X2kK7DItK6Tf<+M^mX0Ijf_!IP>7c8IZX%8_#0060P{QMuV^B9i<^E`_Qf0pv9(P%_s8D`qvDE9LK9u-jB}J2S`(mCO&XHTS04Z5Ez*vl^T%!^$~EH8M-UdwhegL>3IQ*)(MtuH2Xt1p!fS4o~*rR?WLxlA!sjc2(O znjJn~wQ!Fp9s2e^IWP1C<4%sFF}T4omr}7+4asciyo3DntTgWIzhQpQirM$9{EbQd z3jz9vS@{aOqTQHI|l#aUV@2Q^Wko4T0T04Me4!2nsdrA8QY1%fnAYb~d2GDz@lAtfcHq(P7 zaMBAGo}+NcE-K*@9y;Vt3*(aCaMKXBB*BJcD_Qnxpt75r?GeAQ}*|>pYJE=uZb73 zC>sv)18)q#EGrTG6io*}JLuB_jP3AU1Uiu$D7r|2_zlIGb9 zjhst#ni)Y`$)!fc#reM*$~iaYoz~_Cy7J3ZTiPm)E?%`fbk`3Tu-F#`{i!l5pNEn5 zO-Tw-=TojYhzT{J=?SZj=Z8#|eoF>434b-DXiUsignxXNaR3 zm_}4iWU$gt2Mw5NvZ5(VpF`?X*f2UZDs1TEa1oZCif?Jdgr{>O~7}-$|BZ7I(IKW`{f;@|IZFX*R8&iT= zoWstN8&R;}@2Ka%d3vrLtR|O??ben;k8QbS-WB0VgiCz;<$pBmIZdN!aalyCSEm)crpS9dcD^Y@XT1a3+zpi-`D}e#HV<} z$Y(G&o~PvL-xSVD5D?JqF3?B9rxGWeb=oEGJ3vRp5xfBPlngh1O$yI95EL+T8{GC@ z98i1H9KhZGFl|;`)_=QpM6H?eDPpw~^(aFQWwyXZ8_EEE4#@QeT_URray*mEOGsGc z6|sdXtq!hVZo=d#+9^@lm&L5|q&-GDCyUx#YQiccq;spOBe3V+VKdjJA=IL=Zn%P} zNk=_8u}VhzFf{UYZV0`lUwcD&)9AFx0@Fc6LD9A6Rd1=ga>Mi0)_QxM2ddCVRmZ0d z+J=uXc(?5JLX3=)e)Jm$HS2yF`44IKhwRnm2*669_J=2LlwuF5$1tAo@ROSU@-y+;Foy2IEl2^V1N;fk~YR z?&EP8#t&m0B=?aJeuz~lHjAzRBX>&x=A;gIvb>MD{XEV zV%l-+9N-)i;YH%nKP?>f`=?#`>B(`*t`aiPLoQM(a6(qs4p5KFjDBN?8JGrf3z8>= zi7sD)c)Nm~x{e<^jy4nTx${P~cwz_*a>%0_;ULou3kHCAD7EYkw@l$8TN#LO9jC( z1BeFW`k+bu5e8Ns^a8dPcjEVHM;r6UX+cN=Uy7HU)j-myRU0wHd$A1fNI~`4;I~`zC)3ul#8#^rXVSO*m}Ag>c%_;nj=Nv$rCZ z*~L@C@OZg%Q^m)lc-kcX&a*a5`y&DaRxh6O*dfhLfF+fU5wKs(1v*!TkZidw*)YBP za@r`3+^IHRFeO%!ai%rxy;R;;V^Fr=OJlpBX;(b*3+SIw}7= zIq$*Thr(Zft-RlY)D3e8V;BmD&HOfX+E$H#Y@B3?UL5L~_fA-@*IB-!gItK7PIgG9 zgWuGZK_nuZjHVT_Fv(XxtU%)58;W39vzTI2n&)&4Dmq7&JX6G>XFaAR{7_3QB6zsT z?$L8c*WdN~nZGiscY%5KljQARN;`w$gho=p006z;n(qIQ*Zu<``TMO3n0{ARL@gYh zoRwS*|Niw~cR!?hE{m*y@F`1)vx-JRfqET=dJ5_(076st(=lFfjtKHoYg`k3oNmo_ zNbQEw8&sO5jAYmkD|Zaz_yUb0rC})U!rCHOl}JhbYIDLzLvrZVw0~JO`d*6f;X&?V=#T@ND*cv^I;`sFeq4 z##H5;gpZTb^0Hz@3C*~u0AqqNZ-r%rN3KD~%Gw`0XsIq$(^MEb<~H(2*5G^<2(*aI z%7}WB+TRlMIrEK#s0 z93xn*Ohb=kWFc)BNHG4I(~RPn-R8#0lqyBBz5OM6o5|>x9LK@%HaM}}Y5goCQRt2C z{j*2TtT4ne!Z}vh89mjwiSXG=%DURar~=kGNNaO_+Nkb+tRi~Rkf!7a$*QlavziD( z83s4GmQ^Wf*0Bd04f#0HX@ua_d8 z23~z*53ePD6@xwZ(vdl0DLc=>cPIOPOdca&MyR^jhhKrdQO?_jJh`xV3GKz&2lvP8 zEOwW6L*ufvK;TN{=S&R@pzV^U=QNk^Ec}5H z+2~JvEVA{`uMAr)?Kf|aW>33`)UL@bnfIUQc~L;TsTQ6>r-<^rB8uoNOJ>HWgqMI8 zSW}pZmp_;z_2O5_RD|fGyTxaxk53Hg_3Khc<8AUzV|ZeK{fp|Ne933=1&_^Dbv5^u zB9n=*)k*tjHDRJ@$bp9mrh}qFn*s}npMl5BMDC%Hs0M0g-hW~P*3CNG06G!MOPEQ_ zi}Qs-6M8aMt;sL$vlmVBR^+Ry<64jrm1EI1%#j?c?4b*7>)a{aDw#TfTYKq+SjEFA z(aJ&z_0?0JB83D-i3Vh+o|XV4UP+YJ$9Boid2^M2en@APw&wx7vU~t$r2V`F|7Qfo z>WKgI@eNBZ-+Og<{u2ZiG%>YvH2L3fNpV9J;WLJoBZda)01Rn;o@){01{7E#ke(7U zHK>S#qZ(N=aoae*4X!0A{)nu0R_sKpi1{)u>GVjC+b5Jyl6#AoQ-1_3UDovNSo`T> z?c-@7XX*2GMy?k?{g)7?Sv;SJkmxYPJPs!&QqB12ejq`Lee^-cDveVWL^CTUldb(G zjDGe(O4P=S{4fF=#~oAu>LG>wrU^z_?3yt24FOx>}{^lCGh8?vtvY$^hbZ)9I0E3r3NOlb9I?F-Yc=r$*~l`4N^xzlV~N zl~#oc>U)Yjl0BxV>O*Kr@lKT{Z09OXt2GlvE38nfs+DD7exl|&vT;)>VFXJVZp9Np zDK}aO;R3~ag$X*|hRVY3OPax|PG`@_ESc8E!mHRByJbZQRS38V2F__7MW~sgh!a>98Q2%lUNFO=^xU52|?D=IK#QjwBky-C>zOWlsiiM&1n z;!&1((Xn1$9K}xabq~222gYvx3hnZPg}VMF_GV~5ocE=-v>V=T&RsLBo&`)DOyIj* zLV{h)JU_y*7SdRtDajP_Y+rBkNN*1_TXiKwHH2&p51d(#zv~s#HwbNy?<+(=9WBvo zw2hkk2Dj%kTFhY+$T+W-b7@qD!bkfN#Z2ng@Pd=i3-i?xYfs5Z*1hO?kd7Sp^9`;Y zM2jeGg<-nJD1er@Pc_cSY7wo5dzQX44=%6rn}P_SRbpzsA{6B+!$3B0#;}qwO37G^ zL(V_5JK`XT?OHVk|{_$vQ|oNEpab*BO4F zUTNQ7RUhnRsU`TK#~`)$icsvKh~(pl=3p6m98@k3P#~upd=k*u20SNcb{l^1rUa)>qO997)pYRWMncC8A&&MHlbW?7i^7M`+B$hH~Y|J zd>FYOGQ;j>Zc2e7R{KK7)0>>nn_jYJy&o@sK!4G>-rLKM8Hv)f;hi1D2fAc$+six2 zyVZ@wZ6x|fJ!4KrpCJY=!Mq0;)X)OoS~{Lkh6u8J`eK%u0WtKh6B>GW_)PVc zl}-k`p09qwGtZ@VbYJC!>29V?Dr>>vk?)o(x?!z*9DJ||9qG-&G~#kXxbw{KKYy}J zQKa-dPt~M~E}V?PhW0R26xdA%1T*%ra6SguGu50YHngOTIv)@N|YttEXo#OZfgtP7;H?EeZZxo<}3YlYxtBq znJ!WFR^tmGf0Py}N?kZ(#=VtpC@%xJkDmfcCoBTxq zr_|5gP?u1@vJZbxPZ|G0AW4=tpb84gM2DpJU||(b8kMOV1S3|(yuwZJ&rIiFW(U;5 zUtAW`O6F6Zy+eZ1EDuP~AAHlSY-+A_eI5Gx)%*uro5tljy}kCZU*_d7)oJ>oQSZ3* zneTn`{gnNC&uJd)0aMBzAg021?YJ~b(fmkwZAd696a=0NzBAqBN54KuNDwa*no(^O z6p05bioXUR^uXjpTol*ppHp%1v9e)vkoUAUJyBx3lw0UO39b0?^{}yb!$yca(@DUn zCquRF?t=Zb9`Ed3AI6|L{eX~ijVH`VzSMheKoP7LSSf4g>md>`yi!TkoG5P>Ofp+n z(v~rW+(5L96L{vBb^g51B=(o)?%%xhvT*A5btOpw(TKh^g^4c zw>0%X!_0`{iN%RbVk+A^f{w-4-SSf*fu@FhruNL##F~sF24O~u zyYF<3el2b$$wZ_|uW#@Ak+VAGk#e|kS8nL1g>2B-SNMjMp^8;-FfeofY2fphFHO!{ z*!o4oTb{4e;S<|JEs<1_hPsmAlVNk?_5-Fp5KKU&d#FiNW~Y+pVFk@Cua1I{T+1|+ zHx6rFMor)7L)krbilqsWwy@T+g3DiH5MyVf8Wy}XbEaoFIDr~y;@r&I>FMW{ z?Q+(IgyebZ)-i4jNoXQhq4Muy9Fv+OxU;9_Jmn+<`mEC#%2Q_2bpcgzcinygNI!&^ z=V$)o2&Yz04~+&pPWWn`rrWxJ&}8khR)6B(--!9Q zubo}h+1T)>a@c)H^i``@<^j?|r4*{;tQf78(xn0g39IoZw0(CwY1f<%F>kEaJ zp9u|IeMY5mRdAlw*+gSN^5$Q)ShM<~E=(c8QM+T-Qk)FyKz#Sw0EJ*edYcuOtO#~Cx^(M7w5 z3)rl#L)rF|(Vun2LkFr!rg8Q@=r>9p>(t3Gf_auiJ2Xx9HmxYTa|=MH_SUlYL`mz9 zTTS$`%;D-|Jt}AP1&k7PcnfFNTH0A-*FmxstjBDiZX?}%u%Yq94$fUT&z6od+(Uk> zuqsld#G(b$G8tus=M!N#oPd|PVFX)?M?tCD0tS%2IGTfh}3YA3f&UM)W$_GNV8 zQo+a(ml2Km4o6O%gKTCSDNq+#zCTIQ1*`TIJh~k6Gp;htHBFnne))rlFdGqwC6dx2+La1&Mnko*352k0y z+tQcwndQlX`nc6nb$A9?<-o|r*%aWXV#=6PQic0Ok_D;q>wbv&j7cKc!w4~KF#-{6 z(S%6Za)WpGIWf7jZ3svNG5OLs0>vCL9{V7cgO%zevIVMH{WgP*^D9ws&OqA{yr|m| zKD4*07dGXshJHd#e%x%J+qmS^lS|0Bp?{drv;{@{l9ArPO&?Q5=?OO9=}h$oVe#3b z3Yofj&Cb}WC$PxmRRS)H%&$1-)z7jELS}!u!zQ?A^Y{Tv4QVt*vd@uj-^t2fYRzQj zfxGR>-q|o$3sGn^#VzZ!QQx?h9`njeJry}@x?|k0-GTTA4y3t2E`3DZ!A~D?GiJup z)8%PK2^9OVRlP(24P^4_<|D=H^7}WlWu#LgsdHzB%cPy|f8dD3|A^mh4WXxhLTVu_ z@abE{6Saz|Y{rXYPd4$tfPYo}ef(oQWZ=4Bct-=_9`#Qgp4ma$n$`tOwq#&E18$B; z@Bp)bn3&rEi0>fWWZ@7k5WazfoX`SCO4jQWwVuo+$PmSZn^Hz?O(-tW@*DGxuf)V1 zO_xm&;NVCaHD4dqt(-MlszI3F-p?0!-e$fbiCeuaw66h^TTDLWuaV<@C-`=Xe5WL) zwooG7h>4&*)p3pKMS3O!4>-4jQUN}iAMQ)2*70?hP~)TzzR?-f@?Aqy$$1Iy8VGG$ zMM?8;j!pUX7QQD$gRc_#+=raAS577ga-w?jd`vCiN5lu)dEUkkUPl9!?{$IJNxQys z*E4e$eF&n&+AMRQR2gcaFEjAy*r)G!s(P6D&TfoApMFC_*Ftx0|D0@E-=B7tezU@d zZ{hGiN;YLIoSeRS;9o%dEua4b%4R3;$SugDjP$x;Z!M!@QibuSBb)HY!3zJ7M;^jw zlx6AD50FD&p3JyP*>o+t9YWW8(7P2t!VQQ21pHJOcG_SXQD;(5aX#M6x##5H_Re>6lPyDCjxr*R(+HE%c&QN+b^tbT zXBJk?p)zhJj#I?&Y2n&~XiytG9!1ox;bw5Rbj~)7c(MFBb4>IiRATdhg zmiEFlj@S_hwYYI(ki{}&<;_7(Z0Qkfq>am z&LtL=2qc7rWguk3BtE4zL41@#S;NN*-jWw|7Kx7H7~_%7fPt;TIX}Ubo>;Rmj94V> zNB1=;-9AR7s`Pxn}t_6^3ahlq53e&!Lh85uG zec0vJY_6e`tg7LgfrJ3k!DjR)Bi#L@DHIrZ`sK=<5O0Ip!fxGf*OgGSpP@Hbbe&$9 z;ZI}8lEoC2_7;%L2=w?tb%1oL0V+=Z`7b=P&lNGY;yVBazXRYu;+cQDKvm*7NCxu&i;zub zAJh#11%?w>E2rf2e~C4+rAb-&$^vsdACs7 z@|Ra!OfVM(ke{vyiqh7puf&Yp6cd6{DptUteYfIRWG3pI+5< zBVBI_xkBAc<(pcb$!Y%dTW(b;B;2pOI-(QCsLv@U-D1XJ z(Gk8Q3l7Ws46Aktuj>|s{$6zA&xCPuXL-kB`CgYMs}4IeyG*P51IDwW?8UNQd+$i~ zlxOPtSi5L|gJcF@DwmJA5Ju8HEJ>o{{upwIpb!f{2(vLNBw`7xMbvcw<^{Fj@E~1( z?w`iIMieunS#>nXlmUcSMU+D3rX28f?s7z;X=se6bo8;5vM|O^(D6{A9*ChnGH!RG zP##3>LDC3jZPE4PH32AxrqPk|yIIrq~`aL-=}`okhNu9aT%q z1b)7iJ)CN=V#Ly84N_r7U^SH2FGdE5FpTO2 z630TF$P>GNMu8`rOytb(lB2};`;P4YNwW1<5d3Q~AX#P0aX}R2b2)`rgkp#zTxcGj zAV^cvFbhP|JgWrq_e`~exr~sIR$6p5V?o4Wym3kQ3HA+;Pr$bQ0(PmADVO%MKL!^q z?zAM8j1l4jrq|5X+V!8S*2Wl@=7*pPgciTVK6kS1Ge zMsd_u6DFK$jTnvVtE;qa+8(1sGBu~n&F%dh(&c(Zs4Fc#A=gG^^%^AyH}1^?|8quj zl@Z47h$){PlELJgYZCIHHL= z{U8O>Tw4x3<1{?$8>k-P<}1y9DmAZP_;(3Y*{Sk^H^A=_iSJ@+s5ktgwTXz_2$~W9>VVZsfwCm@s0sQ zeB50_yu@uS+e7QoPvdCwDz{prjo(AFwR%C?z`EL{1`|coJHQTk^nX=tvs1<0arUOJ z!^`*x&&BvTYmemyZ)2p~{%eYX=JVR?DYr(rNgqRMA5E1PR1Iw=prk=L2ldy3r3Vg@27IZx43+ywyzr-X*p*d@tZV+!U#~$-q=8c zgdSuh#r?b4GhEGNai)ayHQpk>5(%j5c@C1K3(W1pb~HeHpaqijJZa-e6vq_8t-^M^ zBJxq|MqZc?pjXPIH}70a5vt!IUh;l}<>VX<-Qcv^u@5(@@M2CHSe_hD$VG-eiV^V( zj7*9T0?di?P$FaD6oo?)<)QT>Npf6Og!GO^GmPV(Km0!=+dE&bk#SNI+C9RGQ|{~O*VC+tXK3!n`5 zHfl6>lwf_aEVV3`0T!aHNZLsj$paS$=LL(?b!Czaa5bbSuZ6#$_@LK<(7yrrl+80| z{tOFd=|ta2Z`^ssozD9BINn45NxUeCQis?-BKmU*Kt=FY-NJ+)8S1ecuFtN-M?&42 zl2$G>u!iNhAk*HoJ^4v^9#ORYp5t^wDj6|lx~5w45#E5wVqI1JQ~9l?nPp1YINf++ zMAdSif~_ETv@Er(EFBI^@L4BULFW>)NI+ejHFP*T}UhWNN`I)RRS8za? z*@`1>9ZB}An%aT5K=_2iQmfE;GcBVHLF!$`I99o5GO`O%O_zLr9AG18>&^HkG(;=V z%}c!OBQ~?MX(9h~tajX{=x)+!cbM7$YzTlmsPOdp2L-?GoW`@{lY9U3f;OUo*BwRB z8A+nv(br0-SH#VxGy#ZrgnGD(=@;HME;yd46EgWJ`EL%oXc&lFpc@Y}^>G(W>h_v_ zlN!`idhX+OjL+~T?19sroAFVGfa5tX-D49w$1g2g_-T|EpHL6}K_aX4$K=LTvwtlF zL*z}j{f+Uoe7{-px3_5iKPA<_7W=>Izkk)!l9ez2w%vi(?Y;i8AxRNLSOGDzNoqoI zP!1uAl}r=_871(G?y`i&)-7{u=%nxk7CZ_Qh#!|ITec zwQn`33GTUM`;D2POWnkqngqJhJRlM>CTONzTG}>^Q0wUunQyn|TAiHzyX2_%ATx%P z%7gW)%4rA9^)M<_%k@`Y?RbC<29sWU&5;@|9thf2#zf8z12$hRcZ!CSb>kUp=4N#y zl3hE#y6>kkA8VY2`W`g5Ip?2qC_BY$>R`iGQLhz2-S>x(RuWv)SPaGdl^)gGw7tjR zH@;jwk!jIaCgSg_*9iF|a);sRUTq30(8I(obh^|}S~}P4U^BIGYqcz;MPpC~Y@k_m zaw4WG1_vz2GdCAX!$_a%GHK**@IrHSkGoN>)e}>yzUTm52on`hYot7cB=oA-h1u|R ztH$11t?54Qg2L+i33FPFKKRm1aOjKST{l1*(nps`>sv%VqeVMWjl5+Gh+9);hIP8? zA@$?}Sc z3qIRpba+y5yf{R6G(u8Z^vkg0Fu&D-7?1s=QZU`Ub{-!Y`I?AGf1VNuc^L3v>)>i# z{DV9W$)>34wnzAXUiV^ZpYKw>UElrN_5Xj6{r_3| z$X5PK`e5$7>~9Dj7gK5ash(dvs`vwfk}&RD`>04;j62zoXESkFBklYaKm5seyiX(P zqQ-;XxlV*yg?Dhlx%xt!b0N3GHp@(p$A;8|%# zZ5m2KL|{on4nr>2_s9Yh=r5ScQ0;aMF)G$-9-Ca6%wA`Pa)i?NGFA|#Yi?{X-4ZO_ z^}%7%vkzvUHa$-^Y#aA+aiR5sa%S|Ebyn`EV<3Pc?ax_f>@sBZF1S;7y$CXd5t5=WGsTKBk8$OfH4v|0?0I=Yp}7c=WBSCg!{0n)XmiU;lfx)**zZaYqmDJelxk$)nZyx5`x$6R|fz(;u zEje5Dtm|a%zK!!tk3{i9$I2b{vXNFy%Bf{50X!x{98+BsDr_u9i>G5%*sqEX|06J0 z^IY{UcEbj6LDwuMh7cH`H@9sVt1l1#8kEQ(LyT@&+K}(ReE`ux8gb0r6L_#bDUo^P z3Ka2lRo52Hdtl_%+pwVs14=q`{d^L58PsU@AMf(hENumaxM{7iAT5sYmWh@hQCO^ zK&}ijo=`VqZ#a3vE?`7QW0ZREL17ZvDfdqKGD?0D4fg{7v%|Yj&_jcKJAB)>=*RS* zto8p6@k%;&^ZF>hvXm&$PCuEp{uqw3VPG$9VMdW5$w-fy2CNNT>E;>ejBgy-m_6`& z97L1p{%srn@O_JQgFpa_#f(_)eb#YS>o>q3(*uB;uZb605(iqM$=NK{nHY=+X2*G) zO3-_Xh%aG}fHWe*==58zBwp%&`mge<8uq8;xIxOd=P%9EK!34^E9sk|(Zq1QSz-JVeP12Fp)-`F|KY$LPwUE?rku zY@OJ)Z9A!ojfzfeyJ9;zv2EM7ZQB)AR5xGa-tMn^bl)FmoIiVyJ@!~@%{}qXXD&Ns zPnfe5U+&ohKefILu_1mPfLGuapX@btta5C#gPB2cjk5m4T}Nfi+Vfka!Yd(L?-c~5 z#ZK4VeQEXNPc4r$K00Fg>g#_W!YZ)cJ?JTS<&68_$#cZT-ME`}tcwqg3#``3M3UPvn+pi}(VNNx6y zFIMVb6OwYU(2`at$gHba*qrMVUl8xk5z-z~fb@Q3Y_+aXuEKH}L+>eW__!IAd@V}L zkw#s%H0v2k5-=vh$^vPCuAi22Luu3uKTf6fPo?*nvj$9(u)4$6tvF-%IM+3pt*cgs z_?wW}J7VAA{_~!?))?s6{M=KPpVhg4fNuU*|3THp@_(q!b*hdl{fjRVFWtu^1dV(f z6iOux9hi&+UK=|%M*~|aqFK{Urfl!TA}UWY#`w(0P!KMe1Si{8|o))Gy6d7;!JQYhgMYmXl?3FfOM2nQGN@~Ap6(G z3+d_5y@=nkpKAhRqf{qQ~k7Z$v&l&@m7Ppt#FSNzKPZM z8LhihcE6i=<(#87E|Wr~HKvVWhkll4iSK$^mUHaxgy8*K$_Zj;zJ`L$naPj+^3zTi z-3NTaaKnD5FPY-~?Tq6QHnmDDRxu0mh0D|zD~Y=vv_qig5r-cIbCpxlju&8Sya)@{ zsmv6XUSi)@(?PvItkiZEeN*)AE~I_?#+Ja-r8$(XiXei2d@Hi7Rx8+rZZb?ZLa{;@*EHeRQ-YDadz~M*YCM4&F-r;E#M+@CSJMJ0oU|PQ^ z=E!HBJDMQ2TN*Y(Ag(ynAL8%^v;=~q?s4plA_hig&5Z0x_^Oab!T)@6kRN$)qEJ6E zNuQjg|G7iwU(N8pI@_6==0CL;lRh1dQF#wePhmu@hADFd3B5KIH#dx(2A zp~K&;Xw}F_N6CU~0)QpQk7s$a+LcTOj1%=WXI(U=Dv!6 z{#<#-)2+gCyyv=Jw?Ab#PVkxPDeH|sAxyG`|Ys}A$PW4TdBv%zDz z^?lwrxWR<%Vzc8Sgt|?FL6ej_*e&rhqJZ3Y>k=X(^dytycR;XDU16}Pc9Vn0>_@H+ zQ;a`GSMEG64=JRAOg%~L)x*w{2re6DVprNp+FcNra4VdNjiaF0M^*>CdPkt(m150rCue?FVdL0nFL$V%5y6N z%eLr5%YN7D06k5ji5*p4v$UMM)G??Q%RB27IvH7vYr_^3>1D-M66#MN8tWGw>WED} z5AhlsanO=STFYFs)Il_0i)l)f<8qn|$DW7ZXhf5xI;m+7M5-%P63XFQrG9>DMqHc} zsgNU9nR`b}E^mL5=@7<1_R~j@q_2U^3h|+`7YH-?C=vme1C3m`Fe0HC>pjt6f_XMh zy~-i-8R46QNYneL4t@)<0VU7({aUO?aH`z4V2+kxgH5pYD5)wCh75JqQY)jIPN=U6 z+qi8cGiOtXG2tXm;_CfpH9ESCz#i5B(42}rBJJF$jh<1sbpj^8&L;gzGHb8M{of+} zzF^8VgML2O9nxBW7AvdEt90vp+#kZxWf@A)o9f9}vKJy9NDBjBW zSt=Hcs=YWCwnfY1UYx*+msp{g!w0HC<_SM!VL1(I2PE?CS}r(eh?{I)mQixmo5^p# zV?2R!R@3GV6hwTCrfHiK#3Orj>I!GS2kYhk1S;aFBD_}u2v;0HYFq}Iz1Z(I4oca4 zxquja8$+8JW_EagDHf$a1OTk5S97umGSDaj)gH=fLs9>_=XvVj^Xj9a#gLdk=&3tl zfmK9MNnIX9v{?%xdw7568 zNrZ|roYs(vC4pHB5RJ8>)^*OuyNC>x7ad)tB_}3SgQ96+-JT^Qi<`xi=)_=$Skwv~ zdqeT9Pa`LYvCAn&rMa2aCDV(TMI#PA5g#RtV|CWpgDYRA^|55LLN^uNh*gOU>Z=a06qJ;$C9z8;n-Pq=qZnc1zUwJ@t)L;&NN+E5m zRkQ(SeM8=l-aoAKGKD>!@?mWTW&~)uF2PYUJ;tB^my`r9n|Ly~0c%diYzqs9W#FTjy?h&X3TnH zXqA{QI82sdjPO->f=^K^f>N`+B`q9&rN0bOXO79S&a9XX8zund(kW7O76f4dcWhIu zER`XSMSFbSL>b;Rp#`CuGJ&p$s~G|76){d?xSA5wVg##_O0DrmyEYppyBr%fyWbbv zp`K84JwRNP$d-pJ!Qk|(RMr?*!wi1if-9G#0p>>1QXKXWFy)eB3ai)l3601q8!9JC zvU#ZWWDNKq9g6fYs?JQ)Q4C_cgTy3FhgKb8s&m)DdmL5zhNK#8wWg!J*7G7Qhe9VU zha?^AQTDpYcuN!B+#1dE*X{<#!M%zfUQbj=zLE{dW0XeQ7-oIsGY6RbkP2re@Q{}r_$iiH0xU%iN*ST`A)-EH6eaZB$GA#v)cLi z*MpA(3bYk$oBDKAzu^kJoSUsDd|856DApz={3u8sbQV@JnRkp2nC|)m;#T=DvIL-O zI4vh;g7824l}*`_p@MT4+d`JZ2%6NQh=N9bmgJ#q!hK@_<`HQq3}Z8Ij>3%~<*= zcv=!oT#5xmeGI92lqm9sGVE%#X$ls;St|F#u!?5Y7syhx6q#MVRa&lBmmn%$C0QzU z);*ldgwwCmzM3uglr}!Z2G+?& zf%Dpo&mD%2ZcNFiN-Z0f;c_Q;A%f@>26f?{d1kxIJD}LxsQkB47SAdwinfMILZdN3 zfj^HmTzS3Ku5BxY>ANutS8WPQ-G>v4^_Qndy==P3pDm+Xc?>rUHl-4+^%Sp5atOja z2oP}ftw-rqnb}+khR3CrRg^ibi6?QYk1*i^;kQGirQ=uB9Sd1NTfT-Rbv;hqnY4neE5H1YUrjS2m+2&@uXiAo- zrKUX|Ohg7(6F(AoP~tj;NZlV#xsfo-5reuQHB$&EIAhyZk;bL;k9ouDmJNBAun;H& zn;Of1z_Qj`x&M;5X;{s~iGzBQTY^kv-k{ksbE*Dl%Qf%N@hQCfY~iUw!=F-*$cpf2 z3wix|aLBV0b;W@z^%7S{>9Z^T^fLOI68_;l@+Qzaxo`nAI8emTV@rRhEKZ z?*z_{oGdI~R*#<2{bkz$G~^Qef}$*4OYTgtL$e9q!FY7EqxJ2`zk6SQc}M(k(_MaV zSLJnTXw&@djco1~a(vhBl^&w=$fa9{Sru>7g8SHahv$&Bl(D@(Zwxo_3r=;VH|uc5 zi1Ny)J!<(KN-EcQ(xlw%PNwK8U>4$9nVOhj(y0l9X^vP1TA>r_7WtSExIOsz`nDOP zs}d>Vxb2Vo2e5x8p(n~Y5ggAyvib>d)6?)|E@{FIz?G3PVGLf7-;BxaP;c?7ddH$z zA+{~k^V=bZuXafOv!RPsE1GrR3J2TH9uB=Z67gok+u`V#}BR86hB1xl}H4v`F+mRfr zYhortD%@IGfh!JB(NUNSDh+qDz?4ztEgCz&bIG-Wg7w-ua4ChgQR_c+z8dT3<1?uX z*G(DKy_LTl*Ea!%v!RhpCXW1WJO6F`bgS-SB;Xw9#! z<*K}=#wVu9$`Yo|e!z-CPYH!nj7s9dEPr-E`DXUBu0n!xX~&|%#G=BeM?X@shQQMf zMvr2!y7p_gD5-!Lnm|a@z8Of^EKboZsTMk%5VsJEm>VsJ4W7Kv{<|#4f-qDE$D-W>gWT%z-!qXnDHhOvLk=?^a1*|0j z{pW{M0{#1VcR5;F!!fIlLVNh_Gj zbnW(_j?0c2q$EHIi@fSMR{OUKBcLr{Y&$hrM8XhPByyZaXy|dd&{hYQRJ9@Fn%h3p7*VQolBIV@Eq`=y%5BU~3RPa^$a?ixp^cCg z+}Q*X+CW9~TL29@OOng(#OAOd!)e$d%sr}^KBJ-?-X&|4HTmtemxmp?cT3uA?md4% zT8yZ0U;6Rg6JHy3fJae{6TMGS?ZUX6+gGTT{Q{)SI85$5FD{g-eR%O0KMpWPY`4@O zx!hen1*8^E(*}{m^V_?}(b5k3hYo=T+$&M32+B`}81~KKZhY;2H{7O-M@vbCzuX0n zW-&HXeyr1%I3$@ns-V1~Lb@wIpkmx|8I~ob1Of7i6BTNysEwI}=!nU%q7(V_^+d*G z7G;07m(CRTJup!`cdYi93r^+LY+`M*>aMuHJm(A8_O8C#A*$!Xvddgpjx5)?_EB*q zgE8o5O>e~9IiSC@WtZpF{4Bj2J5eZ>uUzY%TgWF7wdDE!fSQIAWCP)V{;HsU3ap?4 znRsiiDbtN7i9hapO;(|Ew>Ip2TZSvK9Z^N21%J?OiA_&eP1{(Pu_=%JjKy|HOardq ze?zK^K zA%sjF64*Wufad%H<) z^|t>e*h+Z1#l=5wHexzt9HNDNXgM=-OPWKd^5p!~%SIl>Fo&7BvNpbf8{NXmH)o{r zO=aBJ;meX1^{O%q;kqdw*5k!Y7%t_30 zy{nGRVc&5qt?dBwLs+^Sfp;f`YVMSB#C>z^a9@fpZ!xb|b-JEz1LBX7ci)V@W+kvQ89KWA0T~Lj$aCcfW#nD5bt&Y_< z-q{4ZXDqVg?|0o)j1%l0^_it0WF*LCn-+)c!2y5yS7aZIN$>0LqNnkujV*YVes(v$ zY@_-!Q;!ZyJ}Bg|G-~w@or&u0RO?vlt5*9~yeoPV_UWrO2J54b4#{D(D>jF(R88u2 zo#B^@iF_%S>{iXSol8jpmsZuJ?+;epg>k=$d`?GSegAVp3n$`GVDvK${N*#L_1`44 z{w0fL{2%)0|E+qgZtjX}itZz^KJt4Y;*8uSK}Ft38+3>j|K(PxIXXR-t4VopXo#9# zt|F{LWr-?34y`$nLBVV_*UEgA6AUI65dYIbqpNq9cl&uLJ0~L}<=ESlOm?Y-S@L*d z<7vt}`)TW#f%Rp$Q}6@3=j$7Tze@_uZO@aMn<|si{?S}~maII`VTjs&?}jQ4_cut9$)PEqMukwoXobzaKx^MV z2fQwl+;LSZ$qy%Tys0oo^K=jOw$!YwCv^ei4NBVauL)tN%=wz9M{uf{IB(BxK|lT*pFkmNK_1tV`nb%jH=a0~VNq2RCKY(rG7jz!-D^k)Ec)yS%17pE#o6&eY+ z^qN(hQT$}5F(=4lgNQhlxj?nB4N6ntUY6(?+R#B?W3hY_a*)hnr4PA|vJ<6p`K3Z5Hy z{{8(|ux~NLUW=!?9Qe&WXMTAkQnLXg(g=I@(VG3{HE13OaUT|DljyWXPs2FE@?`iU z4GQlM&Q=T<4&v@Fe<+TuXiZQT3G~vZ&^POfmI1K2h6t4eD}Gk5XFGpbj1n_g*{qmD6Xy z`6Vv|lLZtLmrnv*{Q%xxtcWVj3K4M%$bdBk_a&ar{{GWyu#ljM;dII;*jP;QH z#+^o-A4np{@|Mz+LphTD0`FTyxYq#wY)*&Ls5o{0z9yg2K+K7ZN>j1>N&;r+Z`vI| zDzG1LJZ+sE?m?>x{5LJx^)g&pGEpY=fQ-4}{x=ru;}FL$inHemOg%|R*ZXPodU}Kh zFEd5#+8rGq$Y<_?k-}r5zgQ3jRV=ooHiF|@z_#D4pKVEmn5CGV(9VKCyG|sT9nc=U zEoT67R`C->KY8Wp-fEcjjFm^;Cg(ls|*ABVHq8clBE(;~K^b+S>6uj70g? z&{XQ5U&!Z$SO7zfP+y^8XBbiu*Cv-yJG|l-oe*!s5$@Lh_KpxYL2sx`B|V=dETN>5K+C+CU~a_3cI8{vbu$TNVdGf15*>D zz@f{zIlorkY>TRh7mKuAlN9A0>N>SV`X)+bEHms=mfYTMWt_AJtz_h+JMmrgH?mZt zm=lfdF`t^J*XLg7v+iS)XZROygK=CS@CvUaJo&w2W!Wb@aa?~Drtf`JV^cCMjngVZ zv&xaIBEo8EYWuML+vxCpjjY^s1-ahXJzAV6hTw%ZIy!FjI}aJ+{rE&u#>rs)vzuxz z+$5z=7W?zH2>Eb32dvgHYZtCAf!=OLY-pb4>Ae79rd68E2LkVPj-|jFeyqtBCCwiW zkB@kO_(3wFq)7qwV}bA=zD!*@UhT`geq}ITo%@O(Z5Y80nEX~;0-8kO{oB6|(4fQh z);73T!>3@{ZobPwRv*W?7m0Ml9GmJBCJd&6E?hdj9lV= z4flNfsc(J*DyPv?RCOx!MSvk(M952PJ-G|JeVxWVjN~SNS6n-_Ge3Q;TGE;EQvZg86%wZ`MB zSMQua(i*R8a75!6$QRO^(o7sGoomb+Y{OMy;m~Oa`;P9Yqo>?bJAhqXxLr7_3g_n>f#UVtxG!^F#1+y@os6x(sg z^28bsQ@8rw%Gxk-stAEPRbv^}5sLe=VMbkc@Jjimqjvmd!3E7+QnL>|(^3!R} zD-l1l7*Amu@j+PWLGHXXaFG0Ct2Q=}5YNUxEQHCAU7gA$sSC<5OGylNnQUa>>l%sM zyu}z6i&({U@x^hln**o6r2s-(C-L50tQvz|zHTqW!ir?w&V23tuYEDJVV#5pE|OJu z7^R!A$iM$YCe?8n67l*J-okwfZ+ZTkGvZ)tVPfR;|3gyFjF)8V zyXXN=!*bpyRg9#~Bg1+UDYCt0 ztp4&?t1X0q>uz;ann$OrZs{5*r`(oNvw=$7O#rD|Wuv*wIi)4b zGtq4%BX+kkagv3F9Id6~-c+1&?zny%w5j&nk9SQfo0k4LhdSU_kWGW7axkfpgR`8* z!?UTG*Zi_baA1^0eda8S|@&F z{)Rad0kiLjB|=}XFJhD(S3ssKlveFFmkN{Vl^_nb!o5M!RC=m)V&v2%e?ZoRC@h3> zJ(?pvToFd`*Zc@HFPL#=otWKwtuuQ_dT-Hr{S%pQX<6dqVJ8;f(o)4~VM_kEQkMR+ zs1SCVi~k>M`u1u2xc}>#D!V&6nOOh-E$O&SzYrjJdZpaDv1!R-QGA141WjQe2s0J~ zQ;AXG)F+K#K8_5HVqRoRM%^EduqOnS(j2)|ctA6Q^=|s_WJYU;Z%5bHp08HPL`YF2 zR)Ad1z{zh`=sDs^&V}J z%$Z$!jd7BY5AkT?j`eqMs%!Gm@T8)4w3GYEX~IwgE~`d|@T{WYHkudy(47brgHXx& zBL1yFG6!!!VOSmDxBpefy2{L_u5yTwja&HA!mYA#wg#bc-m%~8aRR|~AvMnind@zs zy>wkShe5&*un^zvSOdlVu%kHsEo>@puMQ`b1}(|)l~E{5)f7gC=E$fP(FC2=F<^|A zxeIm?{EE!3sO!Gr7e{w)Dx(uU#3WrFZ>ibmKSQ1tY?*-Nh1TDHLe+k*;{Rp!Bmd_m zb#^kh`Y*8l|9Cz2e{;RL%_lg{#^Ar+NH|3z*Zye>!alpt{z;4dFAw^^H!6ING*EFc z_yqhr8d!;%nHX9AKhFQZBGrSzfzYCi%C!(Q5*~hX>)0N`vbhZ@N|i;_972WSx*>LH z87?en(;2_`{_JHF`Sv6Wlps;dCcj+8IJ8ca6`DsOQCMb3n# z3)_w%FuJ3>fjeOOtWyq)ag|PmgQbC-s}KRHG~enBcIwqIiGW8R8jFeBNY9|YswRY5 zjGUxdGgUD26wOpwM#8a!Nuqg68*dG@VM~SbOroL_On0N6QdT9?)NeB3@0FCC?Z|E0 z6TPZj(AsPtwCw>*{eDEE}Gby>0q{*lI+g2e&(YQrsY&uGM{O~}(oM@YWmb*F zA0^rr5~UD^qmNljq$F#ARXRZ1igP`MQx4aS6*MS;Ot(1L5jF2NJ;de!NujUYg$dr# z=TEL_zTj2@>ZZN(NYCeVX2==~=aT)R30gETO{G&GM4XN<+!&W&(WcDP%oL8PyIVUC zs5AvMgh6qr-2?^unB@mXK*Dbil^y-GTC+>&N5HkzXtozVf93m~xOUHn8`HpX=$_v2 z61H;Z1qK9o;>->tb8y%#4H)765W4E>TQ1o0PFj)uTOPEvv&}%(_mG0ISmyhnQV33Z$#&yd{ zc{>8V8XK$3u8}04CmAQ#I@XvtmB*s4t8va?-IY4@CN>;)mLb_4!&P3XSw4pA_NzDb zORn!blT-aHk1%Jpi>T~oGLuh{DB)JIGZ9KOsciWs2N7mM1JWM+lna4vkDL?Q)z_Ct z`!mi0jtr+4*L&N7jk&LodVO#6?_qRGVaucqVB8*us6i3BTa^^EI0x%EREQSXV@f!lak6Wf1cNZ8>*artIJ(ADO*=<-an`3zB4d*oO*8D1K!f z*A@P1bZCNtU=p!742MrAj%&5v%Xp_dSX@4YCw%F|%Dk=u|1BOmo)HsVz)nD5USa zR~??e61sO(;PR)iaxK{M%QM_rIua9C^4ppVS$qCT9j2%?*em?`4Z;4@>I(c%M&#cH z>4}*;ej<4cKkbCAjjDsyKS8rIm90O)Jjgyxj5^venBx&7B!xLmzxW3jhj7sR(^3Fz z84EY|p1NauwXUr;FfZjdaAfh%ivyp+^!jBjJuAaKa!yCq=?T_)R!>16?{~p)FQ3LDoMyG%hL#pR!f@P%*;#90rs_y z@9}@r1BmM-SJ#DeuqCQk=J?ixDSwL*wh|G#us;dd{H}3*-Y7Tv5m=bQJMcH+_S`zVtf;!0kt*(zwJ zs+kedTm!A}cMiM!qv(c$o5K%}Yd0|nOd0iLjus&;s0Acvoi-PFrWm?+q9f^FslxGi z6ywB`QpL$rJzWDg(4)C4+!2cLE}UPCTBLa*_=c#*$b2PWrRN46$y~yST3a2$7hEH= zNjux+wna^AzQ=KEa_5#9Ph=G1{S0#hh1L3hQ`@HrVnCx{!fw_a0N5xV(iPdKZ-HOM za)LdgK}1ww*C_>V7hbQnTzjURJL`S%`6nTHcgS+dB6b_;PY1FsrdE8(2K6FN>37!62j_cBlui{jO^$dPkGHV>pXvW0EiOA zqW`YaSUBWg_v^Y5tPJfWLcLpsA8T zG)!x>pKMpt!lv3&KV!-um= zKCir6`bEL_LCFx4Z5bAFXW$g3Cq`?Q%)3q0r852XI*Der*JNuKUZ`C{cCuu8R8nkt z%pnF>R$uY8L+D!V{s^9>IC+bmt<05h**>49R*#vpM*4i0qRB2uPbg8{{s#9yC;Z18 zD7|4m<9qneQ84uX|J&f-g8a|nFKFt34@Bt{CU`v(SYbbn95Q67*)_Esl_;v291s=9 z+#2F2apZU4Tq=x+?V}CjwD(P=U~d<=mfEFuyPB`Ey82V9G#Sk8H_Ob_RnP3s?)S_3 zr%}Pb?;lt_)Nf>@zX~D~TBr;-LS<1I##8z`;0ZCvI_QbXNh8Iv)$LS=*gHr;}dgb=w5$3k2la1keIm|=7<-JD>)U%=Avl0Vj@+&vxn zt-)`vJxJr88D&!}2^{GPXc^nmRf#}nb$4MMkBA21GzB`-Or`-3lq^O^svO7Vs~FdM zv`NvzyG+0T!P8l_&8gH|pzE{N(gv_tgDU7SWeiI-iHC#0Ai%Ixn4&nt{5y3(GQs)i z&uA;~_0shP$0Wh0VooIeyC|lak__#KVJfxa7*mYmZ22@(<^W}FdKjd*U1CqSjNKW% z*z$5$=t^+;Ui=MoDW~A7;)Mj%ibX1_p4gu>RC}Z_pl`U*{_z@+HN?AF{_W z?M_X@o%w8fgFIJ$fIzBeK=v#*`mtY$HC3tqw7q^GCT!P$I%=2N4FY7j9nG8aIm$c9 zeKTxVKN!UJ{#W)zxW|Q^K!3s;(*7Gbn;e@pQBCDS(I|Y0euK#dSQ_W^)sv5pa%<^o zyu}3d?Lx`)3-n5Sy9r#`I{+t6x%I%G(iewGbvor&I^{lhu-!#}*Q3^itvY(^UWXgvthH52zLy&T+B)Pw;5>4D6>74 zO_EBS)>l!zLTVkX@NDqyN2cXTwsUVao7$HcqV2%t$YzdAC&T)dwzExa3*kt9d(}al zA~M}=%2NVNUjZiO7c>04YH)sRelXJYpWSn^aC$|Ji|E13a^-v2MB!Nc*b+=KY7MCm zqIteKfNkONq}uM;PB?vvgQvfKLPMB8u5+Am=d#>g+o&Ysb>dX9EC8q?D$pJH!MTAqa=DS5$cb+;hEvjwVfF{4;M{5U&^_+r zvZdu_rildI!*|*A$TzJ&apQWV@p{!W`=?t(o0{?9y&vM)V)ycGSlI3`;ps(vf2PUq zX745#`cmT*ra7XECC0gKkpu2eyhFEUb?;4@X7weEnLjXj_F~?OzL1U1L0|s6M+kIhmi%`n5vvDALMagi4`wMc=JV{XiO+^ z?s9i7;GgrRW{Mx)d7rj)?(;|b-`iBNPqdwtt%32se@?w4<^KU&585_kZ=`Wy^oLu9 z?DQAh5z%q;UkP48jgMFHTf#mj?#z|=w= z(q6~17Vn}P)J3M?O)x))%a5+>TFW3No~TgP;f}K$#icBh;rSS+R|}l鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/2 WEEK/SON/gradle/wrapper/gradle-wrapper.properties b/2 WEEK/SON/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..3fa8f862 --- /dev/null +++ b/2 WEEK/SON/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/2 WEEK/SON/gradlew b/2 WEEK/SON/gradlew new file mode 100644 index 00000000..1aa94a42 --- /dev/null +++ b/2 WEEK/SON/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/2 WEEK/SON/gradlew.bat b/2 WEEK/SON/gradlew.bat new file mode 100644 index 00000000..93e3f59f --- /dev/null +++ b/2 WEEK/SON/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/2 WEEK/SON/settings.gradle b/2 WEEK/SON/settings.gradle new file mode 100644 index 00000000..cde098e0 --- /dev/null +++ b/2 WEEK/SON/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'week2' diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/YebinApplication.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/YebinApplication.java new file mode 100644 index 00000000..860e48be --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/YebinApplication.java @@ -0,0 +1,37 @@ +package com.myMission.yebin; + +import com.myMission.yebin.grade.GradeVO; +import com.myMission.yebin.item.ItemDAO; +import com.myMission.yebin.order.Order; +import com.myMission.yebin.users.UserDAO; +import com.myMission.yebin.users.UserVO; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.List; +import java.util.Map; + +@SpringBootApplication +public class YebinApplication { + + public static void main(String[] args) { + SpringApplication.run(YebinApplication.class, args); + + // 회원가입 test + UserDAO dao = new UserDAO(); + dao.saveUser("yebin", GradeVO.VIP); + dao.saveUser("test2",GradeVO.Basic); + List user = dao.findAllUser(); + System.out.println(user); + + ItemDAO itemDAO = new ItemDAO(); + itemDAO.saveItem("A",2000); + itemDAO.saveItem("B",1000); + int price = itemDAO.findItemPriceByItemName("A"); + System.out.println(price); + Order order = new Order(); + order.ItemOrder("test2","A"); + + // git push 되는지 체크 + } +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/grade/GradeVO.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/grade/GradeVO.java new file mode 100644 index 00000000..19ffb5e5 --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/grade/GradeVO.java @@ -0,0 +1,10 @@ +package com.myMission.yebin.grade; + +import lombok.Getter; +import lombok.Setter; + +// 회원 등급 관련 + +public enum GradeVO { + Basic, VIP +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemDAO.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemDAO.java new file mode 100644 index 00000000..e89bdaa4 --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemDAO.java @@ -0,0 +1,23 @@ +package com.myMission.yebin.item; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ItemDAO { + private Map itemList = ItemMap.getInstance(); + + // 상품 데이터 저장 + public void saveItem(String itemName, int itemPrice){ + // itemVO는 필요없는 건가?? + itemList.put(itemName,itemPrice); + } + + // 상품 이름으로 상품 가격 찾기 + public Integer findItemPriceByItemName(String itemName){ + return itemList.get(itemName); + } + +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemMap.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemMap.java new file mode 100644 index 00000000..701149ce --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemMap.java @@ -0,0 +1,14 @@ +package com.myMission.yebin.item; + +import java.util.HashMap; +import java.util.Map; + +public class ItemMap { + private static Map itemList; + public static Map getInstance(){ + if (itemList == null) { + itemList = new HashMap<>(); + } + return itemList; + } +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemVO.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemVO.java new file mode 100644 index 00000000..5ad1e171 --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemVO.java @@ -0,0 +1,20 @@ +package com.myMission.yebin.item; + + +public class ItemVO { + String itemName; + Integer itemPrice; + + public ItemVO(String itemName, int itemPrice){ + this.itemName = itemName; + this.itemPrice = itemPrice; + } + + public String getItemName() { + return itemName; + } + + public Integer getItemPrice() { + return itemPrice; + } +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/order/DiscountPolicy.java new file mode 100644 index 00000000..1c210267 --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/order/DiscountPolicy.java @@ -0,0 +1,17 @@ +package com.myMission.yebin.order; + +import com.myMission.yebin.grade.GradeVO; + +public class DiscountPolicy { + public int setDiscountByGrade(GradeVO grade){ + // VIP 는 1000원 할인 + if (grade.equals(GradeVO.VIP)) { + return 1000; + } + + // 그외는 할인 X + return 0; + } + + +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/order/Order.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/order/Order.java new file mode 100644 index 00000000..340e686e --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/order/Order.java @@ -0,0 +1,27 @@ +package com.myMission.yebin.order; + +import com.myMission.yebin.grade.GradeVO; +import com.myMission.yebin.item.ItemDAO; +import com.myMission.yebin.item.ItemMap; +import com.myMission.yebin.users.UserDAO; +import com.myMission.yebin.users.UserVO; + +import java.util.Map; + +public class Order { + + private Map itemMap = ItemMap.getInstance(); + public void ItemOrder(String userId, String itemName){ + UserDAO userDAO = new UserDAO(); + ItemDAO itemDAO = new ItemDAO(); + DiscountPolicy discount = new DiscountPolicy(); + + // 상품 가격 = (itemDAO에서 상품Name으로 가격을 찾아온것) - (회원Id로 등급 찾아와서 해당하는 할인가격가져온 것) + Integer itemPrice = itemDAO.findItemPriceByItemName(itemName) + - discount.setDiscountByGrade(userDAO.findGradeByUserId(userId)); + + System.out.println(userId + "님이 "+itemName+"을 주문했습니다. 가격 : " +itemPrice); + + } + +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserDAO.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserDAO.java new file mode 100644 index 00000000..75cee758 --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserDAO.java @@ -0,0 +1,37 @@ +package com.myMission.yebin.users; + +import com.myMission.yebin.grade.GradeVO; +import org.apache.catalina.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class UserDAO { + private List userList = UserList.getInstance(); + private static Long userNumber = 1L; + public void saveUser(String userId, GradeVO grade){ + UserVO userVO = new UserVO(userId, userNumber++, grade); + + userList.add(userVO); + } + + public List findAllUser(){ +// Map userInformationMap = new HashMap<>(); +// +// for(UserVO user : userList){ +// userInformationMap.put(user.getUserId(),user.getUserNumber()); +// } + return userList; + } + + public GradeVO findGradeByUserId(String userId){ + Map userGradeMap = new HashMap<>(); + for(UserVO user : userList){ + userGradeMap.put(user.getUserId(),user.getUserGrade()); + } + return userGradeMap.get(userId); + } + +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserList.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserList.java new file mode 100644 index 00000000..1b771c3f --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserList.java @@ -0,0 +1,15 @@ +package com.myMission.yebin.users; + +import java.util.ArrayList; +import java.util.List; + +public class UserList { + private static List userList; + + public static List getInstance(){ + if(userList == null){ + userList = new ArrayList<>(); + } + return userList; + } +} diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserVO.java b/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserVO.java new file mode 100644 index 00000000..d9d08c8a --- /dev/null +++ b/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserVO.java @@ -0,0 +1,34 @@ +package com.myMission.yebin.users; + +// 회원정보 관련 + +import com.myMission.yebin.grade.GradeVO; +import lombok.Getter; + +public class UserVO { + // 회원 아이디 + private String userId; + // 회원 번호 + private Long userNumber; + // 회원 등급 + private GradeVO userGrade; + + // Build Pattern ?? + public UserVO(String userId, Long userNumber, GradeVO userGrade){ + this.userId = userId; + this.userNumber = userNumber; + this.userGrade = userGrade; + } + + public String getUserId() { + return userId; + } + + public Long getUserNumber() { + return userNumber; + } + + public GradeVO getUserGrade() { + return userGrade; + } +} diff --git a/2 WEEK/SON/src/main/resources/application.properties b/2 WEEK/SON/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/2 WEEK/SON/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/2 WEEK/SON/src/test/java/com/myMission/yebin/YebinApplicationTests.java b/2 WEEK/SON/src/test/java/com/myMission/yebin/YebinApplicationTests.java new file mode 100644 index 00000000..ecd342fc --- /dev/null +++ b/2 WEEK/SON/src/test/java/com/myMission/yebin/YebinApplicationTests.java @@ -0,0 +1,13 @@ +package com.myMission.yebin; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class YebinApplicationTests { + + @Test + void contextLoads() { + } + +} From 5c0295fb96fcc84ea9414f7f1f85405003cb3e68 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 14 Nov 2023 11:14:46 +0900 Subject: [PATCH 002/190] =?UTF-8?q?[BE]=20(REFACTOR)=20lastweek=20commit?= =?UTF-8?q?=20=EB=B9=84=EA=B5=90=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지난주에 작성한 코드를 수정, 보완할 것이기에 비교용으로 올려둡니다. --- 2 WEEK/SON/{ => yebin}/.gitignore | 0 2 WEEK/SON/{ => yebin}/build.gradle | 0 .../{ => yebin}/gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 2 WEEK/SON/{ => yebin}/gradlew | 0 2 WEEK/SON/{ => yebin}/gradlew.bat | 0 2 WEEK/SON/{ => yebin}/settings.gradle | 0 .../java/com/myMission/yebin/YebinApplication.java | 0 .../java/com/myMission/yebin/grade/GradeVO.java | 0 .../main/java/com/myMission/yebin/item/ItemDAO.java | 0 .../main/java/com/myMission/yebin/item/ItemMap.java | 0 .../main/java/com/myMission/yebin/item/ItemVO.java | 0 .../com/myMission/yebin/order/DiscountPolicy.java | 0 .../main/java/com/myMission/yebin/order/Order.java | 0 .../java/com/myMission/yebin/users/UserDAO.java | 0 .../java/com/myMission/yebin/users/UserList.java | 0 .../main/java/com/myMission/yebin/users/UserVO.java | 0 .../src/main/resources/application.properties | 0 .../com/myMission/yebin/YebinApplicationTests.java | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename 2 WEEK/SON/{ => yebin}/.gitignore (100%) rename 2 WEEK/SON/{ => yebin}/build.gradle (100%) rename 2 WEEK/SON/{ => yebin}/gradle/wrapper/gradle-wrapper.jar (100%) rename 2 WEEK/SON/{ => yebin}/gradle/wrapper/gradle-wrapper.properties (100%) rename 2 WEEK/SON/{ => yebin}/gradlew (100%) rename 2 WEEK/SON/{ => yebin}/gradlew.bat (100%) rename 2 WEEK/SON/{ => yebin}/settings.gradle (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/YebinApplication.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/grade/GradeVO.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/item/ItemDAO.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/item/ItemMap.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/item/ItemVO.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/order/DiscountPolicy.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/order/Order.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/users/UserDAO.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/users/UserList.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/java/com/myMission/yebin/users/UserVO.java (100%) rename 2 WEEK/SON/{ => yebin}/src/main/resources/application.properties (100%) rename 2 WEEK/SON/{ => yebin}/src/test/java/com/myMission/yebin/YebinApplicationTests.java (100%) diff --git a/2 WEEK/SON/.gitignore b/2 WEEK/SON/yebin/.gitignore similarity index 100% rename from 2 WEEK/SON/.gitignore rename to 2 WEEK/SON/yebin/.gitignore diff --git a/2 WEEK/SON/build.gradle b/2 WEEK/SON/yebin/build.gradle similarity index 100% rename from 2 WEEK/SON/build.gradle rename to 2 WEEK/SON/yebin/build.gradle diff --git a/2 WEEK/SON/gradle/wrapper/gradle-wrapper.jar b/2 WEEK/SON/yebin/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from 2 WEEK/SON/gradle/wrapper/gradle-wrapper.jar rename to 2 WEEK/SON/yebin/gradle/wrapper/gradle-wrapper.jar diff --git a/2 WEEK/SON/gradle/wrapper/gradle-wrapper.properties b/2 WEEK/SON/yebin/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from 2 WEEK/SON/gradle/wrapper/gradle-wrapper.properties rename to 2 WEEK/SON/yebin/gradle/wrapper/gradle-wrapper.properties diff --git a/2 WEEK/SON/gradlew b/2 WEEK/SON/yebin/gradlew similarity index 100% rename from 2 WEEK/SON/gradlew rename to 2 WEEK/SON/yebin/gradlew diff --git a/2 WEEK/SON/gradlew.bat b/2 WEEK/SON/yebin/gradlew.bat similarity index 100% rename from 2 WEEK/SON/gradlew.bat rename to 2 WEEK/SON/yebin/gradlew.bat diff --git a/2 WEEK/SON/settings.gradle b/2 WEEK/SON/yebin/settings.gradle similarity index 100% rename from 2 WEEK/SON/settings.gradle rename to 2 WEEK/SON/yebin/settings.gradle diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/YebinApplication.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/YebinApplication.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/grade/GradeVO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/grade/GradeVO.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/grade/GradeVO.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/grade/GradeVO.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemDAO.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemMap.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemMap.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemMap.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemMap.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemVO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemVO.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/item/ItemVO.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemVO.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/order/DiscountPolicy.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/order/Order.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserDAO.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserList.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserList.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java diff --git a/2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserVO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserVO.java similarity index 100% rename from 2 WEEK/SON/src/main/java/com/myMission/yebin/users/UserVO.java rename to 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserVO.java diff --git a/2 WEEK/SON/src/main/resources/application.properties b/2 WEEK/SON/yebin/src/main/resources/application.properties similarity index 100% rename from 2 WEEK/SON/src/main/resources/application.properties rename to 2 WEEK/SON/yebin/src/main/resources/application.properties diff --git a/2 WEEK/SON/src/test/java/com/myMission/yebin/YebinApplicationTests.java b/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java similarity index 100% rename from 2 WEEK/SON/src/test/java/com/myMission/yebin/YebinApplicationTests.java rename to 2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java From 127d5dc06e4d5524c1a5924b7a0477103d140b9b Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Tue, 14 Nov 2023 11:17:19 +0900 Subject: [PATCH 003/190] [BE] (DOCS) theory summary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 알아야하는 이론을 조사해 요약했습니다. --- 2 WEEK/SON/ANSWER.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/ANSWER.md b/2 WEEK/SON/ANSWER.md index 066e2c2a..74a6d87a 100644 --- a/2 WEEK/SON/ANSWER.md +++ b/2 WEEK/SON/ANSWER.md @@ -44,8 +44,17 @@ https://agilemanifesto.org/iso/ko/manifesto.html
--- ## 주요 이론 요약 - -Please provide a summary of your main theory here. +Object Oriented Programming 설계 원칙
+
+OOP의 5원칙 ( SOLID )
+SRP ( Single Responsibility Prindiple ) : 한 클래스는 하나의 책임만 가져야 한다.
+OCP ( Open-Closed Prindiple ) : 확장에는 열려있으나, 변경에는 닫혀있어야한다.
+LSP ( Liskov's Substitution Principle ) : 하위객체는 상위객체와 교체할 수 있어야한다.
+ISP ( Interface Segregation Principle ) : 관심사에 맞게 인터페이스를 분리해야한다.
+DIP ( Dependency Inversion Principle ) : 구체화에 의존하지말고 추상화에 의존해야한다.
+
+OOP의 4가지 특징
+1. 캡슐화 2. 상속 3. 추상화 4. 다형성 ## ISSUE From 72b31faa51a1f050342e800072d281824d078f7b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 00:04:12 +0900 Subject: [PATCH 004/190] [BE] (REFACTOR) DiscountPolicy class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 할인 정책을 바꾸어주었는데 아직 고정 금액 할인과 정률 할인을 구분하는 방법을 찾지못함 --- .../com/myMission/yebin/YebinApplication.java | 17 ------- .../myMission/yebin/order/DiscountPolicy.java | 6 +-- .../java/com/myMission/yebin/order/Order.java | 12 ++--- .../com/myMission/yebin/users/UserDAO.java | 14 +++--- .../com/myMission/yebin/users/UserList.java | 2 +- .../yebin/YebinApplicationTests.java | 49 ++++++++++++++++++- 6 files changed, 65 insertions(+), 35 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java index 860e48be..2adddf90 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java @@ -16,22 +16,5 @@ public class YebinApplication { public static void main(String[] args) { SpringApplication.run(YebinApplication.class, args); - - // 회원가입 test - UserDAO dao = new UserDAO(); - dao.saveUser("yebin", GradeVO.VIP); - dao.saveUser("test2",GradeVO.Basic); - List user = dao.findAllUser(); - System.out.println(user); - - ItemDAO itemDAO = new ItemDAO(); - itemDAO.saveItem("A",2000); - itemDAO.saveItem("B",1000); - int price = itemDAO.findItemPriceByItemName("A"); - System.out.println(price); - Order order = new Order(); - order.ItemOrder("test2","A"); - - // git push 되는지 체크 } } diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java index 1c210267..71b8727e 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java @@ -3,12 +3,12 @@ import com.myMission.yebin.grade.GradeVO; public class DiscountPolicy { + // 회원 등급에 따른 할인률 세팅 public int setDiscountByGrade(GradeVO grade){ - // VIP 는 1000원 할인 + // VIP 는 10% 할인 if (grade.equals(GradeVO.VIP)) { - return 1000; + return 10; } - // 그외는 할인 X return 0; } diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java index 340e686e..a9cf7c05 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java @@ -10,17 +10,17 @@ public class Order { - private Map itemMap = ItemMap.getInstance(); + Map itemMap = ItemMap.getInstance(); + // 상품 주문 public void ItemOrder(String userId, String itemName){ UserDAO userDAO = new UserDAO(); - ItemDAO itemDAO = new ItemDAO(); DiscountPolicy discount = new DiscountPolicy(); + Integer findItemPrice = itemMap.get(itemName); + GradeVO userGrade = userDAO.findGradeByUserId(userId); - // 상품 가격 = (itemDAO에서 상품Name으로 가격을 찾아온것) - (회원Id로 등급 찾아와서 해당하는 할인가격가져온 것) - Integer itemPrice = itemDAO.findItemPriceByItemName(itemName) - - discount.setDiscountByGrade(userDAO.findGradeByUserId(userId)); + Integer calculatedItemPrice = discount.calculateItemPrice(findItemPrice, userGrade); - System.out.println(userId + "님이 "+itemName+"을 주문했습니다. 가격 : " +itemPrice); + System.out.println(userId + "님이 "+itemName+"을 주문했습니다. 가격 : " +calculatedItemPrice); } diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java index 75cee758..cb28e068 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java @@ -17,13 +17,13 @@ public void saveUser(String userId, GradeVO grade){ userList.add(userVO); } - public List findAllUser(){ -// Map userInformationMap = new HashMap<>(); -// -// for(UserVO user : userList){ -// userInformationMap.put(user.getUserId(),user.getUserNumber()); -// } - return userList; + public Map findAllUser(){ + Map userInformationMap = new HashMap<>(); + + for(UserVO user : userList){ + userInformationMap.put(user.getUserId(),user.getUserNumber()); + } + return userInformationMap; } public GradeVO findGradeByUserId(String userId){ diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java index 1b771c3f..65fec3c3 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -public class UserList { +public class UserList{ private static List userList; public static List getInstance(){ diff --git a/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java b/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java index ecd342fc..09030d00 100644 --- a/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java +++ b/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java @@ -1,13 +1,60 @@ package com.myMission.yebin; +import com.myMission.yebin.grade.GradeVO; +import com.myMission.yebin.item.ItemDAO; +import com.myMission.yebin.order.Order; +import com.myMission.yebin.users.UserDAO; +import com.myMission.yebin.users.UserVO; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; +import java.util.Map; + @SpringBootTest class YebinApplicationTests { @Test - void contextLoads() { + void saveUserTest(){ + UserDAO userDAO = new UserDAO(); + userDAO.saveUser("yebin", GradeVO.VIP); + userDAO.saveUser("test", GradeVO.Basic); + } + + @Test + void findAllUser(){ + UserDAO userDAO = new UserDAO(); + userDAO.saveUser("yebin",GradeVO.Basic); + userDAO.saveUser("test",GradeVO.VIP); + + Map userList = userDAO.findAllUser(); + } + + @Test + void saveItemTest(){ + ItemDAO itemDAO = new ItemDAO(); + itemDAO.saveItem("itemA",1000); + itemDAO.saveItem("itemB",2000); + } + + @Test + void findItemPriceTest(){ + ItemDAO itemDAO = new ItemDAO(); + itemDAO.saveItem("itmeA",1000); + Integer itemPrice = itemDAO.findItemPriceByItemName("itemA"); + } + + @Test + void OrderTest() { + UserDAO userDAO = new UserDAO(); + ItemDAO itemDAO = new ItemDAO(); + + userDAO.saveUser("yebin",GradeVO.VIP); + itemDAO.saveItem("itemA",2000); + + Order order = new Order(); + // main에서 테스트했을땐 할인된 가격으로 1800원이 떴는데 여기서는 왜 2000원 그대로 뜨는지 모르겠어요,, + order.ItemOrder("yebin","itemA"); } } From 763e4ce57f5093188f20d0f4f839feb941501fe9 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 00:05:59 +0900 Subject: [PATCH 005/190] =?UTF-8?q?=EB=AD=94=EA=B0=80=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=90=EB=8B=A4..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 무언가 잘못되었음을 느꼈지만 여기서 더 건들이면 돌이킬수없을것 같아 그대로 커밋합니다.. --- 2 WEEK/SON/ANSWER.md | 13 +++++++++++-- .../com/myMission/yebin/order/DiscountPolicy.java | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/ANSWER.md b/2 WEEK/SON/ANSWER.md index 066e2c2a..74a6d87a 100644 --- a/2 WEEK/SON/ANSWER.md +++ b/2 WEEK/SON/ANSWER.md @@ -44,8 +44,17 @@ https://agilemanifesto.org/iso/ko/manifesto.html
--- ## 주요 이론 요약 - -Please provide a summary of your main theory here. +Object Oriented Programming 설계 원칙
+
+OOP의 5원칙 ( SOLID )
+SRP ( Single Responsibility Prindiple ) : 한 클래스는 하나의 책임만 가져야 한다.
+OCP ( Open-Closed Prindiple ) : 확장에는 열려있으나, 변경에는 닫혀있어야한다.
+LSP ( Liskov's Substitution Principle ) : 하위객체는 상위객체와 교체할 수 있어야한다.
+ISP ( Interface Segregation Principle ) : 관심사에 맞게 인터페이스를 분리해야한다.
+DIP ( Dependency Inversion Principle ) : 구체화에 의존하지말고 추상화에 의존해야한다.
+
+OOP의 4가지 특징
+1. 캡슐화 2. 상속 3. 추상화 4. 다형성 ## ISSUE diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java index 71b8727e..4bed0c91 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java @@ -13,5 +13,10 @@ public int setDiscountByGrade(GradeVO grade){ return 0; } + // 회원 등급에 따른 상품 가격 계산 + public Integer calculateItemPrice(Integer itemPrice, GradeVO grade){ + return itemPrice - itemPrice * (setDiscountByGrade(grade)/100); + } + } From 23bfe1b294cd5a0f76d453891cee18fe580ba91c Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:14:11 +0900 Subject: [PATCH 006/190] =?UTF-8?q?[BE]=20(DOCS)=20=EC=9C=84=EB=B0=98=20?= =?UTF-8?q?=EC=82=AC=EB=A1=80=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 위반 사례를 발견하여 업데이트합니다. --- 2 WEEK/SON/ANSWER.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/2 WEEK/SON/ANSWER.md b/2 WEEK/SON/ANSWER.md index 74a6d87a..af8f34bb 100644 --- a/2 WEEK/SON/ANSWER.md +++ b/2 WEEK/SON/ANSWER.md @@ -58,7 +58,10 @@ OOP의 4가지 특징
## ISSUE -Please enter your issue details here. +DiscountPolicy 클래스 - OCP위반
+setDiscountByGrade(), calculateItemPrice() 메서드가 할인 정책이 바뀌면 클래스를 수정해야하므로 변경에 열려있다고 할 수 있습니다. + +모든 클래스 - DIP위반 ## Solution From bab903a79b5147942fee2ba435ce83e6bd9afaa9 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 18:27:18 +0900 Subject: [PATCH 007/190] =?UTF-8?q?[BE]=20(FEAT)=20UserDAO=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DIP 원칙을 지키기 위해 인터페이스를 만들었습니다. --- .../main/java/com/myMission/yebin/item/ItemDAO.java | 4 +++- .../com/myMission/yebin/item/ItemDAOInterface.java | 6 ++++++ .../main/java/com/myMission/yebin/users/UserDAO.java | 5 ++++- .../com/myMission/yebin/users/UserDAOInterface.java | 11 +++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java index e89bdaa4..1406cff5 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java @@ -6,16 +6,18 @@ import java.util.List; import java.util.Map; -public class ItemDAO { +public class ItemDAO implements ItemDAOInterface{ private Map itemList = ItemMap.getInstance(); // 상품 데이터 저장 + @Override public void saveItem(String itemName, int itemPrice){ // itemVO는 필요없는 건가?? itemList.put(itemName,itemPrice); } // 상품 이름으로 상품 가격 찾기 + @Override public Integer findItemPriceByItemName(String itemName){ return itemList.get(itemName); } diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java new file mode 100644 index 00000000..cb845cf9 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java @@ -0,0 +1,6 @@ +package com.myMission.yebin.item; + +public interface ItemDAOInterface { + public abstract void saveItem(String itemName, int itemPrice); + public abstract Integer findItemPriceByItemName(String itemName); +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java index cb28e068..50016830 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java @@ -8,15 +8,17 @@ import java.util.List; import java.util.Map; -public class UserDAO { +public class UserDAO implements UserDAOInterface{ private List userList = UserList.getInstance(); private static Long userNumber = 1L; + @Override public void saveUser(String userId, GradeVO grade){ UserVO userVO = new UserVO(userId, userNumber++, grade); userList.add(userVO); } + @Override public Map findAllUser(){ Map userInformationMap = new HashMap<>(); @@ -26,6 +28,7 @@ public Map findAllUser(){ return userInformationMap; } + @Override public GradeVO findGradeByUserId(String userId){ Map userGradeMap = new HashMap<>(); for(UserVO user : userList){ diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java new file mode 100644 index 00000000..5c2d2f70 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java @@ -0,0 +1,11 @@ +package com.myMission.yebin.users; + +import com.myMission.yebin.grade.GradeVO; + +import java.util.Map; + +public interface UserDAOInterface { + public abstract void saveUser(String userID, GradeVO grade); + public abstract Map findAllUser(); + public abstract GradeVO findGradeByUserId(String userId); +} From 1284a9cf503ae1665740a0f0030c9f1fb0f787c0 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 18:41:59 +0900 Subject: [PATCH 008/190] =?UTF-8?q?[BE]=20(FEAT)=20=ED=95=A0=EC=9D=B8?= =?UTF-8?q?=EC=A0=95=EC=B1=85=EC=9D=84=20=EA=B5=AC=EB=B6=84=ED=95=A0=20enu?= =?UTF-8?q?m=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 할인 정책을 구분하기 위해 enum을 생성하였습니다. --- .../src/main/java/com/myMission/yebin/order/DiscountHow.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java new file mode 100644 index 00000000..a5bde1be --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java @@ -0,0 +1,5 @@ +package com.myMission.yebin.order; + +public enum DiscountHow { + RATE, FIXED +} From 6dfcff9796901078da5f70c5b01e17f53f04f229 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 18:43:14 +0900 Subject: [PATCH 009/190] =?UTF-8?q?[BE]=20(FEAT)=20DiscountPolicy=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 고정 금액 할인을 위한 메서드 생성 --- .../java/com/myMission/yebin/order/DiscountPolicy.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java index 4bed0c91..bc388c5c 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java @@ -3,6 +3,13 @@ import com.myMission.yebin.grade.GradeVO; public class DiscountPolicy { + + public int discountFixed(GradeVO grade){ + if(grade.equals(GradeVO.VIP)){ + return 1000; + } + return 0; + } // 회원 등급에 따른 할인률 세팅 public int setDiscountByGrade(GradeVO grade){ // VIP 는 10% 할인 From 19536958fd4397f902e74fc81095a0caebdab1e5 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 18:44:21 +0900 Subject: [PATCH 010/190] =?UTF-8?q?[BE]=20(CHORE)=20DiscountPolicy=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=82=B4=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20=EB=AA=A8=ED=98=B8?= =?UTF-8?q?=ED=95=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 정률 할인을 담당하는 메서드의 이름을 구분하기 쉽도록 바꾸어주었습니다. --- .../src/main/java/com/myMission/yebin/order/DiscountPolicy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java index bc388c5c..73c0ab4e 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java @@ -11,7 +11,7 @@ public int discountFixed(GradeVO grade){ return 0; } // 회원 등급에 따른 할인률 세팅 - public int setDiscountByGrade(GradeVO grade){ + public int discountRate(GradeVO grade){ // VIP 는 10% 할인 if (grade.equals(GradeVO.VIP)) { return 10; From 772d1d6761111742b098ae56667e820ecd78526b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 18:45:40 +0900 Subject: [PATCH 011/190] =?UTF-8?q?[BE]=20(REFACTOR)=20DiscountPolicy=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=82=B4=20=ED=95=A0=EC=9D=B8?= =?UTF-8?q?=EB=90=9C=20=EA=B0=80=EA=B2=A9=EC=9D=84=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 할인 정책이 무엇인지 받아와 어떤 정책을 적용하는지 골라내어 상품 가격을 계산하고 반환합니다. --- .../com/myMission/yebin/order/DiscountPolicy.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java index 73c0ab4e..a9b8d2fb 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java @@ -21,8 +21,16 @@ public int discountRate(GradeVO grade){ } // 회원 등급에 따른 상품 가격 계산 - public Integer calculateItemPrice(Integer itemPrice, GradeVO grade){ - return itemPrice - itemPrice * (setDiscountByGrade(grade)/100); + public Integer calculateItemPrice(Integer itemPrice, GradeVO grade, DiscountHow how){ + Integer calculatedItemPrice; + // 고정 금액 할인 + calculatedItemPrice = itemPrice - discountFixed(grade); + + // 정률 할인 + if (how.equals(DiscountHow.RATE)){ + calculatedItemPrice = itemPrice - (itemPrice*discountRate(grade)/100); + } + return calculatedItemPrice; } From d31b7492a5f05f84ce0451024d574ab377964e3e Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 18:46:47 +0900 Subject: [PATCH 012/190] =?UTF-8?q?[BE]=20(REFACTOR)=20Order=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ItemOrder() 메서드를 호출할때마다 객체를 생성해야해서 바깥에 빼주었고, 할인 정책 구분을 위한 인자도 추가해주었습니다. --- .../src/main/java/com/myMission/yebin/order/Order.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java index a9cf7c05..1b8e42a0 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java @@ -9,16 +9,16 @@ import java.util.Map; public class Order { - + UserDAO userDAO; + DiscountPolicy discount; Map itemMap = ItemMap.getInstance(); // 상품 주문 public void ItemOrder(String userId, String itemName){ - UserDAO userDAO = new UserDAO(); - DiscountPolicy discount = new DiscountPolicy(); + Integer findItemPrice = itemMap.get(itemName); GradeVO userGrade = userDAO.findGradeByUserId(userId); - Integer calculatedItemPrice = discount.calculateItemPrice(findItemPrice, userGrade); + Integer calculatedItemPrice = discount.calculateItemPrice(findItemPrice, userGrade, DiscountHow.RATE); System.out.println(userId + "님이 "+itemName+"을 주문했습니다. 가격 : " +calculatedItemPrice); From 79cc781286c61dd4461ba2039ad3cdc02ab55ae2 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 23:16:38 +0900 Subject: [PATCH 013/190] =?UTF-8?q?[BE]=20(perf)=201=20WEEK=20=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [BE] (perf) 1 WEEK 로 교체 1주차 정답 코드로 교체합니다. 1주차 정답 코드를 수정해 커밋하겠습니다. --- 2 WEEK/SON/yebin/build.gradle | 15 ++++- 2 WEEK/SON/yebin/settings.gradle | 2 +- .../com/myMission/yebin/grade/GradeVO.java | 10 ---- .../com/myMission/yebin/item/ItemDAO.java | 25 -------- .../yebin/item/ItemDAOInterface.java | 6 -- .../com/myMission/yebin/item/ItemMap.java | 14 ----- .../java/com/myMission/yebin/item/ItemVO.java | 20 ------- .../myMission/yebin/order/DiscountHow.java | 5 -- .../myMission/yebin/order/DiscountPolicy.java | 37 ------------ .../java/com/myMission/yebin/order/Order.java | 27 --------- .../com/myMission/yebin/users/UserDAO.java | 40 ------------- .../yebin/users/UserDAOInterface.java | 11 ---- .../com/myMission/yebin/users/UserList.java | 15 ----- .../com/myMission/yebin/users/UserVO.java | 34 ----------- .../main/java/com/yebin/yebin/MemberApp.java | 24 ++++++++ .../main/java/com/yebin/yebin/OrderApp.java | 24 ++++++++ .../yebin/YebinApplication.java | 11 +--- .../yebin/yebin/discount/DiscountPolicy.java | 7 +++ .../yebin/discount/FixDiscountPolicy.java | 19 ++++++ .../java/com/yebin/yebin/member/Grade.java | 6 ++ .../java/com/yebin/yebin/member/Member.java | 37 ++++++++++++ .../yebin/yebin/member/MemberRepository.java | 7 +++ .../com/yebin/yebin/member/MemberService.java | 7 +++ .../yebin/yebin/member/MemberServiceImpl.java | 15 +++++ .../yebin/member/MemoryMemberRepository.java | 20 +++++++ .../java/com/yebin/yebin/order/Order.java | 33 ++++++++++ .../com/yebin/yebin/order/OrderService.java | 5 ++ .../yebin/yebin/order/OrderServiceImpl.java | 19 ++++++ .../yebin/YebinApplicationTests.java | 60 ------------------- .../yebin/yebin/YebinApplicationTests.java | 13 ++++ 30 files changed, 251 insertions(+), 317 deletions(-) delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/grade/GradeVO.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemMap.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemVO.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserVO.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java rename 2 WEEK/SON/yebin/src/main/java/com/{myMission => yebin}/yebin/YebinApplication.java (50%) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Grade.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberRepository.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberService.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java delete mode 100644 2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java create mode 100644 2 WEEK/SON/yebin/src/test/java/com/yebin/yebin/YebinApplicationTests.java diff --git a/2 WEEK/SON/yebin/build.gradle b/2 WEEK/SON/yebin/build.gradle index c3c6e5d7..13d739db 100644 --- a/2 WEEK/SON/yebin/build.gradle +++ b/2 WEEK/SON/yebin/build.gradle @@ -4,13 +4,19 @@ plugins { id 'io.spring.dependency-management' version '1.0.15.RELEASE' } -group = 'com.myMission' +group = 'com.yebin' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + repositories { mavenCentral() } @@ -18,10 +24,13 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' +} - // lombok (Getter, Setter등 반복되는 메서드를 Annotation으로 사용) - implementation 'org.projectlombok:lombok' +tasks.named('bootBuildImage') { + builder = 'paketobuildpacks/builder-jammy-base:latest' } tasks.named('test') { diff --git a/2 WEEK/SON/yebin/settings.gradle b/2 WEEK/SON/yebin/settings.gradle index cde098e0..2e756485 100644 --- a/2 WEEK/SON/yebin/settings.gradle +++ b/2 WEEK/SON/yebin/settings.gradle @@ -1 +1 @@ -rootProject.name = 'week2' +rootProject.name = 'yebin' diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/grade/GradeVO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/grade/GradeVO.java deleted file mode 100644 index 19ffb5e5..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/grade/GradeVO.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.myMission.yebin.grade; - -import lombok.Getter; -import lombok.Setter; - -// 회원 등급 관련 - -public enum GradeVO { - Basic, VIP -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java deleted file mode 100644 index 1406cff5..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.myMission.yebin.item; - - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ItemDAO implements ItemDAOInterface{ - private Map itemList = ItemMap.getInstance(); - - // 상품 데이터 저장 - @Override - public void saveItem(String itemName, int itemPrice){ - // itemVO는 필요없는 건가?? - itemList.put(itemName,itemPrice); - } - - // 상품 이름으로 상품 가격 찾기 - @Override - public Integer findItemPriceByItemName(String itemName){ - return itemList.get(itemName); - } - -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java deleted file mode 100644 index cb845cf9..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemDAOInterface.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.myMission.yebin.item; - -public interface ItemDAOInterface { - public abstract void saveItem(String itemName, int itemPrice); - public abstract Integer findItemPriceByItemName(String itemName); -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemMap.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemMap.java deleted file mode 100644 index 701149ce..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemMap.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.myMission.yebin.item; - -import java.util.HashMap; -import java.util.Map; - -public class ItemMap { - private static Map itemList; - public static Map getInstance(){ - if (itemList == null) { - itemList = new HashMap<>(); - } - return itemList; - } -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemVO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemVO.java deleted file mode 100644 index 5ad1e171..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/item/ItemVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.myMission.yebin.item; - - -public class ItemVO { - String itemName; - Integer itemPrice; - - public ItemVO(String itemName, int itemPrice){ - this.itemName = itemName; - this.itemPrice = itemPrice; - } - - public String getItemName() { - return itemName; - } - - public Integer getItemPrice() { - return itemPrice; - } -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java deleted file mode 100644 index a5bde1be..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountHow.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.myMission.yebin.order; - -public enum DiscountHow { - RATE, FIXED -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java deleted file mode 100644 index a9b8d2fb..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/DiscountPolicy.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.myMission.yebin.order; - -import com.myMission.yebin.grade.GradeVO; - -public class DiscountPolicy { - - public int discountFixed(GradeVO grade){ - if(grade.equals(GradeVO.VIP)){ - return 1000; - } - return 0; - } - // 회원 등급에 따른 할인률 세팅 - public int discountRate(GradeVO grade){ - // VIP 는 10% 할인 - if (grade.equals(GradeVO.VIP)) { - return 10; - } - // 그외는 할인 X - return 0; - } - - // 회원 등급에 따른 상품 가격 계산 - public Integer calculateItemPrice(Integer itemPrice, GradeVO grade, DiscountHow how){ - Integer calculatedItemPrice; - // 고정 금액 할인 - calculatedItemPrice = itemPrice - discountFixed(grade); - - // 정률 할인 - if (how.equals(DiscountHow.RATE)){ - calculatedItemPrice = itemPrice - (itemPrice*discountRate(grade)/100); - } - return calculatedItemPrice; - } - - -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java deleted file mode 100644 index 1b8e42a0..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/order/Order.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.myMission.yebin.order; - -import com.myMission.yebin.grade.GradeVO; -import com.myMission.yebin.item.ItemDAO; -import com.myMission.yebin.item.ItemMap; -import com.myMission.yebin.users.UserDAO; -import com.myMission.yebin.users.UserVO; - -import java.util.Map; - -public class Order { - UserDAO userDAO; - DiscountPolicy discount; - Map itemMap = ItemMap.getInstance(); - // 상품 주문 - public void ItemOrder(String userId, String itemName){ - - Integer findItemPrice = itemMap.get(itemName); - GradeVO userGrade = userDAO.findGradeByUserId(userId); - - Integer calculatedItemPrice = discount.calculateItemPrice(findItemPrice, userGrade, DiscountHow.RATE); - - System.out.println(userId + "님이 "+itemName+"을 주문했습니다. 가격 : " +calculatedItemPrice); - - } - -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java deleted file mode 100644 index 50016830..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.myMission.yebin.users; - -import com.myMission.yebin.grade.GradeVO; -import org.apache.catalina.User; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class UserDAO implements UserDAOInterface{ - private List userList = UserList.getInstance(); - private static Long userNumber = 1L; - @Override - public void saveUser(String userId, GradeVO grade){ - UserVO userVO = new UserVO(userId, userNumber++, grade); - - userList.add(userVO); - } - - @Override - public Map findAllUser(){ - Map userInformationMap = new HashMap<>(); - - for(UserVO user : userList){ - userInformationMap.put(user.getUserId(),user.getUserNumber()); - } - return userInformationMap; - } - - @Override - public GradeVO findGradeByUserId(String userId){ - Map userGradeMap = new HashMap<>(); - for(UserVO user : userList){ - userGradeMap.put(user.getUserId(),user.getUserGrade()); - } - return userGradeMap.get(userId); - } - -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java deleted file mode 100644 index 5c2d2f70..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserDAOInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.myMission.yebin.users; - -import com.myMission.yebin.grade.GradeVO; - -import java.util.Map; - -public interface UserDAOInterface { - public abstract void saveUser(String userID, GradeVO grade); - public abstract Map findAllUser(); - public abstract GradeVO findGradeByUserId(String userId); -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java deleted file mode 100644 index 65fec3c3..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserList.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.myMission.yebin.users; - -import java.util.ArrayList; -import java.util.List; - -public class UserList{ - private static List userList; - - public static List getInstance(){ - if(userList == null){ - userList = new ArrayList<>(); - } - return userList; - } -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserVO.java b/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserVO.java deleted file mode 100644 index d9d08c8a..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/users/UserVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.myMission.yebin.users; - -// 회원정보 관련 - -import com.myMission.yebin.grade.GradeVO; -import lombok.Getter; - -public class UserVO { - // 회원 아이디 - private String userId; - // 회원 번호 - private Long userNumber; - // 회원 등급 - private GradeVO userGrade; - - // Build Pattern ?? - public UserVO(String userId, Long userNumber, GradeVO userGrade){ - this.userId = userId; - this.userNumber = userNumber; - this.userGrade = userGrade; - } - - public String getUserId() { - return userId; - } - - public Long getUserNumber() { - return userNumber; - } - - public GradeVO getUserGrade() { - return userGrade; - } -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java new file mode 100644 index 00000000..a91c9960 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java @@ -0,0 +1,24 @@ +package com.yebin.yebin; + +import com.yebin.yebin.member.Grade; +import com.yebin.yebin.member.Member; +import com.yebin.yebin.member.MemberService; +import com.yebin.yebin.member.MemberServiceImpl; + +public class MemberApp { + public static void main(String[] args) { + + MemberService memberService = new MemberServiceImpl(); + + Member member = new Member("memberA", Grade.VIP); + + memberService.join(member); + + Member findMember = memberService.findMember(1L); + + System.out.println("member = " + member.getName()); + System.out.println("findMember = " + findMember.getName()); + + + } +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java new file mode 100644 index 00000000..a36d50bb --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java @@ -0,0 +1,24 @@ +package com.yebin.yebin; + +import com.yebin.yebin.member.Grade; +import com.yebin.yebin.member.Member; +import com.yebin.yebin.member.MemberService; +import com.yebin.yebin.member.MemberServiceImpl; +import com.yebin.yebin.order.Order; +import com.yebin.yebin.order.OrderService; +import com.yebin.yebin.order.OrderServiceImpl; + +public class OrderApp { + public static void main(String[] args) { + MemberService memberService = new MemberServiceImpl(); + OrderService orderService = new OrderServiceImpl(); + + Member member = new Member("memberA", Grade.VIP); + memberService.join(member); + + Order order = orderService.createOrder(member.getId(),"itemA",10000); + + System.out.println("order = " + order); + + } +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/YebinApplication.java similarity index 50% rename from 2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java rename to 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/YebinApplication.java index 2adddf90..c14d586d 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/myMission/yebin/YebinApplication.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/YebinApplication.java @@ -1,20 +1,13 @@ -package com.myMission.yebin; +package com.yebin.yebin; -import com.myMission.yebin.grade.GradeVO; -import com.myMission.yebin.item.ItemDAO; -import com.myMission.yebin.order.Order; -import com.myMission.yebin.users.UserDAO; -import com.myMission.yebin.users.UserVO; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import java.util.List; -import java.util.Map; - @SpringBootApplication public class YebinApplication { public static void main(String[] args) { SpringApplication.run(YebinApplication.class, args); } + } diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java new file mode 100644 index 00000000..d1855e3a --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java @@ -0,0 +1,7 @@ +package com.yebin.yebin.discount; + +import com.yebin.yebin.member.Member; + +public interface DiscountPolicy { + int discount(Member member, int price); +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java new file mode 100644 index 00000000..13448458 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java @@ -0,0 +1,19 @@ +package com.yebin.yebin.discount; + +import com.yebin.yebin.member.Grade; +import com.yebin.yebin.member.Member; + +public class FixDiscountPolicy implements DiscountPolicy{ + private int discountFixAmount = 1000; + + @Override + public int discount(Member member, int price) { + + if (member.getGrade() == Grade.VIP) { + return discountFixAmount; + }else { + return 0; + } + + } +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Grade.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Grade.java new file mode 100644 index 00000000..d35ba28c --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Grade.java @@ -0,0 +1,6 @@ +package com.yebin.yebin.member; + +public enum Grade { + BASIC, + VIP +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java new file mode 100644 index 00000000..fd636bac --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java @@ -0,0 +1,37 @@ +package com.yebin.yebin.member; + +public class Member { + private Long id; + private String name; + private Grade grade; + + public Member( String name, Grade grade) { + this.name = name; + this.grade = grade; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Grade getGrade() { + return grade; + } + + public void setGrade(Grade grade) { + this.grade = grade; + } + +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberRepository.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberRepository.java new file mode 100644 index 00000000..bb51ae85 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberRepository.java @@ -0,0 +1,7 @@ +package com.yebin.yebin.member; + +public interface MemberRepository { + void save(Member member); + + Member findById(Long memberId); +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberService.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberService.java new file mode 100644 index 00000000..49a89ab7 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberService.java @@ -0,0 +1,7 @@ +package com.yebin.yebin.member; + +public interface MemberService { + void join(Member member); + + Member findMember(Long memberId); +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java new file mode 100644 index 00000000..0e894d5e --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java @@ -0,0 +1,15 @@ +package com.yebin.yebin.member; + +public class MemberServiceImpl implements MemberService{ + private final MemberRepository memberRepository = new MemoryMemberRepository(); + + @Override + public void join(Member member) { + memberRepository.save(member); + } + + @Override + public Member findMember(Long memberId) { + return memberRepository.findById(memberId); + } +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java new file mode 100644 index 00000000..a957d7ba --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java @@ -0,0 +1,20 @@ +package com.yebin.yebin.member; + +import java.util.HashMap; +import java.util.Map; + +public class MemoryMemberRepository implements MemberRepository{ + private static Map store = new HashMap<>(); + private static long SEQUENCE = 0L; + + @Override + public void save(Member member) { + member.setId(++SEQUENCE); + store.put(member.getId(),member); + } + + @Override + public Member findById(Long memberId) { + return store.get(memberId); + } +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java new file mode 100644 index 00000000..99e49cfa --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java @@ -0,0 +1,33 @@ +package com.yebin.yebin.order; + +public class Order { + private Long memberId; + private String itemName; + private int itemPrice; + private int discountPrice; + + public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ + this.memberId = memberId; + this.itemName = itemName; + this.itemPrice = itemPrice; + this.discountPrice = discountPrice; + } + + public int calculatePrice(){ + return itemPrice - discountPrice; + } + + public int getDiscountPrice(){ + return discountPrice; + } + + @Override + public String toString() { + return "Order{" + + "memberId=" + memberId + + ", itemName='" + itemName + '\'' + + ", itemPrice=" + itemPrice + + ", discountPrice=" + discountPrice + + '}'; + } +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java new file mode 100644 index 00000000..4802d304 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java @@ -0,0 +1,5 @@ +package com.yebin.yebin.order; + +public interface OrderService { + Order createOrder(Long memberId, String itemName, int itemPrice); +} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java new file mode 100644 index 00000000..ef6ec1ac --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -0,0 +1,19 @@ +package com.yebin.yebin.order; + +import com.yebin.yebin.discount.DiscountPolicy; +import com.yebin.yebin.discount.FixDiscountPolicy; +import com.yebin.yebin.member.Member; +import com.yebin.yebin.member.MemberRepository; +import com.yebin.yebin.member.MemoryMemberRepository; + +public class OrderServiceImpl implements OrderService{ + private final MemberRepository memberRepository = new MemoryMemberRepository(); + private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); + + @Override + public Order createOrder(Long memberId, String itemName, int itemPrice) { + Member member = memberRepository.findById(memberId); + int discountPrice = discountPolicy.discount(member,itemPrice); + return new Order(memberId, itemName, itemPrice, discountPrice); + } +} diff --git a/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java b/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java deleted file mode 100644 index 09030d00..00000000 --- a/2 WEEK/SON/yebin/src/test/java/com/myMission/yebin/YebinApplicationTests.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.myMission.yebin; - -import com.myMission.yebin.grade.GradeVO; -import com.myMission.yebin.item.ItemDAO; -import com.myMission.yebin.order.Order; -import com.myMission.yebin.users.UserDAO; -import com.myMission.yebin.users.UserVO; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; -import java.util.Map; - -@SpringBootTest -class YebinApplicationTests { - - @Test - void saveUserTest(){ - UserDAO userDAO = new UserDAO(); - userDAO.saveUser("yebin", GradeVO.VIP); - userDAO.saveUser("test", GradeVO.Basic); - } - - @Test - void findAllUser(){ - UserDAO userDAO = new UserDAO(); - userDAO.saveUser("yebin",GradeVO.Basic); - userDAO.saveUser("test",GradeVO.VIP); - - Map userList = userDAO.findAllUser(); - } - - @Test - void saveItemTest(){ - ItemDAO itemDAO = new ItemDAO(); - itemDAO.saveItem("itemA",1000); - itemDAO.saveItem("itemB",2000); - } - - @Test - void findItemPriceTest(){ - ItemDAO itemDAO = new ItemDAO(); - itemDAO.saveItem("itmeA",1000); - Integer itemPrice = itemDAO.findItemPriceByItemName("itemA"); - } - - @Test - void OrderTest() { - UserDAO userDAO = new UserDAO(); - ItemDAO itemDAO = new ItemDAO(); - - userDAO.saveUser("yebin",GradeVO.VIP); - itemDAO.saveItem("itemA",2000); - - Order order = new Order(); - // main에서 테스트했을땐 할인된 가격으로 1800원이 떴는데 여기서는 왜 2000원 그대로 뜨는지 모르겠어요,, - order.ItemOrder("yebin","itemA"); - } - -} diff --git a/2 WEEK/SON/yebin/src/test/java/com/yebin/yebin/YebinApplicationTests.java b/2 WEEK/SON/yebin/src/test/java/com/yebin/yebin/YebinApplicationTests.java new file mode 100644 index 00000000..99fb928e --- /dev/null +++ b/2 WEEK/SON/yebin/src/test/java/com/yebin/yebin/YebinApplicationTests.java @@ -0,0 +1,13 @@ +package com.yebin.yebin; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class YebinApplicationTests { + + @Test + void contextLoads() { + } + +} From f87cd7f3cfa215a7e7805c5bc17433fb09ed84da Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 23:24:53 +0900 Subject: [PATCH 014/190] =?UTF-8?q?[=20BE=20]=20(feat)=20RateDiscountPolic?= =?UTF-8?q?y=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) RateDiscountPolicy 클래스 생성 정률 할인 정책을 위한 클래스를 생성했습니다. 할인율을 변수에 담고 if 문으로 걸러내어 VIP이면 10%를 할인할 수 있도록 만들었습니다. --- .../yebin/yebin/discount/RateDiscountPolicy.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java new file mode 100644 index 00000000..32966602 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java @@ -0,0 +1,16 @@ +package com.yebin.yebin.discount; + +import com.yebin.yebin.member.Grade; +import com.yebin.yebin.member.Member; + +public class RateDiscountPolicy implements DiscountPolicy{ + private int discountRate = 10; + @Override + public int discount(Member member, int price) { + if (member.getGrade() == Grade.VIP){ + return discountRate; + } + + return 0; + } +} From 656f5fe2af0fec6405904477bf550b7750129d7e Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 15 Nov 2023 23:59:10 +0900 Subject: [PATCH 015/190] =?UTF-8?q?[=20BE=20]=20(feat)=20CalculatePrice=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) CalculatePrice 인터페이스 생성 고정 금액 할인과 정률 할인 정책중 후에 바뀔수 있으므로 인터페이스를 만들어 클래스를 따로 빼내어 만들어주기 위해 상속받을 인터페이스를 생성했습니다. --- .../src/main/java/com/yebin/yebin/order/CalculatePrice.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java new file mode 100644 index 00000000..992e4427 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java @@ -0,0 +1,5 @@ +package com.yebin.yebin.order; + +public interface CalculatePrice { + int calculatePrice(int itemPrice, int discount); +} From 02abb3cf0315206a3a53a83de52e3b9dfd065ef8 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 00:11:34 +0900 Subject: [PATCH 016/190] =?UTF-8?q?[=20BE=20]=20(feat)=20CalculatePriceFix?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) CalculatePriceFix 클래스 생성 고정 금액 할인 정책으로 바꿀 시 클래스만 바꾸어주도록 설계했습니다. --- .../java/com/yebin/yebin/order/CalculatePriceFix.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java new file mode 100644 index 00000000..4ba60908 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java @@ -0,0 +1,8 @@ +package com.yebin.yebin.order; + +public class CalculatePriceFix implements CalculatePrice{ + @Override + public int calculatePrice(int itemPrice, int discount) { + return itemPrice - discount; + } +} From 08c63b185de270b594ca017e9e441d12f8eb02d3 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 00:13:17 +0900 Subject: [PATCH 017/190] =?UTF-8?q?[=20BE=20]=20(feat)=20CalculatePriceRat?= =?UTF-8?q?e=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) CalculatePriceRate 클래스 생성 정률 할인 정책으로 바꿀 시 클래스만 바꾸어주도록 설계했습니다. --- .../java/com/yebin/yebin/order/CalculatePriceRate.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java new file mode 100644 index 00000000..7460843a --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java @@ -0,0 +1,8 @@ +package com.yebin.yebin.order; + +public class CalculatePriceRate implements CalculatePrice{ + @Override + public int calculatePrice(int itemPrice, int discount) { + return itemPrice - itemPrice * (discount / 100) ; + } +} From aa6f0da3c4b433be64d4577a33b0bb63840c1111 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 00:25:51 +0900 Subject: [PATCH 018/190] =?UTF-8?q?[=20BE=20]=20(pref)=20Order=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (pref) Order 클래스 수정 할인 정책의 변화에 따라 계산 법이 달라지므로 클래스만 바꾸어주어 계산하고 반환하도록 수정했습니다. --- .../SON/yebin/src/main/java/com/yebin/yebin/order/Order.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java index 99e49cfa..194cf7ba 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java @@ -6,6 +6,8 @@ public class Order { private int itemPrice; private int discountPrice; + private final CalculatePrice calculatePrice= new CalculatePriceRate(); + public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ this.memberId = memberId; this.itemName = itemName; @@ -14,7 +16,7 @@ public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ } public int calculatePrice(){ - return itemPrice - discountPrice; + return calculatePrice.calculatePrice(itemPrice, discountPrice); } public int getDiscountPrice(){ From d51462f01a783780bb952a69713339da672eadfe Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Thu, 16 Nov 2023 00:35:39 +0900 Subject: [PATCH 019/190] =?UTF-8?q?[=20BE=20]=20(docs)=20=EC=9C=84?= =?UTF-8?q?=EB=B0=98=20=EC=82=AC=EB=A1=80=EB=A5=BC=20=EC=B0=BE=EC=95=84?= =?UTF-8?q?=EC=84=9C=20=ED=95=B4=EA=B2=B0=EC=B1=85=20=EC=A0=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (docs) 위반 사례를 찾아서 해결책 제시 Order 클래스의 위반 사례 - OCP 위반을 찾아, 정률 할인와 고정 금액 할인 계산법을 따로 클래스로 빼내는 것으로 해결책을 제시했습니다. --- 2 WEEK/SON/ANSWER.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/2 WEEK/SON/ANSWER.md b/2 WEEK/SON/ANSWER.md index af8f34bb..d9bf5580 100644 --- a/2 WEEK/SON/ANSWER.md +++ b/2 WEEK/SON/ANSWER.md @@ -58,14 +58,20 @@ OOP의 4가지 특징
## ISSUE -DiscountPolicy 클래스 - OCP위반
-setDiscountByGrade(), calculateItemPrice() 메서드가 할인 정책이 바뀌면 클래스를 수정해야하므로 변경에 열려있다고 할 수 있습니다. - -모든 클래스 - DIP위반 - +SRP 위반 ---
+
+OCP 위반 ---
+ Order 클래스 - calculatedPrice() 메서드에서 아이템 가격을 바로 계산하는 것은 후에 할인 정책이 바뀌면 코드를 수정해야하므로 OCP 위반입니다.
+LSP 위반 ---
+
+ISP 위반 ---
+
+DIP 위반 ---
+
## Solution -Please describe your solution in detail here. +OCP 위반 ---
+Order 클래스 - calculatedPrice() 메서드에서 계산을 하기보단, 정률 할인 정책을 적용한 계산 클래스와 고정 금액 할인 정책을 적용한 클래스를 생성하여 계산하도록 만들어줍니다. ## About From b81c32aed6709e73b763a201e7c8966f3c4592a4 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 13:00:38 +0900 Subject: [PATCH 020/190] =?UTF-8?q?[=20BE=20]=20(pref)=20Order=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EB=B3=80=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (pref) Order 클래스의 변수 이름 수정 변수이름과 메서드 이름이 겹쳐서 변수이름을 변경하였습니다. --- .../SON/yebin/src/main/java/com/yebin/yebin/order/Order.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java index 194cf7ba..ed6648c6 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java @@ -6,7 +6,7 @@ public class Order { private int itemPrice; private int discountPrice; - private final CalculatePrice calculatePrice= new CalculatePriceRate(); + private final CalculatePrice calculatedPrice= new CalculatePriceRate(); public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ this.memberId = memberId; @@ -16,7 +16,7 @@ public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ } public int calculatePrice(){ - return calculatePrice.calculatePrice(itemPrice, discountPrice); + return calculatedPrice.calculatePrice(itemPrice, discountPrice); } public int getDiscountPrice(){ From e97d94694cc3fef89a17ea7af13df37ae6a6a924 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 13:01:51 +0900 Subject: [PATCH 021/190] =?UTF-8?q?[=20BE=20]=20(pref)=20OrderService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=ED=95=A0=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (pref) OrderService 클래스의 할인 정책 변경 고정 금액 할인에서 정률 할인으로 바뀌었으므로 적용하는 메서드 또한, 바꾸어주었습니다. --- .../src/main/java/com/yebin/yebin/order/OrderServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index ef6ec1ac..946d4458 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -2,13 +2,14 @@ import com.yebin.yebin.discount.DiscountPolicy; import com.yebin.yebin.discount.FixDiscountPolicy; +import com.yebin.yebin.discount.RateDiscountPolicy; import com.yebin.yebin.member.Member; import com.yebin.yebin.member.MemberRepository; import com.yebin.yebin.member.MemoryMemberRepository; public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository = new MemoryMemberRepository(); - private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); + private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { From 291611e895432eafb5ae19e303701a5b4324bc54 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 13:35:54 +0900 Subject: [PATCH 022/190] =?UTF-8?q?[=20BE=20]=20(perf)=20RateDiscountPolic?= =?UTF-8?q?y=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) RateDiscountPolicy 클래스 수정 할인율을 반환하는 것이 아닌, 할인된 금액을 반환하는 것이 맞다고 판단되어 수정하였습니다. --- .../main/java/com/yebin/yebin/discount/RateDiscountPolicy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java index 32966602..b32fc0b4 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java @@ -8,7 +8,7 @@ public class RateDiscountPolicy implements DiscountPolicy{ @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP){ - return discountRate; + return price * (discountRate/100); } return 0; From bc4271e9bff3aa298e5579ab52317a3106e9c2c5 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 13:45:44 +0900 Subject: [PATCH 023/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Order=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Order 클래스 수정 DiscountPolicy 클래스에서 할인한 가격을 반환하도록 수정을 하여 상품가격계산 메서드를 상품가격-할인한 가격 으로 계산하는 방식으로 수정하였습니다. --- .../SON/yebin/src/main/java/com/yebin/yebin/order/Order.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java index ed6648c6..99e49cfa 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java @@ -6,8 +6,6 @@ public class Order { private int itemPrice; private int discountPrice; - private final CalculatePrice calculatedPrice= new CalculatePriceRate(); - public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ this.memberId = memberId; this.itemName = itemName; @@ -16,7 +14,7 @@ public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ } public int calculatePrice(){ - return calculatedPrice.calculatePrice(itemPrice, discountPrice); + return itemPrice - discountPrice; } public int getDiscountPrice(){ From 4c5422e30f51300934e14dd12a8ed33c9568a2c0 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 13:58:31 +0900 Subject: [PATCH 024/190] =?UTF-8?q?[=20BE=20]=20(perf)=20=ED=95=A0?= =?UTF-8?q?=EC=9D=B8=EC=9C=A8=20=EA=B4=80=EB=A0=A8=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=9E=90=EB=A3=8C=ED=98=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) 할인율 관련 모든 자료형 수정 할인율 계산할때 소수점이들어가는데, int 자료형을 쓰니 0이 반환이 되어 float 형으로 바꾸어주었습니다. --- .../java/com/yebin/yebin/discount/DiscountPolicy.java | 2 +- .../java/com/yebin/yebin/discount/FixDiscountPolicy.java | 2 +- .../java/com/yebin/yebin/discount/RateDiscountPolicy.java | 4 ++-- .../yebin/src/main/java/com/yebin/yebin/order/Order.java | 8 ++++---- .../main/java/com/yebin/yebin/order/OrderServiceImpl.java | 3 ++- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java index d1855e3a..ed10ed1b 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/DiscountPolicy.java @@ -3,5 +3,5 @@ import com.yebin.yebin.member.Member; public interface DiscountPolicy { - int discount(Member member, int price); + float discount(Member member, int price); } diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java index 13448458..5c2d3118 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/FixDiscountPolicy.java @@ -7,7 +7,7 @@ public class FixDiscountPolicy implements DiscountPolicy{ private int discountFixAmount = 1000; @Override - public int discount(Member member, int price) { + public float discount(Member member, int price) { if (member.getGrade() == Grade.VIP) { return discountFixAmount; diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java index b32fc0b4..7af0eb94 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java @@ -4,9 +4,9 @@ import com.yebin.yebin.member.Member; public class RateDiscountPolicy implements DiscountPolicy{ - private int discountRate = 10; + private float discountRate = 10; @Override - public int discount(Member member, int price) { + public float discount(Member member, int price) { if (member.getGrade() == Grade.VIP){ return price * (discountRate/100); } diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java index 99e49cfa..3037f5be 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java @@ -4,20 +4,20 @@ public class Order { private Long memberId; private String itemName; private int itemPrice; - private int discountPrice; + private float discountPrice; - public Order(Long memberId, String itemName, int itemPrice, int discountPrice){ + public Order(Long memberId, String itemName, int itemPrice, float discountPrice){ this.memberId = memberId; this.itemName = itemName; this.itemPrice = itemPrice; this.discountPrice = discountPrice; } - public int calculatePrice(){ + public float calculatePrice(){ return itemPrice - discountPrice; } - public int getDiscountPrice(){ + public float getDiscountPrice(){ return discountPrice; } diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index 946d4458..061f9847 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -14,7 +14,8 @@ public class OrderServiceImpl implements OrderService{ @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); - int discountPrice = discountPolicy.discount(member,itemPrice); + float discountPrice = discountPolicy.discount(member,itemPrice); + System.out.println("discountPrice ===>" + discountPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } } From 4b03063d978fea88404ddfa5edf210a8ae215d55 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 14:16:29 +0900 Subject: [PATCH 025/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Order=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Order 클래스 수정 calculatePrice() 메서드는 SRP 위반이라 생각되어 빼주었습니다. --- .../SON/yebin/src/main/java/com/yebin/yebin/order/Order.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java index 3037f5be..735931ef 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/Order.java @@ -13,10 +13,6 @@ public Order(Long memberId, String itemName, int itemPrice, float discountPrice) this.discountPrice = discountPrice; } - public float calculatePrice(){ - return itemPrice - discountPrice; - } - public float getDiscountPrice(){ return discountPrice; } From 75515eb3be664300372c587d1e6b3cf7be16f578 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 14:17:28 +0900 Subject: [PATCH 026/190] =?UTF-8?q?[=20BE=20]=20(perf)=20OrderService=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) OrderService 인터페이스 수정 Order 클래스에 있던 calculatePrice() 메서드를 빼와 서비스에 넣어주었습니다. --- .../yebin/src/main/java/com/yebin/yebin/order/OrderService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java index 4802d304..bd7ebbb5 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderService.java @@ -2,4 +2,5 @@ public interface OrderService { Order createOrder(Long memberId, String itemName, int itemPrice); + float calculatePrice(int itemPrice, float discountPrice); } From 93a208fcc564ab266756775df36444ec4ad37ddd Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 16 Nov 2023 14:18:57 +0900 Subject: [PATCH 027/190] =?UTF-8?q?[=20BE=20]=20(perf)=20OrderServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) OrderServiceImpl 클래스 수정 인터페이스에 calculatedPrice() 메서드를 추가해주어 구현해주었습니다. --- .../main/java/com/yebin/yebin/order/OrderServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index 061f9847..c58eb420 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -15,7 +15,11 @@ public class OrderServiceImpl implements OrderService{ public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); float discountPrice = discountPolicy.discount(member,itemPrice); - System.out.println("discountPrice ===>" + discountPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } + + @Override + public float calculatePrice(int itemPrice, float discountPrice) { + return itemPrice - discountPrice; + } } From 8aa5c275f822bbc06470412db0f86e45bd568433 Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Thu, 16 Nov 2023 14:21:47 +0900 Subject: [PATCH 028/190] =?UTF-8?q?[=20BE=20]=20(docs)=20Order=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=9C=84=EB=B0=98=20=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (docs) Order 클래스의 위반 사항 수정 Order 클래스가 OCP 위반이 아닌 SRP 위반으로 생각되어 수정하였습니다. --- 2 WEEK/SON/ANSWER.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2 WEEK/SON/ANSWER.md b/2 WEEK/SON/ANSWER.md index d9bf5580..caa75352 100644 --- a/2 WEEK/SON/ANSWER.md +++ b/2 WEEK/SON/ANSWER.md @@ -59,9 +59,9 @@ OOP의 4가지 특징
## ISSUE SRP 위반 ---
-
+ Order 클래스 - calculatedPrice() 메서드가 Order 클래스내에 있으면 Order 클래스가 여러개의 책임을 갖으므로 SRP위반이라 생각됩니다.
OCP 위반 ---
- Order 클래스 - calculatedPrice() 메서드에서 아이템 가격을 바로 계산하는 것은 후에 할인 정책이 바뀌면 코드를 수정해야하므로 OCP 위반입니다.
+
LSP 위반 ---

ISP 위반 ---
@@ -71,7 +71,7 @@ DIP 위반 ---
## Solution OCP 위반 ---
-Order 클래스 - calculatedPrice() 메서드에서 계산을 하기보단, 정률 할인 정책을 적용한 계산 클래스와 고정 금액 할인 정책을 적용한 클래스를 생성하여 계산하도록 만들어줍니다. +Order 클래스 - calculatedPrice()를 Order 클래스에서 빼내어 OrderService 클래스로 옮겨 책임을 한가지만 갖도록 해줍니다. ## About From ce77f20c023fdae88cabb500df9158897e4b305a Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:55:02 +0900 Subject: [PATCH 029/190] =?UTF-8?q?[=20BE=20]=20(docs)=20OCP=20=EC=9C=84?= =?UTF-8?q?=EB=B0=98=EC=82=AC=EB=A1=80=20=EB=B0=9C=EA=B2=AC,=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=EC=B1=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (docs) OCP 위반사례 발견, 해결책 추가 OCP 위반이라 생각되는 사례를 발견하여 해결책을 추가하였습니다. --- 2 WEEK/SON/ANSWER.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/ANSWER.md b/2 WEEK/SON/ANSWER.md index caa75352..1cf0c1b1 100644 --- a/2 WEEK/SON/ANSWER.md +++ b/2 WEEK/SON/ANSWER.md @@ -61,7 +61,8 @@ OOP의 4가지 특징
SRP 위반 ---
Order 클래스 - calculatedPrice() 메서드가 Order 클래스내에 있으면 Order 클래스가 여러개의 책임을 갖으므로 SRP위반이라 생각됩니다.
OCP 위반 ---
-
+ OrderServiceImpl 클래스 - memeberRepository와 discountPolicy를 직접 생성해주면 나중에 정책이 바뀌었을 때, + 이러한 변수를 선언한 코드들을 모두 수정해주어야하므로 OCP위반이라 생각됩니다.
LSP 위반 ---

ISP 위반 ---
@@ -70,8 +71,10 @@ DIP 위반 ---

## Solution +SRP 위반 ---
+ Order 클래스 - calculatedPrice()를 Order 클래스에서 빼내어 OrderService 클래스로 옮겨 책임을 한가지만 갖도록 해줍니다.
OCP 위반 ---
-Order 클래스 - calculatedPrice()를 Order 클래스에서 빼내어 OrderService 클래스로 옮겨 책임을 한가지만 갖도록 해줍니다. + OrderServiceImplt 클래스 - 의존성을 주입해주는 클래스를 새로 만들어 정책이 바뀌었을 시, 그 클래스만 수정하면 되도록 만들어줍니다.
## About From 58b4688b56dc31aa1945a9ecf5af04015c74079c Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 18 Nov 2023 14:05:26 +0900 Subject: [PATCH 030/190] =?UTF-8?q?[=20BE=20]=20(perf)=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=EC=97=86=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) 필요없는 클래스 삭제 CalculatePrcie 클래스가 필요없어서 삭제합니다. --- .../main/java/com/yebin/yebin/order/CalculatePrice.java | 5 ----- .../java/com/yebin/yebin/order/CalculatePriceFix.java | 8 -------- .../java/com/yebin/yebin/order/CalculatePriceRate.java | 8 -------- 3 files changed, 21 deletions(-) delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java delete mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java deleted file mode 100644 index 992e4427..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePrice.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.yebin.yebin.order; - -public interface CalculatePrice { - int calculatePrice(int itemPrice, int discount); -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java deleted file mode 100644 index 4ba60908..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceFix.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.yebin.yebin.order; - -public class CalculatePriceFix implements CalculatePrice{ - @Override - public int calculatePrice(int itemPrice, int discount) { - return itemPrice - discount; - } -} diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java deleted file mode 100644 index 7460843a..00000000 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/CalculatePriceRate.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.yebin.yebin.order; - -public class CalculatePriceRate implements CalculatePrice{ - @Override - public int calculatePrice(int itemPrice, int discount) { - return itemPrice - itemPrice * (discount / 100) ; - } -} From 8093aae45a3e5c40b77cb267d6753a4a7934eefe Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 18 Nov 2023 14:07:34 +0900 Subject: [PATCH 031/190] =?UTF-8?q?[=20BE=20]=20(perf)=20DependencyInjecti?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) DependencyInjection 클래스 생성 OCP 위반을 해결하기위해 의존성을 주입해주는 클래스를 따로 만들어주었습니다. --- .../yebin/dependency/DependencyInjection.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java new file mode 100644 index 00000000..ed21d684 --- /dev/null +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java @@ -0,0 +1,18 @@ +package com.yebin.yebin.dependency; + +import com.yebin.yebin.discount.DiscountPolicy; +import com.yebin.yebin.discount.RateDiscountPolicy; +import com.yebin.yebin.member.MemberRepository; +import com.yebin.yebin.member.MemoryMemberRepository; + +public class DependencyInjection { + public DiscountPolicy discountPolicy(){ + // 할인 정책이 바뀌면 이 부분만 바꿔주면 된다. + return new RateDiscountPolicy(); + } + + public MemberRepository memberRepository(){ + // DB 연결하면 이 부분만 바꿔주면 된다. + return new MemoryMemberRepository(); + } +} From b34fc36ba25224cab164194db69142e4c427075b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 18 Nov 2023 14:08:49 +0900 Subject: [PATCH 032/190] =?UTF-8?q?[=20BE=20]=20(perf)=20OrderServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) OrderServiceImpl 클래스 수정 의존성을 주입해주는 클래스를 따로 만들어 그 클래스의 메서드를 사용하도록 수정하였습니다. --- .../main/java/com/yebin/yebin/order/OrderServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index c58eb420..df721b71 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -1,5 +1,6 @@ package com.yebin.yebin.order; +import com.yebin.yebin.dependency.DependencyInjection; import com.yebin.yebin.discount.DiscountPolicy; import com.yebin.yebin.discount.FixDiscountPolicy; import com.yebin.yebin.discount.RateDiscountPolicy; @@ -8,8 +9,9 @@ import com.yebin.yebin.member.MemoryMemberRepository; public class OrderServiceImpl implements OrderService{ - private final MemberRepository memberRepository = new MemoryMemberRepository(); - private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); + private final DependencyInjection dependencyInjection = new DependencyInjection(); + private final MemberRepository memberRepository = dependencyInjection.memberRepository(); + private final DiscountPolicy discountPolicy = dependencyInjection.discountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { From 988039d50050b5cc753ab7262461698f8f000137 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 18 Nov 2023 14:10:47 +0900 Subject: [PATCH 033/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemberServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemberServiceImpl 클래스 수정 의존성 주입을 해주는 클래스를 따로 만들어 그 클래스의 메서드를 사용하도록 수정하였습니다. --- .../main/java/com/yebin/yebin/member/MemberServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java index 0e894d5e..205d2e09 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java @@ -1,7 +1,10 @@ package com.yebin.yebin.member; +import com.yebin.yebin.dependency.DependencyInjection; + public class MemberServiceImpl implements MemberService{ - private final MemberRepository memberRepository = new MemoryMemberRepository(); + private final DependencyInjection dependencyInjection = new DependencyInjection(); + private final MemberRepository memberRepository = dependencyInjection.memberRepository(); @Override public void join(Member member) { From 6fab83d5b315543d0fd5b28c9d29dd451884a6b0 Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:27:47 +0900 Subject: [PATCH 034/190] =?UTF-8?q?[=20BE=20]=20(docs)=201=20=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20HOME=20WORK=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (docs) 1 주차 HOME WORK 수정 1주차 homework답변 수정하였습니다. --- 1 WEEK/core/1 week.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/1 WEEK/core/1 week.md b/1 WEEK/core/1 week.md index 283a343d..f754fc12 100644 --- a/1 WEEK/core/1 week.md +++ b/1 WEEK/core/1 week.md @@ -446,5 +446,8 @@ class OrderServiceTest { ``` ## HOME WORK 1. 위 코드의 핵심은 무엇일까요? + - 관심사 분리, 추상화 클래스에 의존이 핵심이라 생각됩니다. 2. 위 코드의 문제점은 무엇일까요? + - 할인 정책이나, 데이터 저장 부분이 바뀌었을 때, 그와 관련된 모든 코드를 수정해야한다는 점과 Order 클래스가 2개 이상의 책임을 지고 있는것이 문제점입니다. 3. 그 해결 방법은 무엇일까요? + - 의존성을 주입해주는 클래스를 따로 만들어주고, Order 클래스는 책임을 1가지만 지도록 calculatePrice() 메서드를 빼주는 것으로 해결해야 합니다. From 84c85d1f3e672ab4ccfe737359b21b9242c7101b Mon Sep 17 00:00:00 2001 From: 02yebin <101054089+02yebin@users.noreply.github.com> Date: Sat, 18 Nov 2023 19:29:15 +0900 Subject: [PATCH 035/190] =?UTF-8?q?[=20BE=20]=20(docs)=201=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20home=20work=EB=8B=B5=EB=B3=80=EC=9D=B4=20=EC=95=88?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (docs) home work답변이 안보여서 수정 답변 쓴게 안보여서 수정하였습니다. --- 1 WEEK/core/1 week.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1 WEEK/core/1 week.md b/1 WEEK/core/1 week.md index f754fc12..e016776a 100644 --- a/1 WEEK/core/1 week.md +++ b/1 WEEK/core/1 week.md @@ -445,9 +445,9 @@ class OrderServiceTest { } ``` ## HOME WORK -1. 위 코드의 핵심은 무엇일까요? - - 관심사 분리, 추상화 클래스에 의존이 핵심이라 생각됩니다. -2. 위 코드의 문제점은 무엇일까요? - - 할인 정책이나, 데이터 저장 부분이 바뀌었을 때, 그와 관련된 모든 코드를 수정해야한다는 점과 Order 클래스가 2개 이상의 책임을 지고 있는것이 문제점입니다. -3. 그 해결 방법은 무엇일까요? - - 의존성을 주입해주는 클래스를 따로 만들어주고, Order 클래스는 책임을 1가지만 지도록 calculatePrice() 메서드를 빼주는 것으로 해결해야 합니다. +1. 위 코드의 핵심은 무엇일까요?
+ -- 관심사 분리, 추상화 클래스에 의존이 핵심이라 생각됩니다.
+2. 위 코드의 문제점은 무엇일까요?
+ -- 할인 정책이나, 데이터 저장 부분이 바뀌었을 때, 그와 관련된 모든 코드를 수정해야한다는 점과 Order 클래스가 2개 이상의 책임을 지고 있는것이 문제점입니다.
+3. 그 해결 방법은 무엇일까요?
+ -- 의존성을 주입해주는 클래스를 따로 만들어주고, Order 클래스는 책임을 1가지만 지도록 calculatePrice() 메서드를 빼주는 것으로 해결해야 합니다.
From 9c827c83046e54b3578f54bac56e8a5a35a512f9 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 16:10:50 +0900 Subject: [PATCH 036/190] =?UTF-8?q?[=20BE=20]=20(perf)=20DependencyInjecti?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) DependencyInjection 클래스 명 수정 DependencyInjection 클래스명을 AppConfig로 수정하였습니다. --- .../{DependencyInjection.java => AppConfig.java} | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) rename 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/{DependencyInjection.java => AppConfig.java} (52%) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java similarity index 52% rename from 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java rename to 2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java index ed21d684..12bbb791 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/DependencyInjection.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java @@ -3,9 +3,15 @@ import com.yebin.yebin.discount.DiscountPolicy; import com.yebin.yebin.discount.RateDiscountPolicy; import com.yebin.yebin.member.MemberRepository; +import com.yebin.yebin.member.MemberService; +import com.yebin.yebin.member.MemberServiceImpl; import com.yebin.yebin.member.MemoryMemberRepository; +import com.yebin.yebin.order.OrderService; +import com.yebin.yebin.order.OrderServiceImpl; +import org.springframework.context.annotation.Configuration; -public class DependencyInjection { +@Configuration +public class AppConfig { public DiscountPolicy discountPolicy(){ // 할인 정책이 바뀌면 이 부분만 바꿔주면 된다. return new RateDiscountPolicy(); @@ -15,4 +21,12 @@ public MemberRepository memberRepository(){ // DB 연결하면 이 부분만 바꿔주면 된다. return new MemoryMemberRepository(); } + + public MemberService memberService(){ + return new MemberServiceImpl(memberRepository()); + } + + public OrderService orderService(){ + return new OrderServiceImpl(memberRepository(),discountPolicy()); + } } From e52f17ad924029bc563d056511ed6870b7664730 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 16:12:09 +0900 Subject: [PATCH 037/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Member=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Member 클래스 수정 어노테이션 Getter, Setter를 사용함에따라 getter, setter 관련 메서드들을 삭제하였습니다. --- .../java/com/yebin/yebin/member/Member.java | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java index fd636bac..85db9daa 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/Member.java @@ -1,5 +1,10 @@ package com.yebin.yebin.member; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter public class Member { private Long id; private String name; @@ -10,28 +15,6 @@ public Member( String name, Grade grade) { this.grade = grade; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Grade getGrade() { - return grade; - } - - public void setGrade(Grade grade) { - this.grade = grade; - } } From 5d99f084d283fc4122fd8aa2f80823a3ef1bc755 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 16:13:36 +0900 Subject: [PATCH 038/190] =?UTF-8?q?[=20BE=20]=20(perf)=20OrderApp=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) OrderApp 클래스 수정 AppConfig 클래스로 의존주입 기능을 만들어 OrderApp 클래스에도 적용시켜 주었습니다. --- .../SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java index a36d50bb..dfba847c 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/OrderApp.java @@ -1,5 +1,6 @@ package com.yebin.yebin; +import com.yebin.yebin.dependency.AppConfig; import com.yebin.yebin.member.Grade; import com.yebin.yebin.member.Member; import com.yebin.yebin.member.MemberService; @@ -10,8 +11,9 @@ public class OrderApp { public static void main(String[] args) { - MemberService memberService = new MemberServiceImpl(); - OrderService orderService = new OrderServiceImpl(); + AppConfig appConfig = new AppConfig(); + MemberService memberService = appConfig.memberService(); + OrderService orderService = appConfig.orderService(); Member member = new Member("memberA", Grade.VIP); memberService.join(member); From 007a475b4c669029ee2188139ade881a5d3a5254 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 16:14:39 +0900 Subject: [PATCH 039/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemeberApp=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemeberApp 클래스 수정 AppConfig 클래스에서 의존 주입 기능을 만들어 MemberApp 클래스에도 적용시켜주었습니다. --- .../SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java index a91c9960..d08a0e36 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/MemberApp.java @@ -1,5 +1,6 @@ package com.yebin.yebin; +import com.yebin.yebin.dependency.AppConfig; import com.yebin.yebin.member.Grade; import com.yebin.yebin.member.Member; import com.yebin.yebin.member.MemberService; @@ -7,8 +8,8 @@ public class MemberApp { public static void main(String[] args) { - - MemberService memberService = new MemberServiceImpl(); + AppConfig appConfig = new AppConfig(); + MemberService memberService =appConfig.memberService(); Member member = new Member("memberA", Grade.VIP); From 2811fcfb9cfb52284b08fa13b8967ed033d8e008 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 16:16:43 +0900 Subject: [PATCH 040/190] =?UTF-8?q?[=20BE=20]=20(perf)=20OrderServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) OrderServiceImpl 클래스 수정 AppConfig 클래스에서 의존주입 기능을 만들어 OrderServiceImpl 클래스에도 적용시켜주어 필요한 클래스를 생성자에서 초기화 하도록 만들었습니다. --- .../com/yebin/yebin/order/OrderServiceImpl.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index df721b71..37aa8f78 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -1,17 +1,20 @@ package com.yebin.yebin.order; -import com.yebin.yebin.dependency.DependencyInjection; +import com.yebin.yebin.dependency.AppConfig; import com.yebin.yebin.discount.DiscountPolicy; -import com.yebin.yebin.discount.FixDiscountPolicy; -import com.yebin.yebin.discount.RateDiscountPolicy; import com.yebin.yebin.member.Member; import com.yebin.yebin.member.MemberRepository; -import com.yebin.yebin.member.MemoryMemberRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; public class OrderServiceImpl implements OrderService{ - private final DependencyInjection dependencyInjection = new DependencyInjection(); - private final MemberRepository memberRepository = dependencyInjection.memberRepository(); - private final DiscountPolicy discountPolicy = dependencyInjection.discountPolicy(); + private final MemberRepository memberRepository; + private final DiscountPolicy discountPolicy; + + public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){ + this.memberRepository = memberRepository; + this.discountPolicy = discountPolicy; + } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { From 0829acc61cfe3987e119fc3a1c0570f7ad1f9f9d Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 16:18:18 +0900 Subject: [PATCH 041/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemberServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemberServiceImpl 클래스 수정 AppConfig 클래스에서 의존주입 기능을 만들어 MemberServiceImpl 클래스에도 적용시켜주어 필요한 클래스를 생성자에서 초기화 하도록 만들었습니다. --- .../com/yebin/yebin/member/MemberServiceImpl.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java index 205d2e09..cb281191 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java @@ -1,10 +1,17 @@ package com.yebin.yebin.member; -import com.yebin.yebin.dependency.DependencyInjection; +import com.yebin.yebin.dependency.AppConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; public class MemberServiceImpl implements MemberService{ - private final DependencyInjection dependencyInjection = new DependencyInjection(); - private final MemberRepository memberRepository = dependencyInjection.memberRepository(); + + private final MemberRepository memberRepository; + + public MemberServiceImpl(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } @Override public void join(Member member) { From 9de43712cacf94d0372370e30985c3c92e2fddd4 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 22:48:30 +0900 Subject: [PATCH 042/190] =?UTF-8?q?[=20BE=20]=20(perf)=20OrderService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) OrderService 클래스 수정 빈등록해주고 연결해주었습니다. --- .../src/main/java/com/yebin/yebin/order/OrderServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index 37aa8f78..9162e899 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -7,10 +7,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +@Service public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; + @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){ this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; From dc7addd5da522445dab7ae0736252f7ac2cf24cf Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 22:49:30 +0900 Subject: [PATCH 043/190] =?UTF-8?q?[=20BE=20]=20(perf)=20RateDiscountPolic?= =?UTF-8?q?y=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) RateDiscountPolicy 클래스 수정 빈 등록 해주었습니다. --- .../main/java/com/yebin/yebin/discount/RateDiscountPolicy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java index 7af0eb94..65d72e2e 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java @@ -2,7 +2,9 @@ import com.yebin.yebin.member.Grade; import com.yebin.yebin.member.Member; +import org.springframework.stereotype.Component; +@Component public class RateDiscountPolicy implements DiscountPolicy{ private float discountRate = 10; @Override From 1e10f2d91b3f2e7b0480e33d08b600b483f2067c Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 22:50:26 +0900 Subject: [PATCH 044/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemberServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemberServiceImpl 클래스 수정 빈 등록해주고 연결해주었습니다. --- .../src/main/java/com/yebin/yebin/member/MemberServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java index cb281191..d169e097 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java @@ -5,10 +5,12 @@ import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; +@Service public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; + @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } From 72c80c238deb987fcb3d0de947839608b99b5119 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 20 Nov 2023 22:51:00 +0900 Subject: [PATCH 045/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemoryMemberRepos?= =?UTF-8?q?itory=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemoryMemberRepository 클래스 수정 빈 등록해주었습니다. --- .../java/com/yebin/yebin/member/MemoryMemberRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java index a957d7ba..413fcfea 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java @@ -1,8 +1,11 @@ package com.yebin.yebin.member; +import org.springframework.stereotype.Repository; + import java.util.HashMap; import java.util.Map; +@Repository public class MemoryMemberRepository implements MemberRepository{ private static Map store = new HashMap<>(); private static long SEQUENCE = 0L; From 0219501644a21a07db5fe7c75969b92c6531a0be Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 21 Nov 2023 21:46:09 +0900 Subject: [PATCH 046/190] =?UTF-8?q?[=20BE=20]=20(perf)=20=EB=B9=88=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EB=93=B1=EB=A1=9D=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) 빈 자동 등록 어노테이션 수정 빈 자동해주는 어노테이션을 모두 삭제하였습니다. --- .../java/com/yebin/yebin/discount/RateDiscountPolicy.java | 2 +- .../main/java/com/yebin/yebin/member/MemberServiceImpl.java | 4 ++-- .../java/com/yebin/yebin/member/MemoryMemberRepository.java | 1 - .../src/main/java/com/yebin/yebin/order/OrderServiceImpl.java | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java index 65d72e2e..3a89ab08 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/discount/RateDiscountPolicy.java @@ -4,7 +4,7 @@ import com.yebin.yebin.member.Member; import org.springframework.stereotype.Component; -@Component + public class RateDiscountPolicy implements DiscountPolicy{ private float discountRate = 10; @Override diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java index d169e097..de7db79f 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemberServiceImpl.java @@ -5,12 +5,12 @@ import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; -@Service + public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; - @Autowired + public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java index 413fcfea..7689a99f 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/member/MemoryMemberRepository.java @@ -5,7 +5,6 @@ import java.util.HashMap; import java.util.Map; -@Repository public class MemoryMemberRepository implements MemberRepository{ private static Map store = new HashMap<>(); private static long SEQUENCE = 0L; diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java index 9162e899..d56f6f6e 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/order/OrderServiceImpl.java @@ -7,12 +7,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -@Service + public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; - @Autowired + public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){ this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; From 03ae4c70088955331387798eacf9c3d0d29487da Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 21 Nov 2023 21:48:30 +0900 Subject: [PATCH 047/190] =?UTF-8?q?[=20BE=20]=20(perf)=20AppConfig=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) AppConfig 클래스 수정 빈을 수동으로 등록하도록 어노테이션 Bean 을 사용하였습니다. --- .../src/main/java/com/yebin/yebin/dependency/AppConfig.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java index 12bbb791..220170b0 100644 --- a/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java +++ b/2 WEEK/SON/yebin/src/main/java/com/yebin/yebin/dependency/AppConfig.java @@ -8,24 +8,29 @@ import com.yebin.yebin.member.MemoryMemberRepository; import com.yebin.yebin.order.OrderService; import com.yebin.yebin.order.OrderServiceImpl; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { + @Bean public DiscountPolicy discountPolicy(){ // 할인 정책이 바뀌면 이 부분만 바꿔주면 된다. return new RateDiscountPolicy(); } + @Bean public MemberRepository memberRepository(){ // DB 연결하면 이 부분만 바꿔주면 된다. return new MemoryMemberRepository(); } + @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } + @Bean public OrderService orderService(){ return new OrderServiceImpl(memberRepository(),discountPolicy()); } From d003f20d7773a63f2f828e93c7595ede9f519e80 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 27 Nov 2023 15:34:39 +0900 Subject: [PATCH 048/190] =?UTF-8?q?[=20BE=20]=20(feat)=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) 새로운 프로젝트 생성 프로젝트를 새롭게 생성하여 4주차 미션은 이 프로젝트에 작업할 예정입니다. --- 4 WEEK/item-service/.gitignore | 37 +++ 4 WEEK/item-service/build.gradle | 38 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + 4 WEEK/item-service/gradlew | 249 ++++++++++++++++++ 4 WEEK/item-service/gradlew.bat | 92 +++++++ 4 WEEK/item-service/item-service/.gitignore | 37 +++ 4 WEEK/item-service/item-service/build.gradle | 38 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + 4 WEEK/item-service/item-service/gradlew | 249 ++++++++++++++++++ 4 WEEK/item-service/item-service/gradlew.bat | 92 +++++++ .../item-service/item-service/settings.gradle | 1 + .../itemservice/ItemServiceApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../ItemServiceApplicationTests.java | 13 + 4 WEEK/item-service/settings.gradle | 1 + .../itemservice/ItemServiceApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../ItemServiceApplicationTests.java | 13 + 20 files changed, 902 insertions(+) create mode 100644 4 WEEK/item-service/.gitignore create mode 100644 4 WEEK/item-service/build.gradle create mode 100644 4 WEEK/item-service/gradle/wrapper/gradle-wrapper.jar create mode 100644 4 WEEK/item-service/gradle/wrapper/gradle-wrapper.properties create mode 100644 4 WEEK/item-service/gradlew create mode 100644 4 WEEK/item-service/gradlew.bat create mode 100644 4 WEEK/item-service/item-service/.gitignore create mode 100644 4 WEEK/item-service/item-service/build.gradle create mode 100644 4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.jar create mode 100644 4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.properties create mode 100644 4 WEEK/item-service/item-service/gradlew create mode 100644 4 WEEK/item-service/item-service/gradlew.bat create mode 100644 4 WEEK/item-service/item-service/settings.gradle create mode 100644 4 WEEK/item-service/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java create mode 100644 4 WEEK/item-service/item-service/src/main/resources/application.properties create mode 100644 4 WEEK/item-service/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java create mode 100644 4 WEEK/item-service/settings.gradle create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java create mode 100644 4 WEEK/item-service/src/main/resources/application.properties create mode 100644 4 WEEK/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java diff --git a/4 WEEK/item-service/.gitignore b/4 WEEK/item-service/.gitignore new file mode 100644 index 00000000..c2065bc2 --- /dev/null +++ b/4 WEEK/item-service/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/4 WEEK/item-service/build.gradle b/4 WEEK/item-service/build.gradle new file mode 100644 index 00000000..34550a7d --- /dev/null +++ b/4 WEEK/item-service/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.1.6' + id 'io.spring.dependency-management' version '1.1.4' +} + +group = 'hello' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('bootBuildImage') { + builder = 'paketobuildpacks/builder-jammy-base:latest' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/4 WEEK/item-service/gradle/wrapper/gradle-wrapper.jar b/4 WEEK/item-service/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/4 WEEK/item-service/gradle/wrapper/gradle-wrapper.properties b/4 WEEK/item-service/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..3fa8f862 --- /dev/null +++ b/4 WEEK/item-service/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/4 WEEK/item-service/gradlew b/4 WEEK/item-service/gradlew new file mode 100644 index 00000000..1aa94a42 --- /dev/null +++ b/4 WEEK/item-service/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/4 WEEK/item-service/gradlew.bat b/4 WEEK/item-service/gradlew.bat new file mode 100644 index 00000000..93e3f59f --- /dev/null +++ b/4 WEEK/item-service/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/4 WEEK/item-service/item-service/.gitignore b/4 WEEK/item-service/item-service/.gitignore new file mode 100644 index 00000000..c2065bc2 --- /dev/null +++ b/4 WEEK/item-service/item-service/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/4 WEEK/item-service/item-service/build.gradle b/4 WEEK/item-service/item-service/build.gradle new file mode 100644 index 00000000..34550a7d --- /dev/null +++ b/4 WEEK/item-service/item-service/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.1.6' + id 'io.spring.dependency-management' version '1.1.4' +} + +group = 'hello' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('bootBuildImage') { + builder = 'paketobuildpacks/builder-jammy-base:latest' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.jar b/4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et zwk~hMkhq;MOw^Q5`7oC{CUUyTw9x>^%*FHx^qJw(LB+E0WBX@{Ghw;)6aA-KyYg8p z7XDveQOpEr;B4je@2~usI5BlFadedX^ma{b{ypd|RNYqo#~d*mj&y`^iojR}s%~vF z(H!u`yx68D1Tj(3(m;Q+Ma}s2n#;O~bcB1`lYk%Irx60&-nWIUBr2x&@}@76+*zJ5 ze&4?q8?m%L9c6h=J$WBzbiTf1Z-0Eb5$IZs>lvm$>1n_Mezp*qw_pr8<8$6f)5f<@ zyV#tzMCs51nTv_5ca`x`yfE5YA^*%O_H?;tWYdM_kHPubA%vy47i=9>Bq) zRQ&0UwLQHeswmB1yP)+BiR;S+Vc-5TX84KUA;8VY9}yEj0eESSO`7HQ4lO z4(CyA8y1G7_C;6kd4U3K-aNOK!sHE}KL_-^EDl(vB42P$2Km7$WGqNy=%fqB+ zSLdrlcbEH=T@W8V4(TgoXZ*G1_aq$K^@ek=TVhoKRjw;HyI&coln|uRr5mMOy2GXP zwr*F^Y|!Sjr2YQXX(Fp^*`Wk905K%$bd03R4(igl0&7IIm*#f`A!DCarW9$h$z`kYk9MjjqN&5-DsH@8xh63!fTNPxWsFQhNv z#|3RjnP$Thdb#Ys7M+v|>AHm0BVTw)EH}>x@_f4zca&3tXJhTZ8pO}aN?(dHo)44Z z_5j+YP=jMlFqwvf3lq!57-SAuRV2_gJ*wsR_!Y4Z(trO}0wmB9%f#jNDHPdQGHFR; zZXzS-$`;7DQ5vF~oSgP3bNV$6Z(rwo6W(U07b1n3UHqml>{=6&-4PALATsH@Bh^W? z)ob%oAPaiw{?9HfMzpGb)@Kys^J$CN{uf*HX?)z=g`J(uK1YO^8~s1(ZIbG%Et(|q z$D@_QqltVZu9Py4R0Ld8!U|#`5~^M=b>fnHthzKBRr=i+w@0Vr^l|W;=zFT#PJ?*a zbC}G#It}rQP^Ait^W&aa6B;+0gNvz4cWUMzpv(1gvfw-X4xJ2Sv;mt;zb2Tsn|kSS zo*U9N?I{=-;a-OybL4r;PolCfiaL=y@o9{%`>+&FI#D^uy#>)R@b^1ue&AKKwuI*` zx%+6r48EIX6nF4o;>)zhV_8(IEX})NGU6Vs(yslrx{5fII}o3SMHW7wGtK9oIO4OM&@@ECtXSICLcPXoS|{;=_yj>hh*%hP27yZwOmj4&Lh z*Nd@OMkd!aKReoqNOkp5cW*lC)&C$P?+H3*%8)6HcpBg&IhGP^77XPZpc%WKYLX$T zsSQ$|ntaVVOoRat$6lvZO(G-QM5s#N4j*|N_;8cc2v_k4n6zx9c1L4JL*83F-C1Cn zaJhd;>rHXB%%ZN=3_o3&Qd2YOxrK~&?1=UuN9QhL$~OY-Qyg&})#ez*8NpQW_*a&kD&ANjedxT0Ar z<6r{eaVz3`d~+N~vkMaV8{F?RBVemN(jD@S8qO~L{rUw#=2a$V(7rLE+kGUZ<%pdr z?$DP|Vg#gZ9S}w((O2NbxzQ^zTot=89!0^~hE{|c9q1hVzv0?YC5s42Yx($;hAp*E zyoGuRyphQY{Q2ee0Xx`1&lv(l-SeC$NEyS~8iil3_aNlnqF_G|;zt#F%1;J)jnPT& z@iU0S;wHJ2$f!juqEzPZeZkjcQ+Pa@eERSLKsWf=`{R@yv7AuRh&ALRTAy z8=g&nxsSJCe!QLchJ=}6|LshnXIK)SNd zRkJNiqHwKK{SO;N5m5wdL&qK`v|d?5<4!(FAsDxR>Ky#0#t$8XCMptvNo?|SY?d8b z`*8dVBlXTUanlh6n)!EHf2&PDG8sXNAt6~u-_1EjPI1|<=33T8 zEnA00E!`4Ave0d&VVh0e>)Dc}=FfAFxpsC1u9ATfQ`-Cu;mhc8Z>2;uyXtqpLb7(P zd2F9<3cXS} znMg?{&8_YFTGRQZEPU-XPq55%51}RJpw@LO_|)CFAt62-_!u_Uq$csc+7|3+TV_!h z+2a7Yh^5AA{q^m|=KSJL+w-EWDBc&I_I1vOr^}P8i?cKMhGy$CP0XKrQzCheG$}G# zuglf8*PAFO8%xop7KSwI8||liTaQ9NCAFarr~psQt)g*pC@9bORZ>m`_GA`_K@~&% zijH0z;T$fd;-Liw8%EKZas>BH8nYTqsK7F;>>@YsE=Rqo?_8}UO-S#|6~CAW0Oz1} z3F(1=+#wrBJh4H)9jTQ_$~@#9|Bc1Pd3rAIA_&vOpvvbgDJOM(yNPhJJq2%PCcMaI zrbe~toYzvkZYQ{ea(Wiyu#4WB#RRN%bMe=SOk!CbJZv^m?Flo5p{W8|0i3`hI3Np# zvCZqY%o258CI=SGb+A3yJe~JH^i{uU`#U#fvSC~rWTq+K`E%J@ zasU07&pB6A4w3b?d?q}2=0rA#SA7D`X+zg@&zm^iA*HVi z009#PUH<%lk4z~p^l0S{lCJk1Uxi=F4e_DwlfHA`X`rv(|JqWKAA5nH+u4Da+E_p+ zVmH@lg^n4ixs~*@gm_dgQ&eDmE1mnw5wBz9Yg?QdZwF|an67Xd*x!He)Gc8&2!urh z4_uXzbYz-aX)X1>&iUjGp;P1u8&7TID0bTH-jCL&Xk8b&;;6p2op_=y^m@Nq*0{#o!!A;wNAFG@0%Z9rHo zcJs?Th>Ny6+hI`+1XoU*ED$Yf@9f91m9Y=#N(HJP^Y@ZEYR6I?oM{>&Wq4|v0IB(p zqX#Z<_3X(&{H+{3Tr|sFy}~=bv+l=P;|sBz$wk-n^R`G3p0(p>p=5ahpaD7>r|>pm zv;V`_IR@tvZreIuv2EM7ZQHhO+qUgw#kOs%*ekY^n|=1#x9&c;Ro&I~{rG-#_3ZB1 z?|9}IFdbP}^DneP*T-JaoYHt~r@EfvnPE5EKUwIxjPbsr$% zfWW83pgWST7*B(o=kmo)74$8UU)v0{@4DI+ci&%=#90}!CZz|rnH+Mz=HN~97G3~@ z;v5(9_2%eca(9iu@J@aqaMS6*$TMw!S>H(b z4(*B!|H|8&EuB%mITr~O?vVEf%(Gr)6E=>H~1VR z&1YOXluJSG1!?TnT)_*YmJ*o_Q@om~(GdrhI{$Fsx_zrkupc#y{DK1WOUR>tk>ZE) ziOLoBkhZZ?0Uf}cm>GsA>Rd6V8@JF)J*EQlQ<=JD@m<)hyElXR0`pTku*3MU`HJn| zIf7$)RlK^pW-$87U;431;Ye4Ie+l~_B3*bH1>*yKzn23cH0u(i5pXV! z4K?{3oF7ZavmmtTq((wtml)m6i)8X6ot_mrE-QJCW}Yn!(3~aUHYG=^fA<^~`e3yc z-NWTb{gR;DOUcK#zPbN^D*e=2eR^_!(!RKkiwMW@@yYtEoOp4XjOGgzi`;=8 zi3`Ccw1%L*y(FDj=C7Ro-V?q)-%p?Ob2ZElu`eZ99n14-ZkEV#y5C+{Pq87Gu3&>g zFy~Wk7^6v*)4pF3@F@rE__k3ikx(hzN3@e*^0=KNA6|jC^B5nf(XaoQaZN?Xi}Rn3 z$8&m*KmWvPaUQ(V<#J+S&zO|8P-#!f%7G+n_%sXp9=J%Z4&9OkWXeuZN}ssgQ#Tcj z8p6ErJQJWZ+fXLCco=RN8D{W%+*kko*2-LEb))xcHwNl~Xmir>kmAxW?eW50Osw3# zki8Fl$#fvw*7rqd?%E?}ZX4`c5-R&w!Y0#EBbelVXSng+kUfeUiqofPehl}$ormli zg%r)}?%=?_pHb9`Cq9Z|B`L8b>(!+8HSX?`5+5mm81AFXfnAt1*R3F z%b2RPIacKAddx%JfQ8l{3U|vK@W7KB$CdLqn@wP^?azRks@x8z59#$Q*7q!KilY-P zHUbs(IFYRGG1{~@RF;Lqyho$~7^hNC`NL3kn^Td%A7dRgr_&`2k=t+}D-o9&C!y^? z6MsQ=tc3g0xkK(O%DzR9nbNB(r@L;1zQrs8mzx&4dz}?3KNYozOW5;=w18U6$G4U2 z#2^qRLT*Mo4bV1Oeo1PKQ2WQS2Y-hv&S|C7`xh6=Pj7MNLC5K-zokZ67S)C;(F0Dd zloDK2_o1$Fmza>EMj3X9je7e%Q`$39Dk~GoOj89-6q9|_WJlSl!!+*{R=tGp z8u|MuSwm^t7K^nUe+^0G3dkGZr3@(X+TL5eah)K^Tn zXEtHmR9UIaEYgD5Nhh(s*fcG_lh-mfy5iUF3xxpRZ0q3nZ=1qAtUa?(LnT9I&~uxX z`pV?+=|-Gl(kz?w!zIieXT}o}7@`QO>;u$Z!QB${a08_bW0_o@&9cjJUXzVyNGCm8 zm=W+$H!;_Kzp6WQqxUI;JlPY&`V}9C$8HZ^m?NvI*JT@~BM=()T()Ii#+*$y@lTZBkmMMda>7s#O(1YZR+zTG@&}!EXFG{ zEWPSDI5bFi;NT>Yj*FjH((=oe%t%xYmE~AGaOc4#9K_XsVpl<4SP@E!TgC0qpe1oi zNpxU2b0(lEMcoibQ-G^cxO?ySVW26HoBNa;n0}CWL*{k)oBu1>F18X061$SP{Gu67 z-v-Fa=Fl^u3lnGY^o5v)Bux}bNZ~ z5pL+7F_Esoun8^5>z8NFoIdb$sNS&xT8_|`GTe8zSXQzs4r^g0kZjg(b0bJvz`g<70u9Z3fQILX1Lj@;@+##bP|FAOl)U^9U>0rx zGi)M1(Hce)LAvQO-pW!MN$;#ZMX?VE(22lTlJrk#pB0FJNqVwC+*%${Gt#r_tH9I_ z;+#)#8cWAl?d@R+O+}@1A^hAR1s3UcW{G+>;X4utD2d9X(jF555}!TVN-hByV6t+A zdFR^aE@GNNgSxxixS2p=on4(+*+f<8xrwAObC)D5)4!z7)}mTpb7&ofF3u&9&wPS< zB62WHLGMhmrmOAgmJ+|c>qEWTD#jd~lHNgT0?t-p{T=~#EMcB| z=AoDKOL+qXCfk~F)-Rv**V}}gWFl>liXOl7Uec_8v)(S#av99PX1sQIVZ9eNLkhq$ zt|qu0b?GW_uo}TbU8!jYn8iJeIP)r@;!Ze_7mj{AUV$GEz6bDSDO=D!&C9!M@*S2! zfGyA|EPlXGMjkH6x7OMF?gKL7{GvGfED=Jte^p=91FpCu)#{whAMw`vSLa`K#atdN zThnL+7!ZNmP{rc=Z>%$meH;Qi1=m1E3Lq2D_O1-X5C;!I0L>zur@tPAC9*7Jeh)`;eec}1`nkRP(%iv-`N zZ@ip-g|7l6Hz%j%gcAM}6-nrC8oA$BkOTz^?dakvX?`^=ZkYh%vUE z9+&)K1UTK=ahYiaNn&G5nHUY5niLGus@p5E2@RwZufRvF{@$hW{;{3QhjvEHMvduO z#Wf-@oYU4ht?#uP{N3utVzV49mEc9>*TV_W2TVC`6+oI)zAjy$KJrr=*q##&kobiQ z1vNbya&OVjK`2pdRrM?LuK6BgrLN7H_3m z!qpNKg~87XgCwb#I=Q&0rI*l$wM!qTkXrx1ko5q-f;=R2fImRMwt5Qs{P*p^z@9ex z`2#v(qE&F%MXlHpdO#QEZyZftn4f05ab^f2vjxuFaat2}jke{j?5GrF=WYBR?gS(^ z9SBiNi}anzBDBRc+QqizTTQuJrzm^bNA~A{j%ugXP7McZqJ}65l10({wk++$=e8O{ zxWjG!Qp#5OmI#XRQQM?n6?1ztl6^D40hDJr?4$Wc&O_{*OfMfxe)V0=e{|N?J#fgE>j9jAajze$iN!*yeF%jJU#G1c@@rm zolGW!j?W6Q8pP=lkctNFdfgUMg92wlM4E$aks1??M$~WQfzzzXtS)wKrr2sJeCN4X zY(X^H_c^PzfcO8Bq(Q*p4c_v@F$Y8cHLrH$`pJ2}=#*8%JYdqsqnGqEdBQMpl!Ot04tUGSXTQdsX&GDtjbWD=prcCT9(+ z&UM%lW%Q3yrl1yiYs;LxzIy>2G}EPY6|sBhL&X&RAQrSAV4Tlh2nITR?{6xO9ujGu zr*)^E`>o!c=gT*_@6S&>0POxcXYNQd&HMw6<|#{eSute2C3{&h?Ah|cw56-AP^f8l zT^kvZY$YiH8j)sk7_=;gx)vx-PW`hbSBXJGCTkpt;ap(}G2GY=2bbjABU5)ty%G#x zAi07{Bjhv}>OD#5zh#$0w;-vvC@^}F! z#X$@)zIs1L^E;2xDAwEjaXhTBw2<{&JkF*`;c3<1U@A4MaLPe{M5DGGkL}#{cHL%* zYMG+-Fm0#qzPL#V)TvQVI|?_M>=zVJr9>(6ib*#z8q@mYKXDP`k&A4A};xMK0h=yrMp~JW{L?mE~ph&1Y1a#4%SO)@{ zK2juwynUOC)U*hVlJU17%llUxAJFuKZh3K0gU`aP)pc~bE~mM!i1mi!~LTf>1Wp< zuG+ahp^gH8g8-M$u{HUWh0m^9Rg@cQ{&DAO{PTMudV6c?ka7+AO& z746QylZ&Oj`1aqfu?l&zGtJnpEQOt;OAFq19MXTcI~`ZcoZmyMrIKDFRIDi`FH)w; z8+*8tdevMDv*VtQi|e}CnB_JWs>fhLOH-+Os2Lh!&)Oh2utl{*AwR)QVLS49iTp{6 z;|172Jl!Ml17unF+pd+Ff@jIE-{Oxv)5|pOm@CkHW?{l}b@1>Pe!l}VccX#xp@xgJ zyE<&ep$=*vT=}7vtvif0B?9xw_3Gej7mN*dOHdQPtW5kA5_zGD zpA4tV2*0E^OUimSsV#?Tg#oiQ>%4D@1F5@AHwT8Kgen$bSMHD3sXCkq8^(uo7CWk`mT zuslYq`6Yz;L%wJh$3l1%SZv#QnG3=NZ=BK4yzk#HAPbqXa92;3K5?0kn4TQ`%E%X} z&>Lbt!!QclYKd6+J7Nl@xv!uD%)*bY-;p`y^ZCC<%LEHUi$l5biu!sT3TGGSTPA21 zT8@B&a0lJHVn1I$I3I1I{W9fJAYc+8 zVj8>HvD}&O`TqU2AAb={?eT;0hyL(R{|h23=4fDSZKC32;wWxsVj`P z3J3{M$PwdH!ro*Cn!D&=jnFR>BNGR<<|I8CI@+@658Dy(lhqbhXfPTVecY@L8%`3Q z1Fux2w?2C3th60jI~%OC9BtpNF$QPqcG+Pz96qZJ71_`0o0w_q7|h&O>`6U+^BA&5 zXd5Zp1Xkw~>M%RixTm&OqpNl8Q+ue=92Op_>T~_9UON?ZM2c0aGm=^A4ejrXj3dV9 zhh_bCt-b9`uOX#cFLj!vhZ#lS8Tc47OH>*)y#{O9?AT~KR9LntM|#l#Dlm^8{nZdk zjMl#>ZM%#^nK2TPzLcKxqx24P7R1FPlBy7LSBrRvx>fE$9AJ;7{PQm~^LBX^k#6Zq zw*Z(zJC|`!6_)EFR}8|n8&&Rbj8y028~P~sFXBFRt+tmqH-S3<%N;C&WGH!f3{7cm zy_fCAb9@HqaXa1Y5vFbxWf%#zg6SI$C+Uz5=CTO}e|2fjWkZ;Dx|84Ow~bkI=LW+U zuq;KSv9VMboRvs9)}2PAO|b(JCEC_A0wq{uEj|3x@}*=bOd zwr{TgeCGG>HT<@Zeq8y}vTpwDg#UBvD)BEs@1KP$^3$sh&_joQPn{hjBXmLPJ{tC) z*HS`*2+VtJO{|e$mM^|qv1R*8i(m1`%)}g=SU#T#0KlTM2RSvYUc1fP+va|4;5}Bfz98UvDCpq7}+SMV&;nX zQw~N6qOX{P55{#LQkrZk(e5YGzr|(B;Q;ju;2a`q+S9bsEH@i1{_Y0;hWYn1-79jl z5c&bytD*k)GqrVcHn6t-7kinadiD>B{Tl`ZY@`g|b~pvHh5!gKP4({rp?D0aFd_cN zhHRo4dd5^S6ViN(>(28qZT6E>??aRhc($kP`>@<+lIKS5HdhjVU;>f7<4))E*5|g{ z&d1}D|vpuV^eRj5j|xx9nwaCxXFG?Qbjn~_WSy=N}P0W>MP zG-F%70lX5Xr$a)2i6?i|iMyM|;Jtf*hO?=Jxj12oz&>P=1#h~lf%#fc73M2_(SUM- zf&qnjS80|_Y0lDgl&I?*eMumUklLe_=Td!9G@eR*tcPOgIShJipp3{A10u(4eT~DY zHezEj8V+7m!knn7)W!-5QI3=IvC^as5+TW1@Ern@yX| z7Nn~xVx&fGSr+L%4iohtS3w^{-H1A_5=r&x8}R!YZvp<2T^YFvj8G_vm}5q;^UOJf ztl=X3iL;;^^a#`t{Ae-%5Oq{?M#s6Npj+L(n-*LMI-yMR{)qki!~{5z{&`-iL}lgW zxo+tnvICK=lImjV$Z|O_cYj_PlEYCzu-XBz&XC-JVxUh9;6*z4fuBG+H{voCC;`~GYV|hj%j_&I zDZCj>Q_0RCwFauYoVMiUSB+*Mx`tg)bWmM^SwMA+?lBg12QUF_x2b)b?qb88K-YUd z0dO}3k#QirBV<5%jL$#wlf!60dizu;tsp(7XLdI=eQs?P`tOZYMjVq&jE)qK*6B^$ zBe>VvH5TO>s>izhwJJ$<`a8fakTL!yM^Zfr2hV9`f}}VVUXK39p@G|xYRz{fTI+Yq z20d=)iwjuG9RB$%$^&8#(c0_j0t_C~^|n+c`Apu|x7~;#cS-s=X1|C*YxX3ailhg_|0`g!E&GZJEr?bh#Tpb8siR=JxWKc{#w7g zWznLwi;zLFmM1g8V5-P#RsM@iX>TK$xsWuujcsVR^7TQ@!+vCD<>Bk9tdCo7Mzgq5 zv8d>dK9x8C@Qoh01u@3h0X_`SZluTb@5o;{4{{eF!-4405x8X7hewZWpz z2qEi4UTiXTvsa(0X7kQH{3VMF>W|6;6iTrrYD2fMggFA&-CBEfSqPlQDxqsa>{e2M z(R5PJ7uOooFc|9GU0ELA%m4&4Ja#cQpNw8i8ACAoK6?-px+oBl_yKmenZut#Xumjz zk8p^OV2KY&?5MUwGrBOo?ki`Sxo#?-Q4gw*Sh0k`@ zFTaYK2;}%Zk-68`#5DXU$2#=%YL#S&MTN8bF+!J2VT6x^XBci6O)Q#JfW{YMz) zOBM>t2rSj)n#0a3cjvu}r|k3od6W(SN}V-cL?bi*Iz-8uOcCcsX0L>ZXjLqk zZu2uHq5B|Kt>e+=pPKu=1P@1r9WLgYFq_TNV1p9pu0erHGd!+bBp!qGi+~4A(RsYN@CyXNrC&hxGmW)u5m35OmWwX`I+0yByglO`}HC4nGE^_HUs^&A(uaM zKPj^=qI{&ayOq#z=p&pnx@@k&I1JI>cttJcu@Ihljt?6p^6{|ds`0MoQwp+I{3l6` zB<9S((RpLG^>=Kic`1LnhpW2=Gu!x`m~=y;A`Qk!-w`IN;S8S930#vBVMv2vCKi}u z6<-VPrU0AnE&vzwV(CFC0gnZYcpa-l5T0ZS$P6(?9AM;`Aj~XDvt;Jua=jIgF=Fm? zdp=M$>`phx%+Gu};;-&7T|B1AcC#L4@mW5SV_^1BRbo6;2PWe$r+npRV`yc;T1mo& z+~_?7rA+(Um&o@Tddl zL_hxvWk~a)yY}%j`Y+200D%9$bWHy&;(yj{jpi?Rtz{J66ANw)UyPOm;t6FzY3$hx zcn)Ir79nhFvNa7^a{SHN7XH*|Vlsx`CddPnA&Qvh8aNhEA;mPVv;Ah=k<*u!Zq^7 z<=xs*iQTQOMMcg|(NA_auh@x`3#_LFt=)}%SQppP{E>mu_LgquAWvh<>L7tf9+~rO znwUDS52u)OtY<~!d$;m9+87aO+&`#2ICl@Y>&F{jI=H(K+@3M1$rr=*H^dye#~TyD z!){#Pyfn+|ugUu}G;a~!&&0aqQ59U@UT3|_JuBlYUpT$2+11;}JBJ`{+lQN9T@QFY z5+`t;6(TS0F?OlBTE!@7D`8#URDNqx2t6`GZ{ZgXeS@v%-eJzZOHz18aS|svxII$a zZeFjrJ*$IwX$f-Rzr_G>xbu@euGl)B7pC&S+CmDJBg$BoV~jxSO#>y z33`bupN#LDoW0feZe0%q8un0rYN|eRAnwDHQ6e_)xBTbtoZtTA=Fvk){q}9Os~6mQ zKB80VI_&6iSq`LnK7*kfHZoeX6?WE}8yjuDn=2#JG$+;-TOA1%^=DnXx%w{b=w}tS zQbU3XxtOI8E(!%`64r2`zog;5<0b4i)xBmGP^jiDZ2%HNSxIf3@wKs~uk4%3Mxz;~ zts_S~E4>W+YwI<-*-$U8*^HKDEa8oLbmqGg?3vewnaNg%Mm)W=)lcC_J+1ov^u*N3 zXJ?!BrH-+wGYziJq2Y#vyry6Z>NPgkEk+Ke`^DvNRdb>Q2Nlr#v%O@<5hbflI6EKE z9dWc0-ORk^T}jP!nkJ1imyjdVX@GrjOs%cpgA8-c&FH&$(4od#x6Y&=LiJZPINVyW z0snY$8JW@>tc2}DlrD3StQmA0Twck~@>8dSix9CyQOALcREdxoM$Sw*l!}bXKq9&r zysMWR@%OY24@e`?+#xV2bk{T^C_xSo8v2ZI=lBI*l{RciPwuE>L5@uhz@{!l)rtVlWC>)6(G)1~n=Q|S!{E9~6*fdpa*n z!()-8EpTdj=zr_Lswi;#{TxbtH$8*G=UM`I+icz7sr_SdnHXrv=?iEOF1UL+*6O;% zPw>t^kbW9X@oEXx<97%lBm-9?O_7L!DeD)Me#rwE54t~UBu9VZ zl_I1tBB~>jm@bw0Aljz8! zXBB6ATG6iByKIxs!qr%pz%wgqbg(l{65DP4#v(vqhhL{0b#0C8mq`bnqZ1OwFV z7mlZZJFMACm>h9v^2J9+^_zc1=JjL#qM5ZHaThH&n zXPTsR8(+)cj&>Un{6v*z?@VTLr{TmZ@-fY%*o2G}*G}#!bmqpoo*Ay@U!JI^Q@7gj;Kg-HIrLj4}#ec4~D2~X6vo;ghep-@&yOivYP zC19L0D`jjKy1Yi-SGPAn94(768Tcf$urAf{)1)9W58P`6MA{YG%O?|07!g9(b`8PXG1B1Sh0?HQmeJtP0M$O$hI z{5G`&9XzYhh|y@qsF1GnHN|~^ru~HVf#)lOTSrv=S@DyR$UKQk zjdEPFDz{uHM&UM;=mG!xKvp;xAGHOBo~>_=WFTmh$chpC7c`~7?36h)7$fF~Ii}8q zF|YXxH-Z?d+Q+27Rs3X9S&K3N+)OBxMHn1u(vlrUC6ckBY@@jl+mgr#KQUKo#VeFm zFwNYgv0<%~Wn}KeLeD9e1$S>jhOq&(e*I@L<=I5b(?G(zpqI*WBqf|Zge0&aoDUsC zngMRA_Kt0>La+Erl=Uv_J^p(z=!?XHpenzn$%EA`JIq#yYF?JLDMYiPfM(&Csr#f{ zdd+LJL1by?xz|D8+(fgzRs~(N1k9DSyK@LJygwaYX8dZl0W!I&c^K?7)z{2is;OkE zd$VK-(uH#AUaZrp=1z;O*n=b?QJkxu`Xsw&7yrX0?(CX=I-C#T;yi8a<{E~?vr3W> zQrpPqOW2M+AnZ&p{hqmHZU-;Q(7?- zP8L|Q0RM~sB0w1w53f&Kd*y}ofx@c z5Y6B8qGel+uT1JMot$nT1!Tim6{>oZzJXdyA+4euOLME?5Fd_85Uk%#E*ln%y{u8Q z$|?|R@Hpb~yTVK-Yr_S#%NUy7EBfYGAg>b({J|5b+j-PBpPy$Ns`PaJin4JdRfOaS zE|<HjH%NuJgsd2wOlv>~y=np%=2)$M9LS|>P)zJ+Fei5vYo_N~B0XCn+GM76 z)Xz3tg*FRVFgIl9zpESgdpWAavvVViGlU8|UFY{{gVJskg*I!ZjWyk~OW-Td4(mZ6 zB&SQreAAMqwp}rjy`HsG({l2&q5Y52<@AULVAu~rWI$UbFuZs>Sc*x+XI<+ez%$U)|a^unjpiW0l0 zj1!K0(b6$8LOjzRqQ~K&dfbMIE=TF}XFAi)$+h}5SD3lo z%%Qd>p9se=VtQG{kQ;N`sI)G^u|DN#7{aoEd zkksYP%_X$Rq08);-s6o>CGJ<}v`qs%eYf+J%DQ^2k68C%nvikRsN?$ap--f+vCS`K z#&~)f7!N^;sdUXu54gl3L=LN>FB^tuK=y2e#|hWiWUls__n@L|>xH{%8lIJTd5`w? zSwZbnS;W~DawT4OwSJVdAylbY+u5S+ZH{4hAi2&}Iv~W(UvHg(1GTZRPz`@{SOqzy z(8g&Dz=$PfRV=6FgxN~zo+G8OoPI&d-thcGVR*_^(R8COTM@bq?fDwY{}WhsQS1AK zF6R1t8!RdFmfocpJ6?9Yv~;WYi~XPgs(|>{5})j!AR!voO7y9&cMPo#80A(`za@t>cx<0;qxM@S*m(jYP)dMXr*?q0E`oL;12}VAep179uEr8c<=D zr5?A*C{eJ`z9Ee;E$8)MECqatHkbHH z&Y+ho0B$31MIB-xm&;xyaFCtg<{m~M-QDbY)fQ>Q*Xibb~8ytxZQ?QMf9!%cV zU0_X1@b4d+Pg#R!`OJ~DOrQz3@cpiGy~XSKjZQQ|^4J1puvwKeScrH8o{bscBsowomu z^f12kTvje`yEI3eEXDHJ6L+O{Jv$HVj%IKb|J{IvD*l6IG8WUgDJ*UGz z3!C%>?=dlfSJ>4U88)V+`U-!9r^@AxJBx8R;)J4Fn@`~k>8>v0M9xp90OJElWP&R5 zM#v*vtT}*Gm1^)Bv!s72T3PB0yVIjJW)H7a)ilkAvoaH?)jjb`MP>2z{%Y?}83 zUIwBKn`-MSg)=?R)1Q0z3b>dHE^)D8LFs}6ASG1|daDly_^lOSy&zIIhm*HXm1?VS=_iacG);_I9c zUQH1>i#*?oPIwBMJkzi_*>HoUe}_4o>2(SHWzqQ=;TyhAHS;Enr7!#8;sdlty&(>d zl%5cjri8`2X^Ds`jnw7>A`X|bl=U8n+3LKLy(1dAu8`g@9=5iw$R0qk)w8Vh_Dt^U zIglK}sn^)W7aB(Q>HvrX=rxB z+*L)3DiqpQ_%~|m=44LcD4-bxO3OO*LPjsh%p(k?&jvLp0py57oMH|*IMa(<|{m1(0S|x)?R-mqJ=I;_YUZA>J z62v*eSK;5w!h8J+6Z2~oyGdZ68waWfy09?4fU&m7%u~zi?YPHPgK6LDwphgaYu%0j zurtw)AYOpYKgHBrkX189mlJ`q)w-f|6>IER{5Lk97%P~a-JyCRFjejW@L>n4vt6#hq;!|m;hNE||LK3nw1{bJOy+eBJjK=QqNjI;Q6;Rp5 z&035pZDUZ#%Oa;&_7x0T<7!RW`#YBOj}F380Bq?MjjEhrvlCATPdkCTTl+2efTX$k zH&0zR1n^`C3ef~^sXzJK-)52(T}uTG%OF8yDhT76L~|^+hZ2hiSM*QA9*D5odI1>& z9kV9jC~twA5MwyOx(lsGD_ggYmztXPD`2=_V|ks_FOx!_J8!zM zTzh^cc+=VNZ&(OdN=y4Juw)@8-85lwf_#VMN!Ed(eQiRiLB2^2e`4dp286h@v@`O%_b)Y~A; zv}r6U?zs&@uD_+(_4bwoy7*uozNvp?bXFoB8?l8yG0qsm1JYzIvB_OH4_2G*IIOwT zVl%HX1562vLVcxM_RG*~w_`FbIc!(T=3>r528#%mwwMK}uEhJ()3MEby zQQjzqjWkwfI~;Fuj(Lj=Ug0y`>~C7`w&wzjK(rPw+Hpd~EvQ-ufQOiB4OMpyUKJhw zqEt~jle9d7S~LI~$6Z->J~QJ{Vdn3!c}g9}*KG^Kzr^(7VI5Gk(mHLL{itj_hG?&K4Ws0+T4gLfi3eu$N=`s36geNC?c zm!~}vG6lx9Uf^5M;bWntF<-{p^bruy~f?sk9 zcETAPQZLoJ8JzMMg<-=ju4keY@SY%Wo?u9Gx=j&dfa6LIAB|IrbORLV1-H==Z1zCM zeZcOYpm5>U2fU7V*h;%n`8 zN95QhfD994={1*<2vKLCNF)feKOGk`R#K~G=;rfq}|)s20&MCa65 zUM?xF5!&e0lF%|U!#rD@I{~OsS_?=;s_MQ_b_s=PuWdC)q|UQ&ea)DMRh5>fpQjXe z%9#*x=7{iRCtBKT#H>#v%>77|{4_slZ)XCY{s3j_r{tdpvb#|r|sbS^dU1x70$eJMU!h{Y7Kd{dl}9&vxQl6Jt1a` zHQZrWyY0?!vqf@u-fxU_@+}u(%Wm>0I#KP48tiAPYY!TdW(o|KtVI|EUB9V`CBBNaBLVih7+yMVF|GSoIQD0Jfb{ z!OXq;(>Z?O`1gap(L~bUcp>Lc@Jl-})^=6P%<~~9ywY=$iu8pJ0m*hOPzr~q`23eX zgbs;VOxxENe0UMVeN*>uCn9Gk!4siN-e>x)pIKAbQz!G)TcqIJ0`JBBaX>1-4_XO_-HCS^vr2vjv#7KltDZdyQ{tlWh4$Gm zB>|O1cBDC)yG(sbnc*@w6e%e}r*|IhpXckx&;sQCwGdKH+3oSG-2)Bf#x`@<4ETAr z0My%7RFh6ZLiZ_;X6Mu1YmXx7C$lSZ^}1h;j`EZd6@%JNUe=btBE z%s=Xmo1Ps?8G`}9+6>iaB8bgjUdXT?=trMu|4yLX^m0Dg{m7rpKNJey|EwHI+nN1e zL^>qN%5Fg)dGs4DO~uwIdXImN)QJ*Jhpj7$fq_^`{3fwpztL@WBB}OwQ#Epo-mqMO zsM$UgpFiG&d#)lzEQ{3Q;)&zTw;SzGOah-Dpm{!q7<8*)Ti_;xvV2TYXa}=faXZy? z3y?~GY@kl)>G&EvEijk9y1S`*=zBJSB1iet>0;x1Ai)*`^{pj0JMs)KAM=@UyOGtO z3y0BouW$N&TnwU6!%zS%nIrnANvZF&vB1~P5_d`x-giHuG zPJ;>XkVoghm#kZXRf>qxxEix;2;D1CC~NrbO6NBX!`&_$iXwP~P*c($EVV|669kDO zKoTLZNF4Cskh!Jz5ga9uZ`3o%7Pv`d^;a=cXI|>y;zC3rYPFLQkF*nv(r>SQvD*## z(Vo%^9g`%XwS0t#94zPq;mYGLKu4LU3;txF26?V~A0xZbU4Lmy`)>SoQX^m7fd^*E z+%{R4eN!rIk~K)M&UEzxp9dbY;_I^c} zOc{wlIrN_P(PPqi51k_$>Lt|X6A^|CGYgKAmoI#Li?;Wq%q~q*L7ehZkUrMxW67Jl zhsb~+U?33QS>eqyN{(odAkbopo=Q$Az?L+NZW>j;#~@wCDX?=L5SI|OxI~7!Pli;e zELMFcZtJY3!|=Gr2L4>z8yQ-{To>(f80*#;6`4IAiqUw`=Pg$%C?#1 z_g@hIGerILSU>=P>z{gM|DS91A4cT@PEIB^hSop!uhMo#2G;+tQSpDO_6nOnPWSLU zS;a9m^DFMXR4?*X=}d7l;nXuHk&0|m`NQn%d?8|Ab3A9l9Jh5s120ibWBdB z$5YwsK3;wvp!Kn@)Qae{ef`0#NwlRpQ}k^r>yos_Ne1;xyKLO?4)t_G4eK~wkUS2A&@_;)K0-03XGBzU+5f+uMDxC z(s8!8!RvdC#@`~fx$r)TKdLD6fWEVdEYtV#{ncT-ZMX~eI#UeQ-+H(Z43vVn%Yj9X zLdu9>o%wnWdvzA-#d6Z~vzj-}V3FQ5;axDIZ;i(95IIU=GQ4WuU{tl-{gk!5{l4_d zvvb&uE{%!iFwpymz{wh?bKr1*qzeZb5f6e6m_ozRF&zux2mlK=v_(_s^R6b5lu?_W4W3#<$zeG~Pd)^!4tzhs}-Sx$FJP>)ZGF(hVTH|C3(U zs0PO&*h_ zNA-&qZpTP$$LtIgfiCn07}XDbK#HIXdmv8zdz4TY;ifNIH-0jy(gMSByG2EF~Th#eb_TueZC` zE?3I>UTMpKQ})=C;6p!?G)M6w^u*A57bD?2X`m3X^6;&4%i_m(uGJ3Z5h`nwxM<)H z$I5m?wN>O~8`BGnZ=y^p6;0+%_0K}Dcg|K;+fEi|qoBqvHj(M&aHGqNF48~XqhtU? z^ogwBzRlOfpAJ+Rw7IED8lRbTdBdyEK$gPUpUG}j-M42xDj_&qEAQEtbs>D#dRd7Y z<&TpSZ(quQDHiCFn&0xsrz~4`4tz!CdL8m~HxZM_agu@IrBpyeL1Ft}V$HX_ZqDPm z-f89)pjuEzGdq-PRu`b1m+qBGY{zr_>{6Ss>F|xHZlJj9dt5HD$u`1*WZe)qEIuDSR)%z+|n zatVlhQ?$w#XRS7xUrFE;Y8vMGhQS5*T{ZnY=q1P?w5g$OKJ#M&e??tAmPWHMj3xhS ziGxapy?kn@$~2%ZY;M8Bc@%$pkl%Rvj!?o%agBvpQ-Q61n9kznC4ttrRNQ4%GFR5u zyv%Yo9~yxQJWJSfj z?#HY$y=O~F|2pZs22pu|_&Ajd+D(Mt!nPUG{|1nlvP`=R#kKH zO*s$r_%ss5h1YO7k0bHJ2CXN)Yd6CHn~W!R=SqkWe=&nAZu(Q1G!xgcUilM@YVei@2@a`8he z9@pM`)VB*=e7-MWgLlXlc)t;fF&-AwM{E-EX}pViFn0I0CNw2bNEnN2dj!^4(^zS3 zobUm1uQnpqk_4q{pl*n06=TfK_C>UgurKFjRXsK_LEn};=79`TB12tv6KzwSu*-C8 z;=~ohDLZylHQ|Mpx-?yql>|e=vI1Z!epyUpAcDCp4T|*RV&X`Q$0ogNwy6mFALo^@ z9=&(9txO8V@E!@6^(W0{*~CT>+-MA~vnJULBxCTUW>X5>r7*eXYUT0B6+w@lzw%n> z_VjJ<2qf|(d6jYq2(x$(ZDf!yVkfnbvNmb5c|hhZ^2TV_LBz`9w!e_V*W_(MiA7|= z&EeIIkw*+$Xd!)j8<@_<}A5;~A_>3JT*kX^@}cDoLd>Qj<`Se^wdUa(j0dp+Tl8EptwBm{9OGsdFEq zM`!pjf(Lm(`$e3FLOjqA5LnN5o!}z{ zNf}rJuZh@yUtq&ErjHeGzX4(!luV!jB&;FAP|!R_QHYw#^Z1LwTePAKJ6X&IDNO#; z)#I@Xnnzyij~C@UH~X51JCgQeF0&hTXnuoElz#m{heZRexWc0k4<>0+ClX7%0 zEBqCCld1tD9Zwkr4{?Nor19#E5-YKfB8d?qgR82-Ow2^AuNevly2*tHA|sK!ybYkX zm-sLQH72P&{vEAW6+z~O5d0qd=xW~rua~5a?ymYFSD@8&gV)E5@RNNBAj^C99+Z5Z zR@Pq55mbCQbz+Mn$d_CMW<-+?TU960agEk1J<>d>0K=pF19yN))a~4>m^G&tc*xR+yMD*S=yip-q=H zIlredHpsJV8H(32@Zxc@bX6a21dUV95Th--8pE6C&3F>pk=yv$yd6@Haw;$v4+Fcb zRwn{Qo@0`7aPa2LQOP}j9v>sjOo5Kqvn|`FLizX zB+@-u4Lw|jsvz{p^>n8Vo8H2peIqJJnMN}A)q6%$Tmig7eu^}K2 zrh$X?T|ZMsoh{6pdw1G$_T<`Ds-G=jc;qcGdK4{?dN2-XxjDNbb(7pk|3JUVCU4y; z)?LXR>f+AAu)JEiti_Zy#z5{RgsC}R(@jl%9YZ>zu~hKQ*AxbvhC378-I@{~#%Y`Z zy=a=9YpewPIC+gkEUUwtUL7|RU7=!^Aa}Mk^6uxOgRGA#JXjWLsjFUnix|Mau{hDT z7mn*z1m5g`vP(#tjT0Zy4eAY(br&!RiiXE=ZI!{sE1#^#%x^Z7t1U)b<;%Y}Q9=5v z;wpDCEZ@OE36TWT=|gxigT@VaW9BvHS05;_P(#s z8zI4XFQys}q)<`tkX$WnSarn{3e!s}4(J!=Yf>+Y>cP3f;vr63f2{|S^`_pWc)^5_!R z*(x-fuBxL51@xe!lnDBKi}Br$c$BMZ3%f2Sa6kLabiBS{pq*yj;q|k(86x`PiC{p6 z_bxCW{>Q2BA8~Ggz&0jkrcU+-$ANBsOop*ms>34K9lNYil@}jC;?cYP(m^P}nR6FV zk(M%48Z&%2Rx$A&FhOEirEhY0(dn;-k(qkTU)sFQ`+-ih+s@A8g?r8Pw+}2;35WYf zi}VO`jS`p(tc)$X$a>-#WXoW!phhatC*$}|rk>|wUU71eUJG^$c6_jwX?iSHM@6__ zvV|6%U*$sSXJu9SX?2%M^kK|}a2QJ8AhF{fuXrHZxXsI~O zGKX45!K7p*MCPEQ=gp?eu&#AW*pR{lhQR##P_*{c_DjMGL|3T3-bSJ(o$|M{ytU}> zAV>wq*uE*qFo9KvnA^@juy{x<-u*#2NvkV={Ly}ysKYB-k`K3@K#^S1Bb$8Y#0L0# z`6IkSG&|Z$ODy|VLS+y5pFJx&8tvPmMd8c9FhCyiU8~k6FwkakUd^(_ml8`rnl>JS zZV){9G*)xBqPz^LDqRwyS6w86#D^~xP4($150M)SOZRe9sn=>V#aG0Iy(_^YcPpIz8QYM-#s+n% z@Jd?xQq?Xk6=<3xSY7XYP$$yd&Spu{A#uafiIfy8gRC`o0nk{ezEDjb=q_qRAlR1d zFq^*9Gn)yTG4b}R{!+3hWQ+u3GT~8nwl2S1lpw`s0X_qpxv)g+JIkVKl${sYf_nV~B>Em>M;RlqGb5WVil(89 zs=ld@|#;dq1*vQGz=7--Br-|l) zZ%Xh@v8>B7P?~}?Cg$q9_={59l%m~O&*a6TKsCMAzG&vD>k2WDzJ6!tc!V)+oxF;h zJH;apM=wO?r_+*#;ulohuP=E>^zon}a$NnlcQ{1$SO*i=jnGVcQa^>QOILc)e6;eNTI>os=eaJ{*^DE+~jc zS}TYeOykDmJ=6O%>m`i*>&pO_S;qMySJIyP=}4E&J%#1zju$RpVAkZbEl+p%?ZP^C z*$$2b4t%a(e+%>a>d_f_<JjxI#J1x;=hPd1zFPx=6T$;;X1TD*2(edZ3f46zaAoW>L53vS_J*N8TMB|n+;LD| zC=GkQPpyDY#Am4l49chDv*gojhRj_?63&&8#doW`INATAo(qY#{q}%nf@eTIXmtU< zdB<7YWfyCmBs|c)cK>1)v&M#!yNj#4d$~pVfDWQc_ke1?fw{T1Nce_b`v|Vp5ig(H zJvRD^+ps46^hLX;=e2!2e;w9y1D@!D$c@Jc&%%%IL=+xzw55&2?darw=9g~>P z9>?Kdc$r?6c$m%x2S$sdpPl>GQZ{rC9mPS63*qjCVa?OIBj!fW zm|g?>CVfGXNjOfcyqImXR_(tXS(F{FcoNzKvG5R$IgGaxC@)i(e+$ME}vPVIhd|mx2IIE+f zM?9opQHIVgBWu)^A|RzXw!^??S!x)SZOwZaJkGjc<_}2l^eSBm!eAJG9T>EC6I_sy z?bxzDIAn&K5*mX)$RQzDA?s)-no-XF(g*yl4%+GBf`##bDXJ==AQk*xmnatI;SsLp zP9XTHq5mmS=iWu~9ES>b%Q=1aMa|ya^vj$@qz9S!ih{T8_PD%Sf_QrNKwgrXw9ldm zHRVR98*{C?_XNpJn{abA!oix_mowRMu^2lV-LPi;0+?-F(>^5#OHX-fPED zCu^l7u3E%STI}c4{J2!)9SUlGP_@!d?5W^QJXOI-Ea`hFMKjR7TluLvzC-ozCPn1`Tpy z!vlv@_Z58ILX6>nDjTp-1LlFMx~-%GA`aJvG$?8*Ihn;mH37eK**rmOEwqegf-Ccx zrIX4;{c~RK>XuTXxYo5kMiWMy)!IC{*DHG@E$hx?RwP@+wuad(P1{@%tRkyJRqD)3 zMHHHZ4boqDn>-=DgR5VlhQTpfVy182Gk;A_S8A1-;U1RR>+$62>(MUx@Nox$vTjHq z%QR=j!6Gdyb5wu7y(YUktwMuW5<@jl?m4cv4BODiT5o8qVdC0MBqGr@-YBIwnpZAY znX9(_uQjP}JJ=!~Ve9#5I~rUnN|P_3D$LqZcvBnywYhjlMSFHm`;u9GPla{5QD7(7*6Tb3Svr8;(nuAd81q$*uq6HC_&~je*Ca7hP4sJp0av{M8480wF zxASi7Qv+~@2U%Nu1Ud;s-G4CTVWIPyx!sg&8ZG0Wq zG_}i3C(6_1>q3w!EH7$Kwq8uBp2F2N7}l65mk1p*9v0&+;th=_E-W)E;w}P(j⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.properties b/4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..3fa8f862 --- /dev/null +++ b/4 WEEK/item-service/item-service/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/4 WEEK/item-service/item-service/gradlew b/4 WEEK/item-service/item-service/gradlew new file mode 100644 index 00000000..1aa94a42 --- /dev/null +++ b/4 WEEK/item-service/item-service/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/4 WEEK/item-service/item-service/gradlew.bat b/4 WEEK/item-service/item-service/gradlew.bat new file mode 100644 index 00000000..93e3f59f --- /dev/null +++ b/4 WEEK/item-service/item-service/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/4 WEEK/item-service/item-service/settings.gradle b/4 WEEK/item-service/item-service/settings.gradle new file mode 100644 index 00000000..df5bd80b --- /dev/null +++ b/4 WEEK/item-service/item-service/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'item-service' diff --git a/4 WEEK/item-service/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java b/4 WEEK/item-service/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java new file mode 100644 index 00000000..1311934b --- /dev/null +++ b/4 WEEK/item-service/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java @@ -0,0 +1,13 @@ +package hello.itemservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ItemServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(ItemServiceApplication.class, args); + } + +} diff --git a/4 WEEK/item-service/item-service/src/main/resources/application.properties b/4 WEEK/item-service/item-service/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/4 WEEK/item-service/item-service/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/4 WEEK/item-service/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java b/4 WEEK/item-service/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java new file mode 100644 index 00000000..e2ded1be --- /dev/null +++ b/4 WEEK/item-service/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java @@ -0,0 +1,13 @@ +package hello.itemservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ItemServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/4 WEEK/item-service/settings.gradle b/4 WEEK/item-service/settings.gradle new file mode 100644 index 00000000..df5bd80b --- /dev/null +++ b/4 WEEK/item-service/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'item-service' diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java b/4 WEEK/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java new file mode 100644 index 00000000..1311934b --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/ItemServiceApplication.java @@ -0,0 +1,13 @@ +package hello.itemservice; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ItemServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(ItemServiceApplication.class, args); + } + +} diff --git a/4 WEEK/item-service/src/main/resources/application.properties b/4 WEEK/item-service/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/4 WEEK/item-service/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java new file mode 100644 index 00000000..e2ded1be --- /dev/null +++ b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemServiceApplicationTests.java @@ -0,0 +1,13 @@ +package hello.itemservice; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ItemServiceApplicationTests { + + @Test + void contextLoads() { + } + +} From 820aa5e4918a3331f23d996cb3702b95033aee3b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 27 Nov 2023 16:05:43 +0900 Subject: [PATCH 049/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Item=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Item 클래스 생성 상품의 필요한 정보를 담는 클래스를 생성하였습니다. 빌드패턴을 사용하여 생성자를 만들어주고, getter와 setter는 어노테이션으로 처리하였습니다. --- .../main/java/hello/itemservice/item/Item.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java new file mode 100644 index 00000000..5450f554 --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java @@ -0,0 +1,18 @@ +package hello.itemservice.item; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Item { + private Long id; + private String name; + private double price; + private Long quantity; + public void Item(String name, double price, Long quantity){ + this.name = name; + this.price = price; + this.quantity = quantity; + } +} From 3f81a6c95ed0e68c46394b8c5d6f534f452ad642 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 10:50:50 +0900 Subject: [PATCH 050/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemRepository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemRepository 인터페이스 생성 상품을 저장할 save() 와 아이디로 상품을 찾을 findById() 를 만들 예정이므로 인터페이스에 생성해두었습니다. --- .../main/java/hello/itemservice/item/ItemRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java new file mode 100644 index 00000000..38630f36 --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -0,0 +1,6 @@ +package hello.itemservice.item; + +public interface ItemRepository { + void save(Item item); + Item findById(Long itemId); +} From 05683482131f190fae63d5fcf87c35644aa6fd29 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 10:52:49 +0900 Subject: [PATCH 051/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemService=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemService 인터페이스 생성 상품을 저장하도록 시킬 join() 과 수정 시킬 update(), 상품을 찾아 반환할 findItem() 을 만들 예정이라 추가해두었습니다. --- .../src/main/java/hello/itemservice/item/ItemService.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java new file mode 100644 index 00000000..1a27768d --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java @@ -0,0 +1,7 @@ +package hello.itemservice.item; + +public interface ItemService { + void join(Item item); + void updateItem(Item item); + Item findItem(Long itemId); +} From 6fdb74291560c229516495df3db6d0641063bfb8 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 10:59:29 +0900 Subject: [PATCH 052/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemPepository=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemPepository 어노테이션 추가 자동 등록 사용을 위한 어노테이션 Repository를 추가하였습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index 38630f36..a4fb4794 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -1,5 +1,8 @@ package hello.itemservice.item; +import org.springframework.stereotype.Repository; + +@Repository public interface ItemRepository { void save(Item item); Item findById(Long itemId); From b7ad65e39e5c82c9c8d02f29d30334ad65d12bfc Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 11:05:37 +0900 Subject: [PATCH 053/190] =?UTF-8?q?[=20BE=20]=20(feat)=20MemoryItemReposit?= =?UTF-8?q?ory=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) MemoryItemRepository 클래스 생성 ItemRepository를 상속받는 클래스를 생성하여 아이디와 상품을 저장할 저장소 store를 만들어주었고, 상품 번호 SEQUENCE를 만들어주었습니다. --- .../hello/itemservice/item/MemoryItemRepository.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java new file mode 100644 index 00000000..d3c8c851 --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -0,0 +1,9 @@ +package hello.itemservice.item; + +import java.util.HashMap; +import java.util.Map; + +public class MemoryItemRepository implements ItemRepository { + private static Map store = new HashMap<>(); + private static long SEQUENCE = 0L; +} From 735c6c536307dae94b9195aacc9edd78a3514480 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 11:07:37 +0900 Subject: [PATCH 054/190] =?UTF-8?q?[=20BE=20]=20(feat)=20MemoryItemReposit?= =?UTF-8?q?ory=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) MemoryItemRepository 클래스 수정 save() 메서드를 오버라이딩하여 상품을 저장하는 메서드로 만들어주었습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index d3c8c851..32235e1f 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -6,4 +6,10 @@ public class MemoryItemRepository implements ItemRepository { private static Map store = new HashMap<>(); private static long SEQUENCE = 0L; + @Override + public void save(Item item) { + item.setId(++SEQUENCE); + store.put(item.getId(),item); + } + } From 5d5fbc5d6a185fb0dbf7c733156204a93071e6ad Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 11:12:56 +0900 Subject: [PATCH 055/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemRepository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemRepository 클래스에 기능 추가 아이디로 상품을 찾아오는 findById를 오버라이딩하여 저장소 store에서 아이디로 상품을 찾아오도록 만들어주었습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 32235e1f..7bd80f34 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -12,4 +12,8 @@ public void save(Item item) { store.put(item.getId(),item); } + @Override + public Item findById(Long itemId) { + return store.get(itemId); + } } From a3f7c3fb8f4d632eed76f1af5ab2f32e49dae8b1 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 11:21:56 +0900 Subject: [PATCH 056/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemService=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemService 어노테이션 추가 자동 등록을 위한 어노테이션 Service를 추가해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java index 1a27768d..63dc3627 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java @@ -1,5 +1,8 @@ package hello.itemservice.item; +import org.springframework.stereotype.Service; + +@Service public interface ItemService { void join(Item item); void updateItem(Item item); From 91c40454d8fb47e415e5f48b6ccf28c46b1f424b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Tue, 28 Nov 2023 11:23:41 +0900 Subject: [PATCH 057/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemServiceImpl 클래스 생성 ItemRepository의 기능을 호출해야하므로 final 변수로 선언해주었고, 생성자에 Autowired 어노테이션을 사용하여 자동연결 해주었습니다. --- .../java/hello/itemservice/item/ItemServiceImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java new file mode 100644 index 00000000..a0b28f03 --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -0,0 +1,12 @@ +package hello.itemservice.item; + +import org.springframework.beans.factory.annotation.Autowired; + +public class ItemServiceImpl implements ItemService{ + private final ItemRepository itemRepository; + + @Autowired + public ItemServiceImpl(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } +} From 0aa846f2f180e2ac30c161d6419ba6ddf0358f77 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:09:27 +0900 Subject: [PATCH 058/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20join=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemService 클래스에 join 메서드 구현 상품 정보 저장을 지시하는 메서드를 구현하였습니다. --- .../main/java/hello/itemservice/item/ItemServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java index a0b28f03..0816ac83 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -9,4 +9,10 @@ public class ItemServiceImpl implements ItemService{ public ItemServiceImpl(ItemRepository itemRepository) { this.itemRepository = itemRepository; } + + @Override + public void join(Item item) { + itemRepository.save(item); + } + } From 5577a0ce431d27e9fc9a189c53569720b2510822 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:12:34 +0900 Subject: [PATCH 059/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20findItem=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemService 클래스에 findItem 메서드 구현 상품을 찾도록 지시하는 메서드를 구현하였습니다. --- .../main/java/hello/itemservice/item/ItemServiceImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java index 0816ac83..aaa3a55c 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -15,4 +15,9 @@ public void join(Item item) { itemRepository.save(item); } + + @Override + public Item findItem(Long itemId) { + return itemRepository.findById(itemId); + } } From 20fc3bf9e16152592bda8aa3d5a89d8bda90b3e6 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:26:08 +0900 Subject: [PATCH 060/190] =?UTF-8?q?[=20BE=20]=20(perf)=20itemRepository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) itemRepository 클래스 수정 컨트롤러에서 save() 메서드를 호출하여 업데이트 방법을 고려해봤으나, 떠오르는 방법이 없어 update() 메서드를 추가해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index a4fb4794..03b604a1 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -6,4 +6,5 @@ public interface ItemRepository { void save(Item item); Item findById(Long itemId); + void update(long itemId, String itemName, double itemPrice, long itemQuantity); } From b76a7f4ce747bf038a747efa917cda451c631400 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:30:49 +0900 Subject: [PATCH 061/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemoryItemReposit?= =?UTF-8?q?ory=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemoryItemRepository 클래스 수정 상품 정보를 수정하는 메서드를 구현하였습니다. --- .../hello/itemservice/item/MemoryItemRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 7bd80f34..f433d601 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -16,4 +16,14 @@ public void save(Item item) { public Item findById(Long itemId) { return store.get(itemId); } + + @Override + public void update(long itemId, String itemName, double itemPrice, long itemQuantity) { + Item item = store.get(itemId); + item.setName(itemName); + item.setPrice(itemPrice); + item.setQuantity(itemQuantity); + store.replace(item.getId(),item); + } + } From 8c2aacbfd55840d24068d4f9f588d13df8da0719 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:49:55 +0900 Subject: [PATCH 062/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemRepository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemRepository 클래스 수정 상품 수정에 필요한 정보를 매개변수로 받아오는데 가시성이 떨어지는것 같아 Item 객체로 바꾸었습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index 03b604a1..a7bd64bd 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -6,5 +6,5 @@ public interface ItemRepository { void save(Item item); Item findById(Long itemId); - void update(long itemId, String itemName, double itemPrice, long itemQuantity); + void update(long itemId, Item updatedItem); } From 3cfb5cc1d290453d2e66c34dd761549968931be5 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:50:40 +0900 Subject: [PATCH 063/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemService 클래스 수정 상품 수정에 필요한 매개변수를 서비스 쪽에서 받아오도록 했습니다. --- .../src/main/java/hello/itemservice/item/ItemService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java index 63dc3627..12a96798 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java @@ -5,6 +5,6 @@ @Service public interface ItemService { void join(Item item); - void updateItem(Item item); + void updateItem(Item item, String itemName, double itemPrice, long itemQuantity); Item findItem(Long itemId); } From f81b72f0d07849cf498d21f65ddf435853721627 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:51:52 +0900 Subject: [PATCH 064/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemoryItemReposit?= =?UTF-8?q?ory=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemoryItemRepository 클래스 수정 저장소에 저장되어있는 상품을 id로 찾아 replace() 로 값을 바꾸어주었습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index f433d601..b9b9ac4a 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -18,12 +18,8 @@ public Item findById(Long itemId) { } @Override - public void update(long itemId, String itemName, double itemPrice, long itemQuantity) { - Item item = store.get(itemId); - item.setName(itemName); - item.setPrice(itemPrice); - item.setQuantity(itemQuantity); - store.replace(item.getId(),item); + public void update(long itemId, Item updatedItem) { + store.replace(itemId,updatedItem); } } From 03c87c5db573d8ceada0f14093cf07781a643ff8 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Thu, 30 Nov 2023 00:56:39 +0900 Subject: [PATCH 065/190] =?UTF-8?q?[=20BE=20]=20(feat)=20itemServiceImpl?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20updateItem=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) itemServiceImpl 클래스에 updateItem 메서드 구현 상품 객체를 받아와 itemRepository id와 setter 로 수정한 상품 객체를 넘겼습니다. 서비스에서 setter로 정보를 바꾸는게 맞는가 싶습니다. 그렇다고 repository에서 많은 매개변수를 받아와 연산하는 것도 아닌것같고.. --- .../main/java/hello/itemservice/item/ItemServiceImpl.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java index aaa3a55c..ec7f7d7a 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -15,6 +15,13 @@ public void join(Item item) { itemRepository.save(item); } + @Override + public void updateItem(Item item, String itemName, double itemPrice, long itemQuantity) { + item.setName(itemName); + item.setPrice(itemPrice); + item.setQuantity(itemQuantity); + itemRepository.update(item.getId(), item); + } @Override public Item findItem(Long itemId) { From 0b6d8a4b8b1fba44601dbe1497257601c949a093 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 14:30:38 +0900 Subject: [PATCH 066/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemRepository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemRepository 클래스 어노테이션 수정 @Repository 가 인터페이스에 설정되어있어 구현체로 수정해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 2 +- .../main/java/hello/itemservice/item/MemoryItemRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index a7bd64bd..f29dc0da 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -2,7 +2,7 @@ import org.springframework.stereotype.Repository; -@Repository + public interface ItemRepository { void save(Item item); Item findById(Long itemId); diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index b9b9ac4a..00b51c27 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -19,7 +19,7 @@ public Item findById(Long itemId) { @Override public void update(long itemId, Item updatedItem) { - store.replace(itemId,updatedItem); + store.put(itemId,updatedItem); } } From 3c69c3daf9fc30a5f845b9fffd297647376715aa Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 14:31:14 +0900 Subject: [PATCH 067/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemService 클래스 어노테이션 수정 @Service 가 인터페이스에 설정되어있어 구현체로 수정해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemService.java | 2 +- .../src/main/java/hello/itemservice/item/ItemServiceImpl.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java index 12a96798..19f4352d 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java @@ -2,7 +2,7 @@ import org.springframework.stereotype.Service; -@Service + public interface ItemService { void join(Item item); void updateItem(Item item, String itemName, double itemPrice, long itemQuantity); diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java index ec7f7d7a..b1de2867 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -1,7 +1,9 @@ package hello.itemservice.item; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +@Service public class ItemServiceImpl implements ItemService{ private final ItemRepository itemRepository; From 929e51caf64ffaf0d0629dd03417be07ffaece90 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 14:33:47 +0900 Subject: [PATCH 068/190] =?UTF-8?q?[=20BE=20]=20(perf)=20MemoryItemReposit?= =?UTF-8?q?ory=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) MemoryItemRepository 클래스 어노테이션 추가 인터페이스가 아닌 구현체에 @Repository 어노테이션을 추가하였습니다. --- .../main/java/hello/itemservice/item/MemoryItemRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 00b51c27..3059126f 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -1,8 +1,11 @@ package hello.itemservice.item; +import org.springframework.stereotype.Repository; + import java.util.HashMap; import java.util.Map; +@Repository public class MemoryItemRepository implements ItemRepository { private static Map store = new HashMap<>(); private static long SEQUENCE = 0L; From f7acad55af382b92b1537ece7c4ddf53dbaa3429 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 15:35:31 +0900 Subject: [PATCH 069/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemListForm=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemListForm 작성 상품 리스트가 출력될 폼을 작성하였습니다. --- .../resources/templates/ItemListForm.html | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 4 WEEK/item-service/src/main/resources/templates/ItemListForm.html diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html new file mode 100644 index 00000000..83484475 --- /dev/null +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -0,0 +1,49 @@ + + + + + 상품 목록 + + + +
+

상품 목록

+
+ +
+
+ + + + + + + + + + + + + + + +
ID상품명가격수량
+ ID + + 상품 이름 + + 000 + + 999 +
+
+ + + \ No newline at end of file From bac15d87c747070385a4500dd277a3fd8e4b2902 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 15:36:00 +0900 Subject: [PATCH 070/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemDetailForm=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemDetailForm 작성 상품 상세 폼을 작성하였습니다. --- .../resources/templates/ItemDetailForm.html | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html new file mode 100644 index 00000000..fae17596 --- /dev/null +++ b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html @@ -0,0 +1,32 @@ + + + + + 상품 상세 + + + +
+

상품 상세

+
+
+ 상품 ID
+
+ 상품명
+
+ 가격
+
+ 수량
+
+
+ + +
+ + + + \ No newline at end of file From eda8cae11b3b740c4d40ce9848c295cd45512063 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 15:36:22 +0900 Subject: [PATCH 071/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemSaveForm=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemSaveForm 작성 상품 등록 폼을 작성하였습니다. --- .../resources/templates/ItemSaveForm.html | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html new file mode 100644 index 00000000..836c3c7b --- /dev/null +++ b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html @@ -0,0 +1,29 @@ + + + + + 상품 등록 + + + +
+

상품 등록 폼

+
+
+

상품 입력

+ 상품명
+
+ 가격
+
+ 수량
+
+
+ + +
+ + \ No newline at end of file From 073c32c42e961b66d7606d1a7fed04fdda2edaf1 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Fri, 15 Dec 2023 15:36:56 +0900 Subject: [PATCH 072/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemUpdateForm=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemUpdateForm 작성 상품 수정 폼을 작성하였습니다. 상품 ID 부분은 수정이 불가하기에 disabled 속성을 부여하였습니다. --- .../resources/templates/ItemUpdateForm.html | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html new file mode 100644 index 00000000..1f3aa427 --- /dev/null +++ b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html @@ -0,0 +1,30 @@ + + + + + 상품 수정 + + + +
+

상품 수정 폼

+
+
+ 상품 ID
+
+ 상품명
+
+ 가격
+
+ 수량
+
+
+ + +
+ + \ No newline at end of file From fe7d1c29f7179b2cf32ab3c9901e57950979c0ae Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:09:16 +0900 Subject: [PATCH 073/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemController 클래스 생성 itemController를 생성하여 url 매핑을 해주어 상품 목록폼을 화면에 띄우도록 하였습니다. --- .../hello/itemservice/item/ItemController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java new file mode 100644 index 00000000..de6a6cf8 --- /dev/null +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -0,0 +1,14 @@ +package hello.itemservice.item; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class ItemController { + + @GetMapping("/itemList") + public String getItemListForm(){ + return "ItemListForm"; + } + +} From d85e1a388560eb04490b94f1aeb49df8ee673bef Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:10:06 +0900 Subject: [PATCH 074/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=83=81=ED=92=88?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemController 클래스의 상품상세 매핑 url 매핑을 해주어 상품 상세폼을 화면에 띄우도록 하였습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index de6a6cf8..c56716ad 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -11,4 +11,9 @@ public String getItemListForm(){ return "ItemListForm"; } + @GetMapping("/itemDetail") + public String getItemDetailForm(){ + return "ItemDetailForm"; + } + } From 7676d969a3aa861474d287549cff78814c5bac18 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:10:29 +0900 Subject: [PATCH 075/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=83=81=ED=92=88?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemController 클래스의 상품등록 매핑 url 매핑을 해주어 상품 등록폼을 화면에 띄우도록 하였습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index c56716ad..336823a2 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -16,4 +16,9 @@ public String getItemDetailForm(){ return "ItemDetailForm"; } + @GetMapping("/itemSave") + public String getItemSaveForm(){ + return "ItemSaveForm"; + } + } From 18caff8d85c8443df432b05e36480ab0038f920f Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:10:56 +0900 Subject: [PATCH 076/190] =?UTF-8?q?[=20BE=20]=20(feat)=20ItemController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=83=81=ED=92=88?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) ItemController 클래스의 상품수정 매핑 url 매핑을 하여 상품 수정폼을 화면에 띄우도록 하였습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 336823a2..80a884b3 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -21,4 +21,8 @@ public String getItemSaveForm(){ return "ItemSaveForm"; } + @GetMapping("/itemUpdate") + public String getItemUpdateForm(){ + return "ItemUpdateForm"; + } } From 9ca4a407cdc609a741743435c2c968fddebe4fb4 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:11:45 +0900 Subject: [PATCH 077/190] =?UTF-8?q?[=20BE=20]=20(perf)=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=83=81=EC=84=B8=ED=8F=BC=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) 상품 상세폼 버튼 수정 버튼을 누르면 해당 페이지로 이동하도록 수정하였습니다. --- .../src/main/resources/templates/ItemDetailForm.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html index fae17596..8bf7f004 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html @@ -23,8 +23,8 @@

상품 상세

수량


- - + + From 8e42b2386438631367ac9aa7756fa0fdf8190dfa Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:12:11 +0900 Subject: [PATCH 078/190] =?UTF-8?q?[=20BE=20]=20(perf)=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=AA=A9=EB=A1=9D=ED=8F=BC=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) 상품 목록폼 버튼 수정 버튼을 누르면 해당 페이지로 이동하도록 수정하였습니다. --- .../item-service/src/main/resources/templates/ItemListForm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html index 83484475..da89fbbd 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -16,7 +16,7 @@

상품 목록

- +
From 4deeaa28960d8e5bb7963defe52ebad9161f178d Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 00:12:26 +0900 Subject: [PATCH 079/190] =?UTF-8?q?[=20BE=20]=20(perf)=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EB=93=B1=EB=A1=9D=ED=8F=BC=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) 상품 등록폼 버튼 수정 버튼을 누르면 해당 페이지로 이동하도록 수정하였습니다. --- .../src/main/resources/templates/ItemSaveForm.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html index 836c3c7b..465ddc02 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html @@ -22,8 +22,8 @@

상품 입력

수량


- - + + \ No newline at end of file From b7f3070c36f3c086b7d3ee20cf37b6f94d593f8f Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 01:17:21 +0900 Subject: [PATCH 080/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemController=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemController 수정 상품 상세폼에 ItemRepository가 필요해 선언해주었습니다. --- .../java/hello/itemservice/item/ItemController.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 80a884b3..00e0e765 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -1,11 +1,22 @@ package hello.itemservice.item; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; @Controller public class ItemController { + private final ItemRepository itemRepository; + + @Autowired + public ItemController(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } + + @GetMapping("/itemList") public String getItemListForm(){ return "ItemListForm"; From e975064c9b26fdfc436644bbdb5d2ee3efc1c4d7 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 01:18:38 +0900 Subject: [PATCH 081/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemController=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EC=83=81=EC=84=B8=ED=8F=BC=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemController 상품 상세폼 메서드 수정 상품 아이디를 받아와 정보를 띄워야해 @PathVariable로 id를 받아오도록 하였습니다. --- .../main/java/hello/itemservice/item/ItemController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 00e0e765..c633fb54 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -22,8 +22,10 @@ public String getItemListForm(){ return "ItemListForm"; } - @GetMapping("/itemDetail") - public String getItemDetailForm(){ + @GetMapping("/{itemId}") + public String getItemDetailForm(@PathVariable Long itemId, Model model){ + Item item = itemRepository.findById(itemId); + model.addAttribute("item",item); return "ItemDetailForm"; } From ba6b106bba0ba4197441ea1da4290d705db2bd1b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 01:24:15 +0900 Subject: [PATCH 082/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Repository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20findAll()=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Repository 클래스 findAll()메서드 추가 상품 목록 폼에 상품들을 띄우려면 상품을 모두 찾아오는 메서드가 필요할 것 같아 추가하였습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 3059126f..57fb1fe1 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -2,7 +2,9 @@ import org.springframework.stereotype.Repository; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; @Repository @@ -25,4 +27,8 @@ public void update(long itemId, Item updatedItem) { store.put(itemId,updatedItem); } + public List findAll(){ + return new ArrayList<>(store.values()); + } + } From 1e0968e628fefc4391ac17902263d68c03a8a868 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 01:29:41 +0900 Subject: [PATCH 083/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Repsitory=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=20findAl?= =?UTF-8?q?l()=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Repsitory 인터페이스에 findAll() 메서드 추가 @Override 해주지않으니 findAll() 메서드를 찾지 못해 인터페이스에도 추가해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index f29dc0da..72d0acfa 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -2,9 +2,12 @@ import org.springframework.stereotype.Repository; +import java.util.List; + public interface ItemRepository { void save(Item item); Item findById(Long itemId); void update(long itemId, Item updatedItem); + List findAll(); } From e74d2e999f8497e66aa14172ac76bca2a4bc429b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 01:30:55 +0900 Subject: [PATCH 084/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20findAll()=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 클래스 findAll() 메서드 오버라이딩 @Override 해주지않으니 findAll() 메서드를 찾지 못해 인터페이스에 메서드를 생성해주고 어노테이션을 추가해주었습니다. --- .../main/java/hello/itemservice/item/MemoryItemRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 57fb1fe1..64655ad4 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -27,6 +27,7 @@ public void update(long itemId, Item updatedItem) { store.put(itemId,updatedItem); } + @Override public List findAll(){ return new ArrayList<>(store.values()); } From c9f93014860e5e4662cf55618054097d9068f984 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 17 Dec 2023 01:34:46 +0900 Subject: [PATCH 085/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20getItemListForm()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemController 클래스 getItemListForm() 메서드 수정 상품 목록을 출력하려면 상품 정보를 받아와야하기에 findAll() 메서드를 생성하고 받아왔습니다. --- .../main/java/hello/itemservice/item/ItemController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index c633fb54..4d548a59 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -6,6 +6,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import java.util.List; + @Controller public class ItemController { @@ -18,7 +20,9 @@ public ItemController(ItemRepository itemRepository) { @GetMapping("/itemList") - public String getItemListForm(){ + public String getItemListForm(Model model){ + List itemList = itemRepository.findAll(); + model.addAttribute("itemList",itemList); return "ItemListForm"; } From 640d0ced3d3849af99362b0e39ea9aee9945bef5 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:18:35 +0900 Subject: [PATCH 086/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20mapp?= =?UTF-8?q?ing=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller mapping수정 버튼을 눌렀을 때 기능을 만들려고 보니 폼을 띄우는 메서드와 매핑 이름이 중복되어 폼을 띄우는 메서드는 모두 'Form"을 붙여주었습니다. --- .../main/java/hello/itemservice/item/ItemController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 4d548a59..47bf29cc 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -19,7 +19,7 @@ public ItemController(ItemRepository itemRepository) { } - @GetMapping("/itemList") + @GetMapping("/itemListForm") public String getItemListForm(Model model){ List itemList = itemRepository.findAll(); model.addAttribute("itemList",itemList); @@ -33,12 +33,12 @@ public String getItemDetailForm(@PathVariable Long itemId, Model model){ return "ItemDetailForm"; } - @GetMapping("/itemSave") + @GetMapping("/itemSaveForm") public String getItemSaveForm(){ return "ItemSaveForm"; } - @GetMapping("/itemUpdate") + @GetMapping("/itemUpdateForm") public String getItemUpdateForm(){ return "ItemUpdateForm"; } From 7130c7c36d7bb69a543c680c0888b7342dae1ae4 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:36:49 +0900 Subject: [PATCH 087/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemSaveForm=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemSaveForm 수정 상품 등록 버튼에 href로 이동할 페이지 지정해놓았으나, 해당 버튼을 누르면 작동하는 메서드를 만들어 삭제했습니다. --- .../item-service/src/main/resources/templates/ItemSaveForm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html index 465ddc02..3e32c826 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html @@ -22,7 +22,7 @@

상품 입력

수량


- + From 03604efb51eab589011f5925aeba237d88a30289 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:38:50 +0900 Subject: [PATCH 088/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Controller=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20itemSave=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Controller 클래스 itemSave 메서드 추가 상품 등록 버튼을 누르면 작동하는 메서드를 추가하였습니다. 상품을 저장하고 상품 목록을 띄우도록 만들었습니다. --- .../main/java/hello/itemservice/item/ItemController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 47bf29cc..a290137d 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -38,6 +38,14 @@ public String getItemSaveForm(){ return "ItemSaveForm"; } + @GetMapping("/itemSave") + public String itemSave(Item item, Model model){ + itemRepository.save(item); + List itemList = itemRepository.findAll(); + model.addAttribute("itemList",itemList); + return "ItemListForm"; + } + @GetMapping("/itemUpdateForm") public String getItemUpdateForm(){ return "ItemUpdateForm"; From 61df295adc201b9e6034d6f756b9c72148bdbcdd Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:40:21 +0900 Subject: [PATCH 089/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 인터페이스 수정 상품 수정할때 아이디를 수정하지는 않으니 id를 굳이 받아올 필요가 없다고 생각해서 삭제했습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index 72d0acfa..73ff81bf 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -8,6 +8,6 @@ public interface ItemRepository { void save(Item item); Item findById(Long itemId); - void update(long itemId, Item updatedItem); + void update(Item updatedItem); List findAll(); } From 0282524f816393ab3cc64bd97581f057fae4eb3b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:41:13 +0900 Subject: [PATCH 090/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Service=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Service 클래스 수정 상품을 업데이트할 때, 상품의 아이디가 수정되진않으니 id를 삭제하였습니다. --- .../src/main/java/hello/itemservice/item/ItemServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java index b1de2867..48c033c5 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -22,7 +22,7 @@ public void updateItem(Item item, String itemName, double itemPrice, long itemQu item.setName(itemName); item.setPrice(itemPrice); item.setQuantity(itemQuantity); - itemRepository.update(item.getId(), item); + itemRepository.update(item); } @Override From e0babbeb1c999496baa7c7e861d6b8e557b1ab07 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:43:33 +0900 Subject: [PATCH 091/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20update=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 클래스 update 메서드 수정 컨틀롤러에서 update() 메서드를 사용하려했으나, 기능이 Service에 구현되어 있어 update() 메서드에 기능을 구현하고, 수정하는 아이템의 id로 저장소에서 찾아와 정보를 바꾸기때문에 store.put() 을 할 필요가 없어보여 삭제했습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 64655ad4..617176eb 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -23,8 +23,11 @@ public Item findById(Long itemId) { } @Override - public void update(long itemId, Item updatedItem) { - store.put(itemId,updatedItem); + public void update(Item updatedItem) { + Item findItem = findById(updatedItem.getId()); + findItem.setName(updatedItem.getName()); + findItem.setPrice(updatedItem.getPrice()); + findItem.setQuantity(updatedItem.getQuantity()); } @Override From af7319f22d88f8fd5f6edacc9dbcf442fd978236 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:47:31 +0900 Subject: [PATCH 092/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Controller=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20itemUpdate()=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Controller 클래스 itemUpdate() 메서드 추가 상품 수정버튼을 눌렀을 때의 기능을 작성하였습니다. --- .../main/java/hello/itemservice/item/ItemController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index a290137d..99dcb636 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -50,4 +50,12 @@ public String itemSave(Item item, Model model){ public String getItemUpdateForm(){ return "ItemUpdateForm"; } + + @GetMapping("/itemUpdate") + public String itemUpdate(Item item, Model model){ + itemRepository.update(item); + Item updatedItem = itemRepository.findById(item.getId()); + model.addAttribute("item",updatedItem); + return "ItemDetailForm"; + } } From debbb0bf542ee8e9b70c77410b03993678dbb627 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:51:25 +0900 Subject: [PATCH 093/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemListForm=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EB=93=B1=EB=A1=9D=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemListForm 상품 등록 버튼 수정 상품 등록폼 매핑을 바꾸어 itemSaveForm 으로 수정해주었습니다. --- .../item-service/src/main/resources/templates/ItemListForm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html index da89fbbd..b6294bf1 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -16,7 +16,7 @@

상품 목록

- +
From b20961c9759a7df4d50e593f98f64aba3b7a6419 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:52:30 +0900 Subject: [PATCH 094/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemUpdateForm=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=20=EB=B2=84=ED=8A=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemUpdateForm 취소 버튼 수정 취소 버튼을 눌렀을 때, 상품 목록으로 이동하도록 수정해주었습니다. --- .../src/main/resources/templates/ItemUpdateForm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html index 1f3aa427..2b523002 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html @@ -24,7 +24,7 @@

상품 수정 폼



- + \ No newline at end of file From 88d3a46c40246a1f1adb1660abcb10e4c649a1e7 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Mon, 18 Dec 2023 23:57:49 +0900 Subject: [PATCH 095/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20getItemUpdateForm()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemController 클래스 getItemUpdateForm() 메서드 수정 수정할 상품의 정보를 가지고 상품 수정폼으로 이동하도록 수정하였습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 99dcb636..268fa0ae 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -47,7 +47,9 @@ public String itemSave(Item item, Model model){ } @GetMapping("/itemUpdateForm") - public String getItemUpdateForm(){ + public String getItemUpdateForm(Item item, Model model){ + Item updateItem = itemRepository.findById(item.getId()); + model.addAttribute("updateItem",updateItem); return "ItemUpdateForm"; } From 7353625337e74fd9272bf004b3eb867bd247881d Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:43:22 +0900 Subject: [PATCH 096/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Item=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Item 클래스 수정 생성자를 만들고싶었는데 void를 붙여놔서 생성자 기능을 못해 삭제해주었고, 상품 수량의 타입이 Long 일 필요까진 없을것 같아 int 로 수정하였습니다. --- .../src/main/java/hello/itemservice/item/Item.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java index 5450f554..93c004cb 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java @@ -9,8 +9,9 @@ public class Item { private Long id; private String name; private double price; - private Long quantity; - public void Item(String name, double price, Long quantity){ + private int quantity; + + public Item(String name, double price, int quantity){ this.name = name; this.price = price; this.quantity = quantity; From ffcebc7af619fd39a0786a3a3c541723c60dffd9 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:44:15 +0900 Subject: [PATCH 097/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemService=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20updateItem()=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemService 클래스 updateItem() 메서드 매개변수 수정 상품 수량의 타입을 int 로 수정해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java index 19f4352d..6f5d5005 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemService.java @@ -5,6 +5,6 @@ public interface ItemService { void join(Item item); - void updateItem(Item item, String itemName, double itemPrice, long itemQuantity); + void updateItem(Item item, String itemName, double itemPrice, int itemQuantity); Item findItem(Long itemId); } From 6fe0f75f58519fb1c84d9cd15fddff252c1acebe Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:44:34 +0900 Subject: [PATCH 098/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemService=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20updateItem()=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemService 클래스 updateItem() 메서드 매개변수 수정 상품 수량의 타입을 int 로 수정해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java index 48c033c5..36aee200 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemServiceImpl.java @@ -18,7 +18,7 @@ public void join(Item item) { } @Override - public void updateItem(Item item, String itemName, double itemPrice, long itemQuantity) { + public void updateItem(Item item, String itemName, double itemPrice, int itemQuantity) { item.setName(itemName); item.setPrice(itemPrice); item.setQuantity(itemQuantity); From 0ce7330a77890e02c701569d66b4e92f9d3be83e Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:48:01 +0900 Subject: [PATCH 099/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemListForm?= =?UTF-8?q?=EC=97=90=20thymeleaf=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemListForm에 thymeleaf 추가 thymeleaf를 사용하여 상품 등록 버튼에 적용 시켜주었지만 페이지 이동을 하지 못합니다.. --- .../src/main/resources/templates/ItemListForm.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html index b6294bf1..8f083f17 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -1,5 +1,5 @@ - + 상품 목록 @@ -16,7 +16,7 @@

상품 목록

- +
From 2b790b15350a43c2883e6f50c49d895f522b4f26 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:49:11 +0900 Subject: [PATCH 100/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemListForm=20?= =?UTF-8?q?=EC=83=81=ED=92=88=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemListForm 상품 리스트 표시 부분 수정 상품 리스트 표시 부분을 thymeleaf를 사용하여 나타내도록 수정하였습니다. --- .../main/resources/templates/ItemListForm.html | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html index 8f083f17..c111de60 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -28,19 +28,11 @@

상품 목록

- - - - - + + + + +
수량
- ID - - 상품 이름 - - 000 - - 999 -
From 0091f2c0fded7cf420d7dea6873af9513c92571a Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:50:22 +0900 Subject: [PATCH 101/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20requestMapping=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller 클래스 requestMapping 추가 클래스 단위로 @RequestMapping 을 해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 268fa0ae..29c49b9b 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -5,10 +5,12 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @Controller +@RequestMapping("/item") public class ItemController { private final ItemRepository itemRepository; From ad06218f63319c91c125faa085d94bd176653a80 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:51:20 +0900 Subject: [PATCH 102/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20getItemDetailForm=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller 클래스 getItemDetailForm 매핑 수정 매핑한 주소가 세분화되면 좋을 것 같아 세분화 해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 29c49b9b..5554f224 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -28,7 +28,7 @@ public String getItemListForm(Model model){ return "ItemListForm"; } - @GetMapping("/{itemId}") + @GetMapping("/itemDetailForm/{itemId}") public String getItemDetailForm(@PathVariable Long itemId, Model model){ Item item = itemRepository.findById(itemId); model.addAttribute("item",item); From eb6e327695c7cdb545753164953ab507151bc7ca Mon Sep 17 00:00:00 2001 From: 02yebin Date: Wed, 20 Dec 2023 23:52:25 +0900 Subject: [PATCH 103/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemDetailForm=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemDetailForm 수정 thymeleaf를 사용하여 상품의 상세 정보를 나타내도록 수정하였습니다. --- .../src/main/resources/templates/ItemDetailForm.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html index 8bf7f004..1fadb177 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html @@ -1,5 +1,5 @@ - + 상품 상세 @@ -15,15 +15,15 @@

상품 상세

상품 ID
-
+
상품명
-
+
가격
-
+
수량
-
+

- +
From 043c81fa5301ab6087bb104362d9a5a7b3107035 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 16:47:44 +0900 Subject: [PATCH 104/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Item=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Item 클래스 수정 int와 double 타입 대신 Integer 타입으로 null를 받아도 에러가 나지 않도록 수정하였습니다. --- .../src/main/java/hello/itemservice/item/Item.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java index 93c004cb..78b4c9a2 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/Item.java @@ -8,10 +8,10 @@ public class Item { private Long id; private String name; - private double price; - private int quantity; + private Integer price; + private Integer quantity; - public Item(String name, double price, int quantity){ + public Item(String name, Integer price, Integer quantity){ this.name = name; this.price = price; this.quantity = quantity; From a553996e9929080b1d6bdada14e2c26362aa38e6 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 16:58:22 +0900 Subject: [PATCH 105/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 인터페이스 수정 update() 메서드 기능을 수정하려고 보았더니 item 객체만 받아오면 새로 만든 item객체의 아이디를 사용하게 되어 기존의 상품 아이디와 달라 itemId 파라미터를 받아오도록 수정하였습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index 73ff81bf..14dd3f1b 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -8,6 +8,6 @@ public interface ItemRepository { void save(Item item); Item findById(Long itemId); - void update(Item updatedItem); + void update(Long itemId, Item updatedItem); List findAll(); } From 43ce8b19180af03373438e645200039caad8bf2a Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 16:59:05 +0900 Subject: [PATCH 106/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 인터페이스 수정 테스트를 위해 Item 객체를 반환하도록 수정하였습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index 14dd3f1b..81c45ab5 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -6,7 +6,7 @@ public interface ItemRepository { - void save(Item item); + Item save(Item item); Item findById(Long itemId); void update(Long itemId, Item updatedItem); List findAll(); From b8c5ba2d84b849eb4a63d68ee31671a4fe2f39fc Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:00:13 +0900 Subject: [PATCH 107/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 인터페이스 수정 테스트를 위해 저장소를 비우는 메서드를 추가하였습니다. --- .../src/main/java/hello/itemservice/item/ItemRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java index 81c45ab5..c9901491 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemRepository.java @@ -10,4 +10,5 @@ public interface ItemRepository { Item findById(Long itemId); void update(Long itemId, Item updatedItem); List findAll(); + void clearStore(); } From c02a5afd09b506c1f4b65be160842910a7160cd2 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:01:18 +0900 Subject: [PATCH 108/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 클래스 수정 반환 타입을 수정하여 item 객체를 반환하도록 수정하였습니다. --- .../main/java/hello/itemservice/item/MemoryItemRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 617176eb..7b9743bd 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -12,9 +12,10 @@ public class MemoryItemRepository implements ItemRepository { private static Map store = new HashMap<>(); private static long SEQUENCE = 0L; @Override - public void save(Item item) { + public Item save(Item item) { item.setId(++SEQUENCE); store.put(item.getId(),item); + return item; } @Override From 7077f613380038bd7ec2232c8c6d5d835f5d3753 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:03:32 +0900 Subject: [PATCH 109/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Repository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Repository 클래스 수정 기존에 수정한 item객체만 받아오도록 하였는데, 그렇게하면 기존의 상품 아이디를 알지 못하여 상품 아이디를 받아오도록 수정하였습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index 7b9743bd..c2221ff7 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -24,8 +24,8 @@ public Item findById(Long itemId) { } @Override - public void update(Item updatedItem) { - Item findItem = findById(updatedItem.getId()); + public void update(Long itemId, Item updatedItem) { + Item findItem = findById(itemId); findItem.setName(updatedItem.getName()); findItem.setPrice(updatedItem.getPrice()); findItem.setQuantity(updatedItem.getQuantity()); From 9b45f8c31499a75505cfaca5cea041afb3e6b5c4 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:04:20 +0900 Subject: [PATCH 110/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Repository=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Repository 클래스 수정 저장소의 데이터를 모두 삭제하는 clearStore() 메서드를 추가하였습니다. --- .../java/hello/itemservice/item/MemoryItemRepository.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java index c2221ff7..3a710bff 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/MemoryItemRepository.java @@ -36,4 +36,10 @@ public List findAll(){ return new ArrayList<>(store.values()); } + @Override + public void clearStore(){ + store.clear(); + SEQUENCE = 0L; + } + } From 7c8959fcb7130699ca54203d1b5e456d2e68e042 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:07:07 +0900 Subject: [PATCH 111/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller 수정 매핑 주소를 수정하고 url로 정보를 넘길 필요 없는 메서드는 post 매핑으로 수정해주었습니다. --- .../hello/itemservice/item/ItemController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 5554f224..333c4e87 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -1,11 +1,11 @@ package hello.itemservice.item; +import jakarta.annotation.PostConstruct; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -28,36 +28,36 @@ public String getItemListForm(Model model){ return "ItemListForm"; } - @GetMapping("/itemDetailForm/{itemId}") + @GetMapping("/{itemId}") public String getItemDetailForm(@PathVariable Long itemId, Model model){ Item item = itemRepository.findById(itemId); model.addAttribute("item",item); return "ItemDetailForm"; } - @GetMapping("/itemSaveForm") + @GetMapping("/itemSave") public String getItemSaveForm(){ return "ItemSaveForm"; } - @GetMapping("/itemSave") public String itemSave(Item item, Model model){ + @PostMapping("/itemSave") itemRepository.save(item); List itemList = itemRepository.findAll(); model.addAttribute("itemList",itemList); return "ItemListForm"; } - @GetMapping("/itemUpdateForm") public String getItemUpdateForm(Item item, Model model){ Item updateItem = itemRepository.findById(item.getId()); model.addAttribute("updateItem",updateItem); + @GetMapping("/{itemId}/itemUpdate") return "ItemUpdateForm"; } - @GetMapping("/itemUpdate") public String itemUpdate(Item item, Model model){ itemRepository.update(item); + @PostMapping("/{itemId}/itemUpdate") Item updatedItem = itemRepository.findById(item.getId()); model.addAttribute("item",updatedItem); return "ItemDetailForm"; From 7151477ac038a573e86975e0e810ad7442aa9afd Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:09:39 +0900 Subject: [PATCH 112/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller 수정 @ModelAttribute 어노테이션을 이용하여 item 객체를 받아오도록 하고 상품을 저장하도록 수정 --- .../main/java/hello/itemservice/item/ItemController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 333c4e87..d1754ce1 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -40,12 +40,10 @@ public String getItemSaveForm(){ return "ItemSaveForm"; } - public String itemSave(Item item, Model model){ @PostMapping("/itemSave") + public String itemSave(@ModelAttribute Item item){ itemRepository.save(item); - List itemList = itemRepository.findAll(); - model.addAttribute("itemList",itemList); - return "ItemListForm"; + return "ItemDetailForm"; } public String getItemUpdateForm(Item item, Model model){ From 20c3406485cc0ca012f6c37e8c6afdbf5c9fa9b8 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:14:20 +0900 Subject: [PATCH 113/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller 수정 상품 아이디를 받아와 상품 객체를 찾도록 수정하였습니다. --- .../main/java/hello/itemservice/item/ItemController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index d1754ce1..407a15f8 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -46,10 +46,10 @@ public String itemSave(@ModelAttribute Item item){ return "ItemDetailForm"; } - public String getItemUpdateForm(Item item, Model model){ - Item updateItem = itemRepository.findById(item.getId()); - model.addAttribute("updateItem",updateItem); @GetMapping("/{itemId}/itemUpdate") + public String getItemUpdateForm(@PathVariable Long itemId, Model model){ + Item updateItem = itemRepository.findById(itemId); + model.addAttribute("Item",updateItem); return "ItemUpdateForm"; } From 821407d4d048a0b7a399e6cb8c33c7048b69d2a8 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:15:38 +0900 Subject: [PATCH 114/190] =?UTF-8?q?[=20BE=20]=20(feat)=20Controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Controller 수정 @PostConstruct 어노테이션을 이용하여 초기에 상품을 세팅하여 확인할 수 있는 메서드를 추가해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 407a15f8..02501e5e 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -59,5 +59,10 @@ public String itemUpdate(Item item, Model model){ Item updatedItem = itemRepository.findById(item.getId()); model.addAttribute("item",updatedItem); return "ItemDetailForm"; + + @PostConstruct + public void init(){ + itemRepository.save(new Item("testA",1000,10)); + itemRepository.save(new Item("testB",2000,20)); } } From 742f720359f43c32d806a07dbe663fb926799bb3 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:18:37 +0900 Subject: [PATCH 115/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemDetailForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemDetailForm.html 수정 th:text로 하였는데 input 위젯 밖에 텍스트가 써져 value로 수정하였습니다. 또한, item.get~~() 메서드를 사용하지 않고 item.id 이런식으로 정보를 받아올 수 있다는 것을 알게 되어 수정해주었습니다. --- .../src/main/resources/templates/ItemDetailForm.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html index 1fadb177..a8b37568 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html @@ -15,13 +15,13 @@

상품 상세

상품 ID
-
+
상품명
-
+
가격
-
+
수량
-
+

From 179b365ee0847c7364204f604bd414463dca72c0 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:22:59 +0900 Subject: [PATCH 116/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemDetailForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemDetailForm.html 수정 폼도 띄우고 컨트롤러에서 메서드를 어떻게 연결해주나 했더니 둘 다 써주면 되는 거였군요! type="button"을 써주지않으면 제 기능을 못해 추가해주었습니다. --- .../src/main/resources/templates/ItemDetailForm.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html index a8b37568..cfa11309 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html @@ -23,8 +23,9 @@

상품 상세

수량


- + From f392e936676b3742e4de3486b7040ede72a409c0 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:23:52 +0900 Subject: [PATCH 117/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemDetailForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemDetailForm.html 수정 타임리프를 이용하여 컨트롤러의 메서드를 연결시켜주고 type 설정을 해주었습니다. --- .../src/main/resources/templates/ItemDetailForm.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html index cfa11309..638012f9 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemDetailForm.html @@ -23,9 +23,10 @@

상품 상세

수량


- + From 2e8f3b82549c7e3e36ce5ddcd428aa2c8c491785 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:26:50 +0900 Subject: [PATCH 118/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemListform.html?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemListform.html 수정 상품 등록 버튼의 기존 매핑주소를 바꿔 href를 수정해주고 type을 지정해주었습니다. --- .../src/main/resources/templates/ItemListForm.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html index c111de60..63584577 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -16,7 +16,8 @@

상품 목록

- +
From 2daa8161d6a288a997bbe640d6c4d57604e8cf28 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:28:54 +0900 Subject: [PATCH 119/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemListform.html?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemListform.html 수정 a 태그의 href를 추가하여 상품 상세 폼을 가져오도록 수정하고 .get~~() 메서드 말고 .Id 등과 같이 수정해주었습니다. --- .../src/main/resources/templates/ItemListForm.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html index 63584577..887cd187 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemListForm.html @@ -30,10 +30,10 @@

상품 목록

- - - - + + + +
상품id상품명
From b48ddbd16e0a04c724314338cfb4238508da9849 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:32:04 +0900 Subject: [PATCH 120/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemSaveForm.html?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemSaveForm.html 수정 상품 등록 버튼의 type을 submit으로 수정해주고, 취소 버튼을 누르면 상품 리스트 폼으로 이동할 수 있도록 타임리프를 이용해 수정하였습니다. --- .../src/main/resources/templates/ItemSaveForm.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html index 3e32c826..43187b88 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html @@ -1,5 +1,5 @@ - + 상품 등록 @@ -22,8 +22,9 @@

상품 입력

수량


- - + + \ No newline at end of file From dcb54ec6fe824ad29b89a1863b70f3d14fe7fb29 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:33:00 +0900 Subject: [PATCH 121/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemUpdateForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemUpdateForm.html 수정 th:value 를 이용하여 상품의 정보들을 표시하도록 수정하였습니다. --- .../src/main/resources/templates/ItemUpdateForm.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html index 2b523002..d11cd5bb 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html @@ -1,5 +1,5 @@ - + 상품 수정 @@ -15,13 +15,13 @@

상품 수정 폼

상품 ID
-
+
상품명
-
+
가격
-
+
수량
-
+

From 4c2749899b615ca171c16e69b53bcd8b4bba8ef2 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:33:28 +0900 Subject: [PATCH 122/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemUpdateForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemUpdateForm.html 수정 저장 버튼의 type을 submit으로 지정해주었습니다. --- .../src/main/resources/templates/ItemUpdateForm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html index d11cd5bb..3aa45485 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html @@ -23,8 +23,8 @@

상품 수정 폼

수량


- + \ No newline at end of file From 4a885b34c2ff3c1afb1abbc06fdd32eeaf693988 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:34:05 +0900 Subject: [PATCH 123/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemUpdateForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemUpdateForm.html 수정 타임리프를 이용해 취소 버튼을 눌렀을 때, 상품 리스트 폼으로 이동하도록 수정해주었습니다. --- .../src/main/resources/templates/ItemUpdateForm.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html index 3aa45485..c8faf69e 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html @@ -23,8 +23,9 @@

상품 수정 폼

수량


- + \ No newline at end of file From d5183e680e82275d6419b9d6354a88f261e4668b Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 17:35:47 +0900 Subject: [PATCH 124/190] [ BE ] (feat) Repository Test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) Repository Test 테스트를 수행 한 후, 저장소 초기화를 위해 @afterEach 어노테이션을 사용하여 자동 초기화 되도록 만들어주었습니다. --- .../hello/itemservice/ItemRepositoryTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java diff --git a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java new file mode 100644 index 00000000..348b7b40 --- /dev/null +++ b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java @@ -0,0 +1,21 @@ +package hello.itemservice; + +import hello.itemservice.item.Item; +import hello.itemservice.item.ItemRepository; +import hello.itemservice.item.MemoryItemRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ItemRepositoryTest { + private ItemRepository itemRepository = new MemoryItemRepository(); + + @AfterEach + void afterLogic(){ + itemRepository.clearStore(); + } + +} From b2c739724269f57b5c971a137183123922e19ba0 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 23:21:23 +0900 Subject: [PATCH 125/190] [ BE ] (feat) repository test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) repository test save 메서드를 테스트 해보았습니다. 정상 작동합니다. --- .../java/hello/itemservice/ItemRepositoryTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java index 348b7b40..bced79b8 100644 --- a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java +++ b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java @@ -18,4 +18,17 @@ void afterLogic(){ itemRepository.clearStore(); } + @Test + void saveTest(){ + //given + Item item = new Item("itemA",1000,10); + + //when + Item savedItem = itemRepository.save(item); + + //then + Item findItem = itemRepository.findById(item.getId()); + assertThat(findItem).isEqualTo(savedItem); + } + } From 1ae9e7b37e91a057bd10a3753c4b2f7b57cd4f38 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 23:22:31 +0900 Subject: [PATCH 126/190] [ BE ] (feat) repository test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) repository test findAll 메서드 테스트를 해보았습니다. --- .../hello/itemservice/ItemRepositoryTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java index bced79b8..21553557 100644 --- a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java +++ b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java @@ -31,4 +31,21 @@ void saveTest(){ assertThat(findItem).isEqualTo(savedItem); } + @Test + void findAllTest(){ + //given + Item item1 = new Item("item1",10000,10); + Item item2 = new Item("item2",2000,20); + + itemRepository.save(item1); + itemRepository.save(item2); + + //when + List itemList = itemRepository.findAll(); + + //then + assertThat(itemList.size()).isEqualTo(2); + assertThat(itemList).contains(item1,item2); + } + } From 36a1540a7ae324bd46c1b43f5a63ca216d0bcb65 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 23:22:55 +0900 Subject: [PATCH 127/190] [ BE ] (feat) repository test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (feat) repository test updaet 메서드 테스트를 해보았습니다. --- .../hello/itemservice/ItemRepositoryTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java index 21553557..dbf9dd01 100644 --- a/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java +++ b/4 WEEK/item-service/src/test/java/hello/itemservice/ItemRepositoryTest.java @@ -48,4 +48,23 @@ void findAllTest(){ assertThat(itemList).contains(item1,item2); } + @Test + void updateTest(){ + //given + Item item = new Item("item1",10000,10); + + Item savedItem = itemRepository.save(item); + Long itemId = savedItem.getId(); + + //when + Item updateItem = new Item("item2", 20000, 30); + itemRepository.update(itemId, updateItem); + + Item findItem = itemRepository.findById(itemId); + + //then + assertThat(findItem.getName()).isEqualTo(updateItem.getName()); + assertThat(findItem.getPrice()).isEqualTo(updateItem.getPrice()); + assertThat(findItem.getQuantity()).isEqualTo(updateItem.getQuantity()); + } } From e09b02e5d588a04305e273660d74ee0fd5e59775 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sat, 23 Dec 2023 23:51:35 +0900 Subject: [PATCH 128/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemSaveForm.html?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemSaveForm.html 수정 상품 정보를 입력하고 등록을 하기위해 form에 action 을 설정해주었고, name 속성이 Item 클래스가 가진 변수의 이름과 동일해야 @ModelAttribute 로 가져올 수 있어 수정해주었습니다. --- .../src/main/resources/templates/ItemSaveForm.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html index 43187b88..5116207f 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemSaveForm.html @@ -13,14 +13,14 @@

상품 등록 폼

-
+

상품 입력

상품명
-
+
가격
-
+
수량
-
+

From 742fe3a21c2e6a353714746627abaaec022ea433 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 24 Dec 2023 00:23:47 +0900 Subject: [PATCH 131/190] =?UTF-8?q?[=20BE=20]=20(chore)=20Controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (chore) Controller 수정 Item 으로 정보를 보내주는게 불편해 item으로 수정해주었습니다. --- .../src/main/java/hello/itemservice/item/ItemController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 02501e5e..432d550d 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -49,7 +49,7 @@ public String itemSave(@ModelAttribute Item item){ @GetMapping("/{itemId}/itemUpdate") public String getItemUpdateForm(@PathVariable Long itemId, Model model){ Item updateItem = itemRepository.findById(itemId); - model.addAttribute("Item",updateItem); + model.addAttribute("item",updateItem); return "ItemUpdateForm"; } From 20ba558b7c8956d4206efc0527381cf488fab923 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 24 Dec 2023 00:26:19 +0900 Subject: [PATCH 132/190] =?UTF-8?q?[=20BE=20]=20(perf)=20Controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) Controller 수정 @PathVariable 로 원래 상품의 아이디를 가져오고 @ModelAttribute로 상품 객체를 알아서 만들어가져오도록 지정해주고, redirect:/ 이용하여 요청할 주소를 응답결과로 전달하도록 만들어주었습니다. --- .../java/hello/itemservice/item/ItemController.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java index 432d550d..7481267e 100644 --- a/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java +++ b/4 WEEK/item-service/src/main/java/hello/itemservice/item/ItemController.java @@ -20,7 +20,6 @@ public ItemController(ItemRepository itemRepository) { this.itemRepository = itemRepository; } - @GetMapping("/itemListForm") public String getItemListForm(Model model){ List itemList = itemRepository.findAll(); @@ -53,12 +52,11 @@ public String getItemUpdateForm(@PathVariable Long itemId, Model model){ return "ItemUpdateForm"; } - public String itemUpdate(Item item, Model model){ - itemRepository.update(item); @PostMapping("/{itemId}/itemUpdate") - Item updatedItem = itemRepository.findById(item.getId()); - model.addAttribute("item",updatedItem); - return "ItemDetailForm"; + public String itemUpdate(@PathVariable Long itemId, @ModelAttribute Item item){ + itemRepository.update(itemId, item); + return "redirect:/item/{itemId}"; + } @PostConstruct public void init(){ From 24b1ead5eaf726977155db2c6c6d6594d8ede076 Mon Sep 17 00:00:00 2001 From: 02yebin Date: Sun, 24 Dec 2023 00:28:03 +0900 Subject: [PATCH 133/190] =?UTF-8?q?[=20BE=20]=20(perf)=20ItemUpdateForm.ht?= =?UTF-8?q?ml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ BE ] (perf) ItemUpdateForm.html 수정 addAttribute를 item으로 수정해주어 Item->item 으로 수정해주었고, name 속성은 Item 객체의 변수 이름과 동일하게 맞추어 수정해 @ModelAttribute를 사용할 수 있게끔 만들어주었습니다. --- .../src/main/resources/templates/ItemUpdateForm.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html index c8faf69e..13c65d39 100644 --- a/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html +++ b/4 WEEK/item-service/src/main/resources/templates/ItemUpdateForm.html @@ -13,15 +13,15 @@

상품 수정 폼

- + 상품 ID
-
+
상품명
-
+
가격
-
+
수량
-
+