From d1c31cc4c01fd509bc0810697c797d94c50671a8 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Fri, 6 Oct 2023 21:10:02 +0900 Subject: [PATCH 001/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=202?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 "2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_2\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_2\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_2\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..59d30ac --- /dev/null +++ "b/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_2\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,59 @@ +# 2주차 과제 + +## 1. MobaXterm에서 Bastion 접속하기 + +![Bastion](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/b0280fba-c5d3-4a14-8f68-d4b12de1f701) + +Bastion 서버의 ip 주소는 위 사진과 같다. + +![MobaXterm_Bastion](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/c2f84134-a6bb-488c-b4c3-9f860a97da0a) + + +MobaXterm에서 Bastion 서버로 접속한 사진 + + +## 2. Bastion에서 private 서버 접속하기 + +키 권한 수정없이 바로 private 서버에 접속하려고 하면 접속이 거부되므로, 키 권한 설정을 600으로 바꿔주어야 한다. + +리눅스 명령어 `sudo chmod 600 [키 이름]`을 써주면 되는데... + +*어디에 쓰지?* + +윈도우 cmd 창에서는 해당 명령어를 사용할 수 없기 때문에 번거롭게 보안 설정을 편집해주어야 한다. 개발자의 자아가 거부하는 일이다. + +구글링 결과 키의 사용을 위해서는 세 가지 시도를 해볼 수 있다는 것을 알 수 있었다. + +### 1. 로컬에서 키 권한 수정하기 + +위에서 언급했다시피 chmod는 윈도우 cmd에서 사용할 수 없고, 보안 설정을 하나하나 건드리는 것은 개발자의 자아가 거부하는 일이었다. + +### 2. 바스티온 호스트에서의 SSH 키 사용 + +바스티온 서버에서 다른 인스턴스로 접속하기 위해 키를 사용해야 하는 경우, 키 파일을 로컬에서 바스티온 서버로 전송하여 사용할 수 있다. + +그러나 이는 민감한 키 파일이 바스티온 서버에 전송되는 것이므로, 일반적으로 권장되지 않는 보안관행이라고 한다. + +### 3. SSH Agent Forwarding 사용 + +보안을 위해 키 파일을 바스티온 서버에 올리는 것 대신 SSH Agent Forwarding을 사용할 수 있다고 한다. 이 기능은 로컬의 SSH 키를 바스티온 서버를 거쳐 다른 EC2 인스턴스에 사용할 수 있도록 하는 기능이다. + +![allow_agent_forwarding](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/fd78b2d0-e6af-40dd-ae67-869f5bef2944) + + +이에 따라 세션을 생성할 때 Allow agent forwarding을 체크하고 생성해보았다. + +![nosuchfileordir](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/58c36964-fcd0-4504-a419-18264ace01a2) + + +그럼에도 키 파일의 권한을 수정할 수는 없었다. + +**그렇다면 무슨 방법으로 키 권한을 수정해서 private 인스턴스에 접속할 수 있는거지?** + +김 빠지게도 답은 2번이었다. + +로컬의 키를 바스티온 서버에 올리고, mobaXterm에서 chmod을 사용하여 키의 권한을 변경해준다. +그리고 private 서버의 ip주소로 접속해주면 된다. + +![Instance1](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/448e94f2-e3de-4314-8623-55cfe161b0b6) +![MobaXterm_Instance1](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/cbb7e3e4-9814-4175-a45c-59f20c718229) From 3a45f8afa0448100528b527982af88db94cef909 Mon Sep 17 00:00:00 2001 From: yslim21 Date: Sun, 15 Oct 2023 23:56:25 +0900 Subject: [PATCH 002/103] =?UTF-8?q?[=EC=9E=84=EC=98=81=EC=84=9C]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../img1.png" | Bin 0 -> 75438 bytes .../img2.png" | Bin 0 -> 134735 bytes ...4\354\260\250_\352\263\274\354\240\234.md" | 39 ++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img1.png" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img2.png" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\236\204\354\230\201\354\204\234_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img1.png" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img1.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c3239807c668a75a85f8868cfeaf1d981d1075d GIT binary patch literal 75438 zcmc$_c{rP0*EWu74OR2d8cWSlIw9tos#WtmtGY{DMM6y_2{ltxQCcBYt)YgP#TX@M zX+^7Q7Gj8*m_x`Hy`T4c@8@}c|9tO1zkM8z%f7B$*WP>Wwbnk@+UJfpGch>F%+E|i zLv!xVZ9NMb8hQ{74IPs44D}9OACRAVq4l>g(4i^s6I`TL=smTKwP|Q7Q_hmzPE+el zpxgHTG&Gz~PyT2pJw$?OXeb}==xJL8yR5V@p)Tu(tS9j+rrpwK|BId5tnE@9C@YzT z?yg1~?S%*G!R%KY#h&TStR&w`>Jp0Q@619ay#+c|KmW0i6s(t)^%<4+@Y|I6wec6q zBg$Jxud?-)O6p_QJ}uRMDhb_jC*Eid4`afEjvM8?%-#VqWaSC76E1%7n zaO!`KAlFN7>LpFJ*O0tK`-@wbDg%~nz(4OuDL%)C|BqHP2@XuadK|PVc&`a}*@c*3 z8)s>%k-_uG;^zP8b#G7^J$xC7c4^D zONK9gc|bXn2m(X4Six_X6;#R|zYGij2fVSFzW?Aa=W$AQ5ZtC9U{vV6yu|XafOG8z z&dwp*ZIFX`j|cypjQTIh^F9sbcZM}p0pI#@S-ngH8D0`oaQ{9PeDhYHWrT6w50*`pDaoD0)O*iVMow2@?;8^Lx1BY+%XN8JUU)DXOPIhlc@pKO z35l({>Wxf3tQqhre=QYVQhV;d1?yv-`~9N}(O8%{PG$x1y z=>`3bh8k#>SBx`gozMPr0r2@M^c~^noK^t|vT4pkudUlRQZ=+XS<9t)Wh%1MfK|)s z3EVGXe=JdfmlCoXfX^OU<3y7iJrhiimfSlPC}WYBZptPHzOWTqwI7XEGaKL8W8>7? zi#3RMJO z_4Julvd6_KyTVSI9N-Oq&JV}I2s%xU8w(h zL$UBLr)Z&o2N~?3B6#iZ^zd}E>s}m%so`5*=v^;$1nI?o5?`xXSiqPP z(KFLU_83UpYSX*=Q(tl zq#`!97PEV2KA}f2s5*7L$;et)ag@Am8L%p< zp%hM$gDz|Q-tp!DJ{vdcb>FxlYX2rzV5D-TkJ!_qiU;ZvCO`n|`S*Y8L9Un7)XRbU zF%g!RWs_5S6Ad_T%?)L8-1Y0ZG_5mc&2Q2UeG7$yL*40E=f?OT|3m?=e>C_P3&yN` zITmz_Y5yjMOri?@aJL?PS&6cQ#Q27hVR1>B>ZUJX^XkMOTB;W0pIYk*laxY(xIOZ; z3_kOCWe&eb86tF|$;(=AN~U7wb@KkYAZUa8r$jz~9}AG2dfBwzdWb=jd(m+UFh9A; zth(JoACb|0tC>*4Kz1X{|lhf(7cPi*+%<+ zs|zaZR0#fGp1Xz5e?*W{o?Z7`3-qY%94>40l?e3}aQqyqCt=*I=v@ z-K!j-j}KHhLwKEE-kvx#ULOk?C;Sl$~%O_vEqLRY| z>@hWQQCzzhkS*B!^Meg#5IU_w;8$F%C6MFIvs#5PA&+d&9Q*JO0tqrxnBEr~u3x1y zr?vHU-X=5*1?_ac)ezm_($^y zJnKLSXLZWbCv}C?fUh|KJZNe3cQv2#r2{K60N;P3x3EU72DeifW;N#hsqDO!E7w8n zYLT2TQZ6n*qgv){AM!1w-vymRnhtRBAN@1tw*E!EHgm$nXN#-xAKkB`MyuCY+QcI7 zIy_!uu^PNLc}Ky>mDC%-uly2#1P_#TeLW}GbdybdCN2Bvo5hG4weZOXLpOIq$%FiX zAcmuYZvq)2h}@$ICYRRBqpZr#O0de!d|U)h__3pjhUH{a?z@LZ7kaigCD|1NMrT`@ zw}jH&XZ8zj+NDgA-tNBT>Ovz5$Dsn{6^48Ik_z4jn1?wgl;gpGpLK}q-7eX4*y7;l z&&t;izbZ*x21N0Iu|;9&6X`Z~CQnVq2=$JQ@<-#JW{taQKa~^KXCCiwOul(wZ*}yE zlo*C)u)k&}&2f9LR$8TP z5Z_u-oeM4d&>sV|q}$A-jZRP<_hL+0DXs_%US2fTY zjbXkVTS$4`H^J=4O_SVu!f?DqDnGrz^UcJMLlUw{Z&i!uk#g7hAUWBl2gVQFC_Vn; zA1bdu9esS7)sew^_?l0EE9t>d>$ief&oqg`mbxbcPeuaue@W`*x5fb|Z#66HObX$Y zaHS)`P=&6Z?_YJjaXcm27uOzTrg+wSat#LA*Z z`OKVf?p}{1KiYL|XU>+BYI*R+l;PY=G$%81^OoE9fOLkQ&}lxWfzv%E*3ib%?DS0A zuG)|nMkersYLYc!tZV41i-yDdIu)h4sMPK!*-C^aUvwiZ{vYihb3HZr4>dsEJ~j`gXXdo>C-&z) zZke~Nd##zCOj0=QwTAEx<7?_DZLy$ok1DZ8>T#ZD8fB9g+CtuAbM4ckBV7?YR1-pO zIXz;NWrM2xF(H;5>S}den)QsK+R*A%<#$i6+b`Z@ME>QQ)=%hw7J;}SS)yGPu-RHX5B{~<-7{`irlU7>JezC&wN z)%7Z&ao1|TY^jWMJ3g5?8s10~dO;mFlwo^By4JhdK4a~+ z)P;zW%EZ3wkz_+b=X+9TeMYsjg5R7DRGWLHF7hi$r0y-YYmV=?X<-(vvZV=qCfbU` zbL*uoR5xBp*V=RX^h8af z85jTVa%kO4L=duenJYdxr|%+#YuCS1;|^56sVLWy1R6EA!zR32-^5pfPrDU3YvxVt zI^_pCJ^~nJy*I|JyK9BjlEWw?>Cw?8SgR&t$FlnJU`C%}YR#XK#TZ@sgD}p^%5c!K z@BpUv>DW&mw29H3+;6jJD<7vl#X!e;a`QCiK4V<&uZ ziu%az=Jv7WoTeJ)k~2Dcgd7-~GF$@vraxsolgz{JjkSsrCE+`QG2Z`+s@O zLvl)e4(@4kTD~lAD^5xfAiV!OfcVbzxbEO?w-ZWqt3zv(cDMP#GA$clkk(=Ze!YIu zlswJE#;%}(4;=>Sdg35^Im}KDiEW|`t0hxp-iYh+4Uc6(k9ID|vpKhYROA*8nBu_S zDQq=dsi$a{!dMz(%IC;2?MzbeD?F&0n7$vTt=jO-Z)|`CWj>ELA)9Y}dB+07ERN>L ze9up@aipm3c@P%}FegEBBaSb&^eE{$bUT={8`td z3H+Bd;jWmV5nqZyg1-SFVF24;Cm6hgj62E=zAE6u-aj5cef4lv%13ka3X#Z_%!`H{ z5b?f!VF~~G?szS;d>L!jn{a<38~I&u-xAf^oLgU@Pe{bi{^VE1k&@XGA)1FfbgJ|1 z=iXq$)=as@XW^(F7VLVKfrbu~@?K73O1D@75WfF2eLx;%B?w+gYxX}8(W)BS;4|qm z-LJxnl0td}I&SJK>3|~%@RgyIx)l=o=Elb{J z;&fai_hS=HVT*gJ5qJlBT0;0KR_<64aE*cVRMhd)b9_TO)s*~1bYTv~TweJzE^kDy@@;Zd_xDj(&Nn&2OvdNLV8Gc)RdWtWVJ(ap-776W^7henn=s-#@(^ zvT_;6$$;M1jOO%99`1@+SG*DAchP*l)-)K->26IzXzKBZ|9r6brMABMRYrBC8A~yG^Bit2%gD2zLfA?ir|?C zjB#M)1z_xwfxFj~;Af-3$VX!2?Q{I%uQoQn!}bHE%$#)jK)H}!FH8!BEMko!S-VQp z3m$xr&hu&j@}=ssY8l5X*5JDmlzI2mqi4!RSYm|$tj{_#gDWLzoppz*z;raPpI=G_ zwsV2v1SYp`OW?-?_fGvX%-(q0!K!8ihaHpfMZH>famuf?%Q1NkY16}}cKKXY=kAo+ zr9Cgt^O`^n*QmZzrelp)8fu*y!{@P~O^G#xiA-+47}+Uxa+D<|vJ36Pczrv;>iqn% z$o>nd$$s#8j|C^t4`Vz;Ywz4?CKYkK;Ijqy44kv0@CW*AnARf^BA??88%)TmW2;#1 z)A7ZO{g?zmV>l{LK@#l_MJHU_52|0vpnYs=eR2G$hNG_`;yQDA<8;A?xa&`82|TX*L4iNrM8PprWI68cm#5)oag~DPthC_`dJ=eO zmQf2rPnXPA_F+2ef|x;@s5Gnmntn&?wa$2@HIg>kB4D`kz*?q&(i>489Y@v1juyk6 zPsj<^c;L2ShQKaWsm+e1l6=bIlo^~hG!<6vy=zE|qCfvkBZ2E-94vI+k_RrLJ@ibB zHPeP+Tc?fmt^U|q5Hg43!zWQ8{&ajEGms5R%GLnK?6(de=A*&-!c<>YP7wo5(J~|q zp-FsaIS4ZdvZVz6rE5<3)+OJu{BpJ#L9x7zSMAJ71gDm}N0QT$P9g5oKl!f(?j-Sm zcmsHndE`-=3f#UcWjP6nhUZAHyX zX|B+W1mOIObwK;8Vck%iAh{j3g%Nm`k>K*xZ$^m4Z%q$*bFi$LwChT4c)nF_CfK=b z<>VmLFF;FxW>O-aM+tKJB-;=EOAgN_)BtpSD#&1n#5h~)lH&cDl-7^OG0;T1G89-} z&>>#8+oo;$A}v8kYe$jz)0Wk0`W$0)W}2yr^^=gF;Eb)BrI@H}vx>Zmr%9p7Q&f4Z zEeZ6BmA6;6>ks38$O@RCz|%JPn{5~B!gT>2$M@%0_tdQa-CtX4*I`mwp zHX#PZEG0Qrdc3RFnd6Es@td4e*=sfno5wWliD!bRm( zl_maPa2i_Ttf;>-R`-&Rzrwf>4SVR$`t>I4OwjS}SWimRe0ZYE*8*A^J61oJkI&k< za^Jb+sNxSaa)WhQAYAUFTQOXJIZ>0x&v!BQvb3=k`0rxOz?$_Wz@%UxRzx;$9wI`H z1I`ai@lG$%3p!-zg3m#G;bs_7@O+T`WKV)JMh$noEXxu-5wImIKzLd4{4CQ|1bIaR zAM_xHYy0qZhGPa$*J*!cnS1+i5v%UnJpJ952Tf{n-D_`ZXUqI;#$=1LTNr;|_P4}Z zj=LxO5|reT$HbkU0IJt{$d+B$ypDTsM;m)GnYx!5?xHxQ2qhNWT`eAQ0AD$HxNiHm zBb+~MXV3F^zd8YTFh(gOuUsY0rXb$8H|SvdPs1}?cL?_8F<*E+Fwt1&Y3V%AMiq@;p=pGeh{CBuRF#S6DQc_`)+zDu>dO5WH1X*bMp(ccwtVF17+`#R|dg1R{t9eVb2?C#HL zydbj;2;7-1c)TWpmN=gA)qHmh^PZN>qchr5!>X)`)Gr`n#o;SA zYv3j==iJe$C|(NU*bOQkDwG@dvZ9Kyom}%^fsPfT-NWPVXY(T}l)!QXu(D|rP3=m! zCR!sF+y0A0MI#|&-K~8I*YwK6b-^I80)JvN11p3T&U0VfrXr6=c~|hLPApmAw?5=P z{LWdL3c(L9AFB{7LD2%8=Um;DRfRdXRW{6`NU-&1*{F4q;}og>C^}Y>`FUn9ti7~} ze3^V!Q}|X!$}xOceeVX*F$MN^7(C;7mX@%M2u1^!G^7AN=tGF%EEp+J70#st@O^li zH6Ex%d4mjzWbVyNnJ8$_fo`z{1A-YjpQ3_esUiCkHThmASlH^Mk94Hwk0;rVBY-n2 zo|Rx$T29B@fW-&7K!2?7QQiK}^{_!TPtnSG%JH&R!uQbD!tms>II2RMw^izVx7FOH zu_<~)*Xb55Bwwb<#U<}&Gi8>w(U^A@So3T?eUIYE-9$&#LAiEj!FK2^IB>BUVZ?lm zD)A@5jjzutbGP#V19yy#-o-Nk19|#ho)$b{36|~}Cu$wvZr)DDS*(N+3Cy&y(6KFU z$!4EaO_}4O>*ah5PTS1U&JT2ld4TYTGr1yoX1IYCWu}zT-4!ABa9tpD67sR<+`10f z?-4B(Fh4Wy;Q=jV6t7}6?bRW(uxn1lc9_7tXU8c`X#0=ceH{Uwv@5!(Y~ENp6FEU` z>RSPyole8GQ1gDoRR)bOk$tHTw}gXadPdc*~09Kqk`m&OjY1;faS`GChkz90-R8goM_DpeeudCXyay^y&!EYWAufC(e#OL!#*y8 z(1^ziCBBR%ZK4nLjr%0KY=$dY?Az`@A`-a3_wnbhE-08cyziYc-CZM{LNu+#22>!e z&Ji<;Uk)EDi;7PU+kRT`UGlPeEF$N?$K>^cZxc)VD^%$S4af>``tFVx=-y{7Yiw9wcIDe!z0?~Myb);) zOh~)y#i+ivVPGVV@2}OJJloC8=i};0`jG<3rAl&hraU6N+K$d-|FM-&0Mg-HbXNGl zYtgg7Vg)mf^0+ik-?%(ze1c1=>g;!zJnOR&WP$-QEWKs@Yf6+LvjNf?Ok~M%qU~OT zSW>~96M?!x~ZBTPT3ivIF>bw5@Vv^ z=>261w=0E!1bm)vy_E8cE}7--bS`YnN2x5Y-v)D`F<94bx_x!osg*Ln48WhunQ7;w zt`E22c^Xgd4~O|dc@x~tsd#|?%|fBl^*D0hKEe)&M%9Yyn?;(6tc0=%2UemTb2nb5~%qFh~ zm(mQ|7hxCmbIrrY#cP~BWaja{M<RkDK?lygEChj2)j9O@Jw75J~!CQ=;-bGGU6 zrUqVLYa8H4Gn`21zeCWD`QmfjL+>>d7OJPZb8E&zA0$8r8bo2& z;HUl;lktV6%pzI3zHExq%HD^O}vPVmCO^!8k_x2MayK8~?I^~4sRB6yv5(?J3^6L5RTN3Yq4 zF1abmo-iJ=G}Wwq?Lny*v>?KWZz3&7+f_mASX`>Ww1PMDXA;l7oQ8-zI(! z3Nsa*Bu@+BO8Qbof|8=|mS9043v|?U$V_=x9?mH%PZxq;Ec9JY7i9*H^A$-(v>GY? zQZWDFWp4Ads9CI*l7H9yzILa8*v{ACK6dH!T`e-p8J% zw;1y_&4$$mHi7$tv-lV?Z4lF&>{Z^~Ji<;{>{O9dv(WW{yM>ggd7A^4_{*;QN0g3) ztKRQW)F8D#AzSAuaONNZ4arHcnTdj)?TCo|wHB$1H2Wb8+@6y;Xa@2XgzutL!By0? zo>%ygv~kxp5XI@^)Tc`Mnj1dTYPgehh;uC)Kf#76BfjV!O(4Cuoe|x+vI^1E7?(7$ zbd)Z@_k$~{_^LM89PZ@ce8rO1lOOcx9MjHR@pY_4`?>fV;ggF* zJ~j_Ak8$kQXNpFb;@rsRw0FV;akzJlq#uK6uICD*9rcV zdn#1cD0)?@Ihjn&QFS38o6u6b4sEvv;2G@kVFKUrtdc~(oy&fzH+~Z_{vNe@sj$Rf zYrof1_BJMDf0_;1)};aJgY3$)sdmpzNW5_8uscI5l{tWb<~`qXq`&=yl%#d+c{*Mp z?cU6V58+$;X)V~8Sg|C)8hc`6{8eyUwae<9;_Q*@A$COr#EM$Tc*0K;-bv^`#m0>d z?z;Y~RXH!%f4T(i$aI5{+_$4AxM%&T9zqDJBC^In_IQx02Vfr27*Hoa+odJYkeL&= zRJIMnH>0+Zz#kd4@Q}s9zo%66=6e>1eh-v6Y%dd?=aPqS=R8Sp@wt`7xuXqh8Hce6 zY2jPF$~f7z!_SE|!S19S1!-Es;Vs-{VbpSj+-!H}gy-!KOsCJ|TeP;Sm;9#=d$JKT z;Z$A=TPUdmv)5AD!y|%ylH1EH^Y7cM0JBlIqa=F8 zr=E7QQ?Y2fm9*x|I9&kvSBbU9PSV{UGIK)>@89E!`$5PPIKi@@-2;{z%So!(r13X%v_N3Wq$GBv^PfEH|Q3(K}hCVSS z=$5sfXl_8;H+s0Bi5BG*9$mbheYRRU3|m_t{G5fj!DZss!MR6i^OT+DTMdwX?oxc; zb}DPANEkA8Dc!Cb`w0$L9jEB;@udL&3NG;n(h`z`j>G|@QR*v1Hm*I#7DV^!AVH){ z2mU8NXJ*b`e}dW8S2ba26Ub%D#k^bc=R9N@rM55s!Tl1JJBn@AoCfxe+ z1YRXIjY^)DntWN&(b>c(S3*@P11+5}@&&ft{qaEt+4e2&*NN^Ajbx{sD10eaERfTz zOp0(uj!1eD`P}H~3is;P+dR6E5W}v|UFT@*f)_IIAe;c++O-J{T(N`gTw4_(Fau3t zL(uf{v>&@-`cTaIqw3fNqtmGL_-8CC(26CJZ|3mL!asBRKAdOaPa+rQqANOUhk zmH5ixLW$N-?C_rzVAXuD>4oIS#Xxg;Y?pVNsZn4PV*BQtsm?hjrReaj1W0-oN7r@w zcH>; z*f7X^nosiv>?HNNbxYdfF=hbY zi<2}JHN&Pc{)dzB{nA*g_MsNTfHB<|6%hbE9~0A+$_${)0>5dqD5^&Fo)6V|79u*2 z_img%iDC6nJiuZe#oY|Rvw#GbLc_A(_Vkm_eg$QSCC{>%28RznyID-9wXzT^GaW+@ zkA*v}-iv8}EhSV)&o^2hqe=N5ey-%uj zBQ{rhfZid5YLVQ0nO*E)*KCJb4c}LS!EvMA1wQWX(JcA9&7Zw2Y2*}B)Yek(KmGn= z$y&y?IS=BC+Mr*}^#9QzBHv08Ws?aWJS9?OGezFfJdBev)LLtFxkRv(-)81sb?@+g zBBczLG>ZU+QD#|%BKFRom91E{@DITREVPTuWArB2%*lyg7c;@nz4$}H_{e!u3Q}}<$WBFgd))qb@^ZO5L1*k=h z1}lq>Xb&3J>}sm?#%PSSvuSC<^RDNG>#{v>xsU8UFp(VpuzeJ9y~OYQ#W9=C+=?fH zRO-wOviJV^Q>or1q2#c2d!Df@P$KO?R9Id7phg&}NGX5xtJrL{jQ7|}N1IAqb=Uj@ z=M@%mVEF(^u*o8X=?H%9y3y}$lQyfv#;D;&E5SdR@3g#Y zLx}UQYqa;?T%EZyAM(D7|E$LP0`rnUj^|5J4IA*`z{qYHb+@dsvUL3^_RdUZdFngC z&BaDAcGu%kB(E>|>sa58zL5H~%foMdJBEi9bHMueJ*PJx&UGF{hU{{s*9p@Hhsa`* z1e=@=EkoXTYA!D%dT-U`zioYXtA@AX(23CSGz6=l6EfR2cU^hC*Wwn9oWNkEI|ePa7!0M3C1%M=j2Bb+V=W#gJEGgzKRaclBlU zb>VDWabxntP!GDM=^Gap%-ewz2@_ojFa{6YFdP5m6P6u+&h_g-7Vbq(~#_)X&({3NlnYnJ~YR`#v+a3l_M6s8y zHsn)d;F$Kry1o0r{K}n?^IN^=`0#Z?%${Sq_}rQR^BO?NN=>l`=1EDf>FlKO!N*PR zE<~CQJ0i&0^3zbv9!%TDIh`2&zRVyH%K4xW+EmxO3~Ul`-~2t_U@n9Gb@j-{yxX#O zPdtjmf}MMP;V7^NvrHv!MCyIl_}$sKa_ZGg>qDH)5N!V_z;o+&!_01ysEidEIlaP)QM{>A$uy=%=AiZz zQ|+-ng4>Ro>h)#i*6<@2TL=lk*~SDyj=6XH-W8O zgv(Y|t9JGCBh#E$C_?pe^%`*6)=_exC&=-OW_|N>zh3$4=zNefA#qW40 z9XQ1g!D6s4&Je!|O;Dnb9-C`QYE7Q+>Fs{9bt5l)CjU%PU6oa|B(vCtDI$nDn%r^+ zoEA%Z@H4vhvs=6M zvi>o_PQGQGYu-*tBH4INL*ziBH>G{iuOP6X@9V}VZ)?0DuZzH^U!J8WLP<)i3)x4G z9o!i`(U=QF z^@w4Dgmg#@R(~~wO^C}WR`s^Ru|mEe-&RELswh>5R8My_OC)E{2F%a>tjy^oSvAiN zy*JGY8A%@wooFKPkmd@b1(2a-5<|Vuvk9rKGSXa;8xLVnW4LqgFzFVg+(UNj_Zv%h zF6Efb@;BbOqi2EXsbZ(jd@8*U`ozG!hRL)0sn8L^#hj2>o|uE=e#wO#y4l{It?g!F z!Fu)3>QbumXW=2FoBEHcr|sY1c94FORgTB6AcZXflVQeg4@<0mNKy01Ohu_h_vJOk z&~XXwy_W}3_OFeFWWAqxj?`v+DfQfO+`BLrsb8<9s+>g|;w`|ublqWSdOgJ0@YC+= z9m2t4W3AGs&t^6*I$Bbf*_5Hm$yV7vp$|e|b?2-{q-C#f0OvA$Eaj4|!nVg`{0Ha9 zD~uTj!0+nT4?-3(OYQO47R?J(>xi$~8ZFn`u@~CTtlbN9hNyR`-{DTi=(HZmgvIw;9Z@BMrjd7gBkGZ=M5(tJuBe=6 zDzofZ-)8C(Oc8A(fF;T6a0^ zwc2@^a`2edg6$(j!+yxdmv8kj_-1u?@`Q_42i1NM?)f-VWeKBhsblqv3l1}dR#NxvyuPTDDGbzAL`}*f&2VFTYD)Ow&0FQGf}rz z-?F!jzl&^nG;h|Jt~v5~WGJ0VWzc~KO@`oOsDv2+06;_2f8iI>jG}YIGDJD)z&+KI z(NOWf>J$xl?Q~`Wpd5Y2X%9|F03aY4sFkW-57v)&7t@6PVjJlkaqP|)IeG}*p`O3+ zDsQ+251D_1C#Jxff!qDMv^4Lo7rEvgM;}~R@-4zmA6z>5{?oHmT6fz|9kH(=d`_~t zkR8R+qH79YgsV!5<8;%C0Ocqhbz;2fUsBH0t||V)nW0Z{Fi_vi(mWaI-Lqv+7qf%i zE5-VthwIqUK5Yt9Z15?XEX7~z>W3p(-b3YuKTObmLDRPBN&ho6;hG$Q_q|ofarv0) zph--E6lD4>VO%bG(ofwB_Jx}Al9F$j(0PEj$>A>fV7IY8~yU-$DhuH@%F>k9-A)(%y- z-*J6s4XiPYtJaFbWOJFSr{>tv(zMm&QExK8Tt)y{fg3l8`Rk;L{Si}2mlMkUh|n2d z_{81&gpKT1NoV{ep3tnzq_lm=WZHV?$r$ktc=WUuvTp<@jt7AYPMF%~S)6ywQ#AM4 z!JPp|E)e&I&4X-AUaZFJ@3C{0DUedsTI2HY9UdB*ZwUZovxT7lx2sRIc>G3cl@lhA zVUfV;D6aYThJ4S2`sPDje3zr^dyIJBEo$@clFd+}b#StU#Ls?QxBA+Xo$RRWQ*4?J zq%nW-&40Gu?W^GoA;xnVjc$%!?=u5I(?H*Ml;bS1{FS7NenQw{;+63z>KR*)&fnBi zW}SSl-*zoU*U3`~3DsDY6dqfTuiq7di}zCz`!sqdZ2vOGPJw6EJqg#vhpGD~fwkwD zly_@oHw(9%;4-{=Z6lICcFsJ?PiDw8G>JNV5N>bgupb#}opZKMpP41SgU7x~C1TZg zD--(k;k^ocnN-4u`VtM)PdhtiZM62T`WiUJUCQe9m@gV4h5}OOW3Hlul}mXX6bam) ziX1uanIkELlm+)~`MB$6*l)cWYPENI+8I!qL+#p4X4__Ju2Sy;r}yoXe=vfa0i_kX zNXyhX-RXl$I?u6l_X7e3XQI_MUk^OX3f|PaK&AM}opRnbH&CCp1F!n~On1KGwIj}Z z1x-jmXC~II(Tn3enJ$u(qybl3(2(NvfpdMFd&&$hRl~j@;Fv_HPLs*pYu#(XKR+w~ z@U(MpCsiv&3Av%=4jf;0Y~^bxEG_LACfVwFa-uws?=u3nBJhNbDpMM)`~JlQZvJYD z+E{3kEO+2TE_c8Rb>0@t+Ei|>1dCE*Zf>MbKRsHH6p044?S;@VClN)?V7c;sc4r8>2SFYs8h{%>BpWxkBp)pVH0{ zWx!1>^5Pt(o{zY%kZvFRXgEVmYjK5S4u2-iy^>A2;D1=C)LH05IJzl}44qiU{4fx4 zRxza}*3}UmsRqKuHq*0V7H}obf|iFs^9R4l`-k25;cv*}6ZSMOV9L%s#%6eUP$>{6 zU^`qXz;7Acn4EZB-;=KIs+!A}IAz|;6*Ug=X{YH0*%*QMwBJ~@smxxDEisNzN&Uc7 z9=sL17go;htHVKXCpeG9hwJuBVHXDoK2TxGes^L?d1FG3UUU>)-+oyNpDSf!8b5}H z#vQC4L|f4dD#i!VpOR>tW#pE(2?ObcpNu`rzjIbIP6~!cBovn1kaN=f2~F>^#ntBT zw~&f|mH4P(np#zhr(X4Kt%!!szd7DeSuU-{FlcVjnqu;BPm{@1Xz>n-7YZ5&yTCes z%-!ljP{;%xxGSr&CafMc7md8PN>3g6{g;e03D?$ImDe5%FzeDK^8~KA0I3$F$_e_m zlr4ZqxQ_=$HZjL?IX(A>Gk$K){n+789O2Qv&~9>LG7ctzP=Xu{#cZ7}fnSNaqT#b+ zVQe1^jekaa?>05X2>0u1z`tEabTErIIQbJhql32$(8OiK3Q|K8TF!+0IYoAtJa0Rw z!Wk&d5)TyL2Z0r*KT(fmdM3+nZ&tf^vx0kM3M;sZ*lpYLtd+$lU-W5eGXeD;ORzT4 zbw^76B;muIb2bM}A%5K0#sH$=!!X>5Z{fnm27@KKKlu%<=Id!AL=tpXJzJBB^vw#H9PP>arpUIkX zx;VAKqxo6!nn{kwc?8GRYc6Ak-6gO?Kq9cR=R^Io$YBqxb$Kt7`zpBob{G-R;ZfQ~ zd$vcMj@6saD4TYmpbdWW)v0)85eRvvlhCJ9$nIMj?vM7Qd}ybpB%?*C`&%N7uM?}8 zY@J|f!2SO2B67cE-u7EMZ~h+RcREhAo^x-dc-oWZc$7t!m z=vC(k#io!?=aX)&VB$M?Kyj3L44C|8+V+)$N0I|1t78z?Vng{3eITti*|_C| z;&pqW(OF_D-0(mY+?%|`aPOUw*pyQ+Dd6$-dnV_<&Rwn_x8U&gd*|g6aJ2ITo`fR% z5lc&giod^D9GI@LmsSSj8BYsxdaY;zZNA0F1D%m=GK~81;qp;zLI#hYi||Q1SrDIQ z+^SO7(F%aeO#O-uI0CqZJl+!Qni0z8QCa~w2h>GBT0%YU<<+C+jQv~-@$E_xHVl(b z2aN5rFQ5sR5a!4$;P-~|t_MFesn*2>-OQ(0wv2X;oZzUaVQhpWZ7fD`ZEO0eJh$(> z^psHu8{8=GqgY^to6xnHvV&N{_02RcNrT|xTKiXAY&54nc#G&~Q+`Uel}i5%w{6|5 zJuC4s<6g9^4J4-(%k}{ z0(*B|6u$69;+03%_=^{(jOgkK#+hP$*AXNm@KSMM)lpS%IRPi{)3C~5uPu>@BY($P zfuP2y)dyPQxsZ-6yOa41X9xW5Hx!`q6zPSiRxnNI2o;|ihS=YKAHgfz!=q~4`C{XM zo#G(D`+(_u0MTTF*?P_inl)=!0KdWxYJ2{(F6G&h%2=oMkVz|D3>T=CID_QI0X?-4 zY^^Pvb9B z;{WPQ%5rVbwNihzq8>~9fS34DwBhwwfF6DawbiFKqTx$rx<(VSH!)J0=1!2E!6)by z9mIM8HrW4pPiY?Z?EvAs%AaAq>;{HT^!pw(Qd8j6+od3O`c5vE(Y)T;t-DBR>tUO@=`{BMc&Ww@Uic&Os*H( zENZ3)6LL?zW2jlo7lv$z;uDr7T_L(u#!bj>b!WhkbGONBi(gE@C;%Rn&2LLD=-cis zxuaO3WcMp-{7q?nlJW~F^+2YdMYwJW3CX7~WA1irkGI?($60@RAICRYZF^R1F5x@@ z_`vnFVKui+&4&8`<4WFk&Sv~*!B2%=>ooSTn+mAS9zf^SZt>&Azk-j1v?KzZo=E^c zeS53ivh{!HdhbBEx~_eA2%@(kk`SUqj~WaTqC`TJL@p42zWP z$9LE@U7?nmG!4zMsZtoNdd%lst8d8ebVul~o(cH8uFqxAM-5C1Tc=U@yxDIGXrbQB zZ;EE@ob~3#GWv{Lm)YNB43gnmeX<{1eMs`U_i;~pUGX6|i|@TJB$%C@38MY;$z#%N zk3xazv7$0fl?4Jz?K=%;mLbum9sTqk9Uk%li4QjrIog}JRHsiP0(tGL zdE$Q#A_uG60E543@}yL*{AKOAk2z8y8J^K8e(vJ%Nu_nIY*LI&3#s>{yDjO*a^iPM z4*TC6VGqS&`(w8KZ4!A&4k=D^x_yEZ?`mQ6C z3a>0UGQLjZH2d)lrD7*bb3k_D_URjJ!T{E7REE17i5c}pE1+HifFVNnmOc|Zbxfn$ zR;q@p%Sp8C`&IERZGhe9y71{K7g_7Aw=|==XcT!H7_|_O@7-x(B6A?zDljPSM=9lt zd%AxV@j_9b1t7idw}~gSEZ{IN_gu?IA4(qpnF~^{_haodt$qD_)TivX0qtCMNbner z!n-H+DZd_81b`AlgzwR4pT@e0%)E{WJm&EZ-8CF3OFH|Ga7EHVu?1r_!W#_5PMfdq z8L&tL5mCHmoB@g^Y^@C4%rlb9X23`utQH!y&J6~D#qtR>)6x&u&BdY_!HS3{1^Db) zvZ{BL!q+X7@`JYQJmcmM^!mE-m6!XMrcu!s zcrsq!Kidq0yV6*^k#E&37%??x@H+wYbU zCdOOUYPj;z#9zAtxfTg<`}1AfzJ&@`5p?4yLgo5tK1`6~r3k|d80$R-uk?K{BcgmfDQ=GN$iWGhk(8wCdI~rM99!1&yt=I z0*E>nT8bCf5lANtxcKq9pq=<2neW08PF^qCwg;Do69nV2fkp8iCd4;n*;dh6^OKxo zy4943!sY)VF;__uOan4z+z`E?e|=M&H~-g2MF}A?NL}j6P~Z*&*AC$PEdale zUY9NUsSZk9Sn@5#!qP%EL7`RypH1Bx;gi1VW_RLp{5R**ujeD&EEYw?E*|ZE3#j;j znT2%6MbE4j$Y2}c(;W5pzb7*`tPW+|aN+vLQC0s6DDgbUa1M}K@J|~8p9KmFE7$}F zWSkbh{mp%2X1p`yovPqS1FAhi^zy*XYdsB5%74q`cf?BbETwpSUeo7hu??3O9E+M#flPB%g|FEpJ>h!{CZJT;Pd6q+WS+_q|>ey*re;5v}jN0^l-lK}9 zb?`4=+w=>9)1AVwPu&LeuX2d5$JN?QefJAAIjyJugnavJd)Q3)_LPTg=DL0O1T{%n~c6ZA&-iSHpcr>OHR(LMl;R=2QsY2>DAVotBg@udK7X&JVZ=@&Gpb2LtC z7fLXSEsWVIbapt3nxi{WW?|?&BPX}iabG2qWhDgkupdS{vm4Nvmvl_)uI;DIR61u5 zH{+hxzFe)F1hocaGogq)#~$kDr@H%$ApD=Zx=YW7v5-aOs{9g7^&xI@Wv8ajhM`fDm3#V)M z*Jd__-j2DyVNlHT==JfJ^6XG}eBYPS9L8$?lFVcwmW1s5Xx$a?QQR#wJ|#E$BzbFL zu)v$Lpop_WCBIV4)*Q%<{3kExq(>>Kf|JBLi56Ojz5?z}FwYBD*EhH4%)ME|DivZL zGZq%5Z%a@2=%9NFIg*mEkM+*Nhp{9cyuw}>yk_>fL`WJ>u+E03{rq$+<@woRub%_+ zR_0*3h?@_)kG5&!VaXknIR#um0EtA^o>wH5Z?r$YH-G&0&t`v*bUpo|Jv&z-jg8ub zcej9+7TfE{Uz2ACr+t9{Bh}^Ic38?H$<^Y=Q^2A@RcH6+-yZ6yW2Vh@Iw$&-1&}`+;Y#u${Et`Yv&>2Pn7o7aTV1Ssm1s_6dUv9b zTEt-w_ZsQ>!G`;1$8oC8Ei7u(qdJ%3w_|onG>XWd(?SzYx2bh+31cc=jMj6n1g|+( z=>7~c$5vs#Nq95Uk0WJ1Bk4Fnt|O%`&%@9sAL;x9!_ZEM|9fT>6bvNTpk8bGgg zHs!46=&LApM0a%AF|KydR&D&!dlXC9$J`NxI(1VS6$tG)eziG7ky1qxru2@Z9dw6sl@R`IJ%h`e& zSQlHpI?r%npqEKtv9V9b*1li4_q|AOuYwoVB3b(`U2PmqVMSk3`aGDS+OCG!NG|xa zI(2RheadaAe1(sCQVgL!q3%l=d0F0f(7m?6SRe}%j-b3q&nY*vP44o3DKX#fzDt1b zOhbOuTcU;Jg;_KE)e^vVV*fmgq0d1;p;oxSgTaq&VbBpEbiNgO93bvAe%fc;16cm( zjHh3ek0(=;CsV*7$YZf;rc!d;a?vRW&lMcTDKwc(8)Q@oYC227p8FPLBbN8RPop|e z&#wkNPULLw!4;zX5!QehRD@XQnES-%3G%H2I-K*q`SX*t=ulse#)t8gz3|M}0->nK zC62u%{!o0_-Y#3!RpL`(-OrwX6RXvkap3pkkL%iPGe}uL8U4urPe+U^ynzgTEb~30o{-Kk`1fr-t&z40Ux4l&0pG z_s)MV0S>o|ixXNyiBJ@sgYk;21fVp!?rW}AqJ9KA8q$jc<-K&1D^CQyNl6tW=od@a z$PrI|qzq=%?$}bXH6Xxh9@;OM;Xs9mw0f_3f&vg@%q_)jEtJ-Pb578lU}|mv@<95# z>J(2}-Ov5XcN(L!XAJY57^qDGHSl1?WQ81U^0v^K>mW-2r*-ce3d{kZ0eLEvWBMT) z|Hm?b){r5dcvsAQZ4DT8pzXvLP)LTca)BfRj;4{1Ru<0VssXDbA?l=UTF?J2@WW57H_enu+|5Z&LoXkLvk)sKK`HTAi@J z&hex8J*rLnpscP9&O)?*N}5 zRe(>D=GV;K-pt)JY)*1PS#$26R9{2nfEgh3>$J5_2NNmfokZS+=BF)t=GUBIOvnM> zemTOv95eLzDB?kDjSTjsZiPS!tRbJnxSo0a?r+lFBYwM z$SrX}g0X2M`j{@?c}%j06-Pl41zsNKeM(nTr)k<)Be@$vB{X@}Bnq?h>{EQGBOym0 z;)2PaO(3ImR@=6svJ*&2CFsL3HN>qnJTv6Sl)#MHch})`fwYX*EF5X(@Sc_8TMes zTCRY8+E*IPNowc&FsoV==nt`kr+lXz4L-lZW{V^PagErcZsyivC1NTr(3#nbU?_T7 z12KR!oRL77MH6)cSR)A>J4S3K-%v7kJF4vDmg$@LkpzIv&OqdP_DQ zpcO!19Q;?E3s_UOFU&*X*TpY(Spn+~NC|Y%c}Kx903^v3N^@y#7s%qlqW&7kM=h@{ zq(D%@zl3b#(&D}5r9%KyfKMT;XZ0@aX(B9|g8RWuBQ5DeW58}5pu2cICw>j6LFce- zs9xyn)nN0#?!K23+&qsqhk4vC?$t|K%=M5;!dUQ*qfijLwf>Kxj(#zX-Yyy~LBP6x ziD6`#fHz(CbUu9uSFl9;M!T)q z=Oyne->zm`T{IOHIDrp~PIR}U?@*s+CWPV(+bLXUz6wqsDhQ8x6uh37gRg~yPsy-Q zBK0YK!E15XF?(3NSj-)!WDCpCX8f6}7q7V%242I|(cRJ{oc#v)?C;wVE$I6F7y4L5 z+v(G8A(`qayyT3#qX+i4I@3vv{k~G;zP@-*yR;QHjb*dKEsH$*oDeJ5m6sThr}d0< zn}1T><#wNIWel4|WTNtaT+dyKCXp@|VzcSVC$NP!EO!q__lEd~ZxA&b}< zNE^8Y&SH-%QCD(mFLbH8-0i6+IUxW?EK(sM{A|EW)_o(_0=K&M!kjK}d078Zotl0M z(#;LSFjfX8xc)bWmL2?;e;!@Jw1R{Gx`W=U{{mJ*+Cf-4po9!8yi-r89y2y3@pZ1h z9qYJwOatV4sur4beH|*@*fnt7&?&6t|FZ%0$qm+}-g}^(vp&qR*XHtaFDJ3nZ;e1Z z8Y70|vX>XKx!@awHjVtihlx(I?A30(+x$U~3mZ`D%x41;6yd^mm11QUySAD?me@l~ zyNzymR5ar8g#WwYc%&}|kM#Jq?J84z!^7jnP}_lkuUZk$VLwCXaZ_hv9%8AOuzqYB zD@OJ&hJsvYKx4j^K#$LADKV6+YV{iZ4Zf~lG8wLQwx z2$|U!j&ml0raSBgwk0KnUS+ZKS@5hT5828_g$w446bX8gzrfKOLSS~J{d;;4lHtP0 z%?uyaTkpT%Wsu&DWO&TOgHoWE88XXZRmP>#rwPS+}Y5imP_|8I{+;u~4 zmL2uiK2L416-715Hap!!1P|tMZc%9>dE1Q7n3~qP> z{e!Ie+ja;i77}83c(NeQ?RLKJuB(Okj=dan_IvZ?#8#A?I>3;Z^M+=C0I*GnO=Be< zDWcy%shuM}ow(4@m++#&=iALYHVGzXodQ~wY%0jkH>ua{=U%xzeuShMt+>Yo$RwLn zSl8Q~77|#*4u2}Kk4>5&t#PO)z^oEpbrHPu0z_P_t_K(_V@h8XWBla=cxx06j{U8kyAX4VP`#{>%&|8ogZ zVMPV~fK2tJR#fK#MPPPrn0*F?7wf0jGn8565t4+Ly${NLVx96QFSlY4v4^vG`r2`` z;YPOM>aW6tAa2ep1*8Z}`5y{G<4m<%k@=Z*7xTYH`cy=iim#dcUlK`X=?rI@0o8X;Zj*8 zsLw_k)~@Nq6cE-+)?co4LeI#;p|LTF8OoN+w{qUOa9P0XvsN=20&u2x;P^_FZQMMBacyI#)R# zq|xtkUoVRPv#%jvFC?#xkx`T+2Ry9T$y$}G$nR_;wTWIB)cv5CJihZzfjyWk{_9}n zpCwB5>9&Gee%6fS;PQh{rG9gXtXFuJ%pL)C5D~cvKE2HG(##mba_lw^o=$wcVPV6;g~Icg z!$v=di*eP%?fZp@GB7SwFm{&u4ZaH%Jm+gWgLD5YC%xn46YLiP18aAOK+z+X0vAT~ z3>8#I{;D_~K9mXnlJnyOHF2NkKRWL=&i~PQitg8Qa{@L;h{9d1o_d|yU89)VX7 z@_+lma=kG1+pl+3p;pAf1A=L%j^l(EcmDam8g>T@7ly%MAisB2_s^x9rv73-r3KuA z=xx6D=%tdmRkz+}@AB=+KZn}GTNh*47e9x1V7KllWr+o@+{0L;{pS>b?1Cl;zso=# zmJOY;*`M1cFkiF`ST0@@xUh@_H)iLFq8V?)rl(3GTGj7X44c=XbR3}ZehmUC)T8u{Gx|=u?Bo9FHV?@=#wpSi|83xmhMFV^uwx-fIi|F# zwjHe3okWLVwyzC9OT2$u;=!8V)v$CSzEoNAVLBIqm=8R*!<0hk1aRH7RCp#UjSov9 z2*ZY^11bB4{WDz8Gk(oc()f641B<3(r68v-1Q%V1@|pneptR1bU2lHlL&P#c$~5)C zQ7YSBxP1+D)+EM>g4+eTIdczuw)^nIgZ<{hteE)U3obE zPU{ZxUnOJ}_wNhu?a0?})-gYdhYsSwC_?wzK#7%iYi%JJp~ix5o>Uhi&UUXC&X<-2 za=RS}o+HT-i~Bl-gVT*=*n_pZjXsl9lkWmx)1^~GPlJL$nU3Z?rL5zmm3tCNf45jc zIlvVu3jP&?NnF*7!hpd8>V|kHJ!>*8%CgQ2xdyK`8<}7E(Z~Y! z+5HMZa-^f-bVIB4BPw#$#WLqmx2k+eAGf`?zY4cCBY{0uu=;n0FS7mXBCb9!j)7NR zOtan+*g;aq;~x-G#~|JQnFAxr7&CN^4K=o1>dfJ!JUj9uK#+dS{{H*LRJCar7^%)! zBtPI2I2z%5kp7j=Db`>4q@v{m@{18qs;&16Oj)MxF}BJm<^+7#*1bcay_2obY^J>2 z&(f-k$Gcbl-UGV+p0Q#!m(HO9vjF*TN9q3_E>Rvp8)2=zH+)2MEc~Yy7d8$J|*=xX<*8 zBY_ctKv&`I#wc}{8$Z{|z&pYMIhW|mV=ko?GjzTQszlEHU@o$4jrAT@bKVQ`VV7j zGNSU}pBRvb{>3?2yr<~pN-_bzKa2EJnQFj<7!zP2g^T#E#U~~kV8;;grq}(pGOT7E zXes{c8)~Mutb!u=YySJPB$L}L+&xWlwVJ?Z8U>_&1q*ptz{dq2 ziCEyrLbeIq6uUfpA=j>4O7HDWL_-J3*=kte(|qTugZFg0hNs$Sy5=|p!vxqHO)UTr zs}ty&ykVP?p1GJ9a8!Z0yJ%8^^+)&Dn;;g&H1Dmi_4l#8CU|=>6j5+=ffXT~B7aAP zi+w}Wej6EGrw|~tQ)Wp?OvM68roKJZ5i|QH_8KPf-xYqxW2~h`#zYz$DTa1IDPB>G z_|BmM*|}1A4k8!Cr$$*r3-$2?u%&~`Wu{IDY;Q#P=UTL50ev@^m51VBzMtN7!>?AW z&kDMa|8n6#k|MjFdlDj)af92{fHVxKo|kb|buI%}ia}G&O+%g3#^?D*4nGLMa|4J>W{i@E3I(&S^WF>~ds~b5nUZ$`u{!br+KIPzGj|Ek zJepb|Ke)uTTJKJ~z7gkDVmGk?5mM#fOGiTm@ziE_SMKoB@ySoqb=P)WnSTF!Zsfgr zua5J_HODbcX__q6S8i@bF6K3JL($Ze#iLKJ?(ZRoU43bKbXl8fUY7BnjW+MyeH-Nb zSR~lMuB_aafJ)GB&0v3kr`EZ7+}vffIl*LXC8Irn?ePTLI`P`dLp#~%r~IWa5_4Ut z+DS&>L>^DXw0ejkOY=pY83O?a3NxBWP-S^aGZ zN79>;DQJ(uLa?;hbVh9zfgRN&7b|l^u&Z|LAiZBlOO)lB+JZkNn}H-Y9*LYet2Y+8 zUhxma{xxxPVvz^B1;e#-igzuMg`;>?+GDb*9gB+JFk8}{^SR&9Xy}+>laV9Yr*A65 zxfBYV93F8OZ7SxU@NENA68i9RR4ff{(1yR8rmO3D@m5R2L75k7rc)^SqX$1bO9W%w zv%D->=CYf{(xCdazl~-%njbiaT5v-n_;aJCy&L32V)u+%TYvi;{4O{%TiwyMSw$4RfxJ_m#KBy%?yzZJjugiZYmr`p8i1X*h7$L zB73_PkJn-eK!OpCg}@%8!EbH=$eV54yG=H~nz0I}r+8z4Kwh~-4@0SE#5#Xl`owp!WP~!yO6G*yscB9 z$;Zl=gl1GU$Q4{w60oQdBA#1uyb-nfLSNiEnl9|Ih72^|B~cUUgP#%5XTln)960!% z0U5C!nj-{v3x67)oV2NnA#YXnvHLbm%4ZrDCtPnoS%%vcYkwn0#HD4cxv|oxaQ!L@ z-fE^|R#fYL@=+0q3U-5HY1HhY5X_Ur&&8rJt7A1RCjx2;8saT|jkl@xPDvlqH}&(480&Fn?P z(o}4;j!BFsM5T4^Vm(LT_5^9$^KF>tQhMdPMOT`r^H0|CD;O?SJBYv`4+X7>@vi4h zJzR(&oyO;qalBpFfae?`?+2ANuElIU(4EJXt0poMYd}z9WZW(dC?rEfXfuyX(o{aB z+3*oi7ws1iun$iy^pFbY6Rsd&wmE6Tdk|p8J*5KYQU3}xR#ek@rC-k94bs)5rYbW zmhQVoZ3J?vCkL>~H{1fd+&?S3ELoue zNP)TX_Ga}_%j3rtYs+4#AO1)&kWiV3It1?4I5#Z|c9M9^y<*2y#Jc+i#vq;GLC#}_ zv2gI#7E``LvW3cwVOo;_R;%8aF@4Y*$ii_@+#Cyo<1(wCVcos@ARykyBV6=(>AkL} z#P)|J;hI&A_?=xAu~R7e@^*iCY$a@Z({se61d1);RSd6zrV-sKF^hs$B_1eV6F zpc&e9lT^l~n2M^Ig|GEn@j30MHSu8*E(r?>pEvQ5E+3l|`_j3m?j@0SKCZWBgR2yC z(>=Yf9jTPBRT+2xW!!9I+FCBM?R!bZ$uE4SN6rpvzB!BV_srZTvhWeM+{R3hd+p@if}O%!)2orGfR>XTtyzA@!;eojGyvyM>pdt7X-|j zvyIK{kQ78)KYu;0fz^}cPx92p+)9YBRWbir*2Va;nl1J|-R{2JscT~RrOh|$@%IPNn{!QT;nd^vz#gpX6HX^xPb(+yR$I*^t&&p5R%irunphn zAj71?D{rtvA4DG?QJ~`_Xv@kJlgi|Kr+wkujfqdY2?5(O^%{3iK}Cb@nJaof7j^0b z2yQM>vXPH;$K-{i^-y74ald^W2=C2HXU;iUftMXatU<6-zc@n`==i7>#F7jQq3qlV_8@%5+S zZSWnO%3{7)VD$Yo{<7*FSy-{uq~@plhZ4s5y-8$#@)^^QcE6B#0(f{H3q-wvQgid5 z#PzOE7){}wb}^}^o4zsCHGTc=6Rw@n8Psn-bVAgoGAVgqw!`Dt`}~FQx8JB#b-h_Z z6rS{rz(2sbejccZ@p;DvY=MK<>0)i!aZNROQtd#=zBN{;-WhWttb#{&*iVltXX`!D#KWnT2@#D%sU$kwD33@pj`EZ+wn& zL=vNw52e`pR$Yt{?~=j-hsu{fQt>2o?hhp9`X%cN9psjmnSZKaBbC)tewk*06Sr29 z;tLXM1&_tTw_V}v6-<=PjybY0{~6^W7b?Ny^OIOcv;P{ZlYjl%Tg%~ff2e@- z6a`9tmP2)*&cQzTniA`n<(;h|JE^xrB{hN_8(O_?Dw*G?B`Ivxj|jCj69_9_+Cq`E7}^BijCPt{C208g zBds~J?`uplQe|Wf6cN3@&|WmNN8HvT-(^zmOYcp&#F*sFe*1e|yCD$s}Hyn4u*EJNHwL9Y>$Sl)??=8@6W^htKTi zM>A0JLy_`ui3Z=%s1|dv{=uBFJ>_0vlzIw%D7Q@i@ZjxQwqhy;?Ng!hE{^>#X1X5~ z{V+q_LLP_CbHGwD@EAo&LXp3%Y{ zJK+N%21~XUr?BU<7?K-d=QlQ=l;_p$VMEm4T^xzb*ASqxn1m-tGxP=o@29LjLTx0gS>!I7TVznr3!>ON-nIq31OYiH;^fSLaJzPh-rNQp91R)J{HZL`iOklwYyC*eP~8N`NR4p&yTRR z@w05*C3xaL?@~ZJ#XcNJ=0B|P46d3Cp|moPREqyQu(5Z;7&$!QS1ytX(E#&S${vW^ zeG6EP{0s2p^8p8qO-cB9Fjtih9^Z~VC;)^fPDT5B{;%3PmhE(FbIVNzHPkOa`DGXx zu!-NXOsOm0-~S|8{*%ngUoc;Z>>m@>nEW3g{y(>JOwpW2go9|2+6*E!V8$Dx-iUhBjO=JXPyvBQ*q;xX;20cuVJ#@IA*1a=Ct~$Wgy6r!o zzJPV?YAwKh_QJgK)|8_U34!sCCpi}8fgvRtN=3h<-J1^Y^7pb*0cL-4=$z|1F+#BK zK^?P&_KEBDHT42#&izyV(Bk1b_H)<-RiSIznjUV5bzZ(#sStqYoc`) zIU=;;wgX;fO&(|>6-21@b63oH{&k|3CuRxhcHLjU_OM(GTsiMa(Pt$ z+DIX|=6)}JymaE@&#_9OYAqwB2eVHU$6D@vx8LIFkuKZVH2ppIJMY0LY=IX~jRBz6 zC|PVISqb(i@vHkYC6vro6>G)WdpRrNDBP7|ZBe9Q4VrP};gd3m*%|dh28Fk9mz4lJBMxw#TM?*QqO{=Qjq#z+TkCAv( zkzx2!P?k8Js?vDA0u>fEBe(vhN?hvfF!@)NhLKUBNtEn;v$Z2?1`8{T&Mtw$HUZ?O zU2U}ev~88hU8Wc+#1510!bfv6dIOcr6%yp$>V(upwxnQib=29XkQsr6vsbGT`xWPv z2D4|l4bQ7B;1#o_-^Lu`sJX(F4^mbvLN7jC)=t!-{;Kh)^>>ce@4b@O`#>r3;BbKI#$)DnN5%vBc<5bU`~w7~_U-*) zkdC+|T$nLJ-bHL1qoM!`))+X3>u(Jm!s;^IRQSz$c~mMhgBFMj#qbF6J& z9jrLK+l#j?55+IxV>!vM4s4z6X}U3z*K_z4ABVZlE`c8-5MM1MOE$VtHDg?%hV0az zn@Nq!dT4KTz`bGK^mALnym5{vwJFdZE~dqgrhjio*Nd#xDMn z#eSNJua+0jFt5fgG|y-Y9#oiLPL*53u3eU+kZ5%Cr`s5kV8cR?yW}2gwC1t7R_q!r zNR9ZBjE&5@I2In|dGNcEnPjL>Ry_t)w@ya*LSPs%M7^YloqAp*j|$6mmvZ@z`jSJB z+Ba9f6UQ{ZclRDUiPDF9xkPeP!>?bZ%aA!%wGbG5H8O~dvr|2p+psa{DV{i{)%6ek zmbXSxuqGVbSTgKu3Q_P}diSRHyL6|v(f5=#Z&`SdB1Mu8FRyIuTx1oSS2D>~K2cjh z{H%!6w9l09^vyCV=Y%|hc;AE%+x9wVd8NH$h>CKk8{=4x?5O9#&-Lmp{??Ld)S^pT z(gRLQaUFl5Vw+}?)@Z1SE?Zi}g85n8NVG23?jH7FU$HazuGj_p1icghs~nfyniH_# zHfQKlUgZx}z13db=@eI9)ymiwW&kG}M5~etfx7bOL3i1pB2Tg%&h(j{ngL4#m(ER> z%6AAFd=BH}Jk*CPZknOB$5@wy7*uiEzW&jwYRe@4ZYeip&AGS+oH^qEb2d6r&0 z#P?do$~Bl&A zi6Qg8{dm>im#`4sLo&Aq7t!k0d4spc8j$hwA6Xo@hL!#-B@@g2+1ABgL4 z3#n^~DU-r|f0EQlrovsZmab;4E44?d{9ARXt$UXz#9Za~6)X4x2%;6N!y=`Rvu|t3e#i^yg_dg$4HTcS zJ7}~>wkyl*?Bs-LBXovK^KbX@c|_oUc^pgp~SjCR8r`YHttBi$7~r-}$H{o7OElq3De zL$7JaK4t#R{lx+euT;Rby%LVKvbU}oGbZ^2&lsNV+UK$xjff6v>obwQK^{D@v%#i5 z7m1Fj**xGF)R1Tw?fgltZU;8RDps0X@^wX(Pj(Cwq$dy6Nuta^n&;58qNDBh(>`C- zIkWBSBXKvIsO#Fi+lj{-ZJsvwW8EU*fH*>NpT_^JN!i$RVruhw-Je+X_1k==L%e*n z`8TH?qoF5ypJsQjy4+Ya^ZNOfXr}+$rtP|f&h^an#!-_QGvzQGBX|k-AC`4NEg8|Z z;s+Ud+wIKxCkAsAcnc9#EknKONDkN1kaq6lky_!V2q6VX-=wrNT({q#E-&UKm+*gU zfJL=>UQFBoGN#w8&r^4{v8kOCDD994%DSzgJY~}@&4DA4Tr3;un7}8g*wJ5ar6_Qv zB$X;Pf4t@1$qVM3ev0DCE8!2Ey4%Tcf!W&*tHd2fFwsmqoctX*zkNz}(cxUe<2#jI2Gt7=(EU{9R9lQ?H5j@I$?~k!kI0!DS*nyu|BKG%RCu= zU*)}p@*&#p0Z>sh?D(sa=}Y01?m2_@{AMQkp8W$R;kn zC{y7WF@+JeU4k~D>=W~fK_A<$VZINCF|#j*^poTYTut4?*L~o9`%C&_0*7F(0T3+J#|Tw%|@!$$v;((9hcU6X!= zW}Rs7nx6-aE6btZi^x|#mn*(V!SNCHdiY?m^a}i@WA;yTqd(e23+EZXZ%oN#5(ln) zu)YSx1YU%z9rsdxL#?URHpEeid7Ms%{a3c_4ztc*i$a48witS8ueyn?OSk%RT-`l0 z{#N{vB|7Z>D%NLw{;VDIPjhh7D+-HmU3TXTmc58R2b3)oaUC8d(X#8xS00_=ZgI93 zyh~d6G)#w8dH|icE#E1vwq|eCn`Xwi|ClsyRdmFk$-B7K!kxX&<^0p2qHSZpev>Eo z3P9%Fx~;e)H`c{g`PfB~^(XZohg73e)T4UCUYgUm2;Z>5Lgv`?Owa6L@1o-y1s?wd zk$O{YF&@)yq;V@bIsdv|SIU7HTCtHPrtYNlVv0P#3`Tsr3DDYWgM5Ow+RN8DIeMXp zhh_}WPzRpyyO5jYP=wr$cU`<7K|RkOpGJz$KWewGD)`A&qv|>aj42^`!HSVEc|1)F4?Qis+l1X=*LyDL({q?}9~!K1W`V zA(Y+Zo)qR&`ZV}}a(1yb_BoSB@6vxvXXMTlv`W1Do~3+w`dEdSQ@iZo)@+{*E3J;bVf}BADTwd)E*$jP@aZ_gj6j`F+HsMqR>aAlJ)}X^uyW zQGa8LXh{3;vTzj1u4)Jt&9;4-LfI9hBOUn0?K^ItVR!5w@;i@_lYIOkHifBegv;s^ z3+s@_Ylk1lGCo`BrYyHlFfdw=u$(*wvR`S`|2L{A#N_*d#Be5REtn1h z$cmsqm69li38xyYE{mQe&+J}G1e7H1$xRH?>M0IP84k0f?O%@)&1$#!Z~k&oF6A32 zZDujDX@EJ@raf|sdC~_=`Z&9aVzVy6PAB==eyX>(r;2AfKEeV;lO9#*Td9|>jezj0 z-gjHo1>rNTaaUg?n+`fkXqejIV7+i-|0_>m&p4_xK>AbOOmE);<3*sbs=0>I5aey> zSigOQ80IRq!fX8L(ud1GAj4bv!rbHpqu|2Pgl5(fh5}CVyHpejrzvT=8a5gro(58fSSZR=`Y})m4Q?=3$ z^%AJ|n!AspFMCgND~x-{e9|VPJQ^it_}0mCWgNAhTh+YRU>r|EpI@?oSvr<0omi!C zMnC02F)K-COpZQ-aawO-Z*Ey!nv%(~yF z-l3y_ork8W?TO5W9Bs@F$}RJa^7lvONx_hqGPL5#Oe~-ZBJ%==Xy`a1I~BM3cwqLS z|5yAO(#SBlkI{vYtC~K3$GDN4hg{X=$@*0lO+Z(qy9cUky{m+ z*?>>SB%&f60Q`$zi90h7kz4{x=}RpZW;d&|=4%E+&Q{32mYgw2hRXa5nVO=p?< zA@T9}O&|?v<@u6rWA2Z?h?1GA2SWqj4b$-dA5qfqz^{g@h_MqY483kx9kFbyR|eqz zP!+nuV4fq!_i-syRa3-GE%RCU@tcv?#QJ*;BZ!PW?iuv2)ELy??HKX zG7b-XPvhQq%O+YVcHY-nS){Dc%&U8mnF%bZ}$VE)ZU7T6k}7UZ=*By0F4&5C7l zQ&AIlsotvnXyE z52fF)k~RJTn;-uHn^!b<>7@A&S@T|O#@vsCNsS7K=&F9NpN-D5#re_m-rn%dZzJ=5 z)3-0Iq{UGL0g+E>N*`41CKWi10Gm23d$a}!O3*a6q;B%-w7dq}v3wPGQ%Dp_i-UQ* zX=pZ*IkE4W%B^l;_LbxZFi;C7W7$ZyhM?HTH@Q$Do?P&Mo2kNP3_7<51<(z4QR z_^b~gN#6fKl9dU=uqVlXmcRLPM|aqyAiio(RgCOZXllVpp<*Zlsfoad4|y{L0ds~n z#q|+I+#m^u+>E!_ukWAMzs+(m#G#-6$1-+(lfCii91&1V-}TWLGfv*3S2(Wuv&=qoHx> zyA%5dl6FXYiwqBoE`6H3UxM;iUT-N3zKADg{_yV6<1sZ=X8Fo@MUOX^B5y(?HReyF zs5&E5yW#dP$`n9hvgdVQ*361>vDTuNeUcpgELx(T0@6<R0RgqUx@WK#W z@lU(0pu56aJ9qTEV^6b=n%r%T5bo$Po7l_{?nB#>cNU=@FV50c`N9cc+D%mC?XBK1 z{X(ie&9m=MBE-vX*uD;biKDL$k-KmJ-=2~#Un?DL0+s1Fxm+fEmaU*5!%`6>>p+;l z0G1k^9@#rj{rnKW?B*LMaGWd$$TI3n&nw7lW?Xh+;htopKOECy`~aWz5#_nMzuihd zRYjV|nu>n)LK*M%N9#UOtemrw3%cti1L$fO;t8jC1U8sxs$lf=7SCW?=__4+R*USi zk~cxkt4=eKK^=bkNjq9L>t$mI7mcM#1^Jz2T%8bQ7nDW7153bESbbo&()P=++G2LE z%G~{tg-^ri78mY%7|m*vtNG|t)oN37UG=1Sv0s%N_bWN;ZU-02j=nzebm`--a4ngt z(4>iO@+N_sv$}Ifdf287*Ow2J+F*yq*S1Bo43rz`bzwa7L5I|_LBtpEf&ZWYi#T6c zceUL5@uSQDbU1Vg0M=IGZuTJwmG<|>Z$8M{iF8L~4ssRi2E?C_oxHIV+1%Pb-F?`b z5IpqWxCD(<1D*n;Dq;0sNVUprnYKTM@*edLyL5qs$t`v<7NT&vcSaI*QKV^f$!%$Z zb$rC8(d=+aA*wvzk>k5UG`e+_mM=$SIyCBgc8$@3uypPuf=8)t;%hQ#2|jws9k53& zQU2++HgyIIqNE_#^iXxR=vn#gJd}=Yewg?bN1OILiD68IZaJ@Il&Sr)uHj!`z?* zEfIEFmRpc_oqbry5sX(s?~TWA^9T7}QJ@lDEcR-%`7_8#=X6COzD{q8c}cmxCpau>CZZPO#k~fYDmg9-ff9Ij^&81&IxrZ7`q7X*c!G6>feQ zPtPgJw~wvXlJn%z#)p+SwG%CPEPTx~jEw@~;Bv96SwakM9@?=^6_Z-wD*3ac{Ci`E zu&xpR)wekwGkLWslT>+qb;_#TQ?S$kaw7(g*QFo-7)Vp?juNrVuwfy2Y9D3}e`7Dr zGBiNPK>`K09LIOBCZF4JPxXD6Gp?rlO_Ly;%S?w?Y}j>e)>0AKWLOlPrGIrQNS#t5T(q{il~lh`|4<*!)p3iYV2C|IP*3SRchxY z^56XUzCCnn>LO@{THC)9kC}Q(?pCI5nXnL&w*^rN8tUCLoUI#}sa<|CqDCBSUoo_0 zCaM7}&re7j)A7Wo&hgqp!e47tet&VuA02&iN~IkYZ*FUr^WlTU`e_tpD0gf`(~q`*0@U4#N1zonTyzWJqsPP`8aKUQ}Nbxh32`|-3Gd)%N_<2e3?qt z-7j>mk!~U~>Bl?&xt2E*{%Wq#H#eZ`hz0vvtRMd(W#*cWu(k7)3cwXx7c?rs&VCO? z*qAbda(%p-F+C`SIZ9S)K}Vmj)h!`i4~S2hCh%`TeDQWwLER#6+SO4E8ltGaR|7Ym zwKN=_)7#?=kbU*q6nTYgmTrT;7@H z;IJIZNu7t3KZyVJ8z)suY^%U)mwmdaliN(yEmE-C+pQI@%atxR#1rS}%(YS!ga?PJ z)W+EDo|4UKMCtE}buj|d3b;`tbCc#>TbP2IHaD2bGRFA*NLuxo3vC)+?iy~vio)M| zu{Dd|pe5Jiy~LKIM9 z=pGs*2b2cs?vjx1hC#Yhq`SMMW*B%kUibCC@B4X=z6maX`wY2%dRtWaf!B-26T*=hayy%7V4CH zhvh(qH#feZJD*T0S;&@BE8ay4o(!c%6&}Rq9c)AMhDT!~q0GW288E6l2UHhd{F7iK zN@LNZYlcQ4*jcv*4Y$HjOjg#6d-fG-bBi*6bL@@RR|Q}shzPYNFf#8ziN?q4#=f-2 z>$>Z=xQ{RTfDGEQqBpd7f$;n#49GKVHYJvLtF>TLTI)4Ios_q0TNncQ=bXUz=-d~A z3d;z+^+z;Y@z|WPSfS(6%|!ZfuACy*&j~78JFxy{+0hKsLq-p8gmKYw|7O`PfiQdX zt+o35XbDu!6t?$|{ne*EMqj`IlcrAEiuqf!dv!b>d|yOSWQz?QO%E3!XlH6<#sJC=a*=O=ACt(P5Oux>2n|k^ zo$wZSY$JEyqj|&rOElz83d#*|7B}gz7^WpN-Q%FG90nhYUV|fg4BPuH*~1=NSrMRZ z0lGr}rtEnd7)s@cu3&!k)^bj(xeuZ|fYDNqgQg!QTF*U&@PkR_=HN-0+!&gO qjbwhT)#I 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 ssh -i [Key name].pem user_name@[instance1 private ip] + + *EC2 인바운드 규칙편집: HTTP 프로토콜 허용 + +2.nginx 설치 +->sudo yum update -y +->sudo yum install nginx +->sudo systemctl start nginx +->sudo systemctl enable nginx +->sudo systemctl status nginx + +3.nginx에 정적 파일 설정 +->sudo nano /usr/share/nginx/html/index.html +위 명령어를 이용해 정적파일 교체 + +4.ALB 생성 + +5.Nat Gateway 생성, 탄력적 IP할당 + +6.Private 라우팅 테이블에서 0.0.0.0/0트래픽울 Nat을 향하도록 연결 = private 서브넷과 NAT연결 + +7.ALB의 DNS를 통해서 Web EC2 접근 + + From 8ccdb95cb4b6751ba13e957979eafd8836712ae3 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Wed, 25 Oct 2023 18:46:22 +0900 Subject: [PATCH 003/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..4303a03 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,38 @@ +## 📖3주차 과제 +1. vpc안에 가용영역 2개 생성 +2. 각 가용영역에 bastion, private EC2 생성 +3. 각 private server에 nginx 설치 후 서로 다른 정적 파일 넣기 +4. 2개의 private sever를 로드밸런서로 연결 +5. private subnet은 NAT와, public subnet은 IGW와 연결할 것 + + +## 🤓해결 과정 +1. vpc 생성 +2. 2개의 가용영역에 public, private subnet 생성 -> 총 4개의 subnet (2 public, 2 private) +3. private rt, public rt 생성 후 서브넷 연결 +4. igw 생성후 vpc, public rt와 연결 +5. 각 subnet에 EC2 instance 생성 -> 총 4개의 instance (2 public, 2 private) +6. 로드밸런서 생성 (이때, 로드밸런서의 보안그룹은 ec2 bastion instance의 보안그룹 2개 지정해줌) +7. NAT gateway 생성 (1개의 public subnet에 생성) 후 private rt에 0.0.0.0/0 트래픽이 NAT를 향하도록 설정 + +image + + +## ✌️과제 인증 + +1. bastion을 통해서 private EC2에 ssh 연결 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/e6180b24-d920-4288-bba0-a2bb1225ab1d) +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/3d8f1b88-822c-4f60-b13e-67213deb7a6b) + +2. private EC2에 nginx 설치 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/442919c0-926d-423c-9dc4-e98b35c09471) +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/628e996c-c2f5-4063-8900-92734dc39e9c) + + +3. 새로고침 시 서로 다른 HTTP 웹 페이지 보임 +
+https://drive.google.com/file/d/19b0rq6WKRF9GL-BstKf14QnNKAFVArk8/view?usp=sharing + +## ☠️어려웠던 점 +1. nginx 설치 후에도 unhealthy 해결x, 로드밸런서 주소로 접속 시 504 gateway timeout + 원인: 아마 타겟그룹 설정과 로드밸런서 보안그룹에서 문제가 있었던 것으로 추측됨 From 210a10b62ae526824a0ffb777fa0e59325aaefdf Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Wed, 25 Oct 2023 18:47:38 +0900 Subject: [PATCH 004/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" index 4303a03..4f9df0b 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -30,9 +30,10 @@ 3. 새로고침 시 서로 다른 HTTP 웹 페이지 보임 -
+
https://drive.google.com/file/d/19b0rq6WKRF9GL-BstKf14QnNKAFVArk8/view?usp=sharing ## ☠️어려웠던 점 1. nginx 설치 후에도 unhealthy 해결x, 로드밸런서 주소로 접속 시 504 gateway timeout +
원인: 아마 타겟그룹 설정과 로드밸런서 보안그룹에서 문제가 있었던 것으로 추측됨 From b21eb93dd7dfe1c20da2afffb413ce5fcd4a39ba Mon Sep 17 00:00:00 2001 From: Lee Haewon Date: Thu, 2 Nov 2023 00:56:17 +0900 Subject: [PATCH 005/103] =?UTF-8?q?[=EC=9D=B4=ED=95=B4=EC=9B=90]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..991dba4 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,87 @@ +## 📒 3주차 과제 + +1. [Cloud 과제](#cloud-과제) + +2. [Spring 과제](#spring-과제) + +--- +## Cloud 과제 +> 1. Web EC2 2개에 `nginx1`를 설치하고, 로드 밸런서의 DNS를 통해서 웹 서버에 접근 +> 2. 새로고침을 할 때마다 페이지가 달라지는 것을 확인하기 + +### 과제 인증 +1. `Bastion`을 통해서 Private IP를 가진 `EC2`에 SSH 연결 +

+ +

+ +2. 1에서 접속한 Web EC2에서 `nginx`를 설치 +

+ +

+ +3. [영상 인증](https://drive.google.com/file/d/1722uMrXEpy8Oira_eiIBXLjRk4TJNUqR/view?usp=sharing) + + +### 과제를 해결한 방법 +1. 서로 다른 AZ 2개에 `public subnet`, `private subnet`을 각각 하나씩 생성한다.
+ (💡 public subnet은 **IGW가 연결**된 서브넷, private subnet은 **IGW가 연결되지 않은** 서브넷) +2. 1에서 생성한 public subnet 2개는 `Public RT` 라우팅 테이블에 연결하고, private subnet 2개는 `Private RT` 라우팅 테이블에 연결한다. +3. 각 private subnet에 (서로 다른 AZ) `t2.micro spot` 타입 `EC2`를 생성한다. (총 2개)
+ → `t2.micro` 타입이 지원되는 가용 영역은 다음 코드를 AWS EC2 콘솔에 입력하면 알 수 있다. + ```bash + aws ec2 describe-instance-type-offerings --location-type availability-zone --filters Name=instance-type,Values=t2.micro --region ap-northeast-2 --output table + ``` +4. 보안그룹 규칙에서 **HTTP 프로토콜을 허용**한다. +5. `Load Balancer`를 public subnet에 생성한다. +6. `NAT gateway`를 public subnet에 생성 후, `Private RT`에서 `0.0.0.0/0` 트래픽이 `nat`로 향하도록 설정한다. +7. `Bastion`을 통해서 `web1`과 `web2` EC2에 Private IP로 SSH 연결한 후, `nginx`를 설치한다. + ```bash + sudo yum install nginx + sudo systemctl start nginx + sudo systemctl enable nginx + sudo systemctl status nginx + ``` +8. `web1`과 `web2`의 `/usr/share/nginx/html/` 경로에 있는 `index.html` 파일을 수정한다. +9. `Load Balancer`의 DNS를 통해 `Web EC2`에 접근한다. +10. NAT gateway 삭제 후에는 꼭! **Elastic IPs를 릴리스**해야 한다 ‼️ +--- +## Spring 과제 +> 1. 사용자는 `/(루트)` 경로, `/members` 경로, `/members/new` 경로로 접근 가능 +> 2. 각 경로로 접근했을 때 view에 각각 데이터가 전달되는 것을 확인하기 + +### 과제 인증 +```java +/* 영상 인증 : https://drive.google.com/file/d/1FsOlrfv4vV6PJr_hAyv43tuQ2Zbzpc6j/view?usp=sharing */ +package GDSCsever.springstudy.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class SampleController { + @GetMapping("/") + public String sample(Model model) { + model.addAttribute("description", "메인 페이지 입니다."); // key:value 구조 + return "index"; // resources:templates/ + {viewname} + .html 실행 + } + + @GetMapping("/members") + public String members(Model model) { + model.addAttribute("member1", "Haewon Lee"); // key:value 구조 + model.addAttribute("member2", "GDSC"); + model.addAttribute("member3", "EWHA"); + return "members"; // resources:templates/ + {viewname} + .html 실행 + } + + @GetMapping("/members/new") + public String showNewMember(@RequestParam(name="name", defaultValue="Guest") String name, @RequestParam("email") String email,Model model) { + model.addAttribute("name", name); // 쿼리 파라미터로 name 입력 + model.addAttribute("email", email); // 쿼리 파라미터로 email 입력 + return "newMember"; // resources:templates/ + {viewname} + .html 실행 + } + +} +``` \ No newline at end of file From 424db701ba44f0ea2ec1406085b9ed156ba48f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A7=80=EC=9B=90?= Date: Thu, 2 Nov 2023 20:09:34 +0900 Subject: [PATCH 006/103] =?UTF-8?q?[=EC=84=9C=EC=A7=80=EC=9B=90]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..e69de29 From 17a3d3e8bf5ab39c517307e3dc0a7d35efe0af3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A7=80=EC=9B=90?= Date: Thu, 2 Nov 2023 20:20:56 +0900 Subject: [PATCH 007/103] =?UTF-8?q?[=EC=84=9C=EC=A7=80=EC=9B=90]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 6 ++++++ 1 file changed, 6 insertions(+) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" index e69de29..6b8ffcc 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,6 @@ +## SampleController.class의 코드 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/63919973/9096bb56-75c3-48fa-88a6-1fa090c37ffb) +- spring initializr로 프로젝트 생성 +- index.html, members.html, newMember.html을 resources/templates에 넣음 +- @GetMapping, @RequestParam 어노테이션 사용해서 컨트롤러 작성 +- 동영상 주소: https://drive.google.com/file/d/1J_KLi7vz8SaGJqjZWxo-KK3agNBR98_2/view?usp=sharing From af5197694617a3505cc53e4a945c3a4af316a240 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Fri, 3 Nov 2023 17:21:23 +0900 Subject: [PATCH 008/103] =?UTF-8?q?Create=20=EA=B9=80=EC=A4=91=ED=98=84=5F?= =?UTF-8?q?3=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..aaa047b --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,52 @@ +## 3주차 서버 세션 과제 +```md +1. Bastion Host로 Web EC2에 접근하기 +2. Private 서브넷은 NAT와,Public 서브넷은 IGW와 연결하기 +3. Web EC2에는 nginx를 설치하고, 각 서버에 서로 다른 정적 파일 넣기 +4. ALB의 DNS를 통해서 Web EC2에 접근한 후, 새로고침을 할 때마다 페이지가 달라지는 것을 확인하기 +``` +결과적으로, 아래 이미지와 같은 아키텍쳐를 구성한다.
+스크린샷 2023-11-03 오후 1 10 58 + +
+ +## 과제 인증 +1. Bastion 통해 Private IP를 가진 EC2에 SSH 연결 + 스크린샷 2023-11-03 오후 3 07 00 + +2. 들어간 Web EC2에서 nginx 설치 + 스크린샷 2023-11-03 오후 3 29 53 + +3. 새로고침 하면 서로 다른 HTTP 웹 페이지가 보이는 모습
+ [영상 인증](https://drive.google.com/file/d/1V4kFMS2ts3NRBcdclOURHFO3iaroivK_/view?usp=sharing) +
+ +## 과제 해결 과정 +1. 2개의 가용영역(2a, 2c)에 `public subnet`, `private subnet`을 각각 생성한다. +2. `IGW`를 생성해 `VPC`, `public subnet`과 연결한다. +3. `public RT`, `private RT`를 생성해 각각 `public subnet(2개)`, `private subnet(2개)`과 연결한다. +4. 2개의 private subnet에 EC2 instance(web1, web2)를 각각 생성한다. +5. 네트워크 매핑을 public subnet 두 개로 해 ALB를 생성한다. +6. NAT gateway를 생성하고, private RT에 0.0.0.0/0 → nat-gw를 향하도록 설정한다.
+ → 주의! 실습 종료 후 반드시 Elastic IP release해주기! +7. `Bastion host`를 통해 `web1`, `web2`에 private IP로 ssh 접속한 후, `nginx`를 설치한다. + ```sh + sudo yum update -y # 업데이트 실시 + sudo yum install nginx # yum을 이용한 Apache 설치 + sudo systemctl start nginx # nginx 시작 + sudo systemctl enable nginx # nginx 웹 서버가 시스템이 부팅할 때마다 시작되도록 함 + sudo systemctl status nginx # 상태 확인 + ``` +8. 두 개의 index.html 파일을 `local` → `bastion host`로 전송하고, `bastion host`→ `web1`과 `web2`로 각각 전송한다. 그 후, `web1`과 `web2`의 `/usr/share/nginx/html/` 경로에 있는 `index.html` 파일을 대체한다. + ```sh + sudo mv index_1.html /usr/share/nginx/html/index.html + ``` + ```sh + sudo mv index_2.html /usr/share/nginx/html/index.html + ``` +9. `Load Balancer`의 DNS를 통해 `Web EC2`에 접근한다. +
+ +## 참고 +- [Your requested instance type is not supported in your requested Availability Zone(요청한 인스턴스 유형이 요청된 가용 영역에서 지원되지 않습니다)](https://repost.aws/ko/knowledge-center/ec2-instance-type-not-supported-az-error) +- [로드 밸런서 권장 보안그룹 설정](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html) From 28dd0355c734fefbb2d482617f136177a3816f51 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Fri, 3 Nov 2023 17:24:15 +0900 Subject: [PATCH 009/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" index aaa047b..7ab0ceb 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -5,7 +5,7 @@ 3. Web EC2에는 nginx를 설치하고, 각 서버에 서로 다른 정적 파일 넣기 4. ALB의 DNS를 통해서 Web EC2에 접근한 후, 새로고침을 할 때마다 페이지가 달라지는 것을 확인하기 ``` -결과적으로, 아래 이미지와 같은 아키텍쳐를 구성한다.
+→ 결과적으로, 아래 이미지와 같은 아키텍쳐를 구성한다.
스크린샷 2023-11-03 오후 1 10 58
From dc9fce60c5d408ea14b3b5b98f877e4ca0248c1f Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Fri, 3 Nov 2023 18:35:07 +0900 Subject: [PATCH 010/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.idea/.gitignore" | 8 + .../.idea/compiler.xml" | 14 + .../.idea/gradle.xml" | 17 ++ .../.idea/jarRepositories.xml" | 20 ++ .../.idea/misc.xml" | 7 + .../.idea/modules.xml" | 9 + .../.idea/modules/serverstudy3.main.iml" | 8 + .../.idea/vcs.xml" | 6 + ...\354\260\250_\352\263\274\354\240\234.iml" | 9 + .../serverstudy3/.gitignore" | 37 +++ .../serverstudy3/build.gradle" | 36 +++ .../gradle/wrapper/gradle-wrapper.jar" | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties" | 7 + .../serverstudy3/gradlew" | 249 ++++++++++++++++++ .../serverstudy3/gradlew.bat" | 92 +++++++ .../serverstudy3/settings.gradle" | 1 + .../Serverstudy3Application.java" | 13 + .../controllers/SampleController.java" | 41 +++ .../main/resources/application.properties" | 0 .../src/main/resources/templates/index.html" | 10 + .../main/resources/templates/members.html" | 12 + .../main/resources/templates/newMember.html" | 12 + .../Serverstudy3ApplicationTests.java" | 13 + 23 files changed, 621 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.jar" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/application.properties" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" new file mode 100644 index 0000000..13566b8 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" new file mode 100644 index 0000000..763c1ad --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" new file mode 100644 index 0000000..0006923 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" new file mode 100644 index 0000000..fdc392f --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" new file mode 100644 index 0000000..65d1241 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" new file mode 100644 index 0000000..b2ceafb --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" new file mode 100644 index 0000000..38a8631 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" new file mode 100644 index 0000000..c2065bc --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" new file mode 100644 index 0000000..aa711b4 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" @@ -0,0 +1,36 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.0.12' + id 'io.spring.dependency-management' version '1.1.3' +} + +group = 'gdsc-study' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'com.h2database:h2' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.jar" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" new file mode 100644 index 0000000..3fa8f86 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" new file mode 100644 index 0000000..1aa94a4 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" new file mode 100644 index 0000000..b1e6fa7 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" @@ -0,0 +1 @@ +rootProject.name = 'serverstudy3' diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" new file mode 100644 index 0000000..c54ba4d --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" @@ -0,0 +1,13 @@ +package gdscstudy.serverstudy3; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Serverstudy3Application { + + public static void main(String[] args) { + SpringApplication.run(Serverstudy3Application.class, args); + } + +} diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" new file mode 100644 index 0000000..f57b48d --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" @@ -0,0 +1,41 @@ +package gdscstudy.serverstudy3.controllers; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@Controller +public class SampleController { + @GetMapping("/") //root url 경로 + public String home(Model model){ + model.addAttribute("description", "메인 페이지입니다."); + //key-value 쌍을 모델에 추가 (attributeName "des...", attributeValue "메인...") + return "index"; //html 파일명 + } + + @GetMapping("/members") //url 경로 + public String showMembers(Model model){ //Model은 데이터를 View로 전달하기 위해 사용됨 + model.addAttribute("member1", "Seohyun Lee"); + model.addAttribute("member2", "Haeseung Jeon"); + model.addAttribute("member3", "Hyuna Kim"); + return "members"; //html 파일명 + } + + @GetMapping("/members/new") //url 경로 + public String showNewMember(@RequestParam(name = "name", defaultValue = "guest") String name, + //@RequestParam은 쿼리 스트링 방식으로 url을 통해 파라미터로 값을 받아옴 + //"?name=value1&email=value2": query string(쿼리 파라미터), '&' 연산자 사용해 쿼리 스트링 여러개 + //"name"은 쿼리 파라미터의 key, name 매개변수에 value 받아옴. "guest"은 value 없을 경우 기본값. + String email, //RequestParam 생략 (자동으로 데이터 파싱), email 매개변수에 value 받아옴 + Model model){ + model.addAttribute("name", name); //"name"은 View의 변수 이름(key), name에 value 있음. 모델에 추가 + model.addAttribute("email", email); //"email"은 View의 변수 이름(key), email에 value 있음. 모델에 추가 + return "newMember"; //html 파일명 + } +} +//동영상 : https://drive.google.com/file/d/1kaPrxyZM4b8yTSnxNVRAOqSYwahvLMST/view?usp=sharing +//참고자료 : +// [Spring] @RequestParam 사용법 https://dangdangee.tistory.com/entry/Spring-RequestParam-%EC%82%AC%EC%9A%A9%EB%B2%95 +// [Spring] @RequestParam - 요청 파라미터 데이터 파싱하기 https://amy-it.tistory.com/108 +// [Spring] Spring MVC: Controller에서 parameter를 받아오는 방법 https://ooeunz.tistory.com/99 \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/application.properties" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/application.properties" new file mode 100644 index 0000000..e69de29 diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" new file mode 100644 index 0000000..3ca6734 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" @@ -0,0 +1,10 @@ + + + + Welcome + + + +

메인 페이지에 대한 설명이 들어갑니다.

+ + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" new file mode 100644 index 0000000..887ad09 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" @@ -0,0 +1,12 @@ + + + + Welcome + + + +

첫 번째 멤버입니다.

+

두 번째 멤버입니다.

+

세 번째 멤버입니다.

+ + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" new file mode 100644 index 0000000..46a5e21 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" @@ -0,0 +1,12 @@ + + + + Welcome + + + +

새로운 멤버입니다.

+

유저 이름입니다.

+

이메일 주소입니다.

+ + \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" new file mode 100644 index 0000000..d98573e --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" @@ -0,0 +1,13 @@ +package gdscstudy.serverstudy3; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class Serverstudy3ApplicationTests { + + @Test + void contextLoads() { + } + +} From 9f12eb556fc32e144f2276be23506307ee4f4167 Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Fri, 3 Nov 2023 18:45:44 +0900 Subject: [PATCH 011/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 8 +- .../.idea/.gitignore" | 8 - .../.idea/compiler.xml" | 14 - .../.idea/gradle.xml" | 17 -- .../.idea/jarRepositories.xml" | 20 -- .../.idea/misc.xml" | 7 - .../.idea/modules.xml" | 9 - .../.idea/modules/serverstudy3.main.iml" | 8 - .../.idea/vcs.xml" | 6 - ...\354\260\250_\352\263\274\354\240\234.iml" | 9 - .../serverstudy3/.gitignore" | 37 --- .../serverstudy3/build.gradle" | 36 --- .../gradle/wrapper/gradle-wrapper.jar" | Bin 63721 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties" | 7 - .../serverstudy3/gradlew" | 249 ------------------ .../serverstudy3/gradlew.bat" | 92 ------- .../serverstudy3/settings.gradle" | 1 - .../Serverstudy3Application.java" | 13 - .../main/resources/application.properties" | 0 .../src/main/resources/templates/index.html" | 10 - .../main/resources/templates/members.html" | 12 - .../main/resources/templates/newMember.html" | 12 - .../Serverstudy3ApplicationTests.java" | 13 - 23 files changed, 7 insertions(+), 581 deletions(-) rename "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" => "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" (90%) delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.jar" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/application.properties" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" similarity index 90% rename from "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" rename to "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" index f57b48d..3e15836 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/controllers/SampleController.java" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -1,3 +1,8 @@ +### 2주차 Server S-Day 과제 - 이서현 +> 과제(spring): 스프링 프로젝트 생성, 주어진 HTML을 프로젝트에 포함시키기, SampleController 파일을 만들고 코드 작성 + +* 소스 코드 : +``` package gdscstudy.serverstudy3.controllers; import org.springframework.stereotype.Controller; @@ -38,4 +43,5 @@ public String showNewMember(@RequestParam(name = "name", defaultValue = "guest") //참고자료 : // [Spring] @RequestParam 사용법 https://dangdangee.tistory.com/entry/Spring-RequestParam-%EC%82%AC%EC%9A%A9%EB%B2%95 // [Spring] @RequestParam - 요청 파라미터 데이터 파싱하기 https://amy-it.tistory.com/108 -// [Spring] Spring MVC: Controller에서 parameter를 받아오는 방법 https://ooeunz.tistory.com/99 \ No newline at end of file +// [Spring] Spring MVC: Controller에서 parameter를 받아오는 방법 https://ooeunz.tistory.com/99 +``` \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" deleted file mode 100644 index 13566b8..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/.gitignore" +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" deleted file mode 100644 index 763c1ad..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/compiler.xml" +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" deleted file mode 100644 index 0006923..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/gradle.xml" +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" deleted file mode 100644 index fdc392f..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/jarRepositories.xml" +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" deleted file mode 100644 index 65d1241..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/misc.xml" +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" deleted file mode 100644 index b2ceafb..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules.xml" +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" deleted file mode 100644 index 38a8631..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/modules/serverstudy3.main.iml" +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" deleted file mode 100644 index b2bdec2..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/vcs.xml" +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" deleted file mode 100644 index d6ebd48..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/.idea/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.iml" +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" deleted file mode 100644 index c2065bc..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/.gitignore" +++ /dev/null @@ -1,37 +0,0 @@ -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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" deleted file mode 100644 index aa711b4..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/build.gradle" +++ /dev/null @@ -1,36 +0,0 @@ -plugins { - id 'java' - id 'org.springframework.boot' version '3.0.12' - id 'io.spring.dependency-management' version '1.1.3' -} - -group = 'gdsc-study' -version = '0.0.1-SNAPSHOT' - -java { - sourceCompatibility = '17' -} - -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -repositories { - mavenCentral() -} - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' - runtimeOnly 'com.h2database:h2' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' -} - -tasks.named('test') { - useJUnitPlatform() -} diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.jar" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.jar" deleted file mode 100644 index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" deleted file mode 100644 index 3fa8f86..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradle/wrapper/gradle-wrapper.properties" +++ /dev/null @@ -1,7 +0,0 @@ -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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" deleted file mode 100644 index 1aa94a4..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew" +++ /dev/null @@ -1,249 +0,0 @@ -#!/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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" deleted file mode 100644 index 93e3f59..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/gradlew.bat" +++ /dev/null @@ -1,92 +0,0 @@ -@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/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" deleted file mode 100644 index b1e6fa7..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/settings.gradle" +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'serverstudy3' diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" deleted file mode 100644 index c54ba4d..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/java/gdscstudy/serverstudy3/Serverstudy3Application.java" +++ /dev/null @@ -1,13 +0,0 @@ -package gdscstudy.serverstudy3; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Serverstudy3Application { - - public static void main(String[] args) { - SpringApplication.run(Serverstudy3Application.class, args); - } - -} diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/application.properties" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/application.properties" deleted file mode 100644 index e69de29..0000000 diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" deleted file mode 100644 index 3ca6734..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/index.html" +++ /dev/null @@ -1,10 +0,0 @@ - - - - Welcome - - - -

메인 페이지에 대한 설명이 들어갑니다.

- - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" deleted file mode 100644 index 887ad09..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/members.html" +++ /dev/null @@ -1,12 +0,0 @@ - - - - Welcome - - - -

첫 번째 멤버입니다.

-

두 번째 멤버입니다.

-

세 번째 멤버입니다.

- - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" deleted file mode 100644 index 46a5e21..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/main/resources/templates/newMember.html" +++ /dev/null @@ -1,12 +0,0 @@ - - - - Welcome - - - -

새로운 멤버입니다.

-

유저 이름입니다.

-

이메일 주소입니다.

- - \ No newline at end of file diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" deleted file mode 100644 index d98573e..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234/serverstudy3/src/test/java/gdscstudy/serverstudy3/Serverstudy3ApplicationTests.java" +++ /dev/null @@ -1,13 +0,0 @@ -package gdscstudy.serverstudy3; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class Serverstudy3ApplicationTests { - - @Test - void contextLoads() { - } - -} From 6e09a14605182cfb284fd2d06c538049e2a7fe68 Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Fri, 3 Nov 2023 18:48:54 +0900 Subject: [PATCH 012/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" index 3e15836..4da3815 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -1,7 +1,7 @@ -### 2주차 Server S-Day 과제 - 이서현 -> 과제(spring): 스프링 프로젝트 생성, 주어진 HTML을 프로젝트에 포함시키기, SampleController 파일을 만들고 코드 작성 +### 3주차 Server S-Day 과제 - 이서현 +> 과제(spring): 스프링 프로젝트 생성, 주어진 HTML(index.html, members.html, newMember.html)을 프로젝트에 포함시키기, SampleController 파일을 만들고 코드 작성 -* 소스 코드 : +* SampleController.class의 소스 코드 : ``` package gdscstudy.serverstudy3.controllers; From 6f7f3258070a3d8a32fe3ee245b47faa9eb1df8f Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 3 Nov 2023 23:25:45 +0900 Subject: [PATCH 013/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]3=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20Server=20S-Day=20=EA=B3=BC=EC=A0=9C=20-ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Server S-Day \352\263\274\354\240\234.md" | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" new file mode 100644 index 0000000..1b08372 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -0,0 +1,23 @@ +# Spring 과제 + +## 과정 1 : 인텔리제이 설치 및 jdk 17 설치, spring initializer를 이용하여 프로젝트 다운 +- https://gymdev.tistory.com/72를 참고하여 환경변수 설정함. +#### 난관 : JAVAVIRTUALMACHINE 폴더에 jdk폴더를 넣고 싶어서 맥의 '폴더로 이동'기능을 사용! +- https://support.apple.com/ko-kr/guide/mac-help/mchlp1236/mac +- 이런 것도 있구나... 맥이란 신기한 동네입니다... 언제쯤 맥OS를 점령할지... + + + +## 과정 2 : 코드 작성 +### 난관 1 : symbol not find 문제 +--> 필요한 라이브러리를 import했더니 'web'이라는 symbol를 찾지 못했다고 뜬다. +==> 해결 : https://www.goodsource.co.kr/125 참고 +- build.grandle의 + implementation 'org.springframework.boot:spring-boot-starter'를 + implementation 'org.springframework.boot:spring-boot-starter-web'으로 수정하고 빌딩하고 실행! + +## 과정 3 : + + + + From 9245cf1a1ae0b1a3e2f473115163a2bc327844d6 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 3 Nov 2023 23:52:02 +0900 Subject: [PATCH 014/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20Server=20S-Day=20=EA=B3=BC=EC=A0=9C=20-ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Server S-Day \352\263\274\354\240\234.md" | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index 1b08372..10527b4 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -4,7 +4,7 @@ - https://gymdev.tistory.com/72를 참고하여 환경변수 설정함. #### 난관 : JAVAVIRTUALMACHINE 폴더에 jdk폴더를 넣고 싶어서 맥의 '폴더로 이동'기능을 사용! - https://support.apple.com/ko-kr/guide/mac-help/mchlp1236/mac -- 이런 것도 있구나... 맥이란 신기한 동네입니다... 언제쯤 맥OS를 점령할지... +- 이런 것도 있구나. 맥이란 해도해도 신기해요! 언제쯤 맥OS를 점령할지... @@ -16,7 +16,63 @@ implementation 'org.springframework.boot:spring-boot-starter'를 implementation 'org.springframework.boot:spring-boot-starter-web'으로 수정하고 빌딩하고 실행! -## 과정 3 : + +### 난관 2 : java: cannot find symbol +이번엔 email symbol을 찾지 못하고 에러를 낸다. +스크린샷 2023-11-03 오후 11 37 56 + +==> 해결 : 당연함... 내가 email 선언 안해줌... String email을 추가해줬다! ㅎㅎ +해결~ + + +### 난관 3 : localhost:8080 을 실행했으나 메인 페이지가 나타나지 않았다. +스크린샷 2023-11-03 오후 11 44 20 + +- 참고 : https://devmango.tistory.com/97 + +아직 해결하지 못했습니다. 시험이 어제 끝나서 늦게 시작했습니다. 자정이 넘더라도 마저 수정하겠습니다. 죄송합니다..ㅠㅠㅠ + + + + +--- +SampleController.java 소스 코드 : + +``` + package mvcstudy.mvcstudy.controller; + + import org.springframework.stereotype.Controller; + import org.springframework.ui.Model; + import org.springframework.web.bind.annotation.GetMapping; + import org.springframework.web.bind.annotation.RequestParam; + + + @Controller + public class SampleController { + @GetMapping("/") + public String sample(Model model) { + model.addAttribute("description", + "메인 페이지 입니다."); + return "index"; + } + @GetMapping("/members") + public String members(Model model) { + model.addAttribute("member1", "Yang"); + model.addAttribute("member2", "Dong"); + model.addAttribute("member3", "Seon"); + return "members"; + } + + @GetMapping("/members/new") + public String showNewMember(@RequestParam(name= + "name", defaultValue = "Guest")String name, String email, + Model model){ + model.addAttribute("name", name); + model.addAttribute("email", email); + return "newMember"; + } + } +``` From d3b4099c7864dd873fb1b6805d5155d54f57e39d Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 3 Nov 2023 23:56:13 +0900 Subject: [PATCH 015/103] Create new --- .../new" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" new file mode 100644 index 0000000..f03f694 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" @@ -0,0 +1 @@ +dd From ea477327040377bf19da7b89e52de30a67d0a5d4 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 3 Nov 2023 23:56:36 +0900 Subject: [PATCH 016/103] =?UTF-8?q?Rename=203=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C.md=20to=203=EC=A3=BC=EC=B0=A8=20S?= =?UTF-8?q?erver=20S-Day=20=EA=B3=BC=EC=A0=9C/3=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" => "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" (100%) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" similarity index 100% rename from "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" rename to "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" From dd81536d4a4e03c7e25e941b07174e88adb8b919 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 3 Nov 2023 23:57:27 +0900 Subject: [PATCH 017/103] =?UTF-8?q?Delete=203=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C/new?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../new" | 1 - 1 file changed, 1 deletion(-) delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" deleted file mode 100644 index f03f694..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/new" +++ /dev/null @@ -1 +0,0 @@ -dd From 3f6f425e6138602682f0e6eda241a0871ba5aee4 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Sat, 4 Nov 2023 00:17:43 +0900 Subject: [PATCH 018/103] =?UTF-8?q?Update=203=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250 Server S-Day \352\263\274\354\240\234.md" | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index 10527b4..f0bb87a 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -30,10 +30,6 @@ - 참고 : https://devmango.tistory.com/97 -아직 해결하지 못했습니다. 시험이 어제 끝나서 늦게 시작했습니다. 자정이 넘더라도 마저 수정하겠습니다. 죄송합니다..ㅠㅠㅠ - - - --- SampleController.java 소스 코드 : @@ -74,6 +70,9 @@ SampleController.java 소스 코드 : } ``` +스크린샷 2023-11-04 오전 12 13 34 + +인텔리제이에서 실행도 잘 되고 index.html파일도 넣었고 폴더 위치도 확인 했지만 이유를 모르겠습니다. 한 번 봐주실 수 있을까요? 파일 첨부하겠습니다..! From 50e1a151fac38071b0966e6ed10ba281110ceb43 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Sat, 4 Nov 2023 00:20:01 +0900 Subject: [PATCH 019/103] Add files via upload --- .../MvcStudyApplicationTests.java" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" new file mode 100644 index 0000000..fdbdc5b --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" @@ -0,0 +1,13 @@ +package mvcstudy.mvcstudy; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MvcStudyApplicationTests { + + @Test + void contextLoads() { + } + +} From 4f3cfb25bf41003beab5e135a20f1b85f16e5a19 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Tue, 7 Nov 2023 14:52:21 +0900 Subject: [PATCH 020/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]=203?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Server S-Day \352\263\274\354\240\234.md" | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index f0bb87a..3d1ce46 100644 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -31,6 +31,41 @@ - 참고 : https://devmango.tistory.com/97 +- 해결 과정 :난관4 & 난관5 + + +### 난관 4 : 분명 환경변수 설정을 다 해줬었는데 $java --version 을 해보니 jdk 21버전으로 뜬다. +- 해결: jdk 21 버전을 삭제해줬다! +- 삭제하지 않고 default jdk를 17로 바꿀 수는 없을까 해서 vim ~/.zshrc으로 zshrc 한 번 건드렸다가 터미널이 고장나길래 취소! + +스크린샷 2023-11-07 오후 2 34 55 + +``` +$ sudo rm -rf temurin-21.jdk +``` + +-참고 : https://ifuwanna.tistory.com/247 + + + +### 난관 5 : 갑자기 application이 안돌아간다! 8080포트가 이미 사용 중.. +스크린샷 2023-11-07 오후 2 36 10 + +오케이 해결해주마 + +스크린샷 2023-11-07 오후 2 41 51 + +- 8080포트를 죽여준다~ 해결! + + +스크린샷 2023-11-07 오후 2 42 37 + + +드디어 되는구나~~ʕ”̮ॽु⋆⁺₊⋆ ♡̷̷̷ + + + + --- SampleController.java 소스 코드 : @@ -72,7 +107,5 @@ SampleController.java 소스 코드 : 스크린샷 2023-11-04 오전 12 13 34 -인텔리제이에서 실행도 잘 되고 index.html파일도 넣었고 폴더 위치도 확인 했지만 이유를 모르겠습니다. 한 번 봐주실 수 있을까요? 파일 첨부하겠습니다..! - From 11af2e28e5ad77c7e505a2275c44d6e1b6baf62b Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Tue, 7 Nov 2023 15:16:46 +0900 Subject: [PATCH 021/103] =?UTF-8?q?Delete=203=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C/MvcStudyApplicationTests.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MvcStudyApplicationTests.java" | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" deleted file mode 100644 index fdbdc5b..0000000 --- "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/MvcStudyApplicationTests.java" +++ /dev/null @@ -1,13 +0,0 @@ -package mvcstudy.mvcstudy; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class MvcStudyApplicationTests { - - @Test - void contextLoads() { - } - -} From ad8a01175a20e0c23729f52abfd20343621fca3f Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Tue, 7 Nov 2023 15:17:07 +0900 Subject: [PATCH 022/103] =?UTF-8?q?Rename=203=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C.md=20to=20=EC=96=91=EB=8F=99?= =?UTF-8?q?=EC=84=A0=5F3=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...204\240_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" => "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" (100%) diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" similarity index 100% rename from "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" rename to "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" From 165d59082a39be8d6a135f7cfba5cdcbb1088cc8 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 10 Nov 2023 00:29:36 +0900 Subject: [PATCH 023/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..29cb087 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,36 @@ +## 📖4주차 기본 과제 +http://www.도메인이름 으로 접근시 사용자용 nginx 서버 접속 + +## 🤓해결 과정 +1. dev.도메인이름 로 A유형 레코드 생성 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/ed8a77be-3848-4425-aa31-a6c96e090501) +2. 로드밸런서 리스너 규칙 수정 + dev.도메인이름 를 호스트헤더로 하고 web-dev로 전달하는 2순위 규칙 추가 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/e146aca6-f30b-4b9c-8b0d-491ae3a0d888) + +## ✌️과제 인증 +https://drive.google.com/file/d/1tqpxE1VgiuDXDRUeasbTvpfGmYKrQIMh/view?usp=sharing + +

+## 📖4주차 심화 과제 +1. ACM 인증서 발급 +2. 로드 밸런서 리스너 편집 및 추가를 통해 http접속 시 https로 리다이렉트 적용 + +## 🤓해결 과정 +1. ACM 인증서 요청 + 이때, 서브 도메인까지 전부 적용하기 위해 도메인이름*.도메인이름 모두 등록하기 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/da8da0da-f332-4bd2-a05a-793cdc0846c8) + +2. 생성한 인증서 클릭 -> Route53에서 레코드 생성 버튼 클릭 +3. EC2, 로드밸런서 인바운드 규칙 수정 - HTTPS 443 허용 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/2e6b51a2-bad9-4889-8ee7-92fde7d53d4e) +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/9d20ea67-8510-486e-82d1-a9c5c28564ad) +4. 리스너 규칙 편집 + 기존에 HTTP로 되어있던걸 HTTPS로 변경 (대상 그룹으로 전달 유지) +6. 리스너 규칙 추가 + HTTP를 HTTPS로 연결하도록 'URL로 리다이렉션' 등록 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/d749b63e-3116-4527-80af-980755ec31a5) + +## ✌️과제 인증 +https://drive.google.com/file/d/1lqdPPQWXkG8bn_cXgfI8LcKdKHSTq8De/view?usp=sharing + From 5907f8dc0852965a807be50dadcc79abeb85f2eb Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 10 Nov 2023 00:31:30 +0900 Subject: [PATCH 024/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" index 29cb087..16364a7 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -1,5 +1,6 @@ ## 📖4주차 기본 과제 -http://www.도메인이름 으로 접근시 사용자용 nginx 서버 접속 +1. http://www.도메인이름 으로 접근시 사용자용 nginx 서버 접속 +2. http://dev.도메인이름 으로 접근시 관리자용 nginx 서버 접속 ## 🤓해결 과정 1. dev.도메인이름 로 A유형 레코드 생성 From e25bdf542f3cd577fe45f7809ab6672fd5800053 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Fri, 10 Nov 2023 13:37:34 +0900 Subject: [PATCH 025/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..294a498 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\354\244\221\355\230\204_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,74 @@ +# 4주차 서버 세션 +## ✏️ 기본 과제 +```markdown +1. Bastion Host 없이 모든 서버에 퍼블릭 IP 부여하기 +2. `http://www.도메인이름`으로 접근하면 사용자용 Nginx 웹 서버가 보이고, `http://dev.도메인이름`으로 접근하면 관리자용 웹 서버가 보인다. +``` +
+ +## 기본 과제 인증 +1. ALB 리스너 규칙 + 스크린샷 2023-11-10 오후 12 12 15 + +2. DNS 접근
+ → [영상 인증](https://drive.google.com/file/d/18HRALxm2ToXLiYP-37LGisrY-CT0X97g/view?usp=sharing) +
+ +## 기본 과제 해결 과정 +1. `ALB`에 dev용 리스너 규칙 추가 + - 호스트 헤더값 `dev.joong.store`, 대상 그룹 `web-dev`로 전달되도록 설정한다. + - 규칙 우선수위 1순위는 user용으로 사용했기 때문에 2순위로 설정한다. + - cf) 규칙은 가장 낮은 값에서 가장 높은 값에 이르기까지 우선 순위에 따라 평가된다. 기본 규칙은 마지막에 평가된다. +
+ +2. `joongh.store` 도메인에 `dev.joongh.store`를 name으로 하는 A 레코드를 생성한다. + 스크린샷 2023-11-10 오후 12 16 35 + +
+ +3. 로컬에서 `web-dev`와 `web-user` 서버에 각 index.html 파일을 전송하고, `/usr/share/nginx/html` 경로에 있는 index.html를 대체한다. + 스크린샷 2023-11-10 오후 12 29 21 + + 스크린샷 2023-11-10 오후 12 36 35 + +
+ +## 📚 심화 과제 +```markdown +1. 기본 과제를 통해 구축한 서버를 활용해 ACM 발급 및 적용하기 +2. ALB는 "https://도메인이름"으로 접근하면 Nginx 웹 서버가 보이고, "http://도메인이름"으로 접근하면 자동으로 HTTPS 트래픽으로 리다이렉트된다. +``` +
+ +## 심화 과제 인증 +- `https://도메인이름`으로 접근 시 Nginx 웹 서버가 보이고, `http://도메인이름`으로 접근 시 HTTPS로 리다이렉션이 일어나는 모습
+→ [영상 인증](https://drive.google.com/file/d/1N_jYWKbYMFhBppjxn2_1AzpSe4fhRJsf/view?usp=sharing) + +
+ +## 심화 과제 해결 과정 +1. ACM 퍼블릭 인증서 요청 + - 루트 도메인뿐만 아니라, 모든 서브 도메인에 대해서 인증서를 발급받기 위해 `joongh.store`, `*.joongh.store`로 도메인 이름을 설정한다. + 스크린샷 2023-11-10 오후 12 56 15 + +2. 생성된 인증서를 클릭해 모든 도메인에 대해 `Route53에서 레코드 생성`한다. +3. ALB의 리스너 규칙 중 `HTTP`를 `HTTPS`로 수정하고, 보안 리스너 설정 파트에서 위에서 생성한 ACM 인증서를 선택해준다. + 스크린샷 2023-11-10 오후 1 05 49 + +
+ +4. HTTPS 트래픽을 허용하도록 ALB 보안그룹의 인바운드 규칙을 수정한다. + 스크린샷 2023-11-10 오후 1 09 19 + 스크린샷 2023-11-10 오후 1 11 01 + +
+
+ +5. HTTP로 들어오는 트래픽을 HTTPS로 리디렉션 해주는 HTTP 리스너를 생성한다. + 스크린샷 2023-11-10 오후 1 12 48 + +
+ +## 참고 +- ALB 리스너 규칙 + https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/listener-update-rules.html From df5a14a7fded55b7311ddb245d453501800cdd23 Mon Sep 17 00:00:00 2001 From: Rina Kim <121746871+ri-naa@users.noreply.github.com> Date: Fri, 10 Nov 2023 18:05:23 +0900 Subject: [PATCH 026/103] =?UTF-8?q?[=EA=B9=80=EB=A6=AC=EB=82=98]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..abb8f5d --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,19 @@ +## 4주차 Server session 기본 과제 +- `http:www.도메인이름` 으로 접근하여 사용자용 Nginx 웹 서버 보여주기 +- `http:dev.도메인이름` 으로 접근하여 사용자용 Nginx 웹 서버 보여주기 + +

+ +## 해결과정 + +1. route 53 호스팅 영역에서 레코드 추가
+ `dev.cloud-ri.shop` 이름으로 레코드 추가 +image + +2. 로드밸런서 리스너 규칙 추가
+ `dev.cloud-ri.shop`을 호스트헤더로 해서 web-dev로 전달하는 규칙 추가 +스크린샷 2023-11-09 022938 +

+ +## 과제 인증 +https://drive.google.com/file/d/1KPxJhWUkwKMV7PGoAEhSqFbBQPxQxfH1/view?usp=sharing From 98c1e3ecd4c1d6d541d948793a78f6a2197d6817 Mon Sep 17 00:00:00 2001 From: Rina Kim <121746871+ri-naa@users.noreply.github.com> Date: Fri, 10 Nov 2023 18:30:18 +0900 Subject: [PATCH 027/103] =?UTF-8?q?[=EA=B9=80=EB=A6=AC=EB=82=98]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" index abb8f5d..3fdf70c 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\352\271\200\353\246\254\353\202\230_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -16,4 +16,4 @@

## 과제 인증 -https://drive.google.com/file/d/1KPxJhWUkwKMV7PGoAEhSqFbBQPxQxfH1/view?usp=sharing +https://drive.google.com/file/d/1YwZSKx8XbI9Q_pZIN6fIK_rqyVQvWDbd/view?usp=sharing From 79208a8b99795bd739e0dfa5895d9888f75c066b Mon Sep 17 00:00:00 2001 From: Lee Haewon Date: Fri, 10 Nov 2023 19:09:45 +0900 Subject: [PATCH 028/103] =?UTF-8?q?[=EC=9D=B4=ED=95=B4=EC=9B=90]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..dd40901 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,40 @@ +## 📒 Cloud 4주차 과제 +> 1. `http://www.도메인이름`에 접근하면 사용자용 Nginx 웹 서버가 보임 +> 2. `http://dev.도메인이름`에 접근하면 관리자용 Nginx 웹 서버가 보임 + +### 과제 인증 +1. 리스너 규칙 3개 설정한 모습 (`기본값`, `www.`, `dev.`) +

+ +

+ +2. [영상 인증 - DNS 접근](https://drive.google.com/file/d/1A8cTJ0KN9mDw0APXvZUpGBvzOLS2ckQ6/view?usp=sharing) + + +### 과제를 해결한 방법 +1. 서로 다른 AZ 2개에 `public subnet`을 생성한다. +2. `dev` EC2와 `user` EC2를 생성한다.
+ public IP를 활성화 하고 보안그룹을 생성하여 `ssh`, `HTTP` 모두 위치 무관(모든 IP 허용)으로 규칙을 생성한다. +3. 대상 그룹을 생성한다.
+ 3-1. `web-dev` 대상 그룹을 생성하여 `dev` EC2를 대상 등록한다.
+ 3-2. `web-user` 대상 그룹을 생성하여 `user` EC2를 대상 등록한다. +4. `dev` EC2와 `user` EC2에 연결 후, `NGINX`를 설치한다. + ```bash + sudo yum update -y # 업데이트 실시 + sudo yum install nginx # yum을 이용한 Apache 설치 + sudo systemctl start nginx # nginx 시작 + sudo systemctl enable nginx # nginx 웹 서버가 시스템이 부팅할 때마다 시작되도록 함 + sudo systemctl status nginx # 상태 확인 + ``` +5. 로드밸런서를 생성하고, `public subnet`에 매핑한다.
+ 5-1. `alb-all` 보안그룹을 생성하고, 인바운드 규칙(HTTP를 모든 IP에 대해 허용)과 아웃바운드 규칙(모든 트래픽에 대해 전부 허용)을 등록한다.
+ 5-2. 대상그룹은 `web-user`를 선택한다. +6. 구입한 도메인에 대한 호스팅 영역을 생성한다. +7. [가비아](https://www.gabia.com/)에서 NS 레코드를 참고하여 네임 서버를 설정한다. +8. `alb`와 `Route53` 연결을 위해 레코드를 생성한다.
+ 8-1. 루트 도메인(`haewonlee.site`)에 대해 A 레코드를 생성한다.
+ 8-2. 서브 도메인 `www.haewonlee.site` 와 `dev.haewonlee.site`에 대해 A 레코드를 생성한다. +9. `alb`의 리스너 규칙을 추가한다.
+ 9-1. 루트 도메인과 `www.haewonlee.site` 는 `web-user` 대상 그룹으로 전달한다.
+ 9-2. `dev.haewonlee.site` 는 `web-dev` 대상 그룹으로 전달한다. +10. `dev` EC2와 `user` EC2의 `/usr/share/nginx/html/index.html` 파일을 서로 다른 내용으로 수정한다. From 951f9957a422837f0968f4ebc8b15ec997d81827 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:15:56 +0900 Subject: [PATCH 029/103] =?UTF-8?q?=204=EC=A3=BC=EC=B0=A8=20Server=20S-Day?= =?UTF-8?q?=20=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...260\250 Server S-Day \352\263\274\354\240\234.md" | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" new file mode 100644 index 0000000..638abd5 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -0,0 +1,12 @@ +## 과정1 : 프로젝트를 생성하고 build.gradle을 실행 +- 그러나 실습을 따라가던 도중 yml 파일이 보이지 않았습니다. +스크린샷 2023-11-10 오후 10 10 24 + +## 과정2 : Database 연결 +그래서 환경변수 영상에서 오류가 있었나 하여 환경변수 설정영상을 (노션에 있던 Spring 환경변수 설정을 저번 실습 때 완료하여 보지 않았음) 보고 Database를 연결하던 도중, 연결에 실패하고 막혀서 과제를 완료하지 못했습니다. +이후에 하려고 두었으나 오늘 다시 해결하려고 해도 하지 못하여 막혔습니다.. +추후 수정하고 늦게라도 제출하겠습니다.. +결석처리하시면 될 것 같습니다...ㅠㅠㅠ 과제 미완 죄송합니다..! +스크린샷 2023-11-10 오후 10 08 50 +스크린샷 2023-11-10 오후 10 08 58 +- 참고 : https://devkingdom.tistory.com/148(참고했으나 이미 내가 embedded를 사용하고 있어서 실패) From a81dbba5ace11206de128066d143629b682997aa Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:17:45 +0900 Subject: [PATCH 030/103] =?UTF-8?q?Update=204=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" | 2 ++ 1 file changed, 2 insertions(+) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index 638abd5..0130f08 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -7,6 +7,8 @@ 이후에 하려고 두었으나 오늘 다시 해결하려고 해도 하지 못하여 막혔습니다.. 추후 수정하고 늦게라도 제출하겠습니다.. 결석처리하시면 될 것 같습니다...ㅠㅠㅠ 과제 미완 죄송합니다..! + 스크린샷 2023-11-10 오후 10 08 50 + 스크린샷 2023-11-10 오후 10 08 58 - 참고 : https://devkingdom.tistory.com/148(참고했으나 이미 내가 embedded를 사용하고 있어서 실패) From 965ac340ae4a42845128c9e2f58aa65d55326c65 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:18:26 +0900 Subject: [PATCH 031/103] =?UTF-8?q?Update=204=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...74\354\260\250 Server S-Day \352\263\274\354\240\234.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index 0130f08..54c7ff9 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -6,9 +6,11 @@ 그래서 환경변수 영상에서 오류가 있었나 하여 환경변수 설정영상을 (노션에 있던 Spring 환경변수 설정을 저번 실습 때 완료하여 보지 않았음) 보고 Database를 연결하던 도중, 연결에 실패하고 막혀서 과제를 완료하지 못했습니다. 이후에 하려고 두었으나 오늘 다시 해결하려고 해도 하지 못하여 막혔습니다.. 추후 수정하고 늦게라도 제출하겠습니다.. -결석처리하시면 될 것 같습니다...ㅠㅠㅠ 과제 미완 죄송합니다..! +결석처리하시면 될 것 같습니다...ㅠㅠㅠ 과제 미완 정말 죄송합니다..! + 스크린샷 2023-11-10 오후 10 08 50 스크린샷 2023-11-10 오후 10 08 58 -- 참고 : https://devkingdom.tistory.com/148(참고했으나 이미 내가 embedded를 사용하고 있어서 실패) + +- 참고 : https://devkingdom.tistory.com/148 (참고했으나 이미 내가 embedded를 사용하고 있어서 실패) From 53fe331a649f0410a2e40bbb548f28ecefb4e352 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:23:53 +0900 Subject: [PATCH 032/103] =?UTF-8?q?=20[=ED=99=A9=EC=B1=84=EC=9B=90]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 4주차 클라우드 과제 제출합니다. --- ...4\354\260\250_\352\263\274\354\240\234.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..fb180d5 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,47 @@ +# 황채원_4주차_과제 + +### 과제 영상 + +https://drive.google.com/file/d/1h_hNfldFO7nl_rnm0w7MuTLQekavfASQ/view?usp=drive_link + + +### 해결 과정 + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/937b7d44-c78f-4833-8fca-e8bf9ede3d22) + +dev.cloud-chaiwon.store 에 대한 레코드를 생성해준다. + + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/2ced2eec-c4af-45f1-861d-c449ed3ea368) + +HTTP 호스트 헤더는 dev.cloud-chaiwon.store 인 경우에 web-dev 로 전달해주도록 alb 규칙을 설정해준다. + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/4d7bdae5-c6e9-4345-8800-d97b1eea754c) + +web-user 서버에 frontend-user.html 업로드 + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/e144258f-5a00-4ac9-9d56-a8d3c0d7eeeb) + +frontend-user.html로 index.html을 덮어쓰기 해준다. + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/81b6534b-e71a-4b0e-9824-50a5b45d8c26) + +해당 파일이 정상적으로 보인다. + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/9efc0364-c5c5-4926-9e12-f8aeb7ed68e0) + +같은 방식에도 서버에도 파일을 업로드 해준다. + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/8899395d-e127-471b-acc2-a52b9e547851) + +dev로 접속했을 때 해당 파일이 정상적으로 보인다. + + +### 서버에 파일을 업로드 하는 과정 + +1. `sudo chmod 600 [key name].pem` 으로 키 권한 바꿔주기 +2. `ssh -i [key name].pem ec2-user@[public ip]` ssh 접속하기 +3. `sudo mv [local file] /usr/share/nginx/html/` 서버에 파일 올려주기 +4. (optional) `ls -l /usr/share/nginx/html/` 잘 올라갔는지 확인 +5. `sudo systemctl restart nginx` + From ee0ebaecb82be76e6568b46142a33b48ef530e5a Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:27:07 +0900 Subject: [PATCH 033/103] =?UTF-8?q?Update=20and=20rename=204=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20Server=20S-Day=20=EA=B3=BC=EC=A0=9C.md=20to=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20Server=20S-Day=20=EA=B3=BC=EC=A0=9C/4?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20Server=20S-Day=20=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50 Server S-Day \352\263\274\354\240\234.md" | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) rename "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" => "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" (62%) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" similarity index 62% rename from "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" rename to "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index 54c7ff9..40c30e7 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -2,10 +2,16 @@ - 그러나 실습을 따라가던 도중 yml 파일이 보이지 않았습니다. 스크린샷 2023-11-10 오후 10 10 24 +yml 파일 내용을 보고 데이터 베이스 연결이 필요하다고 판단했습니다. + + + + ## 과정2 : Database 연결 -그래서 환경변수 영상에서 오류가 있었나 하여 환경변수 설정영상을 (노션에 있던 Spring 환경변수 설정을 저번 실습 때 완료하여 보지 않았음) 보고 Database를 연결하던 도중, 연결에 실패하고 막혀서 과제를 완료하지 못했습니다. -이후에 하려고 두었으나 오늘 다시 해결하려고 해도 하지 못하여 막혔습니다.. -추후 수정하고 늦게라도 제출하겠습니다.. +그래서 환경변수 영상에서 오류가 있었나 하여 환경변수 설정영상을 (노션에 있던 Spring 환경변수 설정을 저번 실습 때 완료하여 보지 않았음) 보고 Database를 연결하던 도중, 연결에 실패하고 막혀서 과제를 완료하지 못했습니다.
+yml 파일을 직접 만들어서 내용을 추가하고 시도해보았으나 계속 오류가 발생했습니다.(yml이 원래 없었는데 제가 직접 만들어도 되는 걸까요?)
+이후에 하려고 두었으나 오늘 다시 해결하려고 해도 하지 못하여 막혔습니다..
+추후 수정하고 늦게라도 제출하겠습니다..
결석처리하시면 될 것 같습니다...ㅠㅠㅠ 과제 미완 정말 죄송합니다..! @@ -13,4 +19,7 @@ 스크린샷 2023-11-10 오후 10 08 58 -- 참고 : https://devkingdom.tistory.com/148 (참고했으나 이미 내가 embedded를 사용하고 있어서 실패) +### 참고 : +- https://ifuwanna.tistory.com/261(맥에서 폴더 내에서 터미널을 여는 방법을 몰라서 참고함) +- https://devkingdom.tistory.com/148 (참고했으나 이미 내가 embedded를 사용하고 있어서 실패) +- https://primary.tistory.com/11 From 4f409a4842861b50b886d825f986f2dd1c3f529d Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:29:33 +0900 Subject: [PATCH 034/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test --- ...33\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 1 + 1 file changed, 1 insertion(+) create mode 100644 "2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..9daeafb --- /dev/null +++ "b/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1 @@ +test From b6d998c67caa03ccf96a60594212e50f9b886a72 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:31:24 +0900 Subject: [PATCH 035/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=202?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 1 - 1 file changed, 1 deletion(-) delete mode 100644 "2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" deleted file mode 100644 index 9daeafb..0000000 --- "a/2\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ /dev/null @@ -1 +0,0 @@ -test From b3106607516f615b9efb7a10ea37f47f5818c238 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:32:03 +0900 Subject: [PATCH 036/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]4=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20Server=20S-Day=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" index 40c30e7..fce3d8f 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234.md" @@ -1,4 +1,4 @@ -## 과정1 : 프로젝트를 생성하고 build.gradle을 실행 +## 과정1 : 프로젝트를 생성하고 build.gradle을 실행 - 그러나 실습을 따라가던 도중 yml 파일이 보이지 않았습니다. 스크린샷 2023-11-10 오후 10 10 24 From 576d030046af816075e2b6a27427d65bf3a5a9a6 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Fri, 10 Nov 2023 22:35:24 +0900 Subject: [PATCH 037/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 4주차 클라우드 과제 제출합니다. --- ..._4\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 7 +++++++ 1 file changed, 7 insertions(+) diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" index fb180d5..bbc9102 100644 --- "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -12,31 +12,38 @@ https://drive.google.com/file/d/1h_hNfldFO7nl_rnm0w7MuTLQekavfASQ/view?usp=drive dev.cloud-chaiwon.store 에 대한 레코드를 생성해준다. + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/2ced2eec-c4af-45f1-861d-c449ed3ea368) HTTP 호스트 헤더는 dev.cloud-chaiwon.store 인 경우에 web-dev 로 전달해주도록 alb 규칙을 설정해준다. + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/4d7bdae5-c6e9-4345-8800-d97b1eea754c) web-user 서버에 frontend-user.html 업로드 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/e144258f-5a00-4ac9-9d56-a8d3c0d7eeeb) frontend-user.html로 index.html을 덮어쓰기 해준다. + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/81b6534b-e71a-4b0e-9824-50a5b45d8c26) 해당 파일이 정상적으로 보인다. + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/9efc0364-c5c5-4926-9e12-f8aeb7ed68e0) 같은 방식에도 서버에도 파일을 업로드 해준다. + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/8899395d-e127-471b-acc2-a52b9e547851) dev로 접속했을 때 해당 파일이 정상적으로 보인다. + ### 서버에 파일을 업로드 하는 과정 1. `sudo chmod 600 [key name].pem` 으로 키 권한 바꿔주기 From d27e3bcf66e7d2df78fea9f835c741294be0d2b0 Mon Sep 17 00:00:00 2001 From: yslim21 Date: Fri, 10 Nov 2023 23:34:00 +0900 Subject: [PATCH 038/103] =?UTF-8?q?[=EC=9E=84=EC=98=81=EC=84=9C]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../img1.png" | Bin 0 -> 55213 bytes .../img2.png" | Bin 0 -> 33257 bytes ...4\354\260\250_\352\263\274\354\240\234.md" | 35 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img1.png" create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img2.png" create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\236\204\354\230\201\354\204\234_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img1.png" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img1.png" new file mode 100644 index 0000000000000000000000000000000000000000..9e39a83ade71071d951eaaf72fb08780d3bc66e9 GIT binary patch literal 55213 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 literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img2.png" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/img2.png" new file mode 100644 index 0000000000000000000000000000000000000000..098034a6feb212308f15574cfd4a83367ab1950f GIT binary patch literal 33257 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 literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\236\204\354\230\201\354\204\234_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\236\204\354\230\201\354\204\234_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..58f8942 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\236\204\354\230\201\354\204\234_4\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,35 @@ +###인증 사진 + +1.Bastion을 통해서 Private IP를 가진 EC2애 SSH 연결 +![img1.png](img1.png) + +2.nginx 설치 +![img2.png](img2.png) + +3.HTTP 웹페이지 영상 +[Web link]() + + +###과제를 해결한 방법 + +1.서로 다른 가용영역에 있는 퍼블릭 서브넷 2개를 생성한다.(퍼블릭 서브넷은 라우팅 테이블에 연결되어 있어야한다) +2.dev EC2와 user EC2를 생성한다 +3.대상 그룹을 생성하여 EC2를 등록한다. + -dev는 web-dev대상 그룹에 + -user은 web-user대상그룹에 +4.dev와 user를 EC2에 연결하고 NGINX를 설치한다. + sudo yum update -y # 업데이트 실시 + sudo yum install nginx # yum을 이용한 Apache 설치 + sudo systemctl start nginx # nginx 시작 + sudo systemctl enable nginx # nginx 웹 서버가 시스템이 부팅할 때마다 시작되도록 함 + sudo systemctl status nginx # 상태 확인 +5.가비아에서 도메인 구매 후 퍼블릭 호스팅 영역을 생성한다. + -AWS Route53에서 할당받은 네임서버를 가비아>구입도메인>관리 탭에 넣어준다. +6.ALB와 Route53이 연결되도록 레코드를 생성한다. + -루트도메인에 대해 A레코드 생성 + -서브도메인(www,dev)에 대해 A레코드 생성 +7.alb 리스너 규칙 추가 + -루트도메인(xohalox.com)과 서브도메인(www.xohlox.com)은 web-user대상그룹으로 + -서브도메인(dev.xohalox.com)은 wev-dev대상 그룹으로 +8.dev EC2와 userEC2의 /usr/share/nginx/html/index.html파일을 수정한다 + -sudo nano /usr/share/nginx/html/index.html 명령어 이용 \ No newline at end of file From 4ed2199e64487c49b3e64d3ebb28766a46c27ece Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Fri, 10 Nov 2023 23:45:35 +0900 Subject: [PATCH 039/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=204?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classDiagram_leeseohyun.PNG" | Bin 0 -> 54503 bytes .../domain_leeseohyun/Blogpost.java" | 28 ++++++++++++++++++ .../domain_leeseohyun/Category.java" | 21 +++++++++++++ .../domain_leeseohyun/Resume.java" | 20 +++++++++++++ .../domain_leeseohyun/User.java" | 27 +++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/classDiagram_leeseohyun.PNG" create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/Blogpost.java" create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/Category.java" create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/Resume.java" create mode 100644 "4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/User.java" diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/classDiagram_leeseohyun.PNG" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/classDiagram_leeseohyun.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..3cb7cdb18e99e71c3f4b9130be75703fc5d3becf GIT binary patch literal 54503 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 blogposts = new ArrayList<>(); +} diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/Resume.java" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/Resume.java" new file mode 100644 index 0000000..4b7b9ba --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/Resume.java" @@ -0,0 +1,20 @@ +package com.example.serverstudy4.domain_leeseohyun; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter @Setter +public class Resume { + @Id + @GeneratedValue + @JoinColumn(name="resume_id") + private Long id; + private String title; //제목 + private String content; //내용 + + @ManyToOne //Many 쪽임 + @JoinColumn(name="user_id") + private User user; +} diff --git "a/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/User.java" "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/User.java" new file mode 100644 index 0000000..b4eb313 --- /dev/null +++ "b/4\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/domain_leeseohyun/User.java" @@ -0,0 +1,27 @@ +package com.example.serverstudy4.domain_leeseohyun; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@Setter +public class User { + + @Id + @GeneratedValue + @Column(name="user_id") + private Long id; //id + private String name; //이름 + private int age; //나이 + private String country; //국가 + private String city; //도시 + private String postal_code; //우편번호 + + @OneToMany(mappedBy="user") //one 쪽이다 + private List blogposts = new ArrayList<>(); +} From f5479f7e8d970864eef9aa4c75179cf9b7cb8801 Mon Sep 17 00:00:00 2001 From: Lee Haewon Date: Thu, 16 Nov 2023 22:42:29 +0900 Subject: [PATCH 040/103] =?UTF-8?q?[=EC=9D=B4=ED=95=B4=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller_LeeHaewon.java" | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeHaewon.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeHaewon.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeHaewon.java" new file mode 100644 index 0000000..2055cfd --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeHaewon.java" @@ -0,0 +1,75 @@ +package GDSC.ServerStudyCloud5.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectMetadata; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +/* + + [Cloud 5주차 과제] + 1. S3에 객체 업로드가 가능한 @PostMapping 구현 + 2. S3 객체 조회가 가능한 @GetMapping 구현 + + 영상 인증 : https://drive.google.com/file/d/1oLtqv3YUAEVZu-bkpyFeafFT2Jj8jysW/view?usp=sharing + +*/ + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + List imageUrls = getImageUrls(); + model.addAttribute("fileUrls", imageUrls); // fileUrls 값 + + return "index"; // index.html 반환 + } + + private List getImageUrls() { + + // S3 버킷 내의 모든 객체의 키(파일 경로)를 가져오기 + List objectKeys = amazonS3.listObjects(bucketName).getObjectSummaries() + .stream() + .map(s3ObjectSummary -> s3ObjectSummary.getKey()) + .collect(Collectors.toList()); + + // 이미지 URL로 변환 + return objectKeys.stream() + .map(objectKey -> amazonS3.getUrl(bucketName, objectKey).toString()) // 객체 URL 가져오기 + .collect(Collectors.toList()); + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException{ + + String originalFilename = file.getOriginalFilename(); + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); // 메타데이터 설정 + metadata.setContentType(file.getContentType()); // 메타데이터 설정 + + amazonS3.putObject(bucketName, originalFilename, file.getInputStream(), metadata); // 이미지 업로드 + amazonS3.setObjectAcl(bucketName, originalFilename, CannedAccessControlList.PublicRead); // ACL 퍼블릭으로 만들기 + + return "redirect:/"; + + } +} \ No newline at end of file From 6c2fe15b7b694a5b43b36c1b556f5bd99b1bdce6 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 17 Nov 2023 12:00:10 +0900 Subject: [PATCH 041/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..883e047 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,19 @@ +## 📖5주차 기본 과제 +1. S3 bucket에 사진 업로드 controller 작성 +2. S3 bucket 사진 리스트 가져오기 controller 작성 + +## 🤓해결 과정 +### 1️⃣ 사진 리스트 가져오기 +1. amazonS3.listObjects(bucketName).getObjectSummaries() 를 이용해 버킷 내 모든 객체 리스트 가져오기 +2. 반복문으로 각 객체의 url에 접근 +3. 객체의 key값을 이용해 amazonS3.getUrl(bucketName, objectKey).toString() 함수로 객체의 url 가져오기 +4. 리스트에 저장 +5. thymeleaf 적용을 위해 모델에 객체 url 리스트 추가 + +### 2️⃣ 사진 업로드하기 +1. amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); 로 S3에 파일 업로드 +2. amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead);로 ACL객체 권한을 Public read로 설정 + + +## ✌️과제 인증 +https://drive.google.com/file/d/1ZP0zgfgus9n5NOU51p686daHZSkrR84E/view?usp=sharing From 335ba13b881bec3aad06cd4c6fe405163ac5593d Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 17 Nov 2023 12:00:56 +0900 Subject: [PATCH 042/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" new file mode 100644 index 0000000..5c55634 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -0,0 +1,70 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + List imageUrls = new ArrayList<>(); + + //S3 버킷 내 모든 객체 리스트 가져오기 + List objectSummaries = amazonS3.listObjects(bucketName).getObjectSummaries(); + + //각 객체의 URL을 가져와서 리스트에 추가하기 + for(S3ObjectSummary ob : objectSummaries){ //반복문을 돌면서 리스트의 모든 객체에 접근 + String objectKey = ob.getKey(); //객체의 key값 가져오기 + String objectUrl = amazonS3.getUrl(bucketName, objectKey).toString(); //key값으로 url가져오기 + imageUrls.add(objectUrl); //list에 저장 + } + + //모델에 객체 URL 리스트 추가 + //index.html은 ${fileUrls}를 이용하여 객체에 접근 + model.addAttribute("fileUrls", imageUrls); + + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) { + + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + + try{ + //s3에 파일 업로드 + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); + + //업로드한 객체에 대해 ACL 설정 + amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); + + } catch (IOException e) { + e.printStackTrace(); + } + + return "redirect:/"; + + } +} From 5b5a09174910bdc13d6d00abc3c57cd4bc771eed Mon Sep 17 00:00:00 2001 From: D <111134734+DeiLee0913@users.noreply.github.com> Date: Fri, 17 Nov 2023 21:51:46 +0900 Subject: [PATCH 043/103] =?UTF-8?q?Delete=20=EC=9D=B4=EC=98=88=EC=A7=80=5F?= =?UTF-8?q?3=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 "\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" deleted file mode 100644 index ad124f8..0000000 --- "a/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ /dev/null @@ -1,71 +0,0 @@ -# 과제 -주어진 index, members, newMember html 파일을 조정하는 Controll 코드 작성하기 - -## Controller에 대해 공부한 내용 -https://www.notion.so/Java-Spring-Framework-controller-cb21042e62ba4321a8f69cd717cc2212?pvs=4 - - -# 작성한 코드 - ```java - package mvcstudy.mvcstudy.Controller; - - import org.springframework.stereotype.Controller; - import org.springframework.web.bind.annotation.GetMapping; - import org.springframework.web.bind.annotation.RequestParam; - import org.springframework.ui.Model; - //import org.springframework.web.bind.annotation.ModelAttribute; - - @Controller - public class SampleController { - - /* 문제 조건 - 1. 사용자는 `/(루트)` 경로, `/members` 경로, `/members/new` 경로로 접근 - 2. 각 경로로 접근했을 때 view에 각각 데이터가 전달되는 것을 확인하기 - */ - - @GetMapping("/") //루트 경로 - public String home(Model model) { - model.addAttribute("description", "메인 페이지 입니다."); // key:value 구조 - return "index"; // resources:templates/ + {viewname} + .html 실행 - } - - @GetMapping("/members") - public String showMembersPage(Model model) { - //데이터들 View로 전달하기 위해 Model 사용 - model.addAttribute("member1", "Yeji Lee"); - model.addAttribute("member2", "Sumin Kim"); - model.addAttribute("member3", "GDSC Ewha"); - - return "members"; - } - - - @GetMapping("/members/new") - public String showNewMember(@RequestParam(name = "name", defaultValue = "guest") String name, - @RequestParam(name = "email", defaultValue = "example@example.com") String email, - Model model) { - - /* - @RequestParam: 쿼리 파라미터로 필요 정보 받아오기(url 입력 값에서 파라미터로 값 받아오기) - "name=value1&email=value2": query string(쿼리 파라미터) 받아올 파라미터가 여러 개이므로 & 연산자 이용하기 - 쿼리 파라미터의 key로 name을 받아오고 name 매개변수로 value 받아오기 - */ - - - //쿼리 파라미터로 name과 email 입력 받아서 전달 - model.addAttribute("name", name); - model.addAttribute("email", email); - - return "newMember"; //내려받아온 html 파일명 - } -} -``` - - -# 어려움(미완 이유) - - 자바 스프링을 다뤄보는 게 처음인데 과제의 중심이 controller 코드 작성이라고 생각해서 열심히 controller 자체나 파라미터를 받아오는 방법 등에 대해 주로 공부했으나, - 1. 막상 코드 작성을 끝내고나니 파일 구조를 어떻게 해야할지 매우 헤맸음 - 2. 작성한 Controller 코드로 각 html 파일을 캣톰 서버로 열어서 정상 작동하는 것을 확인할 수 있으나... 찍어올려야하는 동영상처럼 localhost로 로그인 했을 때는 수행 불가 - : 계속 Controller에 No usage 경고가 계속 뜨는 것이 분명 구조 상 문제 같은데... 해결하지 못함 - From e6cb09d8e512e8ec676d83b6ab6bdb110d09b432 Mon Sep 17 00:00:00 2001 From: D <111134734+DeiLee0913@users.noreply.github.com> Date: Fri, 17 Nov 2023 21:53:57 +0900 Subject: [PATCH 044/103] Add files via upload --- ...4\354\260\250_\352\263\274\354\240\234.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 "3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..ad124f8 --- /dev/null +++ "b/3\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_3\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,71 @@ +# 과제 +주어진 index, members, newMember html 파일을 조정하는 Controll 코드 작성하기 + +## Controller에 대해 공부한 내용 +https://www.notion.so/Java-Spring-Framework-controller-cb21042e62ba4321a8f69cd717cc2212?pvs=4 + + +# 작성한 코드 + ```java + package mvcstudy.mvcstudy.Controller; + + import org.springframework.stereotype.Controller; + import org.springframework.web.bind.annotation.GetMapping; + import org.springframework.web.bind.annotation.RequestParam; + import org.springframework.ui.Model; + //import org.springframework.web.bind.annotation.ModelAttribute; + + @Controller + public class SampleController { + + /* 문제 조건 + 1. 사용자는 `/(루트)` 경로, `/members` 경로, `/members/new` 경로로 접근 + 2. 각 경로로 접근했을 때 view에 각각 데이터가 전달되는 것을 확인하기 + */ + + @GetMapping("/") //루트 경로 + public String home(Model model) { + model.addAttribute("description", "메인 페이지 입니다."); // key:value 구조 + return "index"; // resources:templates/ + {viewname} + .html 실행 + } + + @GetMapping("/members") + public String showMembersPage(Model model) { + //데이터들 View로 전달하기 위해 Model 사용 + model.addAttribute("member1", "Yeji Lee"); + model.addAttribute("member2", "Sumin Kim"); + model.addAttribute("member3", "GDSC Ewha"); + + return "members"; + } + + + @GetMapping("/members/new") + public String showNewMember(@RequestParam(name = "name", defaultValue = "guest") String name, + @RequestParam(name = "email", defaultValue = "example@example.com") String email, + Model model) { + + /* + @RequestParam: 쿼리 파라미터로 필요 정보 받아오기(url 입력 값에서 파라미터로 값 받아오기) + "name=value1&email=value2": query string(쿼리 파라미터) 받아올 파라미터가 여러 개이므로 & 연산자 이용하기 + 쿼리 파라미터의 key로 name을 받아오고 name 매개변수로 value 받아오기 + */ + + + //쿼리 파라미터로 name과 email 입력 받아서 전달 + model.addAttribute("name", name); + model.addAttribute("email", email); + + return "newMember"; //내려받아온 html 파일명 + } +} +``` + + +# 어려움(미완 이유) + + 자바 스프링을 다뤄보는 게 처음인데 과제의 중심이 controller 코드 작성이라고 생각해서 열심히 controller 자체나 파라미터를 받아오는 방법 등에 대해 주로 공부했으나, + 1. 막상 코드 작성을 끝내고나니 파일 구조를 어떻게 해야할지 매우 헤맸음 + 2. 작성한 Controller 코드로 각 html 파일을 캣톰 서버로 열어서 정상 작동하는 것을 확인할 수 있으나... 찍어올려야하는 동영상처럼 localhost로 로그인 했을 때는 수행 불가 + : 계속 Controller에 No usage 경고가 계속 뜨는 것이 분명 구조 상 문제 같은데... 해결하지 못함 + From a6b215f76ad5c931acca7677104c3696dd6a0a56 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:57:34 +0900 Subject: [PATCH 045/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...243\274\354\260\250_\352\263\274\354\240\234.md" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..bc94e06 --- /dev/null +++ "b/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,13 @@ +## 과정 +1. 인스턴스 생성(EC2) +2. 보안자격증명 > 키 생성 +3. index.html과 S3Controller 파일 수정 +4. main 메소드를 실행한 후 결과 확인 ! + +## 난관 +해결 : test를 돌리는데 안돼서 당황했지만, 코어멤버 혜승님께서 main 메소드를 돌리는 것을 알려주셨다!! 서비스를 구동하려면 main메소드를 돌리는 것이구나.. + +귀여운 미리보기 +스크린샷 2023-11-17 오후 10 54 53 + + From 11f2353ef3a245c3e75e5aafbc542c102ae4747a Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:58:02 +0900 Subject: [PATCH 046/103] Add files via upload --- .../S3Controller.java" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" diff --git "a/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" "b/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" new file mode 100644 index 0000000..10d3d26 --- /dev/null +++ "b/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" @@ -0,0 +1,66 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + List fileUrls = new ArrayList<>(); + List objectSummaries = amazonS3.listObjects(bucketName).getObjectSummaries(); + // 객체 URL을 리스트에 추가 + for (S3ObjectSummary objectSummary : objectSummaries) { + fileUrls.add(amazonS3.getUrl(bucketName, objectSummary.getKey()).toString()); + } + // 모델에 URL 리스트 추가 + model.addAttribute("fileUrls", fileUrls); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) { + try { + /// ObjectMetadata 인스턴스 생성 + ObjectMetadata metadata = new ObjectMetadata(); + + // content type (MIME type)세팅 + metadata.setContentType(file.getContentType()); + + // S3에 파일 업로드 + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), metadata); + + // ACL를 public-read로 + amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); + + + return "redirect:/"; + } catch (IOException e) { + // Handle the exception appropriately (e.g., log it or show an error message) + return "error"; + } + + } +} \ No newline at end of file From 4e191f4c7c4bc5d9c71036985bc1279ed3d101c0 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:59:42 +0900 Subject: [PATCH 047/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" "b/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" index 10d3d26..9e54923 100644 --- "a/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" +++ "b/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.List; - +//영상 링크 : https://drive.google.com/file/d/17tmgRlWb4g0ZRuUKt6pvBlmmw-NqpDHR/view?usp=sharing @Controller @RequiredArgsConstructor public class S3Controller { @@ -63,4 +63,4 @@ public String uploadFile(@RequestParam("file") MultipartFile file) { } } -} \ No newline at end of file +} From 6f860781aca76413eadd6a1a9d1ee9f0fcebf670 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:03:39 +0900 Subject: [PATCH 048/103] =?UTF-8?q?Update=20=EC=96=91=EB=8F=99=EC=84=A0=5F?= =?UTF-8?q?5=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" index bc94e06..f9ed048 100644 --- "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -9,5 +9,3 @@ 귀여운 미리보기 스크린샷 2023-11-17 오후 10 54 53 - - From 89c9df68d808b13f428773c02bbd6745e31ae086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A7=80=EC=9B=90?= Date: Fri, 17 Nov 2023 23:03:59 +0900 Subject: [PATCH 049/103] =?UTF-8?q?[=EC=84=9C=EC=A7=80=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 60 +++++++++++++++++++ ...4\354\260\250_\352\263\274\354\240\234.md" | 0 2 files changed, 60 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" new file mode 100644 index 0000000..1187e15 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -0,0 +1,60 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +@Slf4j +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + List files = new ArrayList<>(); + + ListObjectsV2Result result = amazonS3.listObjectsV2(bucketName); + List objects = result.getObjectSummaries(); + + for(S3ObjectSummary os : objects){ + files.add(amazonS3.getUrl(bucketName, os.getKey()).toString()); + //log.info("{}",files.get(files.size()-1)); + } + + model.addAttribute("fileUrls", files); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); + amazonS3.setObjectAcl(bucketName,file.getOriginalFilename(), CannedAccessControlList.PublicRead); + return "redirect:/"; + + } +} \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..e69de29 From c8a2f85d3496199e4e8e7c9882d774ddbfac93c2 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:05:21 +0900 Subject: [PATCH 050/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 2 -- 1 file changed, 2 deletions(-) rename "5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" => "5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" (99%) diff --git "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" similarity index 99% rename from "5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" rename to "5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" index bc94e06..f9ed048 100644 --- "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -9,5 +9,3 @@ 귀여운 미리보기 스크린샷 2023-11-17 오후 10 54 53 - - From b5c06e85d1391eb8cc1b228f7d10cc57e1d45dd3 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:05:45 +0900 Subject: [PATCH 051/103] S3Controller.java to S3Controller.java --- .../S3Controller.java" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" => "5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" (100%) diff --git "a/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" "b/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" similarity index 100% rename from "5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" rename to "5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" From 8cd64b8bacf377b254185996ce72c53dee4a4f4b Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Fri, 17 Nov 2023 23:07:28 +0900 Subject: [PATCH 052/103] =?UTF-8?q?Delete=205=EC=A3=BC=EC=B0=A8=20Sever=20?= =?UTF-8?q?S-Day=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 66 ------------------- ...4\354\260\250_\352\263\274\354\240\234.md" | 11 ---- 2 files changed, 77 deletions(-) delete mode 100644 "5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" delete mode 100644 "5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" "b/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" deleted file mode 100644 index 9e54923..0000000 --- "a/5\354\243\274\354\260\250 Sever S-Day/S3Controller.java" +++ /dev/null @@ -1,66 +0,0 @@ -package ServerStudy5Cloud.ServerStudy5Cloud.Controller; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.S3ObjectSummary; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -//영상 링크 : https://drive.google.com/file/d/17tmgRlWb4g0ZRuUKt6pvBlmmw-NqpDHR/view?usp=sharing -@Controller -@RequiredArgsConstructor -public class S3Controller { - - private final AmazonS3 amazonS3; - - @Value("${cloud.aws.s3.bucket}") - private String bucketName; - - @GetMapping("/") - public String listFiles(Model model) { - List fileUrls = new ArrayList<>(); - List objectSummaries = amazonS3.listObjects(bucketName).getObjectSummaries(); - // 객체 URL을 리스트에 추가 - for (S3ObjectSummary objectSummary : objectSummaries) { - fileUrls.add(amazonS3.getUrl(bucketName, objectSummary.getKey()).toString()); - } - // 모델에 URL 리스트 추가 - model.addAttribute("fileUrls", fileUrls); - return "index"; - } - - @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) { - try { - /// ObjectMetadata 인스턴스 생성 - ObjectMetadata metadata = new ObjectMetadata(); - - // content type (MIME type)세팅 - metadata.setContentType(file.getContentType()); - - // S3에 파일 업로드 - amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), metadata); - - // ACL를 public-read로 - amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); - - - return "redirect:/"; - } catch (IOException e) { - // Handle the exception appropriately (e.g., log it or show an error message) - return "error"; - } - - } -} diff --git "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" deleted file mode 100644 index f9ed048..0000000 --- "a/5\354\243\274\354\260\250 Sever S-Day/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ /dev/null @@ -1,11 +0,0 @@ -## 과정 -1. 인스턴스 생성(EC2) -2. 보안자격증명 > 키 생성 -3. index.html과 S3Controller 파일 수정 -4. main 메소드를 실행한 후 결과 확인 ! - -## 난관 -해결 : test를 돌리는데 안돼서 당황했지만, 코어멤버 혜승님께서 main 메소드를 돌리는 것을 알려주셨다!! 서비스를 구동하려면 main메소드를 돌리는 것이구나.. - -귀여운 미리보기 -스크린샷 2023-11-17 오후 10 54 53 From 0b64523875ff986ffc89ce63fa9420f4b6d6b434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A7=80=EC=9B=90?= Date: Fri, 17 Nov 2023 23:22:29 +0900 Subject: [PATCH 053/103] =?UTF-8?q?Update=20=EC=84=9C=EC=A7=80=EC=9B=90=5F?= =?UTF-8?q?5=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" index e69de29..5f5eb6d 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,20 @@ +1. IAM에서 AmazonS3FullAccess 권한을 가진 사용자 생성 -> application.yml의 accessKey와 secretKey에 입력
+2. ```getUrl```로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기
+ a. ```listObjects```메서드로 버킷의 ```ObjectListing```객체에 대한 정보를 제공하는 객체를 반환
+ b. ```getObjectSummaries``` 메서드를 사용하여 각 객체가 버킷의 단일 ```ObjectSummary``` 객체를 나타내는 S3 객체 목록을 가져옴
+ c . 반복문을 돌며 summary에서 key 가져와 url을 list에 저장
+
+⚠️발생한 문제 + +![사진 안뜸](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/63919973/0191904f-9bb4-4e96-97c3-51ba5a0cc96b) +- 사진이 안뜸->버킷 읽기 권한이 없기 때문이었음 + ![access denied](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/63919973/eb333e7d-5f10-46d3-94b4-8b128a0af747) +- 버킷 권한 설정 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/63919973/9abcb391-b84c-4880-b698-a75374f8b235) + +------>해결
+3. putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + +[화면] +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/63919973/062ed883-ecde-4f1c-9d98-e014b7eb3dca) + From a48acf39d19de19d980fecdfd791d3986953e348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A7=80=EC=9B=90?= Date: Fri, 17 Nov 2023 23:24:11 +0900 Subject: [PATCH 054/103] =?UTF-8?q?[=EC=84=9C=EC=A7=80=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...33\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 1 - 1 file changed, 1 deletion(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" index 5f5eb6d..a41906a 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\204\234\354\247\200\354\233\220_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -17,4 +17,3 @@ [화면] ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/63919973/062ed883-ecde-4f1c-9d98-e014b7eb3dca) - From 2eeb60072b2cbea85c4741fc7010148e576718cf Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Sat, 18 Nov 2023 16:23:58 +0900 Subject: [PATCH 055/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../files_leeseohyun/S3Controller.java" | 53 +++++++++++++++++++ .../files_leeseohyun/application.yml" | 15 ++++++ ...4\354\260\250_\352\263\274\354\240\234.md" | 0 3 files changed, 68 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" new file mode 100644 index 0000000..c08ae6e --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" @@ -0,0 +1,53 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + // S3 버킷의 객체 목록 가져오기 + List objectSummaries = amazonS3.listObjectsV2(bucketName).getObjectSummaries(); + // getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환 + List fileUrls = new ArrayList<>(); + for (S3ObjectSummary os : objectSummaries) { + String url = amazonS3.getUrl(bucketName, os.getKey()).toString(); + fileUrls.add(url); + } + model.addAttribute("fileUrls", fileUrls); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + String filename = file.getOriginalFilename(); + // putObject로 파일을 S3 버킷에 업로드 + amazonS3.putObject(bucketName, filename, file.getInputStream(), null); + // ACL 퍼블릭으로 설정 + amazonS3.setObjectAcl(bucketName, filename, CannedAccessControlList.PublicRead); + return "redirect:/"; + } +} +// 동작 영상 : https://drive.google.com/file/d/10wPjsBbnbIR5E6pKbwmr2sZ-GsLY-FWP/view?usp=sharing \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" new file mode 100644 index 0000000..4b7489c --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" @@ -0,0 +1,15 @@ +spring: + config: + import: optional:file:.env[.properties] +# 이렇게 .env 파일을 사용하려고 했지만 잘 동작하지 않아서... 빌드 Edit Configuration에서 Environment variables로 설정해서 했습니다...! +cloud: + aws: + s3: + bucket: ${S3_BUCKET} + stack.auto: false + region.static: ap-northeast-2 + credentials: + access-key: ${CREDENTIALS_ACCESS_KEY} + secret-key: ${CREDENTIALS_SECRET_KEY} +server: + port: 8080 \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..e69de29 From bd34917495cb7f3e6b7567a34893b6674b35435e Mon Sep 17 00:00:00 2001 From: Seohyun Lee <32611398+seohyun-lee@users.noreply.github.com> Date: Sat, 18 Nov 2023 16:35:34 +0900 Subject: [PATCH 056/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\243\274\354\260\250_\352\263\274\354\240\234.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" index e69de29..fa3f376 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,11 @@ +### 5주차 Server S-Day 과제 - 이서현 +> 과제: S3에 객체 업로드 및 조회 + +> 심화 과제: application.yml 변경 + +## 과제 +### 사진 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/32611398/305cc543-d0df-46bc-8c28-d615a45a70fa) + +### 참고 자료 +* [Spring] 설정 파일 환경변수를 통해 숨기기 — Shin._.Mallang https://ttl-blog.tistory.com/1125 From 48b6237f43646c306e191900a68d6b18bd451e97 Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Sat, 18 Nov 2023 16:38:02 +0900 Subject: [PATCH 057/103] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../files_leeseohyun/S3Controller.java" | 53 ------------------- .../files_leeseohyun/application.yml" | 15 ------ ...4\354\260\250_\352\263\274\354\240\234.md" | 11 ---- 3 files changed, 79 deletions(-) delete mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" delete mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" delete mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" deleted file mode 100644 index c08ae6e..0000000 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" +++ /dev/null @@ -1,53 +0,0 @@ -package ServerStudy5Cloud.ServerStudy5Cloud.Controller; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.S3ObjectSummary; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - - -@Controller -@RequiredArgsConstructor -public class S3Controller { - - private final AmazonS3 amazonS3; - - @Value("${cloud.aws.s3.bucket}") - private String bucketName; - - @GetMapping("/") - public String listFiles(Model model) { - // S3 버킷의 객체 목록 가져오기 - List objectSummaries = amazonS3.listObjectsV2(bucketName).getObjectSummaries(); - // getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환 - List fileUrls = new ArrayList<>(); - for (S3ObjectSummary os : objectSummaries) { - String url = amazonS3.getUrl(bucketName, os.getKey()).toString(); - fileUrls.add(url); - } - model.addAttribute("fileUrls", fileUrls); - return "index"; - } - - @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { - String filename = file.getOriginalFilename(); - // putObject로 파일을 S3 버킷에 업로드 - amazonS3.putObject(bucketName, filename, file.getInputStream(), null); - // ACL 퍼블릭으로 설정 - amazonS3.setObjectAcl(bucketName, filename, CannedAccessControlList.PublicRead); - return "redirect:/"; - } -} -// 동작 영상 : https://drive.google.com/file/d/10wPjsBbnbIR5E6pKbwmr2sZ-GsLY-FWP/view?usp=sharing \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" deleted file mode 100644 index 4b7489c..0000000 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" +++ /dev/null @@ -1,15 +0,0 @@ -spring: - config: - import: optional:file:.env[.properties] -# 이렇게 .env 파일을 사용하려고 했지만 잘 동작하지 않아서... 빌드 Edit Configuration에서 Environment variables로 설정해서 했습니다...! -cloud: - aws: - s3: - bucket: ${S3_BUCKET} - stack.auto: false - region.static: ap-northeast-2 - credentials: - access-key: ${CREDENTIALS_ACCESS_KEY} - secret-key: ${CREDENTIALS_SECRET_KEY} -server: - port: 8080 \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" deleted file mode 100644 index fa3f376..0000000 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ /dev/null @@ -1,11 +0,0 @@ -### 5주차 Server S-Day 과제 - 이서현 -> 과제: S3에 객체 업로드 및 조회 - -> 심화 과제: application.yml 변경 - -## 과제 -### 사진 -![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/32611398/305cc543-d0df-46bc-8c28-d615a45a70fa) - -### 참고 자료 -* [Spring] 설정 파일 환경변수를 통해 숨기기 — Shin._.Mallang https://ttl-blog.tistory.com/1125 From 5c3230da6825a7268b0311a5f69d483d45596ecf Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Sat, 18 Nov 2023 16:38:40 +0900 Subject: [PATCH 058/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../files_leeseohyun/S3Controller.java" | 53 +++++++++++++++++++ .../files_leeseohyun/application.yml" | 15 ++++++ ...4\354\260\250_\352\263\274\354\240\234.md" | 11 ++++ 3 files changed, 79 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" new file mode 100644 index 0000000..c08ae6e --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/S3Controller.java" @@ -0,0 +1,53 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + // S3 버킷의 객체 목록 가져오기 + List objectSummaries = amazonS3.listObjectsV2(bucketName).getObjectSummaries(); + // getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환 + List fileUrls = new ArrayList<>(); + for (S3ObjectSummary os : objectSummaries) { + String url = amazonS3.getUrl(bucketName, os.getKey()).toString(); + fileUrls.add(url); + } + model.addAttribute("fileUrls", fileUrls); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + String filename = file.getOriginalFilename(); + // putObject로 파일을 S3 버킷에 업로드 + amazonS3.putObject(bucketName, filename, file.getInputStream(), null); + // ACL 퍼블릭으로 설정 + amazonS3.setObjectAcl(bucketName, filename, CannedAccessControlList.PublicRead); + return "redirect:/"; + } +} +// 동작 영상 : https://drive.google.com/file/d/10wPjsBbnbIR5E6pKbwmr2sZ-GsLY-FWP/view?usp=sharing \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" new file mode 100644 index 0000000..4b7489c --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/files_leeseohyun/application.yml" @@ -0,0 +1,15 @@ +spring: + config: + import: optional:file:.env[.properties] +# 이렇게 .env 파일을 사용하려고 했지만 잘 동작하지 않아서... 빌드 Edit Configuration에서 Environment variables로 설정해서 했습니다...! +cloud: + aws: + s3: + bucket: ${S3_BUCKET} + stack.auto: false + region.static: ap-northeast-2 + credentials: + access-key: ${CREDENTIALS_ACCESS_KEY} + secret-key: ${CREDENTIALS_SECRET_KEY} +server: + port: 8080 \ No newline at end of file diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..ffedd12 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,11 @@ +### 5주차 Server S-Day 과제 - 이서현 +> 과제: S3에 객체 업로드 및 조회 + +> 심화 과제: application.yml 변경 + +## 과제 +### 사진 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/32611398/305cc543-d0df-46bc-8c28-d615a45a70fa) + +### 참고 자료 +* [Spring] 설정 파일 환경변수를 통해 숨기기 — Shin._.Mallang https://ttl-blog.tistory.com/1125 From 133f72abb0c07622523852b9713b9227d5dfe5c3 Mon Sep 17 00:00:00 2001 From: yslim21 Date: Sat, 18 Nov 2023 18:47:45 +0900 Subject: [PATCH 059/103] =?UTF-8?q?[=EC=9E=84=EC=98=81=EC=84=9C]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" new file mode 100644 index 0000000..d51b0df --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -0,0 +1,79 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectListing; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + //업로드할 URL 파일 목록을 저장할 리스트 생성 + List fileUrls = new ArrayList<>(); + + //S3 내의 객체 목록 가져오기 + ObjectListing objectListing = amazonS3.listObjects(bucketName); + List objectSummaries = objectListing.getObjectSummaries(); + + // 객체 URL 가져와서 리스트에 추가 + for (S3ObjectSummary objectSummary : objectSummaries) { + String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); + fileUrls.add(fileUrl); + } + + // 모델에 URL 리스트 추가 + model.addAttribute("fileUrls", fileUrls); + + return "index"; + } + + + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException{ + + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + //파일 이름가져오기 + String originalFilename = file.getOriginalFilename(); + + //메타데이터 설정 + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); + + // putObject로 s3에 파일 업로드 + amazonS3.putObject(bucketName, originalFilename, file.getInputStream(),metadata); + + //업로드한 객체에 ACL퍼블릭 설정 + amazonS3.setObjectAcl(bucketName, originalFilename, CannedAccessControlList.PublicRead); + + return "redirect:/"; + + + } +} + +//https://drive.google.com/file/d/1o9uRjxExZHYJOCKX6aTS8y8KKc-vic0d/view?usp=sharing \ No newline at end of file From 737443e97dce6fa7b75b76723d732c817343311a Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 18 Nov 2023 19:08:07 +0900 Subject: [PATCH 060/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" new file mode 100644 index 0000000..212689d --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -0,0 +1,56 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.*; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 영상 인증: https://drive.google.com/file/d/1aoKdLbbNA8EHkJmxeYoLGfrx0gwYSfdg/view?usp=sharing + */ +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + // 버킷의 object list 조회 + ObjectListing objectListing = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucketName)); + + // object list에서 각 object의 url을 조회해 list 생성 + List urls = objectListing.getObjectSummaries().stream() + .map(os -> amazonS3.getUrl(bucketName, os.getKey()).toString()) + .collect(Collectors.toList()); + model.addAttribute("urls", urls); // 모델에 추가해 뷰로 전달 + + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + // 전송한 파일 이름 조회 + String fileName = file.getOriginalFilename(); + + // 버킷에 파일 업로드 + amazonS3.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), null)); + // 파일의 접근 권한을 public으로 설정 + amazonS3.setObjectAcl(bucketName, fileName, CannedAccessControlList.PublicRead); + + return "redirect:/"; + } +} From 5fbb6a101b0ef2a5b9f5a61f867bd1da1ab39ab2 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 18 Nov 2023 19:09:00 +0900 Subject: [PATCH 061/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../index.html" | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" new file mode 100644 index 0000000..592fda0 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" @@ -0,0 +1,29 @@ + + + + + + + GDSC Server + + + +

AWS S3에 파일을 업로드해봐요!

+ +
+ + +
+ +

AWS S3의 파일을 확인해봐요!

+ + + + + +
+ +
+ + + From 9c2cb1aab7f18da97203cc7f93195629b2f9aad4 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 18 Nov 2023 19:09:50 +0900 Subject: [PATCH 062/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application.yml" | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" new file mode 100644 index 0000000..5d08cb2 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" @@ -0,0 +1,9 @@ +cloud: + aws: + s3: + bucket: gdsc-server-prac + stack.auto: false + region.static: ap-northeast-2 + credentials: + access-key: ${AWS_ACCESS_KEY} + secret-key: ${AWS_SECRET_KEY} From b0429ebb2422a4d38f2631314c82177987c0b0ac Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 18 Nov 2023 19:13:58 +0900 Subject: [PATCH 063/103] Rename S3Controller.java to S3Controller_JoongHyunKim.java --- .../S3Controller_JoongHyunKim.java" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" => "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_JoongHyunKim.java" (100%) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_JoongHyunKim.java" similarity index 100% rename from "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" rename to "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_JoongHyunKim.java" From 152721f8fdc4a3aff81ac12f296ad8c786bb7af2 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 18 Nov 2023 19:14:16 +0900 Subject: [PATCH 064/103] Rename application.yml to application_JoongHyunKim.yml --- .../application_JoongHyunKim.yml" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" => "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application_JoongHyunKim.yml" (100%) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application_JoongHyunKim.yml" similarity index 100% rename from "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application.yml" rename to "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/application_JoongHyunKim.yml" From de57a53fd7a661b714d49d23756a9c3347dfc1c0 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 18 Nov 2023 19:14:31 +0900 Subject: [PATCH 065/103] Rename index.html to index_JoongHyunKim.html --- .../index_JoongHyunKim.html" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" => "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index_JoongHyunKim.html" (100%) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index_JoongHyunKim.html" similarity index 100% rename from "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index.html" rename to "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/index_JoongHyunKim.html" From acd9b6ddcb0eae0fb240059358ed3bca12c32543 Mon Sep 17 00:00:00 2001 From: D <111134734+DeiLee0913@users.noreply.github.com> Date: Sat, 18 Nov 2023 22:23:34 +0900 Subject: [PATCH 066/103] =?UTF-8?q?[=EC=9D=B4=EC=98=88=EC=A7=80]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..dadc554 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,74 @@ +# 과제 풀이 + +## 메서드별 기능 생각해보기 +1. GetMapping("/"): + - 이 메서드는 웹 어플리케이션의 루트 경로("/")에 대한 GET 요청을 처리 + - **`listFiles(Model model)`** 메서드는 S3 버킷 내의 파일 목록을 가져와서 **`index.html`**에 반환 + - 여기서 **`Model`** 객체를 사용하여 파일 목록을 뷰로 전달 + - **`index.html`**은 파일 목록을 화면에 표시할 템플릿 파일, 파일 목록을 가져와 화면에 표시하도록 해당 템플릿을 구성 +2. PostMapping("/upload"): + - 이 메서드는 **`/upload`** 엔드포인트에 POST 요청을 처리 + - **`uploadFile(@RequestParam("file") MultipartFile file)`** 메서드는 클라이언트로부터 업로드된 파일을 처리 + - **`MultipartFile`**은 HTTP 요청에서 전송된 파일을 나타내며, 해당 파일을 Amazon S3에 업로드하는 작업을 수행 + - **`amazonS3.putObject()`** 또는 관련 메서드를 사용하여 파일을 S3 버킷에 업로드하고, 업로드된 파일에 대한 ACL(Access Control List)을 설정하여 해당 파일을 퍼블릭으로 만들 수 있음 + - 이후에는 **`redirect:/`**를 사용하여 파일 업로드가 완료된 후에는 루트 경로로 리디렉션하여 홈 화면으로 이동하도록 설정 + + +## 코드 작성하기 + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + List fileUrls = new ArrayList<>(); + + ListObjectsV2Result objects = amazonS3.listObjectsV2(bucketName); + for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { + String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); + fileUrls.add(fileUrl); + } + + model.addAttribute("fileUrls", fileUrls); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) { + try { + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); + amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); + } catch (IOException e) { + // 에러 처리 로직 추가 + e.printStackTrace(); + } + + return "redirect:/"; + } +} + +## 과제 수행 인증 동영상 +https://drive.google.com/file/d/10d7Rp4JSPHYUbRt4dOeozRHmkafxJ32R/view?usp=sharing \ No newline at end of file From cddbe55c7fbbfa3ac232612069c2583733d24e1f Mon Sep 17 00:00:00 2001 From: D <111134734+DeiLee0913@users.noreply.github.com> Date: Sat, 18 Nov 2023 22:24:17 +0900 Subject: [PATCH 067/103] =?UTF-8?q?Delete=205=EC=A3=BC=EC=B0=A8=20Server?= =?UTF-8?q?=20S-Day=20=EA=B3=BC=EC=A0=9C/=EC=9D=B4=EC=98=88=EC=A7=80=5F5?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" deleted file mode 100644 index dadc554..0000000 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\230\210\354\247\200_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ /dev/null @@ -1,74 +0,0 @@ -# 과제 풀이 - -## 메서드별 기능 생각해보기 -1. GetMapping("/"): - - 이 메서드는 웹 어플리케이션의 루트 경로("/")에 대한 GET 요청을 처리 - - **`listFiles(Model model)`** 메서드는 S3 버킷 내의 파일 목록을 가져와서 **`index.html`**에 반환 - - 여기서 **`Model`** 객체를 사용하여 파일 목록을 뷰로 전달 - - **`index.html`**은 파일 목록을 화면에 표시할 템플릿 파일, 파일 목록을 가져와 화면에 표시하도록 해당 템플릿을 구성 -2. PostMapping("/upload"): - - 이 메서드는 **`/upload`** 엔드포인트에 POST 요청을 처리 - - **`uploadFile(@RequestParam("file") MultipartFile file)`** 메서드는 클라이언트로부터 업로드된 파일을 처리 - - **`MultipartFile`**은 HTTP 요청에서 전송된 파일을 나타내며, 해당 파일을 Amazon S3에 업로드하는 작업을 수행 - - **`amazonS3.putObject()`** 또는 관련 메서드를 사용하여 파일을 S3 버킷에 업로드하고, 업로드된 파일에 대한 ACL(Access Control List)을 설정하여 해당 파일을 퍼블릭으로 만들 수 있음 - - 이후에는 **`redirect:/`**를 사용하여 파일 업로드가 완료된 후에는 루트 경로로 리디렉션하여 홈 화면으로 이동하도록 설정 - - -## 코드 작성하기 - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.ListObjectsV2Result; -import com.amazonaws.services.s3.model.S3ObjectSummary; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -@Controller -@RequiredArgsConstructor -public class S3Controller { - - private final AmazonS3 amazonS3; - - @Value("${cloud.aws.s3.bucket}") - private String bucketName; - - @GetMapping("/") - public String listFiles(Model model) { - List fileUrls = new ArrayList<>(); - - ListObjectsV2Result objects = amazonS3.listObjectsV2(bucketName); - for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { - String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); - fileUrls.add(fileUrl); - } - - model.addAttribute("fileUrls", fileUrls); - return "index"; - } - - @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) { - try { - amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); - amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); - } catch (IOException e) { - // 에러 처리 로직 추가 - e.printStackTrace(); - } - - return "redirect:/"; - } -} - -## 과제 수행 인증 동영상 -https://drive.google.com/file/d/10d7Rp4JSPHYUbRt4dOeozRHmkafxJ32R/view?usp=sharing \ No newline at end of file From 29afdab283be536ecee589f4e9bf704e0e27f7d7 Mon Sep 17 00:00:00 2001 From: D <111134734+DeiLee0913@users.noreply.github.com> Date: Sat, 18 Nov 2023 22:28:37 +0900 Subject: [PATCH 068/103] =?UTF-8?q?[=EC=9D=B4=EC=98=88=EC=A7=80]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller_LeeYeji.java" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeYeji.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeYeji.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeYeji.java" new file mode 100644 index 0000000..1bd7ef0 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LeeYeji.java" @@ -0,0 +1,76 @@ +/* + ## 과제 수행 인증 동영상 + https://drive.google.com/file/d/10d7Rp4JSPHYUbRt4dOeozRHmkafxJ32R/view?usp=sharing + + ##메서드별 기능 생각해보기 + 1. GetMapping("/"): + - 이 메서드는 웹 어플리케이션의 루트 경로("/")에 대한 GET 요청을 처리 + - **`listFiles(Model model)`** 메서드는 S3 버킷 내의 파일 목록을 가져와서 **`index.html`**에 반환 + - 여기서 **`Model`** 객체를 사용하여 파일 목록을 뷰로 전달 + - **`index.html`**은 파일 목록을 화면에 표시할 템플릿 파일, 파일 목록을 가져와 화면에 표시하도록 해당 템플릿을 구성 + + 2. PostMapping("/upload"): + - 이 메서드는 **`/upload`** 엔드포인트에 POST 요청을 처리 + - **`uploadFile(@RequestParam("file") MultipartFile file)`** 메서드는 클라이언트로부터 업로드된 파일을 처리 + - **`MultipartFile`**은 HTTP 요청에서 전송된 파일을 나타내며, 해당 파일을 Amazon S3에 업로드하는 작업을 수행 + - **`amazonS3.putObject()`** 또는 관련 메서드를 사용하여 파일을 S3 버킷에 업로드하고, 업로드된 파일에 대한 ACL(Access Control List)을 설정하여 해당 파일을 퍼블릭으로 만들 수 있음 + - 이후에는 **`redirect:/`**를 사용하여 파일 업로드가 완료된 후에는 루트 경로로 리디렉션하여 홈 화면으로 이동하도록 설정 + + 위 내용 바탕으로 아래에 코드 채워넣기 +*/ + +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + List fileUrls = new ArrayList<>(); + + ListObjectsV2Result objects = amazonS3.listObjectsV2(bucketName); + for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { + String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); + fileUrls.add(fileUrl); + } + + model.addAttribute("fileUrls", fileUrls); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) { + try { + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); + amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); + } catch (IOException e) { + // 에러 처리 로직 추가 + e.printStackTrace(); + } + + return "redirect:/"; + } +} \ No newline at end of file From 52bf1d9aaa0f28659390ac26e544823575cb7f3a Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sat, 18 Nov 2023 23:51:37 +0900 Subject: [PATCH 069/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 파일 업로드 구현 미완료 --- ...74\354\262\264_\352\263\274\354\240\234.md" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..bdee49f --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" @@ -0,0 +1,18 @@ +### 파일 보기 구현 +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/e49f5e4f-b867-4ec2-8ed1-8132648b18ff) + +--- +### 파일 업로드 구현 + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/b3144564-a21a-45ac-a0fd-06b9f78331c3) + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/e046ee55-5af4-4338-b4a4-ab0ab6ecec55) + +try catch 문을 사용해서 예외처리를 해주려고 하면 white label 에러가 나는 상황이다. + +--- +**참고** + +- https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html + +- https://growth-coder.tistory.com/116 From 792a53747ec9714c2654592485907a0a5a0f608b Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sat, 18 Nov 2023 23:54:20 +0900 Subject: [PATCH 070/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit java 파일 업로드 --- .../S3Controller_chaiwonHwang.java" | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" new file mode 100644 index 0000000..b964c80 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" @@ -0,0 +1,67 @@ +package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.server.ResponseStatusException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +// https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html +// https://growth-coder.tistory.com/116 +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + List fileUrls = new ArrayList<>(); + List objectSummaries = amazonS3.listObjects(bucketName).getObjectSummaries(); + for (S3ObjectSummary os : objectSummaries) { + String url = "https://" + bucketName + ".s3.amazonaws.com/" + os.getKey(); + fileUrls.add(url); + } + model.addAttribute("fileUrls", fileUrls); + return "index"; + } + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) { + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + if (file.isEmpty()) { + // 파일이 비어있는 경우 처리 + return "redirect:/"; + } + + String fileName = file.getOriginalFilename(); + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); + + // 파일의 InputStream을 얻어 S3에 업로드 + InputStream inputStream = file.getInputStream(); + amazonS3.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), metadata)); + amazonS3.setObjectAcl(bucketName, fileName, CannedAccessControlList.PublicRead); + return "redirect:/"; + } +} \ No newline at end of file From a59cbecaef46e17a1b14b5c22c30329b56ccc54f Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sun, 19 Nov 2023 02:12:55 +0900 Subject: [PATCH 071/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [황채원] 5주차 과제 - ing --- .../S3Controller_chaiwonHwang.java" | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" index b964c80..2d0350c 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" @@ -1,10 +1,7 @@ package ServerStudy5Cloud.ServerStudy5Cloud.Controller; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.PutObjectRequest; -import com.amazonaws.services.s3.model.S3ObjectSummary; +import com.amazonaws.services.s3.model.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; @@ -16,6 +13,7 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.server.ResponseStatusException; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -46,21 +44,14 @@ public String listFiles(Model model) { } @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) { + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 - if (file.isEmpty()) { - // 파일이 비어있는 경우 처리 - return "redirect:/"; - } - String fileName = file.getOriginalFilename(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(file.getSize()); metadata.setContentType(file.getContentType()); - // 파일의 InputStream을 얻어 S3에 업로드 - InputStream inputStream = file.getInputStream(); - amazonS3.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), metadata)); + amazonS3.putObject(bucketName, fileName, file.getInputStream(), metadata); amazonS3.setObjectAcl(bucketName, fileName, CannedAccessControlList.PublicRead); return "redirect:/"; } From 9d0a41f47725f54990fbe7db1a11f445bcea5381 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sun, 19 Nov 2023 02:55:56 +0900 Subject: [PATCH 072/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [황채원] 5주차 과제 - complete --- ...4\354\262\264_\352\263\274\354\240\234.md" | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" index bdee49f..2a90b32 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_5\354\243\274\354\262\264_\352\263\274\354\240\234.md" @@ -1,14 +1,62 @@ +### 과제링크 + +https://drive.google.com/file/d/11ZL6ydk9WMiko-jp4E0RmoXrEZvhr-PN/view?usp=sharing + +--- + ### 파일 보기 구현 ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/e49f5e4f-b867-4ec2-8ed1-8132648b18ff) --- ### 파일 업로드 구현 -![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/b3144564-a21a-45ac-a0fd-06b9f78331c3) +``` +@PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file, Model model) { + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + if (file.isEmpty()) { + model.addAttribute("message", "업로드할 파일이 없습니다."); + return "errorPage"; // 에러 메시지를 표시할 뷰 이름 + } + + try { + // 파일 업로드 로직 + String fileName = file.getOriginalFilename(); + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); + + amazonS3.putObject(bucketName, fileName, file.getInputStream(), metadata); + amazonS3.setObjectAcl(bucketName, fileName, CannedAccessControlList.PublicRead); + return "redirect:/"; + + } catch (Exception e) { + // 예외 메시지를 모델에 추가 + model.addAttribute("message", "업로드 중 오류 발생: " + e.getMessage()); + return "errorPage"; // 에러 메시지를 표시할 뷰 이름 + } + + } +``` + + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/b85ab488-db69-4f2b-8ad8-f9ff94fb9d9d) + +에러 확인을 위해 errorPage.html을 추가하고 웹페이지에 에러가 출력되도록 설정해보았지만 ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/e046ee55-5af4-4338-b4a4-ab0ab6ecec55) -try catch 문을 사용해서 예외처리를 해주려고 하면 white label 에러가 나는 상황이다. +여전히 같은 white label 에러가 나는 상황이다. + + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/0f9261c6-b74b-4935-afa7-4733eb024b9b) + +이것저것 시도해보았는데 허무하게도(?) 사진 사이즈가 너무 컸다는 것을 알게되었다... + +인터넷에서 적당히 작은 사진을 찾아 업로드해보았더니 아주 잘 올라간다... + + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/c6347889-4f61-4f91-bff1-82bcaae76ed1) --- **참고** From 78258991b621822211ccb569787193aa6a8041e0 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sun, 19 Nov 2023 02:56:55 +0900 Subject: [PATCH 073/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [황채원] 5주차 과제 - complete --- .../S3Controller_chaiwonHwang.java" | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" index 2d0350c..dbe65ff 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_chaiwonHwang.java" @@ -44,15 +44,21 @@ public String listFiles(Model model) { } @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + public String uploadFile(@RequestParam("file") MultipartFile file) { //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + // 파일 업로드 로직 String fileName = file.getOriginalFilename(); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(file.getSize()); metadata.setContentType(file.getContentType()); - amazonS3.putObject(bucketName, fileName, file.getInputStream(), metadata); + try { + amazonS3.putObject(bucketName, fileName, file.getInputStream(), metadata); + } catch (IOException e) { + throw new RuntimeException(e); + } amazonS3.setObjectAcl(bucketName, fileName, CannedAccessControlList.PublicRead); return "redirect:/"; + } } \ No newline at end of file From d616ef92b74f86206878231cdcf61d313b75b0a9 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Wed, 22 Nov 2023 14:10:12 +0900 Subject: [PATCH 074/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller_HaYunji.java" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" => "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_HaYunji.java" (100%) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_HaYunji.java" similarity index 100% rename from "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" rename to "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_HaYunji.java" From 334404c4f4d6a5e3a98ea23e7d52b04780f401e0 Mon Sep 17 00:00:00 2001 From: Lee Haewon Date: Sat, 16 Dec 2023 18:15:10 +0900 Subject: [PATCH 075/103] =?UTF-8?q?[=EC=9D=B4=ED=95=B4=EC=9B=90]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookForm.java" | 11 ++++++ .../RdsController.java" | 39 +++++++++++++++++++ .../RdsRepository.java" | 25 ++++++++++++ .../RdsService.java" | 29 ++++++++++++++ .../application.yml" | 13 +++++++ 5 files changed, 117 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/BookForm.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsController.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsRepository.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsService.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/application.yml" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/BookForm.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/BookForm.java" new file mode 100644 index 0000000..e9eb5fb --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/BookForm.java" @@ -0,0 +1,11 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class BookForm { + // 이름, 책 좋아하는 이유 + private String name; + private String reason; +} \ No newline at end of file diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsController.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsController.java" new file mode 100644 index 0000000..c3c37fe --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsController.java" @@ -0,0 +1,39 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Service.RdsService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class RdsController { + private final RdsService rdsService; + + // AWS RDS에서 Book list를 가져오는 GetMapping + @GetMapping("/") + public ResponseEntity> readDB() { + List bookList = rdsService.findBooks(); + + return new ResponseEntity<>(bookList, HttpStatus.OK); + } + + // AWS RDS에 Book 객체를 저장하는 PostMapping + @PostMapping("/upload") + public ResponseEntity updateDB(BookForm form) { + Book book = new Book(); + book.setName(form.getName()); + book.setReason(form.getReason()); + + rdsService.saveBook(book); + + return new ResponseEntity<>(HttpStatus.CREATED); + } +} diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsRepository.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsRepository.java" new file mode 100644 index 0000000..e45fd8d --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsRepository.java" @@ -0,0 +1,25 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Repository; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RdsRepository { + private final EntityManager em; + + // DB에 새로운 책 저장하는 메서드 + public void save(Book book) { + em.persist(book); // book 객체 저장 + } + + // DB에서 모든 책 리스트 가져오는 메서드 + public List findAll() { + return em.createQuery("select b from Book b", Book.class) // JPQL 쿼리 & 조회할 class + .getResultList(); + } +} diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsService.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsService.java" new file mode 100644 index 0000000..1f0eb9d --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/RdsService.java" @@ -0,0 +1,29 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Service; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Repository.RdsRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class RdsService { + // RdsRepository를 사용해 DB에 저장하는 로직 + private final RdsRepository rdsRepository; + + @Transactional(readOnly = true) // 데이터 조회 + public List findBooks() { + return rdsRepository.findAll(); + } + + public Long saveBook(Book book) { + rdsRepository.save(book); + return book.getId(); // 값 저장되었는지 확인 용도 + } + + +} diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/application.yml" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/application.yml" new file mode 100644 index 0000000..52913a4 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\355\225\264\354\233\220 Server S-Day \352\263\274\354\240\234/application.yml" @@ -0,0 +1,13 @@ +# RDS +spring: + datasource: + url: jdbc:mysql://gdsc-rds.c6tjoxms8dv5.ap-northeast-2.rds.amazonaws.com:3306/study6 + username: admin + password: [password] + driver-class-name: com.mysql.cj.jdbc.Driver + # hibernate + jpa: + show-sql: true + hibernate: + ddl-auto: update + dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file From 4407df0b968a2a593ef6b748d5b6f76d8b142362 Mon Sep 17 00:00:00 2001 From: yslim21 Date: Fri, 22 Dec 2023 08:54:46 +0900 Subject: [PATCH 076/103] =?UTF-8?q?5=EC=A3=BC=EC=B0=A8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EC=B6=A9=EB=8F=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit merge하려는데 충돌 문제때문에 다시 올립니다 --- .../S3Controller.java" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" index d51b0df..811dcc3 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -1,4 +1,4 @@ -package ServerStudy5Cloud.ServerStudy5Cloud.Controller; +/*package ServerStudy5Cloud.ServerStudy5Cloud.Controller; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.CannedAccessControlList; From 8e0494db3b546482584207abaa453a88a4977f09 Mon Sep 17 00:00:00 2001 From: yslim21 <121086341+yslim21@users.noreply.github.com> Date: Fri, 22 Dec 2023 09:26:40 +0900 Subject: [PATCH 077/103] =?UTF-8?q?Revert=20"[=EC=9E=84=EC=98=81=EC=84=9C]?= =?UTF-8?q?=205=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 54 +++++-------------- 1 file changed, 14 insertions(+), 40 deletions(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" index bca173a..1187e15 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -1,13 +1,11 @@ - package ServerStudy5Cloud.ServerStudy5Cloud.Controller; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.ObjectListing; -import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.S3ObjectSummary; import lombok.RequiredArgsConstructor; - +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -16,7 +14,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; - import java.io.File; import java.io.IOException; import java.net.URL; @@ -26,6 +23,7 @@ @Controller @RequiredArgsConstructor +@Slf4j public class S3Controller { private final AmazonS3 amazonS3; @@ -36,51 +34,27 @@ public class S3Controller { @GetMapping("/") public String listFiles(Model model) { //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + List files = new ArrayList<>(); - //업로드할 URL 파일 목록을 저장할 리스트 생성 - List fileUrls = new ArrayList<>(); - - //S3 내의 객체 목록 가져오기 - ObjectListing objectListing = amazonS3.listObjects(bucketName); - List objectSummaries = objectListing.getObjectSummaries(); + ListObjectsV2Result result = amazonS3.listObjectsV2(bucketName); + List objects = result.getObjectSummaries(); - // 객체 URL 가져와서 리스트에 추가 - for (S3ObjectSummary objectSummary : objectSummaries) { - String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); - fileUrls.add(fileUrl); + for(S3ObjectSummary os : objects){ + files.add(amazonS3.getUrl(bucketName, os.getKey()).toString()); + //log.info("{}",files.get(files.size()-1)); } - // 모델에 URL 리스트 추가 - model.addAttribute("fileUrls", fileUrls); - + model.addAttribute("fileUrls", files); return "index"; } - - @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException{ + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 - //파일 이름가져오기 - String originalFilename = file.getOriginalFilename(); - - //메타데이터 설정 - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentLength(file.getSize()); - metadata.setContentType(file.getContentType()); - - // putObject로 s3에 파일 업로드 - amazonS3.putObject(bucketName, originalFilename, file.getInputStream(),metadata); - - //업로드한 객체에 ACL퍼블릭 설정 - amazonS3.setObjectAcl(bucketName, originalFilename, CannedAccessControlList.PublicRead); - + amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); + amazonS3.setObjectAcl(bucketName,file.getOriginalFilename(), CannedAccessControlList.PublicRead); return "redirect:/"; - } -} - -//https://drive.google.com/file/d/1o9uRjxExZHYJOCKX6aTS8y8KKc-vic0d/view?usp=sharing - +} \ No newline at end of file From ac1f68ae4394f05809aa29d884e192a1c3aae2bb Mon Sep 17 00:00:00 2001 From: yslim21 <121086341+yslim21@users.noreply.github.com> Date: Fri, 22 Dec 2023 09:34:37 +0900 Subject: [PATCH 078/103] =?UTF-8?q?Revert=20"Revert=20"[=EC=9E=84=EC=98=81?= =?UTF-8?q?=EC=84=9C]=205=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20com?= =?UTF-8?q?plete""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../S3Controller.java" | 54 ++++++++++++++----- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" index 1187e15..bca173a 100644 --- "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller.java" @@ -1,11 +1,13 @@ + package ServerStudy5Cloud.ServerStudy5Cloud.Controller; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.ListObjectsV2Result; +import com.amazonaws.services.s3.model.ObjectListing; +import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.S3ObjectSummary; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; + import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; + import java.io.File; import java.io.IOException; import java.net.URL; @@ -23,7 +26,6 @@ @Controller @RequiredArgsConstructor -@Slf4j public class S3Controller { private final AmazonS3 amazonS3; @@ -34,27 +36,51 @@ public class S3Controller { @GetMapping("/") public String listFiles(Model model) { //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 - List files = new ArrayList<>(); - ListObjectsV2Result result = amazonS3.listObjectsV2(bucketName); - List objects = result.getObjectSummaries(); + //업로드할 URL 파일 목록을 저장할 리스트 생성 + List fileUrls = new ArrayList<>(); + + //S3 내의 객체 목록 가져오기 + ObjectListing objectListing = amazonS3.listObjects(bucketName); + List objectSummaries = objectListing.getObjectSummaries(); - for(S3ObjectSummary os : objects){ - files.add(amazonS3.getUrl(bucketName, os.getKey()).toString()); - //log.info("{}",files.get(files.size()-1)); + // 객체 URL 가져와서 리스트에 추가 + for (S3ObjectSummary objectSummary : objectSummaries) { + String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); + fileUrls.add(fileUrl); } - model.addAttribute("fileUrls", files); + // 모델에 URL 리스트 추가 + model.addAttribute("fileUrls", fileUrls); + return "index"; } + + @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException { + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException{ //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 - amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), null); - amazonS3.setObjectAcl(bucketName,file.getOriginalFilename(), CannedAccessControlList.PublicRead); + //파일 이름가져오기 + String originalFilename = file.getOriginalFilename(); + + //메타데이터 설정 + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); + + // putObject로 s3에 파일 업로드 + amazonS3.putObject(bucketName, originalFilename, file.getInputStream(),metadata); + + //업로드한 객체에 ACL퍼블릭 설정 + amazonS3.setObjectAcl(bucketName, originalFilename, CannedAccessControlList.PublicRead); + return "redirect:/"; + } -} \ No newline at end of file +} + +//https://drive.google.com/file/d/1o9uRjxExZHYJOCKX6aTS8y8KKc-vic0d/view?usp=sharing + From 9e682e389affd0925fd28c395d95292489c659cd Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:20:24 +0900 Subject: [PATCH 079/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookForm.java" | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/BookForm.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/BookForm.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/BookForm.java" new file mode 100644 index 0000000..2623542 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/BookForm.java" @@ -0,0 +1,11 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class BookForm { //폼에서 입력받은 필드를 그대로 적음 + //책 이름, 책 좋아하는 이유 + private String name; + private String reason; +} From 9a019e9cd7a26da828f2f261334db093e44684f8 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:21:11 +0900 Subject: [PATCH 080/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RdsController.java" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsController.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsController.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsController.java" new file mode 100644 index 0000000..845b7cf --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsController.java" @@ -0,0 +1,52 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Service.RdsService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class RdsController { + private final RdsService rdsService; + //AWS RDS에서 Book list를 가져오는 GetMapping +// @GetMapping("/") +// public String readDB(Model model){ +// model.addAttribute("bookForm", new BookForm()); +// model.addAttribute("books", rdsService.findBooks()); +// return "index"; +// } + @GetMapping("/") + public ResponseEntity> readDB(){ + List bookList = rdsService.findBooks(); + return new ResponseEntity<>(bookList, HttpStatus.OK); + } + + //AWS RDS에 Book 객체를 저장하는 PostMapping +// @PostMapping("/upload") +// public String updateDB(BookForm form){ +// Book book = new Book(); +// book.setName(form.getName()); +// book.setReason(form.getReason()); +// rdsService.saveBook(book); +// return "redirect:/"; +// } + @PostMapping("/upload") + public ResponseEntity updateDB(BookForm form){ + Book book = new Book(); + book.setName(form.getName()); + book.setReason(form.getReason()); + rdsService.saveBook(book); + return new ResponseEntity<>(HttpStatus.CREATED); + + } + +} From a654369f5e11259cf138aadcf2ab46e5d6565087 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:21:36 +0900 Subject: [PATCH 081/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Book.java" | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/Book.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/Book.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/Book.java" new file mode 100644 index 0000000..23ddc33 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/Book.java" @@ -0,0 +1,18 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Setter @Getter +@Table(name = "book_info") +public class Book { + @Id + @GeneratedValue + @Column(name = "book_id") + private Long id; + + private String name;//책 이름 + private String reason;//해당 책을 좋아하는 이유 +} From ae44339531d72756c3b19f99dd365f281b1edda2 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:22:04 +0900 Subject: [PATCH 082/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RdsRepository.java" | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsRepository.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsRepository.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsRepository.java" new file mode 100644 index 0000000..b675bef --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsRepository.java" @@ -0,0 +1,24 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Repository; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RdsRepository { + private final EntityManager em; + //DB에 새로운 책 저장하는 메서드 + public void save(Book book){ + em.persist(book); // book 객체 저장 + } + + //DB에서 모든 책 리스트 가져오는 메서드 + public List findAll(){ + return em.createQuery("select b from Book b", Book.class) //JPQL 쿼리와 조회할 class + .getResultList(); + } +} From 4c2a04ec15c4db480fdcea9b06a0361c5defdb75 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:22:21 +0900 Subject: [PATCH 083/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RdsService.java" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsService.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsService.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsService.java" new file mode 100644 index 0000000..41fee18 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/RdsService.java" @@ -0,0 +1,28 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Service; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Repository.RdsRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor //final이 있는 argument의 생성자를 자동으로 만들어준다. +public class RdsService { + //RdsRepository를 사용해 DB에 저장하는 로직 + private final RdsRepository rdsRepository; + + @Transactional(readOnly = true) //위의 transactional을 override + public List findBooks(){ + return rdsRepository.findAll(); + } + + public Long saveBook(Book book){ + rdsRepository.save(book); + return book.getId(); //값이 저장되었는지 확인하는 용도 + } + +} From d11690472d303c2f37013ade5d0b7d45aed13f1c Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:23:04 +0900 Subject: [PATCH 084/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicaion.yml" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/applicaion.yml" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/applicaion.yml" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/applicaion.yml" new file mode 100644 index 0000000..6a7c45c --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/applicaion.yml" @@ -0,0 +1,13 @@ +# RDS +spring: + datasource: + url: jdbc:mysql://gdsc-rds.cbsa892orvdn.ap-northeast-2.rds.amazonaws.com:3306/study6 + username: admin + password: [password] + driver-class-name: com.mysql.cj.jdbc.Driver + # hibernate + jpa: + show-sql: true + hibernate: + ddl-auto: update + dialect: org.hibernate.dialect.MySQL8Dialect From fda67e551a9a8bd72b03de20ca81ba0da7deb63c Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Fri, 22 Dec 2023 19:26:32 +0900 Subject: [PATCH 085/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...6\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..527a992 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,8 @@ +## 📖6주차 과제 +좋아하는 책의 이름, 좋아하는 이유 입력 받고 DB에 저장하기 및 데이터 불러오기 +1. Amazon RDS 환경 구축 +2. 강의 영상 대로 코드 작성하기 +3. postman을 이용해 API 테스트 + +## ✌️과제 인증 +https://drive.google.com/file/d/1yfBd62XxBBkL7_C4YVLGPu3woH7yTbZY/view?usp=sharing From 6f3b499d784ce84cb5a03e6ac17d2efc513a8e32 Mon Sep 17 00:00:00 2001 From: yslim21 Date: Fri, 22 Dec 2023 21:49:18 +0900 Subject: [PATCH 086/103] =?UTF-8?q?[=EC=9E=84=EC=98=81=EC=84=9C]=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 11/18에 올렸었는데 충돌 문제로 다시 올립니다 ㅜㅜ --- .../S3Controller_LimYoungseo.java" | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LimYoungseo.java" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LimYoungseo.java" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LimYoungseo.java" new file mode 100644 index 0000000..283468e --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/S3Controller_LimYoungseo.java" @@ -0,0 +1,79 @@ +//package ServerStudy5Cloud.ServerStudy5Cloud.Controller; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectListing; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.S3ObjectSummary; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +@Controller +@RequiredArgsConstructor +public class S3Controller { + + private final AmazonS3 amazonS3; + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @GetMapping("/") + public String listFiles(Model model) { + //getUrl로 객체 URL 가져온 후, List에 넣어 index.html에 반환하기 + //업로드할 URL 파일 목록을 저장할 리스트 생성 + List fileUrls = new ArrayList<>(); + + //S3 내의 객체 목록 가져오기 + ObjectListing objectListing = amazonS3.listObjects(bucketName); + List objectSummaries = objectListing.getObjectSummaries(); + + // 객체 URL 가져와서 리스트에 추가 + for (S3ObjectSummary objectSummary : objectSummaries) { + String fileUrl = amazonS3.getUrl(bucketName, objectSummary.getKey()).toString(); + fileUrls.add(fileUrl); + } + + // 모델에 URL 리스트 추가 + model.addAttribute("fileUrls", fileUrls); + + return "index"; + } + + + + @PostMapping("/upload") + public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException{ + + //putObject와 setObjectAcl로 이미지 업로드하고 ACL 퍼블릭으로 만들기 + //파일 이름가져오기 + String originalFilename = file.getOriginalFilename(); + + //메타데이터 설정 + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); + + // putObject로 s3에 파일 업로드 + amazonS3.putObject(bucketName, originalFilename, file.getInputStream(),metadata); + + //업로드한 객체에 ACL퍼블릭 설정 + amazonS3.setObjectAcl(bucketName, originalFilename, CannedAccessControlList.PublicRead); + + return "redirect:/"; + + + } +} + +//https://drive.google.com/file/d/1o9uRjxExZHYJOCKX6aTS8y8KKc-vic0d/view?usp=sharing \ No newline at end of file From 563c214ac876ee5bdecb320bc58411904536c7e9 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 23 Dec 2023 15:45:12 +0900 Subject: [PATCH 087/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoongHyun-Kim/Book.java" | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/Book.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/Book.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/Book.java" new file mode 100644 index 0000000..88c4df8 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/Book.java" @@ -0,0 +1,16 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Domain; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter @Setter +@Table(name = "book_info") +public class Book { + @Id + @GeneratedValue + @Column(name = "book_id") + private Long id; + private String name; + private String reason; +} From 24b546638c9a2aa04120fba12380a25e5154cbe6 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 23 Dec 2023 15:45:57 +0900 Subject: [PATCH 088/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoongHyun-Kim/RdsRepository.java" | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsRepository.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsRepository.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsRepository.java" new file mode 100644 index 0000000..098961b --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsRepository.java" @@ -0,0 +1,21 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Repository; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RdsRepository { + private final EntityManager em; + public void save(Book book){ + em.persist(book); + } + + public List findAll(){ + return em.createQuery("select b from Book b", Book.class).getResultList(); + } +} From 481f5468bb8f6b09c36b6bf780a217c5a6c6afd9 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 23 Dec 2023 15:46:29 +0900 Subject: [PATCH 089/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoongHyun-Kim/RdsService.java" | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsService.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsService.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsService.java" new file mode 100644 index 0000000..03ad612 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsService.java" @@ -0,0 +1,26 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Service; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Repository.RdsRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class RdsService { + private final RdsRepository rdsRepository; + + @Transactional(readOnly = true) + public List findBooks(){ + return rdsRepository.findAll(); + } + + public Long saveBook(Book book){ + rdsRepository.save(book); + return book.getId(); + } +} From eb0958479ae9ddd44ee17f378f1cd9aeafd708c1 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 23 Dec 2023 15:47:16 +0900 Subject: [PATCH 090/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoongHyun-Kim/BookForm.java" | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/BookForm.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/BookForm.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/BookForm.java" new file mode 100644 index 0000000..657a170 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/BookForm.java" @@ -0,0 +1,9 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; +import lombok.*; + +@Getter +@Setter +public class BookForm { + private String name; + private String reason; +} From eac5e2a66d115d5e0e2f4836c389ae93f7843934 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 23 Dec 2023 15:47:50 +0900 Subject: [PATCH 091/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoongHyun-Kim/RdsController.java" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsController.java" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsController.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsController.java" new file mode 100644 index 0000000..05003b0 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/RdsController.java" @@ -0,0 +1,34 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Service.RdsService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class RdsController { + private final RdsService rdsService; + + @GetMapping("/") + public ResponseEntity> readDB(){ + List bookList = rdsService.findBooks(); + return new ResponseEntity<>(bookList, HttpStatus.OK); + } + + @PostMapping("/upload") + public ResponseEntity updateDB(BookForm form){ + Book book = new Book(); + book.setName(form.getName()); + book.setReason(form.getReason()); + rdsService.saveBook(book); + return new ResponseEntity<>(HttpStatus.CREATED); + } +} From 3c88338779273d996534945526fcf3d62918d9d0 Mon Sep 17 00:00:00 2001 From: JoongHyun Kim Date: Sat, 23 Dec 2023 15:49:15 +0900 Subject: [PATCH 092/103] =?UTF-8?q?[=EA=B9=80=EC=A4=91=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoongHyun-Kim/application.yml" | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/application.yml" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/application.yml" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/application.yml" new file mode 100644 index 0000000..bb3c12f --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/JoongHyun-Kim/application.yml" @@ -0,0 +1,13 @@ +# RDS +spring: + datasource: + url: jdbc:mysql://gdsc-rds.cuzvt5d8qznc.ap-northeast-2.rds.amazonaws.com:3306/study6 + username: admin + password: [password] + driver-class-name: com.mysql.cj.jdbc.Driver + # hibernate + jpa: + show-sql: true + hibernate: + ddl-auto: update + dialect: org.hibernate.dialect.MySQL8Dialect From 217e3967e116640625fae7916914c9e3d57b50ed Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sat, 23 Dec 2023 15:54:51 +0900 Subject: [PATCH 093/103] =?UTF-8?q?=ED=99=A9=EC=B1=84=EC=9B=90=5F6?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=5F=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1단계 rds 접속 불가능 --- ...4\354\260\250_\352\263\274\354\240\234.md" | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..4c09618 --- /dev/null +++ "b/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,33 @@ +## 6주차 과제 + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/c1f8d221-6595-4483-a1c2-2836b7ddaf2f) + +`Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure` 이라는 오류가 계속 발생했다. +main을 실행하면 아래 사진과 같이 `application.yml` 파일이 리셋된다. + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/377ca9d8-cd72-4379-bdd5-0c68ce27c55b) + + + +**사용한 VPC** + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/565eab2b-dc54-478e-bdc4-f32349dc8406) + +**사용한 라우팅 테이블** + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/f5d8a420-e408-49b2-94a4-945e5a42d459) + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/a402f4d6-6d2b-4eae-8bc8-ceaa1dfead6b) + +**보안그룹 설정** + +인바운드 규칙 설정 + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/3deda922-c8e0-4951-bc30-cce1e7cab9f0) + +아웃바운드 규칙 설정 + +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/90598552/4261324e-df98-4151-aecd-760336c35004) + + + From 963f80985ca27d8df58501de846ab135738ab8d8 Mon Sep 17 00:00:00 2001 From: leeseohyun Date: Sat, 23 Dec 2023 19:52:02 +0900 Subject: [PATCH 094/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LeeSeohyun/Book.java" | 18 +++++++ .../LeeSeohyun/BookForm.java" | 12 +++++ .../LeeSeohyun/RdsController.java" | 54 +++++++++++++++++++ .../LeeSeohyun/RdsRepository.java" | 23 ++++++++ .../LeeSeohyun/RdsService.java" | 27 ++++++++++ .../LeeSeohyun/application.yml" | 13 +++++ 6 files changed, 147 insertions(+) create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/Book.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/BookForm.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsController.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsRepository.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsService.java" create mode 100644 "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/application.yml" diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/Book.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/Book.java" new file mode 100644 index 0000000..6add2b2 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/Book.java" @@ -0,0 +1,18 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter @Setter +@Table(name= "book_info") +public class Book { + @Id + @GeneratedValue + @Column(name="book_id") + private Long id; + + private String name; //책 이름 + private String reason; //해당 책을 좋아하는 이유 +} diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/BookForm.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/BookForm.java" new file mode 100644 index 0000000..100c259 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/BookForm.java" @@ -0,0 +1,12 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import lombok.Getter; +import lombok.Setter; + +//BookForm: 폼에서 입력받은 내용과 entity에 넣을 내용 분리 위해 만든 클래스 +@Getter @Setter +public class BookForm { + //책 이름, 책 좋아하는 이유 + private String name; + private String reason; +} \ No newline at end of file diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsController.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsController.java" new file mode 100644 index 0000000..0cfdc22 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsController.java" @@ -0,0 +1,54 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Controller; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Service.RdsService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController //API 만들기 +@RequiredArgsConstructor +public class RdsController { + private final RdsService rdsService; + //AWS RDS에서 Book list를 가져오는 GetMapping + + @GetMapping("/") + public ResponseEntity> readDB(){ + List bookList = rdsService.findBooks(); + return new ResponseEntity<>(bookList, HttpStatus.OK); + } + + @PostMapping("/upload") + public ResponseEntity updateDB(BookForm form){ + Book book = new Book(); + book.setName(form.getName()); + book.setReason(form.getReason()); + rdsService.saveBook(book); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + + //AWS RDS에 Book 객체를 저장하는 PostMapping +} + +//@Controller에서 view에 리턴할 때의 컨트롤러 코드 + /*@GetMapping("/") + public String readDB(Model model){ + model.addAttribute("bookForm", new BookForm()); //BookForm 객체 넘기기 + model.addAttribute("books", rdsService.findBooks()); + return "index"; + } + @PostMapping("/upload") + public String updateDB(BookForm form){ + Book book = new Book(); + book.setName(form.getName()); + book.setReason(form.getReason()); + rdsService.saveBook(book); + return "redirect:/"; + } + */ \ No newline at end of file diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsRepository.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsRepository.java" new file mode 100644 index 0000000..86e3ea5 --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsRepository.java" @@ -0,0 +1,23 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Repository; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class RdsRepository { + private final EntityManager em; + //DB에 새로운 책 저장하는 메서드 + public void save(Book book){ + em.persist(book); + } + //DB에서 모든 책 리스트 가져오는 메서드 + public List findAll() { + return em.createQuery("select b from Book b", Book.class) //JPQL 쿼리와 조회할 class + .getResultList(); + } +} diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsService.java" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsService.java" new file mode 100644 index 0000000..ac9007e --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/RdsService.java" @@ -0,0 +1,27 @@ +package ServerStudy6Cloud.ServerStudy6Cloud.Service; + +import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; +import ServerStudy6Cloud.ServerStudy6Cloud.Repository.RdsRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +@RequiredArgsConstructor +public class RdsService { + //RdsRepository를 사용해 DB에 저장하는 로직 + private final RdsRepository rdsRepository; //레포지토리 주입받음 + + @Transactional(readOnly=true) //조회에 최적화되게 Transaction 사용가능 + public List findBooks() { + return rdsRepository.findAll(); + } + + public Long saveBook(Book book) { + rdsRepository.save(book); + return book.getId(); //값 저장되었는지 확인하는 용도 + } +} diff --git "a/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/application.yml" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/application.yml" new file mode 100644 index 0000000..9fd0aad --- /dev/null +++ "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/LeeSeohyun/application.yml" @@ -0,0 +1,13 @@ +# RDS +spring: + datasource: + url: jdbc:mysql://gdsc-rds2.cf0i42aimwar.ap-northeast-2.rds.amazonaws.com:3306/study_6 + username: admin + password: [password] + driver-class-name: com.mysql.cj.jdbc.Driver + # hibernate + jpa: + show-sql: true + hibernate: + ddl-auto: update + dialect: org.hibernate.dialect.MySQL8Dialect \ No newline at end of file From 80009d2fc75e0bb08e5a40bef544ed76db9bd5fc Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sun, 24 Dec 2023 00:28:52 +0900 Subject: [PATCH 095/103] =?UTF-8?q?[=ED=99=A9=EC=B1=84=EC=9B=90]=206?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C-ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" => "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" (100%) diff --git "a/5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" similarity index 100% rename from "5\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" rename to "6\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\231\251\354\261\204\354\233\220_6\354\243\274\354\260\250_\352\263\274\354\240\234.md" From 74b5fb051b508720d26f5315c728ebd300e0dd44 Mon Sep 17 00:00:00 2001 From: Dongseon Yang <78548833+dongseon0@users.noreply.github.com> Date: Sun, 24 Dec 2023 17:37:20 +0900 Subject: [PATCH 096/103] =?UTF-8?q?[=EC=96=91=EB=8F=99=EC=84=A0]Delete=205?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20Sever=20S-Day=20=EA=B3=BC=EC=A0=9C=20direc?= =?UTF-8?q?tory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이름 변경을 위해 삭제합니다 --- .../S3Controller.java" | 66 ------------------- ...4\354\260\250_\352\263\274\354\240\234.md" | 11 ---- 2 files changed, 77 deletions(-) delete mode 100644 "5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" delete mode 100644 "5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" "b/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" deleted file mode 100644 index 9e54923..0000000 --- "a/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/S3Controller.java" +++ /dev/null @@ -1,66 +0,0 @@ -package ServerStudy5Cloud.ServerStudy5Cloud.Controller; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.S3ObjectSummary; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -//영상 링크 : https://drive.google.com/file/d/17tmgRlWb4g0ZRuUKt6pvBlmmw-NqpDHR/view?usp=sharing -@Controller -@RequiredArgsConstructor -public class S3Controller { - - private final AmazonS3 amazonS3; - - @Value("${cloud.aws.s3.bucket}") - private String bucketName; - - @GetMapping("/") - public String listFiles(Model model) { - List fileUrls = new ArrayList<>(); - List objectSummaries = amazonS3.listObjects(bucketName).getObjectSummaries(); - // 객체 URL을 리스트에 추가 - for (S3ObjectSummary objectSummary : objectSummaries) { - fileUrls.add(amazonS3.getUrl(bucketName, objectSummary.getKey()).toString()); - } - // 모델에 URL 리스트 추가 - model.addAttribute("fileUrls", fileUrls); - return "index"; - } - - @PostMapping("/upload") - public String uploadFile(@RequestParam("file") MultipartFile file) { - try { - /// ObjectMetadata 인스턴스 생성 - ObjectMetadata metadata = new ObjectMetadata(); - - // content type (MIME type)세팅 - metadata.setContentType(file.getContentType()); - - // S3에 파일 업로드 - amazonS3.putObject(bucketName, file.getOriginalFilename(), file.getInputStream(), metadata); - - // ACL를 public-read로 - amazonS3.setObjectAcl(bucketName, file.getOriginalFilename(), CannedAccessControlList.PublicRead); - - - return "redirect:/"; - } catch (IOException e) { - // Handle the exception appropriately (e.g., log it or show an error message) - return "error"; - } - - } -} diff --git "a/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" deleted file mode 100644 index f9ed048..0000000 --- "a/5\354\243\274\354\260\250 Sever S-Day \352\263\274\354\240\234/\354\226\221\353\217\231\354\204\240_5\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ /dev/null @@ -1,11 +0,0 @@ -## 과정 -1. 인스턴스 생성(EC2) -2. 보안자격증명 > 키 생성 -3. index.html과 S3Controller 파일 수정 -4. main 메소드를 실행한 후 결과 확인 ! - -## 난관 -해결 : test를 돌리는데 안돼서 당황했지만, 코어멤버 혜승님께서 main 메소드를 돌리는 것을 알려주셨다!! 서비스를 구동하려면 main메소드를 돌리는 것이구나.. - -귀여운 미리보기 -스크린샷 2023-11-17 오후 10 54 53 From 07f80b54cec79694206d9ba91ce5ad0401bb84d8 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Thu, 29 Feb 2024 02:50:58 +0900 Subject: [PATCH 097/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=207?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 "7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..4a15882 --- /dev/null +++ "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,66 @@ +# 7주차 과제 Article + +## 📝강의 정리 +### 컨테이너 +- 어떤 환경에서 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지 +- 코드와 그에 필요한 모든 종속성을 패키징하여 응용 프로그램이 한 컴퓨팅 환경에서 빠르고 신뢰성 있게 다른 환경으로 실행될 수 있도록 함 -> 애플리케이션을 환경에 구애받지 않고 실행하는 기술! + + +### 도커 +- 컨테이너를 관리하기 위한 기술 + +### 도커 vs VM + - VM은 Host OS위에 하이퍼바이저가 올라가고 그 위에 Guest OS가 올라가는 구조. + - 하지만 Docker는 Host OS 위에 바로 어플리케이션을 패키징한 컨테이너를 올림 -> VM에 비해 종속성 격리가 간편하고 오버헤드가 적음 + - 도커는 각 컨테이너는 격리된 실행 환경을 제공 + - 도커는 호스트의 리눅스 커널을 공유 (도커가 리눅스 기술 기반이기 때문) + +### 도커는 하나의 프로세스다 + - 도커 컨테이너는 프로세스 ID를 격리하는 PID 네임스페이스에 의해 호스트 시스템(리눅스)가 보기에는 하나의 프로세스처럼 보임 + - 도커 컨테이너가 보기에는 하나의 가상머신처럼 관리된다 +
+ -> 도커는 가상머신 보다는 훨씬 더 가벼우면서도 어플리케이션을 위한 독립된 환경을 제공해 줄 수 있음 + +### Docker image +- 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 변경이 불가능한 파일(템플릿) +- 도커 컨테이너를 생성하기 위한 모든 파일과 설정을 가지고 있음 -> 도커 컨테이너의 설계도! + + +### Dockerfile +- 도커 이미지를 정의한 파일 +- 컨테이너 내부에 설치할 소프트웨어, 설정값, 실행 명령 등을 명시하는 스크립트 형태의 파일 + +Dockerfile을 작성 후 빌드 -> 도커 이미지 생성 -> 이미지를 사용하여 도커 컨테이너 실행 + +### 쿠버네티스(Kubernetes, K8s) +- 컨테이너로 이루어진 워크로드를 자동화하거나 관리하기 위한 기술 +- 쿠버네티스는 컨테이너 그 자체를 다루진 않고 서로 밀접하게 연관된 컨테이너들의 집합인 Pod를 관리함 (컨테이너 관리 기술은 도커) + +### Pod +- 하나의 포드 내의 모든 컨테이너는 네트워킹과 스토리지를 공유함 -> ip주소, 네크워크 포트, 네트워크 네임스페이스도 공유 + +### 쿠버네티스의 아키텍쳐 +- Master Node(=컨트롤 플레인): 어떤 컨테이너를 실행할지, 얼만큼의 컨테이너를 실행할지 결정 +- Worker Node: 각자 컨테이너를 가지고 있음 + +### GKE 클러스터 (Google Kubernetes Engine(GKE)) +- 클러스터는 1개 이상의 클러스터 master 머신과 여러 worker 머신으로 구성됨. 그리고 각 머신들은 VM 인스턴스로 구현되어야함 +
+ -> GKE 클러스터를 사용하면 자동으로 해당 작업이 완료됨. +- 사용자는 kubectl 명령어를 통해 컨트롤 플레인에 접근 가능함 + +## ✌️과제 인증 +1. Dockerfile로 Node 서버 만들기 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/dad1f423-0c6b-4d6f-aa7f-04139f339ced) + +
+ +2. GKE 클러스터 생성 후 클러스터에 애플리케이션 배포 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/eb7936be-5d82-4357-b3ca-11b07dfff611) + + +### 🚨문제상황 +애플리케이션 배포 생성, 서비스 노출, 서비스 확인 명령어 실행 후 사진과 같은 경고 문구 발생 +하지만 애플리케이션은 정상적으로 동작하였다... +![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/68639b7f-48be-4e55-9685-341202cb2a04) + From bb67e1d455afa990589d5dd82380c8c89af80fad Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Thu, 29 Feb 2024 23:21:35 +0900 Subject: [PATCH 098/103] =?UTF-8?q?=20[=ED=95=98=EC=9C=A4=EC=A7=80]=208?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 "8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..41fa85e --- /dev/null +++ "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,31 @@ +# 8주차 과제 Article + +## 📝강의 정리 +### Service +- Pod를 위한 영구적인 엔드포인트 +- private IP(=cluster IP) 제공: 클러스터 내부에서만 사용됨. pod 내에서는 접근 가능 +- external IP 제공: 외부에서 접근 가능 +- 여러 pod로 백엔드 서버를 띄우고 이를 service가 제공하는 LoadBalancer로 연결한 다음 LoadBalancer의 IP로 접근하는 것이 가능함 + +### 쿠버네티스의 객체 +- 스펙(spec)과 상태(status) +1. Spec: 원하는 상태 +2. Status: 현재 상태 + +쿠버네티스의 control plane은 spec과 status를 계속 비교한다. 필요한 경우 status를 수정함으로써 spec과 status를 일치시키려고 한다! + +### 배포(Deployment) +- 내용은 같고 이름만 다른 pod 여러개를 만들고 싶은 경우, 배포를 사용하면 파드 관리가 편해진다! +- 배포 파일에 실행하고 유지할 pod의 수와 각 pod의 스펙을 정의한다 +- pod를 삭제하기 위해서는 배포를 수정해야함 -> 원하는 상태 자체를 변경해야한다! + - 배포를 통해 만든 선언적 명령을 만족시키기 위해 계속 원상복구 시켜두기 때문 + +### 배포 업데이트 방식 +1. 순차적(Rolling) 업데이트 +2. + +## ✌️과제 인증 +실습 진행 과정: yaml 파일 생성 -> apply 명령어로 객체 만들기 + +1. service의 외부 IP를 이용해 접속 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/501175d7-6641-404f-bc68-4aed1a7c8363) From b53c545507fe2d85915f0f92e1e66513b9186c5f Mon Sep 17 00:00:00 2001 From: seohyun-lee Date: Thu, 29 Feb 2024 23:40:52 +0900 Subject: [PATCH 099/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=207?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 "7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" diff --git "a/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" new file mode 100644 index 0000000..cef5206 --- /dev/null +++ "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" @@ -0,0 +1,4 @@ +## 과제 Article + +* 개발 블로그(티스토리) 링크 +https://hereishyun.tistory.com/105 \ No newline at end of file From 0545fb154925291237f7db84df04cbad37fd8e63 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Thu, 29 Feb 2024 23:43:15 +0900 Subject: [PATCH 100/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=208?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git "a/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" index 41fa85e..b89e118 100644 --- "a/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -1,31 +1,49 @@ # 8주차 과제 Article ## 📝강의 정리 -### Service +### ✨Service - Pod를 위한 영구적인 엔드포인트 - private IP(=cluster IP) 제공: 클러스터 내부에서만 사용됨. pod 내에서는 접근 가능 - external IP 제공: 외부에서 접근 가능 - 여러 pod로 백엔드 서버를 띄우고 이를 service가 제공하는 LoadBalancer로 연결한 다음 LoadBalancer의 IP로 접근하는 것이 가능함 -### 쿠버네티스의 객체 +### ✨쿠버네티스의 객체 - 스펙(spec)과 상태(status) 1. Spec: 원하는 상태 2. Status: 현재 상태 쿠버네티스의 control plane은 spec과 status를 계속 비교한다. 필요한 경우 status를 수정함으로써 spec과 status를 일치시키려고 한다! -### 배포(Deployment) +### ✨배포(Deployment) - 내용은 같고 이름만 다른 pod 여러개를 만들고 싶은 경우, 배포를 사용하면 파드 관리가 편해진다! - 배포 파일에 실행하고 유지할 pod의 수와 각 pod의 스펙을 정의한다 - pod를 삭제하기 위해서는 배포를 수정해야함 -> 원하는 상태 자체를 변경해야한다! - 배포를 통해 만든 선언적 명령을 만족시키기 위해 계속 원상복구 시켜두기 때문 -### 배포 업데이트 방식 -1. 순차적(Rolling) 업데이트 -2. +### ✨배포 업데이트 방식 +1. 순차적(Rolling) 업데이트
+ a. 배포가 업데이트 되면 새로운 ReplicaSet이 생성됨
+ b. 이전 ReplicaSet의 복제본은 서서히 감소 (기존 pod들이 하나씩 삭제됨)
+ c. 새 ReplicaSet의 복제본은 서서히 증가 (새로운 pod들이 하나씩 늘어남)
+ - 장점: 최소한의 downtime(중단시간)
+ - 단점: 업데이트 시간이 짧진 않음
+ - 쿠버네티스는 롤백을 새로운 리비전으로 처리함. 롤백된 배포의 이전 리비전은 표시하지 않음 + +2. 카나리아 업데이트
+ a. 카나리아 배포용 yaml파일 작성 후 apply하여 파드 생성
+ b. 기존 파드와 카나리아 파드 모두를 다루도록 service 변경
+ - 일부 사용자에게만 신버전을 업데이트하는 방식
+ - 카나리아 배포를 통해 신버전이 정상적으로 동작하는 것을 확인하면 기존 카나리아 배포를 삭제하고 rolling update 함 + +3. 블루/그린 업데이트
+ a. 구버전(blue)와 동일한 신버전(green)을 구축
+ b. 구 버전을 가리켰던 서비스가 한번에 신버전을 가리키도록 업데이트
+ - 장점: 신버전을 배포하기 전 동일한 리소스를 사용해서 프로덕션 환경을 구축한 다음 테스트를 진행할 수 있다 + - 단점: 일시적으로 시스템 자원이 2배로 필요함 + ## ✌️과제 인증 -실습 진행 과정: yaml 파일 생성 -> apply 명령어로 객체 만들기 +실습 진행 과정: yaml 파일 생성 -> apply 명령어로 파드/서비스 만들기 1. service의 외부 IP를 이용해 접속 ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/501175d7-6641-404f-bc68-4aed1a7c8363) From 1d6e0d212160d854747139301c0dbabbe12af902 Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Thu, 29 Feb 2024 23:44:04 +0900 Subject: [PATCH 101/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=208?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 4 ++++ 1 file changed, 4 insertions(+) diff --git "a/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" index b89e118..3ee8212 100644 --- "a/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -47,3 +47,7 @@ 1. service의 외부 IP를 이용해 접속 ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/501175d7-6641-404f-bc68-4aed1a7c8363) + +2. 카나리아 배포 실습 + ![image](https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/67634926/c97b8b6e-1ee7-473d-9ca9-ac0f1207445f) + From 83643dcb5008494f2a45e4f586e03136ac8e354a Mon Sep 17 00:00:00 2001 From: Yunji Ha Date: Thu, 29 Feb 2024 23:45:14 +0900 Subject: [PATCH 102/103] =?UTF-8?q?[=ED=95=98=EC=9C=A4=EC=A7=80]=207?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250_\352\263\274\354\240\234.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" index 4a15882..6e316b4 100644 --- "a/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" +++ "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\355\225\230\354\234\244\354\247\200_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -1,49 +1,49 @@ # 7주차 과제 Article ## 📝강의 정리 -### 컨테이너 +### ✨컨테이너 - 어떤 환경에서 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지 - 코드와 그에 필요한 모든 종속성을 패키징하여 응용 프로그램이 한 컴퓨팅 환경에서 빠르고 신뢰성 있게 다른 환경으로 실행될 수 있도록 함 -> 애플리케이션을 환경에 구애받지 않고 실행하는 기술! -### 도커 +### ✨도커 - 컨테이너를 관리하기 위한 기술 -### 도커 vs VM +### ✨도커 vs VM - VM은 Host OS위에 하이퍼바이저가 올라가고 그 위에 Guest OS가 올라가는 구조. - 하지만 Docker는 Host OS 위에 바로 어플리케이션을 패키징한 컨테이너를 올림 -> VM에 비해 종속성 격리가 간편하고 오버헤드가 적음 - 도커는 각 컨테이너는 격리된 실행 환경을 제공 - 도커는 호스트의 리눅스 커널을 공유 (도커가 리눅스 기술 기반이기 때문) -### 도커는 하나의 프로세스다 +### ✨도커는 하나의 프로세스다 - 도커 컨테이너는 프로세스 ID를 격리하는 PID 네임스페이스에 의해 호스트 시스템(리눅스)가 보기에는 하나의 프로세스처럼 보임 - 도커 컨테이너가 보기에는 하나의 가상머신처럼 관리된다
-> 도커는 가상머신 보다는 훨씬 더 가벼우면서도 어플리케이션을 위한 독립된 환경을 제공해 줄 수 있음 -### Docker image +### ✨Docker image - 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 변경이 불가능한 파일(템플릿) - 도커 컨테이너를 생성하기 위한 모든 파일과 설정을 가지고 있음 -> 도커 컨테이너의 설계도! -### Dockerfile +### ✨Dockerfile - 도커 이미지를 정의한 파일 - 컨테이너 내부에 설치할 소프트웨어, 설정값, 실행 명령 등을 명시하는 스크립트 형태의 파일 Dockerfile을 작성 후 빌드 -> 도커 이미지 생성 -> 이미지를 사용하여 도커 컨테이너 실행 -### 쿠버네티스(Kubernetes, K8s) +### ✨쿠버네티스(Kubernetes, K8s) - 컨테이너로 이루어진 워크로드를 자동화하거나 관리하기 위한 기술 - 쿠버네티스는 컨테이너 그 자체를 다루진 않고 서로 밀접하게 연관된 컨테이너들의 집합인 Pod를 관리함 (컨테이너 관리 기술은 도커) -### Pod +### ✨Pod - 하나의 포드 내의 모든 컨테이너는 네트워킹과 스토리지를 공유함 -> ip주소, 네크워크 포트, 네트워크 네임스페이스도 공유 -### 쿠버네티스의 아키텍쳐 +### ✨쿠버네티스의 아키텍쳐 - Master Node(=컨트롤 플레인): 어떤 컨테이너를 실행할지, 얼만큼의 컨테이너를 실행할지 결정 - Worker Node: 각자 컨테이너를 가지고 있음 -### GKE 클러스터 (Google Kubernetes Engine(GKE)) +### ✨GKE 클러스터 (Google Kubernetes Engine(GKE)) - 클러스터는 1개 이상의 클러스터 master 머신과 여러 worker 머신으로 구성됨. 그리고 각 머신들은 VM 인스턴스로 구현되어야함
-> GKE 클러스터를 사용하면 자동으로 해당 작업이 완료됨. From 8a8c679f28f863183a0fd196d111bf4eda0dcb63 Mon Sep 17 00:00:00 2001 From: seohyun-lee Date: Thu, 29 Feb 2024 23:53:10 +0900 Subject: [PATCH 103/103] =?UTF-8?q?[=EC=9D=B4=EC=84=9C=ED=98=84]=208?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=20=EA=B3=BC=EC=A0=9C=20-=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...204_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 0 ...204_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" | 4 ++++ 2 files changed, 4 insertions(+) rename "7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" => "7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" (100%) create mode 100644 "8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" "b/7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" similarity index 100% rename from "7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.txt" rename to "7\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_7\354\243\274\354\260\250_\352\263\274\354\240\234.md" diff --git "a/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" new file mode 100644 index 0000000..c045afa --- /dev/null +++ "b/8\354\243\274\354\260\250 Server S-Day \352\263\274\354\240\234/\354\235\264\354\204\234\355\230\204_8\354\243\274\354\260\250_\352\263\274\354\240\234.md" @@ -0,0 +1,4 @@ +## 과제 Article + +* 개발 블로그(티스토리) 링크 +https://hereishyun.tistory.com/106 \ No newline at end of file