From 1755c0d53edded541070d10a8f6d2d40f0466535 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 8 Jan 2025 23:00:55 +0900 Subject: [PATCH 001/115] Start project --- .gitignore | 43 ++++ build.gradle | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 234 +++++++++++++++++++++ gradlew.bat | 89 ++++++++ settings.gradle | 2 + src/main/java/com/sprint/mission/Main.java | 17 ++ 8 files changed, 410 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/sprint/mission/Main.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8ec73278f --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..668101a29 --- /dev/null +++ b/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group = 'com.sprint.mission' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 zcmb5WV{~QRw(p$^Dz@00IL3?^hro$gg*4VI_WAaTyVM5Foj~O|-84 z$;06hMwt*rV;^8iB z1~&0XWpYJmG?Ts^K9PC62H*`G}xom%S%yq|xvG~FIfP=9*f zZoDRJBm*Y0aId=qJ?7dyb)6)JGWGwe)MHeNSzhi)Ko6J<-m@v=a%NsP537lHe0R* z`If4$aaBA#S=w!2z&m>{lpTy^Lm^mg*3?M&7HFv}7K6x*cukLIGX;bQG|QWdn{%_6 zHnwBKr84#B7Z+AnBXa16a?or^R?+>$4`}{*a_>IhbjvyTtWkHw)|ay)ahWUd-qq$~ zMbh6roVsj;_qnC-R{G+Cy6bApVOinSU-;(DxUEl!i2)1EeQ9`hrfqj(nKI7?Z>Xur zoJz-a`PxkYit1HEbv|jy%~DO^13J-ut986EEG=66S}D3!L}Efp;Bez~7tNq{QsUMm zh9~(HYg1pA*=37C0}n4g&bFbQ+?-h-W}onYeE{q;cIy%eZK9wZjSwGvT+&Cgv z?~{9p(;bY_1+k|wkt_|N!@J~aoY@|U_RGoWX<;p{Nu*D*&_phw`8jYkMNpRTWx1H* z>J-Mi_!`M468#5Aix$$u1M@rJEIOc?k^QBc?T(#=n&*5eS#u*Y)?L8Ha$9wRWdH^3D4|Ps)Y?m0q~SiKiSfEkJ!=^`lJ(%W3o|CZ zSrZL-Xxc{OrmsQD&s~zPfNJOpSZUl%V8tdG%ei}lQkM+z@-4etFPR>GOH9+Y_F<3=~SXln9Kb-o~f>2a6Xz@AS3cn^;c_>lUwlK(n>z?A>NbC z`Ud8^aQy>wy=$)w;JZzA)_*Y$Z5hU=KAG&htLw1Uh00yE!|Nu{EZkch zY9O6x7Y??>!7pUNME*d!=R#s)ghr|R#41l!c?~=3CS8&zr6*aA7n9*)*PWBV2w+&I zpW1-9fr3j{VTcls1>ua}F*bbju_Xq%^v;-W~paSqlf zolj*dt`BBjHI)H9{zrkBo=B%>8}4jeBO~kWqO!~Thi!I1H(in=n^fS%nuL=X2+s!p}HfTU#NBGiwEBF^^tKU zbhhv+0dE-sbK$>J#t-J!B$TMgN@Wh5wTtK2BG}4BGfsZOoRUS#G8Cxv|6EI*n&Xxq zt{&OxCC+BNqz$9b0WM7_PyBJEVObHFh%%`~!@MNZlo*oXDCwDcFwT~Rls!aApL<)^ zbBftGKKBRhB!{?fX@l2_y~%ygNFfF(XJzHh#?`WlSL{1lKT*gJM zs>bd^H9NCxqxn(IOky5k-wALFowQr(gw%|`0991u#9jXQh?4l|l>pd6a&rx|v=fPJ z1mutj{YzpJ_gsClbWFk(G}bSlFi-6@mwoQh-XeD*j@~huW4(8ub%^I|azA)h2t#yG z7e_V_<4jlM3D(I+qX}yEtqj)cpzN*oCdYHa!nm%0t^wHm)EmFP*|FMw!tb@&`G-u~ zK)=Sf6z+BiTAI}}i{*_Ac$ffr*Wrv$F7_0gJkjx;@)XjYSh`RjAgrCck`x!zP>Ifu z&%he4P|S)H*(9oB4uvH67^0}I-_ye_!w)u3v2+EY>eD3#8QR24<;7?*hj8k~rS)~7 zSXs5ww)T(0eHSp$hEIBnW|Iun<_i`}VE0Nc$|-R}wlSIs5pV{g_Dar(Zz<4X3`W?K z6&CAIl4U(Qk-tTcK{|zYF6QG5ArrEB!;5s?tW7 zrE3hcFY&k)+)e{+YOJ0X2uDE_hd2{|m_dC}kgEKqiE9Q^A-+>2UonB+L@v3$9?AYw zVQv?X*pK;X4Ovc6Ev5Gbg{{Eu*7{N3#0@9oMI~}KnObQE#Y{&3mM4`w%wN+xrKYgD zB-ay0Q}m{QI;iY`s1Z^NqIkjrTlf`B)B#MajZ#9u41oRBC1oM1vq0i|F59> z#StM@bHt|#`2)cpl_rWB($DNJ3Lap}QM-+A$3pe}NyP(@+i1>o^fe-oxX#Bt`mcQc zb?pD4W%#ep|3%CHAYnr*^M6Czg>~L4?l16H1OozM{P*en298b+`i4$|w$|4AHbzqB zHpYUsHZET$Z0ztC;U+0*+amF!@PI%^oUIZy{`L{%O^i{Xk}X0&nl)n~tVEpcAJSJ} zverw15zP1P-O8h9nd!&hj$zuwjg?DoxYIw{jWM zW5_pj+wFy8Tsa9g<7Qa21WaV&;ejoYflRKcz?#fSH_)@*QVlN2l4(QNk| z4aPnv&mrS&0|6NHq05XQw$J^RR9T{3SOcMKCXIR1iSf+xJ0E_Wv?jEc*I#ZPzyJN2 zUG0UOXHl+PikM*&g$U@g+KbG-RY>uaIl&DEtw_Q=FYq?etc!;hEC_}UX{eyh%dw2V zTTSlap&5>PY{6I#(6`j-9`D&I#|YPP8a;(sOzgeKDWsLa!i-$frD>zr-oid!Hf&yS z!i^cr&7tN}OOGmX2)`8k?Tn!!4=tz~3hCTq_9CdiV!NIblUDxHh(FJ$zs)B2(t5@u z-`^RA1ShrLCkg0)OhfoM;4Z{&oZmAec$qV@ zGQ(7(!CBk<5;Ar%DLJ0p0!ResC#U<+3i<|vib1?{5gCebG7$F7URKZXuX-2WgF>YJ^i zMhHDBsh9PDU8dlZ$yJKtc6JA#y!y$57%sE>4Nt+wF1lfNIWyA`=hF=9Gj%sRwi@vd z%2eVV3y&dvAgyuJ=eNJR+*080dbO_t@BFJO<@&#yqTK&+xc|FRR;p;KVk@J3$S{p` zGaMj6isho#%m)?pOG^G0mzOAw0z?!AEMsv=0T>WWcE>??WS=fII$t$(^PDPMU(P>o z_*0s^W#|x)%tx8jIgZY~A2yG;US0m2ZOQt6yJqW@XNY_>_R7(Nxb8Ged6BdYW6{prd!|zuX$@Q2o6Ona8zzYC1u!+2!Y$Jc9a;wy+pXt}o6~Bu1oF1c zp7Y|SBTNi@=I(K%A60PMjM#sfH$y*c{xUgeSpi#HB`?|`!Tb&-qJ3;vxS!TIzuTZs-&%#bAkAyw9m4PJgvey zM5?up*b}eDEY+#@tKec)-c(#QF0P?MRlD1+7%Yk*jW;)`f;0a-ZJ6CQA?E%>i2Dt7T9?s|9ZF|KP4;CNWvaVKZ+Qeut;Jith_y{v*Ny6Co6!8MZx;Wgo z=qAi%&S;8J{iyD&>3CLCQdTX*$+Rx1AwA*D_J^0>suTgBMBb=*hefV+Ars#mmr+YsI3#!F@Xc1t4F-gB@6aoyT+5O(qMz*zG<9Qq*f0w^V!03rpr*-WLH}; zfM{xSPJeu6D(%8HU%0GEa%waFHE$G?FH^kMS-&I3)ycx|iv{T6Wx}9$$D&6{%1N_8 z_CLw)_9+O4&u94##vI9b-HHm_95m)fa??q07`DniVjAy`t7;)4NpeyAY(aAk(+T_O z1om+b5K2g_B&b2DCTK<>SE$Ode1DopAi)xaJjU>**AJK3hZrnhEQ9E`2=|HHe<^tv z63e(bn#fMWuz>4erc47}!J>U58%<&N<6AOAewyzNTqi7hJc|X{782&cM zHZYclNbBwU6673=!ClmxMfkC$(CykGR@10F!zN1Se83LR&a~$Ht&>~43OX22mt7tcZUpa;9@q}KDX3O&Ugp6< zLZLfIMO5;pTee1vNyVC$FGxzK2f>0Z-6hM82zKg44nWo|n}$Zk6&;5ry3`(JFEX$q zK&KivAe${e^5ZGc3a9hOt|!UOE&OocpVryE$Y4sPcs4rJ>>Kbi2_subQ9($2VN(3o zb~tEzMsHaBmBtaHAyES+d3A(qURgiskSSwUc9CfJ@99&MKp2sooSYZu+-0t0+L*!I zYagjOlPgx|lep9tiU%ts&McF6b0VE57%E0Ho%2oi?=Ks+5%aj#au^OBwNwhec zta6QAeQI^V!dF1C)>RHAmB`HnxyqWx?td@4sd15zPd*Fc9hpDXP23kbBenBxGeD$k z;%0VBQEJ-C)&dTAw_yW@k0u?IUk*NrkJ)(XEeI z9Y>6Vel>#s_v@=@0<{4A{pl=9cQ&Iah0iD0H`q)7NeCIRz8zx;! z^OO;1+IqoQNak&pV`qKW+K0^Hqp!~gSohcyS)?^P`JNZXw@gc6{A3OLZ?@1Uc^I2v z+X!^R*HCm3{7JPq{8*Tn>5;B|X7n4QQ0Bs79uTU%nbqOJh`nX(BVj!#f;#J+WZxx4 z_yM&1Y`2XzhfqkIMO7tB3raJKQS+H5F%o83bM+hxbQ zeeJm=Dvix$2j|b4?mDacb67v-1^lTp${z=jc1=j~QD>7c*@+1?py>%Kj%Ejp7Y-!? z8iYRUlGVrQPandAaxFfks53@2EC#0)%mrnmGRn&>=$H$S8q|kE_iWko4`^vCS2aWg z#!`RHUGyOt*k?bBYu3*j3u0gB#v(3tsije zgIuNNWNtrOkx@Pzs;A9un+2LX!zw+p3_NX^Sh09HZAf>m8l@O*rXy_82aWT$Q>iyy zqO7Of)D=wcSn!0+467&!Hl))eff=$aneB?R!YykdKW@k^_uR!+Q1tR)+IJb`-6=jj zymzA>Sv4>Z&g&WWu#|~GcP7qP&m*w-S$)7Xr;(duqCTe7p8H3k5>Y-n8438+%^9~K z3r^LIT_K{i7DgEJjIocw_6d0!<;wKT`X;&vv+&msmhAAnIe!OTdybPctzcEzBy88_ zWO{6i4YT%e4^WQZB)KHCvA(0tS zHu_Bg+6Ko%a9~$EjRB90`P(2~6uI@SFibxct{H#o&y40MdiXblu@VFXbhz>Nko;7R z70Ntmm-FePqhb%9gL+7U8@(ch|JfH5Fm)5${8|`Lef>LttM_iww6LW2X61ldBmG0z zax3y)njFe>j*T{i0s8D4=L>X^j0)({R5lMGVS#7(2C9@AxL&C-lZQx~czI7Iv+{%1 z2hEG>RzX4S8x3v#9sgGAnPzptM)g&LB}@%E>fy0vGSa(&q0ch|=ncKjNrK z`jA~jObJhrJ^ri|-)J^HUyeZXz~XkBp$VhcTEcTdc#a2EUOGVX?@mYx#Vy*!qO$Jv zQ4rgOJ~M*o-_Wptam=~krnmG*p^j!JAqoQ%+YsDFW7Cc9M%YPiBOrVcD^RY>m9Pd< zu}#9M?K{+;UIO!D9qOpq9yxUquQRmQNMo0pT`@$pVt=rMvyX)ph(-CCJLvUJy71DI zBk7oc7)-%ngdj~s@76Yse3L^gV0 z2==qfp&Q~L(+%RHP0n}+xH#k(hPRx(!AdBM$JCfJ5*C=K3ts>P?@@SZ_+{U2qFZb>4kZ{Go37{# zSQc+-dq*a-Vy4?taS&{Ht|MLRiS)Sn14JOONyXqPNnpq&2y~)6wEG0oNy>qvod$FF z`9o&?&6uZjhZ4_*5qWVrEfu(>_n2Xi2{@Gz9MZ8!YmjYvIMasE9yVQL10NBrTCczq zcTY1q^PF2l!Eraguf{+PtHV3=2A?Cu&NN&a8V(y;q(^_mFc6)%Yfn&X&~Pq zU1?qCj^LF(EQB1F`8NxNjyV%fde}dEa(Hx=r7$~ts2dzDwyi6ByBAIx$NllB4%K=O z$AHz1<2bTUb>(MCVPpK(E9wlLElo(aSd(Os)^Raum`d(g9Vd_+Bf&V;l=@mM=cC>) z)9b0enb)u_7V!!E_bl>u5nf&Rl|2r=2F3rHMdb7y9E}}F82^$Rf+P8%dKnOeKh1vs zhH^P*4Ydr^$)$h@4KVzxrHyy#cKmWEa9P5DJ|- zG;!Qi35Tp7XNj60=$!S6U#!(${6hyh7d4q=pF{`0t|N^|L^d8pD{O9@tF~W;#Je*P z&ah%W!KOIN;SyAEhAeTafJ4uEL`(RtnovM+cb(O#>xQnk?dzAjG^~4$dFn^<@-Na3 z395;wBnS{t*H;Jef2eE!2}u5Ns{AHj>WYZDgQJt8v%x?9{MXqJsGP|l%OiZqQ1aB! z%E=*Ig`(!tHh>}4_z5IMpg{49UvD*Pp9!pxt_gdAW%sIf3k6CTycOT1McPl=_#0?8 zVjz8Hj*Vy9c5-krd-{BQ{6Xy|P$6LJvMuX$* zA+@I_66_ET5l2&gk9n4$1M3LN8(yEViRx&mtd#LD}AqEs?RW=xKC(OCWH;~>(X6h!uDxXIPH06xh z*`F4cVlbDP`A)-fzf>MuScYsmq&1LUMGaQ3bRm6i7OsJ|%uhTDT zlvZA1M}nz*SalJWNT|`dBm1$xlaA>CCiQ zK`xD-RuEn>-`Z?M{1%@wewf#8?F|(@1e0+T4>nmlSRrNK5f)BJ2H*$q(H>zGD0>eL zQ!tl_Wk)k*e6v^m*{~A;@6+JGeWU-q9>?+L_#UNT%G?4&BnOgvm9@o7l?ov~XL+et zbGT)|G7)KAeqb=wHSPk+J1bdg7N3$vp(ekjI1D9V$G5Cj!=R2w=3*4!z*J-r-cyeb zd(i2KmX!|Lhey!snRw z?#$Gu%S^SQEKt&kep)up#j&9}e+3=JJBS(s>MH+|=R(`8xK{mmndWo_r`-w1#SeRD&YtAJ#GiVI*TkQZ}&aq<+bU2+coU3!jCI6E+Ad_xFW*ghnZ$q zAoF*i&3n1j#?B8x;kjSJD${1jdRB;)R*)Ao!9bd|C7{;iqDo|T&>KSh6*hCD!rwv= zyK#F@2+cv3=|S1Kef(E6Niv8kyLVLX&e=U;{0x{$tDfShqkjUME>f8d(5nzSkY6@! z^-0>DM)wa&%m#UF1F?zR`8Y3X#tA!*7Q$P3lZJ%*KNlrk_uaPkxw~ zxZ1qlE;Zo;nb@!SMazSjM>;34ROOoygo%SF);LL>rRonWwR>bmSd1XD^~sGSu$Gg# zFZ`|yKU0%!v07dz^v(tY%;So(e`o{ZYTX`hm;@b0%8|H>VW`*cr8R%3n|ehw2`(9B+V72`>SY}9^8oh$En80mZK9T4abVG*to;E z1_S6bgDOW?!Oy1LwYy=w3q~KKdbNtyH#d24PFjX)KYMY93{3-mPP-H>@M-_>N~DDu zENh~reh?JBAK=TFN-SfDfT^=+{w4ea2KNWXq2Y<;?(gf(FgVp8Zp-oEjKzB%2Iqj;48GmY3h=bcdYJ}~&4tS`Q1sb=^emaW$IC$|R+r-8V- zf0$gGE(CS_n4s>oicVk)MfvVg#I>iDvf~Ov8bk}sSxluG!6#^Z_zhB&U^`eIi1@j( z^CK$z^stBHtaDDHxn+R;3u+>Lil^}fj?7eaGB z&5nl^STqcaBxI@v>%zG|j))G(rVa4aY=B@^2{TFkW~YP!8!9TG#(-nOf^^X-%m9{Z zCC?iC`G-^RcBSCuk=Z`(FaUUe?hf3{0C>>$?Vs z`2Uud9M+T&KB6o4o9kvdi^Q=Bw!asPdxbe#W-Oaa#_NP(qpyF@bVxv5D5))srkU#m zj_KA+#7sqDn*Ipf!F5Byco4HOSd!Ui$l94|IbW%Ny(s1>f4|Mv^#NfB31N~kya9!k zWCGL-$0ZQztBate^fd>R!hXY_N9ZjYp3V~4_V z#eB)Kjr8yW=+oG)BuNdZG?jaZlw+l_ma8aET(s+-x+=F-t#Qoiuu1i`^x8Sj>b^U} zs^z<()YMFP7CmjUC@M=&lA5W7t&cxTlzJAts*%PBDAPuqcV5o7HEnqjif_7xGt)F% zGx2b4w{@!tE)$p=l3&?Bf#`+!-RLOleeRk3 z7#pF|w@6_sBmn1nECqdunmG^}pr5(ZJQVvAt$6p3H(16~;vO>?sTE`Y+mq5YP&PBo zvq!7#W$Gewy`;%6o^!Dtjz~x)T}Bdk*BS#=EY=ODD&B=V6TD2z^hj1m5^d6s)D*wk zu$z~D7QuZ2b?5`p)E8e2_L38v3WE{V`bVk;6fl#o2`) z99JsWhh?$oVRn@$S#)uK&8DL8>An0&S<%V8hnGD7Z^;Y(%6;^9!7kDQ5bjR_V+~wp zfx4m3z6CWmmZ<8gDGUyg3>t8wgJ5NkkiEm^(sedCicP^&3D%}6LtIUq>mXCAt{9eF zNXL$kGcoUTf_Lhm`t;hD-SE)m=iBnxRU(NyL}f6~1uH)`K!hmYZjLI%H}AmEF5RZt z06$wn63GHnApHXZZJ}s^s)j9(BM6e*7IBK6Bq(!)d~zR#rbxK9NVIlgquoMq z=eGZ9NR!SEqP6=9UQg#@!rtbbSBUM#ynF);zKX+|!Zm}*{H z+j=d?aZ2!?@EL7C~%B?6ouCKLnO$uWn;Y6Xz zX8dSwj732u(o*U3F$F=7xwxm>E-B+SVZH;O-4XPuPkLSt_?S0)lb7EEg)Mglk0#eS z9@jl(OnH4juMxY+*r03VDfPx_IM!Lmc(5hOI;`?d37f>jPP$?9jQQIQU@i4vuG6MagEoJrQ=RD7xt@8E;c zeGV*+Pt+t$@pt!|McETOE$9k=_C!70uhwRS9X#b%ZK z%q(TIUXSS^F0`4Cx?Rk07C6wI4!UVPeI~-fxY6`YH$kABdOuiRtl73MqG|~AzZ@iL&^s?24iS;RK_pdlWkhcF z@Wv-Om(Aealfg)D^adlXh9Nvf~Uf@y;g3Y)i(YP zEXDnb1V}1pJT5ZWyw=1i+0fni9yINurD=EqH^ciOwLUGi)C%Da)tyt=zq2P7pV5-G zR7!oq28-Fgn5pW|nlu^b!S1Z#r7!Wtr{5J5PQ>pd+2P7RSD?>(U7-|Y z7ZQ5lhYIl_IF<9?T9^IPK<(Hp;l5bl5tF9>X-zG14_7PfsA>6<$~A338iYRT{a@r_ zuXBaT=`T5x3=s&3=RYx6NgG>No4?5KFBVjE(swfcivcIpPQFx5l+O;fiGsOrl5teR z_Cm+;PW}O0Dwe_(4Z@XZ)O0W-v2X><&L*<~*q3dg;bQW3g7)a#3KiQP>+qj|qo*Hk z?57>f2?f@`=Fj^nkDKeRkN2d$Z@2eNKpHo}ksj-$`QKb6n?*$^*%Fb3_Kbf1(*W9K>{L$mud2WHJ=j0^=g30Xhg8$#g^?36`p1fm;;1@0Lrx+8t`?vN0ZorM zSW?rhjCE8$C|@p^sXdx z|NOHHg+fL;HIlqyLp~SSdIF`TnSHehNCU9t89yr@)FY<~hu+X`tjg(aSVae$wDG*C zq$nY(Y494R)hD!i1|IIyP*&PD_c2FPgeY)&mX1qujB1VHPG9`yFQpLFVQ0>EKS@Bp zAfP5`C(sWGLI?AC{XEjLKR4FVNw(4+9b?kba95ukgR1H?w<8F7)G+6&(zUhIE5Ef% z=fFkL3QKA~M@h{nzjRq!Y_t!%U66#L8!(2-GgFxkD1=JRRqk=n%G(yHKn%^&$dW>; zSjAcjETMz1%205se$iH_)ZCpfg_LwvnsZQAUCS#^FExp8O4CrJb6>JquNV@qPq~3A zZ<6dOU#6|8+fcgiA#~MDmcpIEaUO02L5#T$HV0$EMD94HT_eXLZ2Zi&(! z&5E>%&|FZ`)CN10tM%tLSPD*~r#--K(H-CZqIOb99_;m|D5wdgJ<1iOJz@h2Zkq?} z%8_KXb&hf=2Wza(Wgc;3v3TN*;HTU*q2?#z&tLn_U0Nt!y>Oo>+2T)He6%XuP;fgn z-G!#h$Y2`9>Jtf}hbVrm6D70|ERzLAU>3zoWhJmjWfgM^))T+2u$~5>HF9jQDkrXR z=IzX36)V75PrFjkQ%TO+iqKGCQ-DDXbaE;C#}!-CoWQx&v*vHfyI>$HNRbpvm<`O( zlx9NBWD6_e&J%Ous4yp~s6)Ghni!I6)0W;9(9$y1wWu`$gs<$9Mcf$L*piP zPR0Av*2%ul`W;?-1_-5Zy0~}?`e@Y5A&0H!^ApyVTT}BiOm4GeFo$_oPlDEyeGBbh z1h3q&Dx~GmUS|3@4V36&$2uO8!Yp&^pD7J5&TN{?xphf*-js1fP?B|`>p_K>lh{ij zP(?H%e}AIP?_i^f&Li=FDSQ`2_NWxL+BB=nQr=$ zHojMlXNGauvvwPU>ZLq!`bX-5F4jBJ&So{kE5+ms9UEYD{66!|k~3vsP+mE}x!>%P za98bAU0!h0&ka4EoiDvBM#CP#dRNdXJcb*(%=<(g+M@<)DZ!@v1V>;54En?igcHR2 zhubQMq}VSOK)onqHfczM7YA@s=9*ow;k;8)&?J3@0JiGcP! zP#00KZ1t)GyZeRJ=f0^gc+58lc4Qh*S7RqPIC6GugG1gXe$LIQMRCo8cHf^qXgAa2 z`}t>u2Cq1CbSEpLr~E=c7~=Qkc9-vLE%(v9N*&HF`(d~(0`iukl5aQ9u4rUvc8%m) zr2GwZN4!s;{SB87lJB;veebPmqE}tSpT>+`t?<457Q9iV$th%i__Z1kOMAswFldD6 ztbOvO337S5o#ZZgN2G99_AVqPv!?Gmt3pzgD+Hp3QPQ`9qJ(g=kjvD+fUSS3upJn! zqoG7acIKEFRX~S}3|{EWT$kdz#zrDlJU(rPkxjws_iyLKU8+v|*oS_W*-guAb&Pj1 z35Z`3z<&Jb@2Mwz=KXucNYdY#SNO$tcVFr9KdKm|%^e-TXzs6M`PBper%ajkrIyUe zp$vVxVs9*>Vp4_1NC~Zg)WOCPmOxI1V34QlG4!aSFOH{QqSVq1^1)- z0P!Z?tT&E-ll(pwf0?=F=yOzik=@nh1Clxr9}Vij89z)ePDSCYAqw?lVI?v?+&*zH z)p$CScFI8rrwId~`}9YWPFu0cW1Sf@vRELs&cbntRU6QfPK-SO*mqu|u~}8AJ!Q$z znzu}50O=YbjwKCuSVBs6&CZR#0FTu)3{}qJJYX(>QPr4$RqWiwX3NT~;>cLn*_&1H zaKpIW)JVJ>b{uo2oq>oQt3y=zJjb%fU@wLqM{SyaC6x2snMx-}ivfU<1- znu1Lh;i$3Tf$Kh5Uk))G!D1UhE8pvx&nO~w^fG)BC&L!_hQk%^p`Kp@F{cz>80W&T ziOK=Sq3fdRu*V0=S53rcIfWFazI}Twj63CG(jOB;$*b`*#B9uEnBM`hDk*EwSRdwP8?5T?xGUKs=5N83XsR*)a4|ijz|c{4tIU+4j^A5C<#5 z*$c_d=5ml~%pGxw#?*q9N7aRwPux5EyqHVkdJO=5J>84!X6P>DS8PTTz>7C#FO?k#edkntG+fJk8ZMn?pmJSO@`x-QHq;7^h6GEXLXo1TCNhH z8ZDH{*NLAjo3WM`xeb=X{((uv3H(8&r8fJJg_uSs_%hOH%JDD?hu*2NvWGYD+j)&` zz#_1%O1wF^o5ryt?O0n;`lHbzp0wQ?rcbW(F1+h7_EZZ9{>rePvLAPVZ_R|n@;b$;UchU=0j<6k8G9QuQf@76oiE*4 zXOLQ&n3$NR#p4<5NJMVC*S);5x2)eRbaAM%VxWu9ohlT;pGEk7;002enCbQ>2r-us z3#bpXP9g|mE`65VrN`+3mC)M(eMj~~eOf)do<@l+fMiTR)XO}422*1SL{wyY(%oMpBgJagtiDf zz>O6(m;};>Hi=t8o{DVC@YigqS(Qh+ix3Rwa9aliH}a}IlOCW1@?%h_bRbq-W{KHF z%Vo?-j@{Xi@=~Lz5uZP27==UGE15|g^0gzD|3x)SCEXrx`*MP^FDLl%pOi~~Il;dc z^hrwp9sYeT7iZ)-ajKy@{a`kr0-5*_!XfBpXwEcFGJ;%kV$0Nx;apKrur zJN2J~CAv{Zjj%FolyurtW8RaFmpn&zKJWL>(0;;+q(%(Hx!GMW4AcfP0YJ*Vz!F4g z!ZhMyj$BdXL@MlF%KeInmPCt~9&A!;cRw)W!Hi@0DY(GD_f?jeV{=s=cJ6e}JktJw zQORnxxj3mBxfrH=x{`_^Z1ddDh}L#V7i}$njUFRVwOX?qOTKjfPMBO4y(WiU<)epb zvB9L=%jW#*SL|Nd_G?E*_h1^M-$PG6Pc_&QqF0O-FIOpa4)PAEPsyvB)GKasmBoEt z?_Q2~QCYGH+hW31x-B=@5_AN870vY#KB~3a*&{I=f);3Kv7q4Q7s)0)gVYx2#Iz9g(F2;=+Iy4 z6KI^8GJ6D@%tpS^8boU}zpi=+(5GfIR)35PzrbuXeL1Y1N%JK7PG|^2k3qIqHfX;G zQ}~JZ-UWx|60P5?d1e;AHx!_;#PG%d=^X(AR%i`l0jSpYOpXoKFW~7ip7|xvN;2^? zsYC9fanpO7rO=V7+KXqVc;Q5z%Bj})xHVrgoR04sA2 zl~DAwv=!(()DvH*=lyhIlU^hBkA0$e*7&fJpB0|oB7)rqGK#5##2T`@_I^|O2x4GO z;xh6ROcV<9>?e0)MI(y++$-ksV;G;Xe`lh76T#Htuia+(UrIXrf9?

L(tZ$0BqX1>24?V$S+&kLZ`AodQ4_)P#Q3*4xg8}lMV-FLwC*cN$< zt65Rf%7z41u^i=P*qO8>JqXPrinQFapR7qHAtp~&RZ85$>ob|Js;GS^y;S{XnGiBc zGa4IGvDl?x%gY`vNhv8wgZnP#UYI-w*^4YCZnxkF85@ldepk$&$#3EAhrJY0U)lR{F6sM3SONV^+$;Zx8BD&Eku3K zKNLZyBni3)pGzU0;n(X@1fX8wYGKYMpLmCu{N5-}epPDxClPFK#A@02WM3!myN%bkF z|GJ4GZ}3sL{3{qXemy+#Uk{4>Kf8v11;f8I&c76+B&AQ8udd<8gU7+BeWC`akUU~U zgXoxie>MS@rBoyY8O8Tc&8id!w+_ooxcr!1?#rc$-|SBBtH6S?)1e#P#S?jFZ8u-Bs&k`yLqW|{j+%c#A4AQ>+tj$Y z^CZajspu$F%73E68Lw5q7IVREED9r1Ijsg#@DzH>wKseye>hjsk^{n0g?3+gs@7`i zHx+-!sjLx^fS;fY!ERBU+Q zVJ!e0hJH%P)z!y%1^ZyG0>PN@5W~SV%f>}c?$H8r;Sy-ui>aruVTY=bHe}$e zi&Q4&XK!qT7-XjCrDaufT@>ieQ&4G(SShUob0Q>Gznep9fR783jGuUynAqc6$pYX; z7*O@@JW>O6lKIk0G00xsm|=*UVTQBB`u1f=6wGAj%nHK_;Aqmfa!eAykDmi-@u%6~ z;*c!pS1@V8r@IX9j&rW&d*}wpNs96O2Ute>%yt{yv>k!6zfT6pru{F1M3P z2WN1JDYqoTB#(`kE{H676QOoX`cnqHl1Yaru)>8Ky~VU{)r#{&s86Vz5X)v15ULHA zAZDb{99+s~qI6;-dQ5DBjHJP@GYTwn;Dv&9kE<0R!d z8tf1oq$kO`_sV(NHOSbMwr=To4r^X$`sBW4$gWUov|WY?xccQJN}1DOL|GEaD_!@& z15p?Pj+>7d`@LvNIu9*^hPN)pwcv|akvYYq)ks%`G>!+!pW{-iXPZsRp8 z35LR;DhseQKWYSD`%gO&k$Dj6_6q#vjWA}rZcWtQr=Xn*)kJ9kacA=esi*I<)1>w^ zO_+E>QvjP)qiSZg9M|GNeLtO2D7xT6vsj`88sd!94j^AqxFLi}@w9!Y*?nwWARE0P znuI_7A-saQ+%?MFA$gttMV-NAR^#tjl_e{R$N8t2NbOlX373>e7Ox=l=;y#;M7asp zRCz*CLnrm$esvSb5{T<$6CjY zmZ(i{Rs_<#pWW>(HPaaYj`%YqBra=Ey3R21O7vUbzOkJJO?V`4-D*u4$Me0Bx$K(lYo`JO}gnC zx`V}a7m-hLU9Xvb@K2ymioF)vj12<*^oAqRuG_4u%(ah?+go%$kOpfb`T96P+L$4> zQ#S+sA%VbH&mD1k5Ak7^^dZoC>`1L%i>ZXmooA!%GI)b+$D&ziKrb)a=-ds9xk#~& z7)3iem6I|r5+ZrTRe_W861x8JpD`DDIYZNm{$baw+$)X^Jtjnl0xlBgdnNY}x%5za zkQ8E6T<^$sKBPtL4(1zi_Rd(tVth*3Xs!ulflX+70?gb&jRTnI8l+*Aj9{|d%qLZ+ z>~V9Z;)`8-lds*Zgs~z1?Fg?Po7|FDl(Ce<*c^2=lFQ~ahwh6rqSjtM5+$GT>3WZW zj;u~w9xwAhOc<kF}~`CJ68 z?(S5vNJa;kriPlim33{N5`C{9?NWhzsna_~^|K2k4xz1`xcui*LXL-1#Y}Hi9`Oo!zQ>x-kgAX4LrPz63uZ+?uG*84@PKq-KgQlMNRwz=6Yes) zY}>YN+qP}nwr$(CZQFjUOI=-6J$2^XGvC~EZ+vrqWaOXB$k?%Suf5k=4>AveC1aJ! ziaW4IS%F$_Babi)kA8Y&u4F7E%99OPtm=vzw$$ zEz#9rvn`Iot_z-r3MtV>k)YvErZ<^Oa${`2>MYYODSr6?QZu+be-~MBjwPGdMvGd!b!elsdi4% z`37W*8+OGulab8YM?`KjJ8e+jM(tqLKSS@=jimq3)Ea2EB%88L8CaM+aG7;27b?5` z4zuUWBr)f)k2o&xg{iZ$IQkJ+SK>lpq4GEacu~eOW4yNFLU!Kgc{w4&D$4ecm0f}~ zTTzquRW@`f0}|IILl`!1P+;69g^upiPA6F{)U8)muWHzexRenBU$E^9X-uIY2%&1w z_=#5*(nmxJ9zF%styBwivi)?#KMG96-H@hD-H_&EZiRNsfk7mjBq{L%!E;Sqn!mVX*}kXhwH6eh;b42eD!*~upVG@ z#smUqz$ICm!Y8wY53gJeS|Iuard0=;k5i5Z_hSIs6tr)R4n*r*rE`>38Pw&lkv{_r!jNN=;#?WbMj|l>cU(9trCq; z%nN~r^y7!kH^GPOf3R}?dDhO=v^3BeP5hF|%4GNQYBSwz;x({21i4OQY->1G=KFyu z&6d`f2tT9Yl_Z8YACZaJ#v#-(gcyeqXMhYGXb=t>)M@fFa8tHp2x;ODX=Ap@a5I=U z0G80^$N0G4=U(>W%mrrThl0DjyQ-_I>+1Tdd_AuB3qpYAqY54upwa3}owa|x5iQ^1 zEf|iTZxKNGRpI>34EwkIQ2zHDEZ=(J@lRaOH>F|2Z%V_t56Km$PUYu^xA5#5Uj4I4RGqHD56xT%H{+P8Ag>e_3pN$4m8n>i%OyJFPNWaEnJ4McUZPa1QmOh?t8~n& z&RulPCors8wUaqMHECG=IhB(-tU2XvHP6#NrLVyKG%Ee*mQ5Ps%wW?mcnriTVRc4J`2YVM>$ixSF2Xi+Wn(RUZnV?mJ?GRdw%lhZ+t&3s7g!~g{%m&i<6 z5{ib-<==DYG93I(yhyv4jp*y3#*WNuDUf6`vTM%c&hiayf(%=x@4$kJ!W4MtYcE#1 zHM?3xw63;L%x3drtd?jot!8u3qeqctceX3m;tWetK+>~q7Be$h>n6riK(5@ujLgRS zvOym)k+VAtyV^mF)$29Y`nw&ijdg~jYpkx%*^ z8dz`C*g=I?;clyi5|!27e2AuSa$&%UyR(J3W!A=ZgHF9OuKA34I-1U~pyD!KuRkjA zbkN!?MfQOeN>DUPBxoy5IX}@vw`EEB->q!)8fRl_mqUVuRu|C@KD-;yl=yKc=ZT0% zB$fMwcC|HE*0f8+PVlWHi>M`zfsA(NQFET?LrM^pPcw`cK+Mo0%8*x8@65=CS_^$cG{GZQ#xv($7J z??R$P)nPLodI;P!IC3eEYEHh7TV@opr#*)6A-;EU2XuogHvC;;k1aI8asq7ovoP!* z?x%UoPrZjj<&&aWpsbr>J$Er-7!E(BmOyEv!-mbGQGeJm-U2J>74>o5x`1l;)+P&~ z>}f^=Rx(ZQ2bm+YE0u=ZYrAV@apyt=v1wb?R@`i_g64YyAwcOUl=C!i>=Lzb$`tjv zOO-P#A+)t-JbbotGMT}arNhJmmGl-lyUpMn=2UacVZxmiG!s!6H39@~&uVokS zG=5qWhfW-WOI9g4!R$n7!|ViL!|v3G?GN6HR0Pt_L5*>D#FEj5wM1DScz4Jv@Sxnl zB@MPPmdI{(2D?;*wd>3#tjAirmUnQoZrVv`xM3hARuJksF(Q)wd4P$88fGYOT1p6U z`AHSN!`St}}UMBT9o7i|G`r$ zrB=s$qV3d6$W9@?L!pl0lf%)xs%1ko^=QY$ty-57=55PvP(^6E7cc zGJ*>m2=;fOj?F~yBf@K@9qwX0hA803Xw+b0m}+#a(>RyR8}*Y<4b+kpp|OS+!whP( zH`v{%s>jsQI9rd$*vm)EkwOm#W_-rLTHcZRek)>AtF+~<(did)*oR1|&~1|e36d-d zgtm5cv1O0oqgWC%Et@P4Vhm}Ndl(Y#C^MD03g#PH-TFy+7!Osv1z^UWS9@%JhswEq~6kSr2DITo59+; ze=ZC}i2Q?CJ~Iyu?vn|=9iKV>4j8KbxhE4&!@SQ^dVa-gK@YfS9xT(0kpW*EDjYUkoj! zE49{7H&E}k%5(>sM4uGY)Q*&3>{aitqdNnRJkbOmD5Mp5rv-hxzOn80QsG=HJ_atI-EaP69cacR)Uvh{G5dTpYG7d zbtmRMq@Sexey)||UpnZ?;g_KMZq4IDCy5}@u!5&B^-=6yyY{}e4Hh3ee!ZWtL*s?G zxG(A!<9o!CL+q?u_utltPMk+hn?N2@?}xU0KlYg?Jco{Yf@|mSGC<(Zj^yHCvhmyx z?OxOYoxbptDK()tsJ42VzXdINAMWL$0Gcw?G(g8TMB)Khw_|v9`_ql#pRd2i*?CZl z7k1b!jQB=9-V@h%;Cnl7EKi;Y^&NhU0mWEcj8B|3L30Ku#-9389Q+(Yet0r$F=+3p z6AKOMAIi|OHyzlHZtOm73}|ntKtFaXF2Fy|M!gOh^L4^62kGUoWS1i{9gsds_GWBc zLw|TaLP64z3z9?=R2|T6Xh2W4_F*$cq>MtXMOy&=IPIJ`;!Tw?PqvI2b*U1)25^<2 zU_ZPoxg_V0tngA0J+mm?3;OYw{i2Zb4x}NedZug!>EoN3DC{1i)Z{Z4m*(y{ov2%- zk(w>+scOO}MN!exSc`TN)!B=NUX`zThWO~M*ohqq;J2hx9h9}|s#?@eR!=F{QTrq~ zTcY|>azkCe$|Q0XFUdpFT=lTcyW##i;-e{}ORB4D?t@SfqGo_cS z->?^rh$<&n9DL!CF+h?LMZRi)qju!meugvxX*&jfD!^1XB3?E?HnwHP8$;uX{Rvp# zh|)hM>XDv$ZGg=$1{+_bA~u-vXqlw6NH=nkpyWE0u}LQjF-3NhATL@9rRxMnpO%f7 z)EhZf{PF|mKIMFxnC?*78(}{Y)}iztV12}_OXffJ;ta!fcFIVjdchyHxH=t%ci`Xd zX2AUB?%?poD6Zv*&BA!6c5S#|xn~DK01#XvjT!w!;&`lDXSJT4_j$}!qSPrb37vc{ z9^NfC%QvPu@vlxaZ;mIbn-VHA6miwi8qJ~V;pTZkKqqOii<1Cs}0i?uUIss;hM4dKq^1O35y?Yp=l4i zf{M!@QHH~rJ&X~8uATV><23zZUbs-J^3}$IvV_ANLS08>k`Td7aU_S1sLsfi*C-m1 z-e#S%UGs4E!;CeBT@9}aaI)qR-6NU@kvS#0r`g&UWg?fC7|b^_HyCE!8}nyh^~o@< zpm7PDFs9yxp+byMS(JWm$NeL?DNrMCNE!I^ko-*csB+dsf4GAq{=6sfyf4wb>?v1v zmb`F*bN1KUx-`ra1+TJ37bXNP%`-Fd`vVQFTwWpX@;s(%nDQa#oWhgk#mYlY*!d>( zE&!|ySF!mIyfING+#%RDY3IBH_fW$}6~1%!G`suHub1kP@&DoAd5~7J55;5_noPI6eLf{t;@9Kf<{aO0`1WNKd?<)C-|?C?)3s z>wEq@8=I$Wc~Mt$o;g++5qR+(6wt9GI~pyrDJ%c?gPZe)owvy^J2S=+M^ z&WhIE`g;;J^xQLVeCtf7b%Dg#Z2gq9hp_%g)-%_`y*zb; zn9`f`mUPN-Ts&fFo(aNTsXPA|J!TJ{0hZp0^;MYHLOcD=r_~~^ymS8KLCSeU3;^QzJNqS z5{5rEAv#l(X?bvwxpU;2%pQftF`YFgrD1jt2^~Mt^~G>T*}A$yZc@(k9orlCGv&|1 zWWvVgiJsCAtamuAYT~nzs?TQFt<1LSEx!@e0~@yd6$b5!Zm(FpBl;(Cn>2vF?k zOm#TTjFwd2D-CyA!mqR^?#Uwm{NBemP>(pHmM}9;;8`c&+_o3#E5m)JzfwN?(f-a4 zyd%xZc^oQx3XT?vcCqCX&Qrk~nu;fxs@JUoyVoi5fqpi&bUhQ2y!Ok2pzsFR(M(|U zw3E+kH_zmTRQ9dUMZWRE%Zakiwc+lgv7Z%|YO9YxAy`y28`Aw;WU6HXBgU7fl@dnt z-fFBV)}H-gqP!1;V@Je$WcbYre|dRdp{xt!7sL3Eoa%IA`5CAA%;Wq8PktwPdULo! z8!sB}Qt8#jH9Sh}QiUtEPZ6H0b*7qEKGJ%ITZ|vH)5Q^2m<7o3#Z>AKc%z7_u`rXA zqrCy{-{8;9>dfllLu$^M5L z-hXs))h*qz%~ActwkIA(qOVBZl2v4lwbM>9l70Y`+T*elINFqt#>OaVWoja8RMsep z6Or3f=oBnA3vDbn*+HNZP?8LsH2MY)x%c13@(XfuGR}R?Nu<|07{$+Lc3$Uv^I!MQ z>6qWgd-=aG2Y^24g4{Bw9ueOR)(9h`scImD=86dD+MnSN4$6 z^U*o_mE-6Rk~Dp!ANp#5RE9n*LG(Vg`1)g6!(XtDzsov$Dvz|Gv1WU68J$CkshQhS zCrc|cdkW~UK}5NeaWj^F4MSgFM+@fJd{|LLM)}_O<{rj z+?*Lm?owq?IzC%U%9EBga~h-cJbIu=#C}XuWN>OLrc%M@Gu~kFEYUi4EC6l#PR2JS zQUkGKrrS#6H7}2l0F@S11DP`@pih0WRkRJl#F;u{c&ZC{^$Z+_*lB)r)-bPgRFE;* zl)@hK4`tEP=P=il02x7-C7p%l=B`vkYjw?YhdJU9!P!jcmY$OtC^12w?vy3<<=tlY zUwHJ_0lgWN9vf>1%WACBD{UT)1qHQSE2%z|JHvP{#INr13jM}oYv_5#xsnv9`)UAO zuwgyV4YZ;O)eSc3(mka6=aRohi!HH@I#xq7kng?Acdg7S4vDJb6cI5fw?2z%3yR+| zU5v@Hm}vy;${cBp&@D=HQ9j7NcFaOYL zj-wV=eYF{|XTkFNM2uz&T8uH~;)^Zo!=KP)EVyH6s9l1~4m}N%XzPpduPg|h-&lL` zAXspR0YMOKd2yO)eMFFJ4?sQ&!`dF&!|niH*!^*Ml##o0M(0*uK9&yzekFi$+mP9s z>W9d%Jb)PtVi&-Ha!o~Iyh@KRuKpQ@)I~L*d`{O8!kRObjO7=n+Gp36fe!66neh+7 zW*l^0tTKjLLzr`x4`_8&on?mjW-PzheTNox8Hg7Nt@*SbE-%kP2hWYmHu#Fn@Q^J(SsPUz*|EgOoZ6byg3ew88UGdZ>9B2Tq=jF72ZaR=4u%1A6Vm{O#?@dD!(#tmR;eP(Fu z{$0O%=Vmua7=Gjr8nY%>ul?w=FJ76O2js&17W_iq2*tb!i{pt#`qZB#im9Rl>?t?0c zicIC}et_4d+CpVPx)i4~$u6N-QX3H77ez z?ZdvXifFk|*F8~L(W$OWM~r`pSk5}#F?j_5u$Obu9lDWIknO^AGu+Blk7!9Sb;NjS zncZA?qtASdNtzQ>z7N871IsPAk^CC?iIL}+{K|F@BuG2>qQ;_RUYV#>hHO(HUPpk@ z(bn~4|F_jiZi}Sad;_7`#4}EmD<1EiIxa48QjUuR?rC}^HRocq`OQPM@aHVKP9E#q zy%6bmHygCpIddPjE}q_DPC`VH_2m;Eey&ZH)E6xGeStOK7H)#+9y!%-Hm|QF6w#A( zIC0Yw%9j$s-#odxG~C*^MZ?M<+&WJ+@?B_QPUyTg9DJGtQN#NIC&-XddRsf3n^AL6 zT@P|H;PvN;ZpL0iv$bRb7|J{0o!Hq+S>_NrH4@coZtBJu#g8#CbR7|#?6uxi8d+$g z87apN>EciJZ`%Zv2**_uiET9Vk{pny&My;+WfGDw4EVL#B!Wiw&M|A8f1A@ z(yFQS6jfbH{b8Z-S7D2?Ixl`j0{+ZnpT=;KzVMLW{B$`N?Gw^Fl0H6lT61%T2AU**!sX0u?|I(yoy&Xveg7XBL&+>n6jd1##6d>TxE*Vj=8lWiG$4=u{1UbAa5QD>5_ z;Te^42v7K6Mmu4IWT6Rnm>oxrl~b<~^e3vbj-GCdHLIB_>59}Ya+~OF68NiH=?}2o zP(X7EN=quQn&)fK>M&kqF|<_*H`}c zk=+x)GU>{Af#vx&s?`UKUsz})g^Pc&?Ka@t5$n$bqf6{r1>#mWx6Ep>9|A}VmWRnowVo`OyCr^fHsf# zQjQ3Ttp7y#iQY8l`zEUW)(@gGQdt(~rkxlkefskT(t%@i8=|p1Y9Dc5bc+z#n$s13 zGJk|V0+&Ekh(F};PJzQKKo+FG@KV8a<$gmNSD;7rd_nRdc%?9)p!|B-@P~kxQG}~B zi|{0}@}zKC(rlFUYp*dO1RuvPC^DQOkX4<+EwvBAC{IZQdYxoq1Za!MW7%p7gGr=j zzWnAq%)^O2$eItftC#TTSArUyL$U54-O7e|)4_7%Q^2tZ^0-d&3J1}qCzR4dWX!)4 zzIEKjgnYgMus^>6uw4Jm8ga6>GBtMjpNRJ6CP~W=37~||gMo_p@GA@#-3)+cVYnU> zE5=Y4kzl+EbEh%dhQokB{gqNDqx%5*qBusWV%!iprn$S!;oN_6E3?0+umADVs4ako z?P+t?m?};gev9JXQ#Q&KBpzkHPde_CGu-y z<{}RRAx=xlv#mVi+Ibrgx~ujW$h{?zPfhz)Kp7kmYS&_|97b&H&1;J-mzrBWAvY} zh8-I8hl_RK2+nnf&}!W0P+>5?#?7>npshe<1~&l_xqKd0_>dl_^RMRq@-Myz&|TKZBj1=Q()) zF{dBjv5)h=&Z)Aevx}+i|7=R9rG^Di!sa)sZCl&ctX4&LScQ-kMncgO(9o6W6)yd< z@Rk!vkja*X_N3H=BavGoR0@u0<}m-7|2v!0+2h~S2Q&a=lTH91OJsvms2MT~ zY=c@LO5i`mLpBd(vh|)I&^A3TQLtr>w=zoyzTd=^f@TPu&+*2MtqE$Avf>l>}V|3-8Fp2hzo3y<)hr_|NO(&oSD z!vEjTWBxbKTiShVl-U{n*B3#)3a8$`{~Pk}J@elZ=>Pqp|MQ}jrGv7KrNcjW%TN_< zZz8kG{#}XoeWf7qY?D)L)8?Q-b@Na&>i=)(@uNo zr;cH98T3$Iau8Hn*@vXi{A@YehxDE2zX~o+RY`)6-X{8~hMpc#C`|8y> zU8Mnv5A0dNCf{Ims*|l-^ z(MRp{qoGohB34|ggDI*p!Aw|MFyJ|v+<+E3brfrI)|+l3W~CQLPbnF@G0)P~Ly!1TJLp}xh8uW`Q+RB-v`MRYZ9Gam3cM%{ zb4Cb*f)0deR~wtNb*8w-LlIF>kc7DAv>T0D(a3@l`k4TFnrO+g9XH7;nYOHxjc4lq zMmaW6qpgAgy)MckYMhl?>sq;-1E)-1llUneeA!ya9KM$)DaNGu57Z5aE>=VST$#vb zFo=uRHr$0M{-ha>h(D_boS4zId;3B|Tpqo|?B?Z@I?G(?&Iei+-{9L_A9=h=Qfn-U z1wIUnQe9!z%_j$F_{rf&`ZFSott09gY~qrf@g3O=Y>vzAnXCyL!@(BqWa)Zqt!#_k zfZHuwS52|&&)aK;CHq9V-t9qt0au{$#6c*R#e5n3rje0hic7c7m{kW$p(_`wB=Gw7 z4k`1Hi;Mc@yA7dp@r~?@rfw)TkjAW++|pkfOG}0N|2guek}j8Zen(!+@7?qt_7ndX zB=BG6WJ31#F3#Vk3=aQr8T)3`{=p9nBHlKzE0I@v`{vJ}h8pd6vby&VgFhzH|q;=aonunAXL6G2y(X^CtAhWr*jI zGjpY@raZDQkg*aMq}Ni6cRF z{oWv}5`nhSAv>usX}m^GHt`f(t8@zHc?K|y5Zi=4G*UG1Sza{$Dpj%X8 zzEXaKT5N6F5j4J|w#qlZP!zS7BT)9b+!ZSJdToqJts1c!)fwih4d31vfb{}W)EgcA zH2pZ^8_k$9+WD2n`6q5XbOy8>3pcYH9 z07eUB+p}YD@AH!}p!iKv><2QF-Y^&xx^PAc1F13A{nUeCDg&{hnix#FiO!fe(^&%Qcux!h znu*S!s$&nnkeotYsDthh1dq(iQrE|#f_=xVgfiiL&-5eAcC-> z5L0l|DVEM$#ulf{bj+Y~7iD)j<~O8CYM8GW)dQGq)!mck)FqoL^X zwNdZb3->hFrbHFm?hLvut-*uK?zXn3q1z|UX{RZ;-WiLoOjnle!xs+W0-8D)kjU#R z+S|A^HkRg$Ij%N4v~k`jyHffKaC~=wg=9)V5h=|kLQ@;^W!o2^K+xG&2n`XCd>OY5Ydi= zgHH=lgy++erK8&+YeTl7VNyVm9-GfONlSlVb3)V9NW5tT!cJ8d7X)!b-$fb!s76{t z@d=Vg-5K_sqHA@Zx-L_}wVnc@L@GL9_K~Zl(h5@AR#FAiKad8~KeWCo@mgXIQ#~u{ zgYFwNz}2b6Vu@CP0XoqJ+dm8px(5W5-Jpis97F`+KM)TuP*X8H@zwiVKDKGVp59pI zifNHZr|B+PG|7|Y<*tqap0CvG7tbR1R>jn70t1X`XJixiMVcHf%Ez*=xm1(CrTSDt z0cle!+{8*Ja&EOZ4@$qhBuKQ$U95Q%rc7tg$VRhk?3=pE&n+T3upZg^ZJc9~c2es% zh7>+|mrmA-p&v}|OtxqmHIBgUxL~^0+cpfkSK2mhh+4b=^F1Xgd2)}U*Yp+H?ls#z zrLxWg_hm}AfK2XYWr!rzW4g;+^^&bW%LmbtRai9f3PjU${r@n`JThy-cphbcwn)rq9{A$Ht`lmYKxOacy z6v2R(?gHhD5@&kB-Eg?4!hAoD7~(h>(R!s1c1Hx#s9vGPePUR|of32bS`J5U5w{F) z>0<^ktO2UHg<0{oxkdOQ;}coZDQph8p6ruj*_?uqURCMTac;>T#v+l1Tc~%^k-Vd@ zkc5y35jVNc49vZpZx;gG$h{%yslDI%Lqga1&&;mN{Ush1c7p>7e-(zp}6E7f-XmJb4nhk zb8zS+{IVbL$QVF8pf8}~kQ|dHJAEATmmnrb_wLG}-yHe>W|A&Y|;muy-d^t^<&)g5SJfaTH@P1%euONny=mxo+C z4N&w#biWY41r8k~468tvuYVh&XN&d#%QtIf9;iVXfWY)#j=l`&B~lqDT@28+Y!0E+MkfC}}H*#(WKKdJJq=O$vNYCb(ZG@p{fJgu;h z21oHQ(14?LeT>n5)s;uD@5&ohU!@wX8w*lB6i@GEH0pM>YTG+RAIWZD;4#F1&F%Jp zXZUml2sH0!lYJT?&sA!qwez6cXzJEd(1ZC~kT5kZSp7(@=H2$Azb_*W&6aA|9iwCL zdX7Q=42;@dspHDwYE?miGX#L^3xD&%BI&fN9^;`v4OjQXPBaBmOF1;#C)8XA(WFlH zycro;DS2?(G&6wkr6rqC>rqDv3nfGw3hmN_9Al>TgvmGsL8_hXx09};l9Ow@)F5@y z#VH5WigLDwZE4nh^7&@g{1FV^UZ%_LJ-s<{HN*2R$OPg@R~Z`c-ET*2}XB@9xvAjrK&hS=f|R8Gr9 zr|0TGOsI7RD+4+2{ZiwdVD@2zmg~g@^D--YL;6UYGSM8i$NbQr4!c7T9rg!8;TM0E zT#@?&S=t>GQm)*ua|?TLT2ktj#`|R<_*FAkOu2Pz$wEc%-=Y9V*$&dg+wIei3b*O8 z2|m$!jJG!J!ZGbbIa!(Af~oSyZV+~M1qGvelMzPNE_%5?c2>;MeeG2^N?JDKjFYCy z7SbPWH-$cWF9~fX%9~v99L!G(wi!PFp>rB!9xj7=Cv|F+7CsGNwY0Q_J%FID%C^CBZQfJ9K(HK%k31j~e#&?hQ zNuD6gRkVckU)v+53-fc} z7ZCzYN-5RG4H7;>>Hg?LU9&5_aua?A0)0dpew1#MMlu)LHe(M;OHjHIUl7|%%)YPo z0cBk;AOY00%Fe6heoN*$(b<)Cd#^8Iu;-2v@>cE-OB$icUF9EEoaC&q8z9}jMTT2I z8`9;jT%z0;dy4!8U;GW{i`)3!c6&oWY`J3669C!tM<5nQFFrFRglU8f)5Op$GtR-3 zn!+SPCw|04sv?%YZ(a7#L?vsdr7ss@WKAw&A*}-1S|9~cL%uA+E~>N6QklFE>8W|% zyX-qAUGTY1hQ-+um`2|&ji0cY*(qN!zp{YpDO-r>jPk*yuVSay<)cUt`t@&FPF_&$ zcHwu1(SQ`I-l8~vYyUxm@D1UEdFJ$f5Sw^HPH7b!9 zzYT3gKMF((N(v0#4f_jPfVZ=ApN^jQJe-X$`A?X+vWjLn_%31KXE*}5_}d8 zw_B1+a#6T1?>M{ronLbHIlEsMf93muJ7AH5h%;i99<~JX^;EAgEB1uHralD*!aJ@F zV2ruuFe9i2Q1C?^^kmVy921eb=tLDD43@-AgL^rQ3IO9%+vi_&R2^dpr}x{bCVPej z7G0-0o64uyWNtr*loIvslyo0%)KSDDKjfThe0hcqs)(C-MH1>bNGBDRTW~scy_{w} zp^aq8Qb!h9Lwielq%C1b8=?Z=&U)ST&PHbS)8Xzjh2DF?d{iAv)Eh)wsUnf>UtXN( zL7=$%YrZ#|^c{MYmhn!zV#t*(jdmYdCpwqpZ{v&L8KIuKn`@IIZfp!uo}c;7J57N` zAxyZ-uA4=Gzl~Ovycz%MW9ZL7N+nRo&1cfNn9(1H5eM;V_4Z_qVann7F>5f>%{rf= zPBZFaV@_Sobl?Fy&KXyzFDV*FIdhS5`Uc~S^Gjo)aiTHgn#<0C=9o-a-}@}xDor;D zZyZ|fvf;+=3MZd>SR1F^F`RJEZo+|MdyJYQAEauKu%WDol~ayrGU3zzbHKsnHKZ*z zFiwUkL@DZ>!*x05ql&EBq@_Vqv83&?@~q5?lVmffQZ+V-=qL+!u4Xs2Z2zdCQ3U7B&QR9_Iggy} z(om{Y9eU;IPe`+p1ifLx-XWh?wI)xU9ik+m#g&pGdB5Bi<`PR*?92lE0+TkRuXI)z z5LP!N2+tTc%cB6B1F-!fj#}>S!vnpgVU~3!*U1ej^)vjUH4s-bd^%B=ItQqDCGbrEzNQi(dJ`J}-U=2{7-d zK8k^Rlq2N#0G?9&1?HSle2vlkj^KWSBYTwx`2?9TU_DX#J+f+qLiZCqY1TXHFxXZqYMuD@RU$TgcnCC{_(vwZ-*uX)~go#%PK z@}2Km_5aQ~(<3cXeJN6|F8X_1@L%@xTzs}$_*E|a^_URF_qcF;Pfhoe?FTFwvjm1o z8onf@OY@jC2tVcMaZS;|T!Ks(wOgPpRzRnFS-^RZ4E!9dsnj9sFt609a|jJbb1Dt@ z<=Gal2jDEupxUSwWu6zp<<&RnAA;d&4gKVG0iu6g(DsST(4)z6R)zDpfaQ}v{5ARt zyhwvMtF%b-YazR5XLz+oh=mn;y-Mf2a8>7?2v8qX;19y?b>Z5laGHvzH;Nu9S`B8} zI)qN$GbXIQ1VL3lnof^6TS~rvPVg4V?Dl2Bb*K2z4E{5vy<(@@K_cN@U>R!>aUIRnb zL*)=787*cs#zb31zBC49x$`=fkQbMAef)L2$dR{)6BAz!t5U_B#1zZG`^neKSS22oJ#5B=gl%U=WeqL9REF2g zZnfCb0?quf?Ztj$VXvDSWoK`0L=Zxem2q}!XWLoT-kYMOx)!7fcgT35uC~0pySEme z`{wGWTkGr7>+Kb^n;W?BZH6ZP(9tQX%-7zF>vc2}LuWDI(9kh1G#7B99r4x6;_-V+k&c{nPUrR zAXJGRiMe~aup{0qzmLNjS_BC4cB#sXjckx{%_c&^xy{M61xEb>KW_AG5VFXUOjAG4 z^>Qlm9A#1N{4snY=(AmWzatb!ngqiqPbBZ7>Uhb3)dTkSGcL#&SH>iMO-IJBPua`u zo)LWZ>=NZLr758j{%(|uQuZ)pXq_4c!!>s|aDM9#`~1bzK3J1^^D#<2bNCccH7~-X}Ggi!pIIF>uFx%aPARGQsnC8ZQc8lrQ5o~smqOg>Ti^GNme94*w z)JZy{_{#$jxGQ&`M z!OMvZMHR>8*^>eS%o*6hJwn!l8VOOjZQJvh)@tnHVW&*GYPuxqXw}%M!(f-SQf`=L z5;=5w2;%82VMH6Xi&-K3W)o&K^+vJCepWZ-rW%+Dc6X3(){z$@4zjYxQ|}8UIojeC zYZpQ1dU{fy=oTr<4VX?$q)LP}IUmpiez^O&N3E_qPpchGTi5ZM6-2ScWlQq%V&R2Euz zO|Q0Hx>lY1Q1cW5xHv5!0OGU~PVEqSuy#fD72d#O`N!C;o=m+YioGu-wH2k6!t<~K zSr`E=W9)!g==~x9VV~-8{4ZN9{~-A9zJpRe%NGg$+MDuI-dH|b@BD)~>pPCGUNNzY zMDg||0@XGQgw`YCt5C&A{_+J}mvV9Wg{6V%2n#YSRN{AP#PY?1FF1#|vO_%e+#`|2*~wGAJaeRX6=IzFNeWhz6gJc8+(03Ph4y6ELAm=AkN7TOgMUEw*N{= z_)EIDQx5q22oUR+_b*tazu9+pX|n1c*IB-}{DqIj z-?E|ks{o3AGRNb;+iKcHkZvYJvFsW&83RAPs1Oh@IWy%l#5x2oUP6ZCtv+b|q>jsf zZ_9XO;V!>n`UxH1LvH8)L4?8raIvasEhkpQoJ`%!5rBs!0Tu(s_D{`4opB;57)pkX z4$A^8CsD3U5*!|bHIEqsn~{q+Ddj$ME@Gq4JXtgVz&7l{Ok!@?EA{B3P~NAqb9)4? zkQo30A^EbHfQ@87G5&EQTd`frrwL)&Yw?%-W@uy^Gn23%j?Y!Iea2xw<-f;esq zf%w5WN@E1}zyXtYv}}`U^B>W`>XPmdLj%4{P298|SisrE;7HvXX;A}Ffi8B#3Lr;1 zHt6zVb`8{#+e$*k?w8|O{Uh|&AG}|DG1PFo1i?Y*cQm$ZwtGcVgMwtBUDa{~L1KT-{jET4w60>{KZ27vXrHJ;fW{6| z=|Y4!&UX020wU1>1iRgB@Q#m~1^Z^9CG1LqDhYBrnx%IEdIty z!46iOoKlKs)c}newDG)rWUikD%j`)p z_w9Ph&e40=(2eBy;T!}*1p1f1SAUDP9iWy^u^Ubdj21Kn{46;GR+hwLO=4D11@c~V zI8x&(D({K~Df2E)Nx_yQvYfh4;MbMJ@Z}=Dt3_>iim~QZ*hZIlEs0mEb z_54+&*?wMD`2#vsQRN3KvoT>hWofI_Vf(^C1ff-Ike@h@saEf7g}<9T`W;HAne-Nd z>RR+&SP35w)xKn8^U$7))PsM!jKwYZ*RzEcG-OlTrX3}9a{q%#Un5E5W{{hp>w~;` zGky+3(vJvQyGwBo`tCpmo0mo((?nM8vf9aXrrY1Ve}~TuVkB(zeds^jEfI}xGBCM2 zL1|#tycSaWCurP+0MiActG3LCas@_@tao@(R1ANlwB$4K53egNE_;!&(%@Qo$>h`^1S_!hN6 z)vZtG$8fN!|BXBJ=SI>e(LAU(y(i*PHvgQ2llulxS8>qsimv7yL}0q_E5WiAz7)(f zC(ahFvG8&HN9+6^jGyLHM~$)7auppeWh_^zKk&C_MQ~8;N??OlyH~azgz5fe^>~7F zl3HnPN3z-kN)I$4@`CLCMQx3sG~V8hPS^}XDXZrQA>}mQPw%7&!sd(Pp^P=tgp-s^ zjl}1-KRPNWXgV_K^HkP__SR`S-|OF0bR-N5>I%ODj&1JUeAQ3$9i;B~$S6}*^tK?= z**%aCiH7y?xdY?{LgVP}S0HOh%0%LI$wRx;$T|~Y8R)Vdwa}kGWv8?SJVm^>r6+%I z#lj1aR94{@MP;t-scEYQWc#xFA30^}?|BeX*W#9OL;Q9#WqaaM546j5j29((^_8Nu z4uq}ESLr~r*O7E7$D{!k9W>`!SLoyA53i9QwRB{!pHe8um|aDE`Cg0O*{jmor)^t)3`>V>SWN-2VJcFmj^1?~tT=JrP`fVh*t zXHarp=8HEcR#vFe+1a%XXuK+)oFs`GDD}#Z+TJ}Ri`FvKO@ek2ayn}yaOi%(8p%2$ zpEu)v0Jym@f}U|-;}CbR=9{#<^z28PzkkTNvyKvJDZe+^VS2bES3N@Jq!-*}{oQlz z@8bgC_KnDnT4}d#&Cpr!%Yb?E!brx0!eVOw~;lLwUoz#Np%d$o%9scc3&zPm`%G((Le|6o1 zM(VhOw)!f84zG^)tZ1?Egv)d8cdNi+T${=5kV+j;Wf%2{3g@FHp^Gf*qO0q!u$=m9 zCaY`4mRqJ;FTH5`a$affE5dJrk~k`HTP_7nGTY@B9o9vvnbytaID;^b=Tzp7Q#DmD zC(XEN)Ktn39z5|G!wsVNnHi) z%^q94!lL|hF`IijA^9NR0F$@h7k5R^ljOW(;Td9grRN0Mb)l_l7##{2nPQ@?;VjXv zaLZG}yuf$r$<79rVPpXg?6iiieX|r#&`p#Con2i%S8*8F}(E) zI5E6c3tG*<;m~6>!&H!GJ6zEuhH7mkAzovdhLy;)q z{H2*8I^Pb}xC4s^6Y}6bJvMu=8>g&I)7!N!5QG$xseeU#CC?ZM-TbjsHwHgDGrsD= z{%f;@Sod+Ch66Ko2WF~;Ty)v>&x^aovCbCbD7>qF*!?BXmOV3(s|nxsb*Lx_2lpB7 zokUnzrk;P=T-&kUHO}td+Zdj!3n&NR?K~cRU zAXU!DCp?51{J4w^`cV#ye}(`SQhGQkkMu}O3M*BWt4UsC^jCFUy;wTINYmhD$AT;4 z?Xd{HaJjP`raZ39qAm;%beDbrLpbRf(mkKbANan7XsL>_pE2oo^$TgdidjRP!5-`% zv0d!|iKN$c0(T|L0C~XD0aS8t{*&#LnhE;1Kb<9&=c2B+9JeLvJr*AyyRh%@jHej=AetOMSlz^=!kxX>>B{2B1uIrQyfd8KjJ+DBy!h)~*(!|&L4^Q_07SQ~E zcemVP`{9CwFvPFu7pyVGCLhH?LhEVb2{7U+Z_>o25#+3<|8%1T^5dh}*4(kfJGry} zm%r#hU+__Z;;*4fMrX=Bkc@7|v^*B;HAl0((IBPPii%X9+u3DDF6%bI&6?Eu$8&aWVqHIM7mK6?Uvq$1|(-T|)IV<>e?!(rY zqkmO1MRaLeTR=)io(0GVtQT@s6rN%C6;nS3@eu;P#ry4q;^O@1ZKCJyp_Jo)Ty^QW z+vweTx_DLm{P-XSBj~Sl<%_b^$=}odJ!S2wAcxenmzFGX1t&Qp8Vxz2VT`uQsQYtdn&_0xVivIcxZ_hnrRtwq4cZSj1c-SG9 z7vHBCA=fd0O1<4*=lu$6pn~_pVKyL@ztw1swbZi0B?spLo56ZKu5;7ZeUml1Ws1?u zqMf1p{5myAzeX$lAi{jIUqo1g4!zWLMm9cfWcnw`k6*BR^?$2(&yW?>w;G$EmTA@a z6?y#K$C~ZT8+v{87n5Dm&H6Pb_EQ@V0IWmG9cG=O;(;5aMWWrIPzz4Q`mhK;qQp~a z+BbQrEQ+w{SeiuG-~Po5f=^EvlouB@_|4xQXH@A~KgpFHrwu%dwuCR)=B&C(y6J4J zvoGk9;lLs9%iA-IJGU#RgnZZR+@{5lYl8(e1h6&>Vc_mvg0d@);X zji4T|n#lB!>pfL|8tQYkw?U2bD`W{na&;*|znjmalA&f;*U++_aBYerq;&C8Kw7mI z7tsG*?7*5j&dU)Lje;^{D_h`%(dK|pB*A*1(Jj)w^mZ9HB|vGLkF1GEFhu&rH=r=8 zMxO42e{Si6$m+Zj`_mXb&w5Q(i|Yxyg?juUrY}78uo@~3v84|8dfgbPd0iQJRdMj< zncCNGdMEcsxu#o#B5+XD{tsg*;j-eF8`mp~K8O1J!Z0+>0=7O=4M}E?)H)ENE;P*F z$Ox?ril_^p0g7xhDUf(q652l|562VFlC8^r8?lQv;TMvn+*8I}&+hIQYh2 z1}uQQaag&!-+DZ@|C+C$bN6W;S-Z@)d1|en+XGvjbOxCa-qAF*LA=6s(Jg+g;82f$ z(Vb)8I)AH@cdjGFAR5Rqd0wiNCu!xtqWbcTx&5kslzTb^7A78~Xzw1($UV6S^VWiP zFd{Rimd-0CZC_Bu(WxBFW7+k{cOW7DxBBkJdJ;VsJ4Z@lERQr%3eVv&$%)b%<~ zCl^Y4NgO}js@u{|o~KTgH}>!* z_iDNqX2(As7T0xivMH|3SC1ivm8Q}6Ffcd7owUKN5lHAtzMM4<0v+ykUT!QiowO;`@%JGv+K$bBx@*S7C8GJVqQ_K>12}M`f_Ys=S zKFh}HM9#6Izb$Y{wYzItTy+l5U2oL%boCJn?R3?jP@n$zSIwlmyGq30Cw4QBO|14` zW5c);AN*J3&eMFAk$SR~2k|&+&Bc$e>s%c{`?d~85S-UWjA>DS5+;UKZ}5oVa5O(N zqqc@>)nee)+4MUjH?FGv%hm2{IlIF-QX}ym-7ok4Z9{V+ZHVZQl$A*x!(q%<2~iVv znUa+BX35&lCb#9VE-~Y^W_f;Xhl%vgjwdjzMy$FsSIj&ok}L+X`4>J=9BkN&nu^E*gbhj3(+D>C4E z@Fwq_=N)^bKFSHTzZk?-gNU$@l}r}dwGyh_fNi=9b|n}J>&;G!lzilbWF4B}BBq4f zYIOl?b)PSh#XTPp4IS5ZR_2C!E)Z`zH0OW%4;&~z7UAyA-X|sh9@~>cQW^COA9hV4 zXcA6qUo9P{bW1_2`eo6%hgbN%(G-F1xTvq!sc?4wN6Q4`e9Hku zFwvlAcRY?6h^Fj$R8zCNEDq8`=uZB8D-xn)tA<^bFFy}4$vA}Xq0jAsv1&5!h!yRA zU()KLJya5MQ`q&LKdH#fwq&(bNFS{sKlEh_{N%{XCGO+po#(+WCLmKW6&5iOHny>g z3*VFN?mx!16V5{zyuMWDVP8U*|BGT$(%IO|)?EF|OI*sq&RovH!N%=>i_c?K*A>>k zyg1+~++zY4Q)J;VWN0axhoIKx;l&G$gvj(#go^pZskEVj8^}is3Jw26LzYYVos0HX zRPvmK$dVxM8(Tc?pHFe0Z3uq){{#OK3i-ra#@+;*=ui8)y6hsRv z4Fxx1c1+fr!VI{L3DFMwXKrfl#Q8hfP@ajgEau&QMCxd{g#!T^;ATXW)nUg&$-n25 zruy3V!!;{?OTobo|0GAxe`Acn3GV@W=&n;~&9 zQM>NWW~R@OYORkJAo+eq1!4vzmf9K%plR4(tB@TR&FSbDoRgJ8qVcH#;7lQub*nq&?Z>7WM=oeEVjkaG zT#f)=o!M2DO5hLR+op>t0CixJCIeXH*+z{-XS|%jx)y(j&}Wo|3!l7{o)HU3m7LYyhv*xF&tq z%IN7N;D4raue&&hm0xM=`qv`+TK@;_xAcGKuK(2|75~ar2Yw)geNLSmVxV@x89bQu zpViVKKnlkwjS&&c|-X6`~xdnh}Ps)Hs z4VbUL^{XNLf7_|Oi>tA%?SG5zax}esF*FH3d(JH^Gvr7Rp*n=t7frH!U;!y1gJB^i zY_M$KL_}mW&XKaDEi9K-wZR|q*L32&m+2n_8lq$xRznJ7p8}V>w+d@?uB!eS3#u<} zIaqi!b!w}a2;_BfUUhGMy#4dPx>)_>yZ`ai?Rk`}d0>~ce-PfY-b?Csd(28yX22L% zI7XI>OjIHYTk_@Xk;Gu^F52^Gn6E1&+?4MxDS2G_#PQ&yXPXP^<-p|2nLTb@AAQEY zI*UQ9Pmm{Kat}wuazpjSyXCdnrD&|C1c5DIb1TnzF}f4KIV6D)CJ!?&l&{T)e4U%3HTSYqsQ zo@zWB1o}ceQSV)<4G<)jM|@@YpL+XHuWsr5AYh^Q{K=wSV99D~4RRU52FufmMBMmd z_H}L#qe(}|I9ZyPRD6kT>Ivj&2Y?qVZq<4bG_co_DP`sE*_Xw8D;+7QR$Uq(rr+u> z8bHUWbV19i#)@@G4bCco@Xb<8u~wVDz9S`#k@ciJtlu@uP1U0X?yov8v9U3VOig2t zL9?n$P3=1U_Emi$#slR>N5wH-=J&T=EdUHA}_Z zZIl3nvMP*AZS9{cDqFanrA~S5BqxtNm9tlu;^`)3X&V4tMAkJ4gEIPl= zoV!Gyx0N{3DpD@)pv^iS*dl2FwANu;1;%EDl}JQ7MbxLMAp>)UwNwe{=V}O-5C*>F zu?Ny+F64jZn<+fKjF01}8h5H_3pey|;%bI;SFg$w8;IC<8l|3#Lz2;mNNik6sVTG3 z+Su^rIE#40C4a-587$U~%KedEEw1%r6wdvoMwpmlXH$xPnNQN#f%Z7|p)nC>WsuO= z4zyqapLS<8(UJ~Qi9d|dQijb_xhA2)v>la)<1md5s^R1N&PiuA$^k|A<+2C?OiHbj z>Bn$~t)>Y(Zb`8hW7q9xQ=s>Rv81V+UiuZJc<23HplI88isqRCId89fb`Kt|CxVIg znWcwprwXnotO>3s&Oypkte^9yJjlUVVxSe%_xlzmje|mYOVPH^vjA=?6xd0vaj0Oz zwJ4OJNiFdnHJX3rw&inskjryukl`*fRQ#SMod5J|KroJRsVXa5_$q7whSQ{gOi*s0 z1LeCy|JBWRsDPn7jCb4s(p|JZiZ8+*ExC@Vj)MF|*Vp{B(ziccSn`G1Br9bV(v!C2 z6#?eqpJBc9o@lJ#^p-`-=`4i&wFe>2)nlPK1p9yPFzJCzBQbpkcR>={YtamIw)3nt z(QEF;+)4`>8^_LU)_Q3 zC5_7lgi_6y>U%m)m@}Ku4C}=l^J=<<7c;99ec3p{aR+v=diuJR7uZi%aQv$oP?dn?@6Yu_+*^>T0ptf(oobdL;6)N-I!TO`zg^Xbv3#L0I~sn@WGk-^SmPh5>W+LB<+1PU}AKa?FCWF|qMNELOgdxR{ zbqE7@jVe+FklzdcD$!(A$&}}H*HQFTJ+AOrJYnhh}Yvta(B zQ_bW4Rr;R~&6PAKwgLWXS{Bnln(vUI+~g#kl{r+_zbngT`Y3`^Qf=!PxN4IYX#iW4 zucW7@LLJA9Zh3(rj~&SyN_pjO8H&)|(v%!BnMWySBJV=eSkB3YSTCyIeJ{i;(oc%_hk{$_l;v>nWSB)oVeg+blh=HB5JSlG_r7@P z3q;aFoZjD_qS@zygYqCn=;Zxjo!?NK!%J$ z52lOP`8G3feEj+HTp@Tnn9X~nG=;tS+z}u{mQX_J0kxtr)O30YD%oo)L@wy`jpQYM z@M>Me=95k1p*FW~rHiV1CIfVc{K8r|#Kt(ApkXKsDG$_>76UGNhHExFCw#Ky9*B-z zNq2ga*xax!HMf_|Vp-86r{;~YgQKqu7%szk8$hpvi_2I`OVbG1doP(`gn}=W<8%Gn z%81#&WjkH4GV;4u43EtSW>K_Ta3Zj!XF?;SO3V#q=<=>Tc^@?A`i;&`-cYj|;^ zEo#Jl5zSr~_V-4}y8pnufXLa80vZY4z2ko7fj>DR)#z=wWuS1$$W!L?(y}YC+yQ|G z@L&`2upy3f>~*IquAjkVNU>}c10(fq#HdbK$~Q3l6|=@-eBbo>B9(6xV`*)sae58*f zym~RRVx;xoCG3`JV`xo z!lFw)=t2Hy)e!IFs?0~7osWk(d%^wxq&>_XD4+U#y&-VF%4z?XH^i4w`TxpF{`XhZ z%G}iEzf!T(l>g;W9<~K+)$g!{UvhW{E0Lis(S^%I8OF&%kr!gJ&fMOpM=&=Aj@wuL zBX?*6i51Qb$uhkwkFYkaD_UDE+)rh1c;(&Y=B$3)J&iJfQSx!1NGgPtK!$c9OtJuu zX(pV$bfuJpRR|K(dp@^j}i&HeJOh@|7lWo8^$*o~Xqo z5Sb+!EtJ&e@6F+h&+_1ETbg7LfP5GZjvIUIN3ibCOldAv z)>YdO|NH$x7AC8dr=<2ekiY1%fN*r~e5h6Yaw<{XIErujKV~tiyrvV_DV0AzEknC- zR^xKM3i<1UkvqBj3C{wDvytOd+YtDSGu!gEMg+!&|8BQrT*|p)(dwQLEy+ zMtMzij3zo40)CA!BKZF~yWg?#lWhqD3@qR)gh~D{uZaJO;{OWV8XZ_)J@r3=)T|kt zUS1pXr6-`!Z}w2QR7nP%d?ecf90;K_7C3d!UZ`N(TZoWNN^Q~RjVhQG{Y<%E1PpV^4 z-m-K+$A~-+VDABs^Q@U*)YvhY4Znn2^w>732H?NRK(5QSS$V@D7yz2BVX4)f5A04~$WbxGOam22>t&uD)JB8-~yiQW6ik;FGblY_I>SvB_z2?PS z*Qm&qbKI{H1V@YGWzpx`!v)WeLT02};JJo*#f$a*FH?IIad-^(;9XC#YTWN6;Z6+S zm4O1KH=#V@FJw7Pha0!9Vb%ZIM$)a`VRMoiN&C|$YA3~ZC*8ayZRY^fyuP6$n%2IU z$#XceYZeqLTXw(m$_z|33I$B4k~NZO>pP6)H_}R{E$i%USGy{l{-jOE;%CloYPEU+ zRFxOn4;7lIOh!7abb23YKD+_-?O z0FP9otcAh+oSj;=f#$&*ExUHpd&e#bSF%#8*&ItcL2H$Sa)?pt0Xtf+t)z$_u^wZi z44oE}r4kIZGy3!Mc8q$B&6JqtnHZ>Znn!Zh@6rgIu|yU+zG8q`q9%B18|T|oN3zMq z`l&D;U!OL~%>vo&q0>Y==~zLiCZk4v%s_7!9DxQ~id1LLE93gf*gg&2$|hB#j8;?3 z5v4S;oM6rT{Y;I+#FdmNw z){d%tNM<<#GN%n9ox7B=3#;u7unZ~tLB_vRZ52a&2=IM)2VkXm=L+Iqq~uk#Dug|x z>S84e+A7EiOY5lj*!q?6HDkNh~0g;0Jy(al!ZHHDtur9T$y-~)94HelX1NHjXWIM7UAe}$?jiz z9?P4`I0JM=G5K{3_%2jPLC^_Mlw?-kYYgb7`qGa3@dn|^1fRMwiyM@Ch z;CB&o7&&?c5e>h`IM;Wnha0QKnEp=$hA8TJgR-07N~U5(>9vJzeoFsSRBkDq=x(YgEMpb=l4TDD`2 zwVJpWGTA_u7}?ecW7s6%rUs&NXD3+n;jB86`X?8(l3MBo6)PdakI6V6a}22{)8ilT zM~T*mU}__xSy|6XSrJ^%lDAR3Lft%+yxC|ZUvSO_nqMX!_ul3;R#*{~4DA=h$bP)%8Yv9X zyp><|e8=_ttI}ZAwOd#dlnSjck#6%273{E$kJuCGu=I@O)&6ID{nWF5@gLb16sj|&Sb~+du4e4O_%_o`Ix4NRrAsyr1_}MuP94s>de8cH-OUkVPk3+K z&jW)It9QiU-ti~AuJkL`XMca8Oh4$SyJ=`-5WU<{cIh+XVH#e4d&zive_UHC!pN>W z3TB;Mn5i)9Qn)#6@lo4QpI3jFYc0~+jS)4AFz8fVC;lD^+idw^S~Qhq>Tg(!3$yLD zzktzoFrU@6s4wwCMz}edpF5i5Q1IMmEJQHzp(LAt)pgN3&O!&d?3W@6U4)I^2V{;- z6A(?zd93hS*uQmnh4T)nHnE{wVhh(=MMD(h(P4+^p83Om6t<*cUW>l(qJzr%5vp@K zN27ka(L{JX=1~e2^)F^i=TYj&;<7jyUUR2Bek^A8+3Up*&Xwc{)1nRR5CT8vG>ExV zHnF3UqXJOAno_?bnhCX-&kwI~Ti8t4`n0%Up>!U`ZvK^w2+0Cs-b9%w%4`$+To|k= zKtgc&l}P`*8IS>8DOe?EB84^kx4BQp3<7P{Pq}&p%xF_81pg!l2|u=&I{AuUgmF5n zJQCTLv}%}xbFGYtKfbba{CBo)lWW%Z>i(_NvLhoQZ*5-@2l&x>e+I~0Nld3UI9tdL zRzu8}i;X!h8LHVvN?C+|M81e>Jr38%&*9LYQec9Ax>?NN+9(_>XSRv&6hlCYB`>Qm z1&ygi{Y()OU4@D_jd_-7vDILR{>o|7-k)Sjdxkjgvi{@S>6GqiF|o`*Otr;P)kLHN zZkpts;0zw_6;?f(@4S1FN=m!4^mv~W+lJA`&7RH%2$)49z0A+8@0BCHtj|yH--AEL z0tW6G%X-+J+5a{5*WKaM0QDznf;V?L5&uQw+yegDNDP`hA;0XPYc6e0;Xv6|i|^F2WB)Z$LR|HR4 zTQsRAby9(^Z@yATyOgcfQw7cKyr^3Tz7lc7+JEwwzA7)|2x+PtEb>nD(tpxJQm)Kn zW9K_*r!L%~N*vS8<5T=iv|o!zTe9k_2jC_j*7ik^M_ zaf%k{WX{-;0*`t`G!&`eW;gChVXnJ-Rn)To8vW-?>>a%QU1v`ZC=U)f8iA@%JG0mZ zDqH;~mgBnrCP~1II<=V9;EBL)J+xzCoiRBaeH&J6rL!{4zIY8tZka?_FBeQeNO3q6 zyG_alW54Ba&wQf{&F1v-r1R6ID)PTsqjIBc+5MHkcW5Fnvi~{-FjKe)t1bl}Y;z@< z=!%zvpRua>>t_x}^}z0<7MI!H2v6|XAyR9!t50q-A)xk0nflgF4*OQlCGK==4S|wc zRMsSscNhRzHMBU8TdcHN!q^I}x0iXJ%uehac|Zs_B$p@CnF)HeXPpB_Za}F{<@6-4 zl%kml@}kHQ(ypD8FsPJ2=14xXJE|b20RUIgs!2|R3>LUMGF6X*B_I|$`Qg=;zm7C z{mEDy9dTmPbued7mlO@phdmAmJ7p@GR1bjCkMw6*G7#4+`k>fk1czdJUB!e@Q(~6# zwo%@p@V5RL0ABU2LH7Asq^quDUho@H>eTZH9f*no9fY0T zD_-9px3e}A!>>kv5wk91%C9R1J_Nh!*&Kk$J3KNxC}c_@zlgpJZ+5L)Nw|^p=2ue}CJtm;uj*Iqr)K})kA$xtNUEvX;4!Px*^&9T_`IN{D z{6~QY=Nau6EzpvufB^hflc#XIsSq0Y9(nf$d~6ZwK}fal92)fr%T3=q{0mP-EyP_G z)UR5h@IX}3Qll2b0oCAcBF>b*@Etu*aTLPU<%C>KoOrk=x?pN!#f_Og-w+;xbFgjQ zXp`et%lDBBh~OcFnMKMUoox0YwBNy`N0q~bSPh@+enQ=4RUw1) zpovN`QoV>vZ#5LvC;cl|6jPr}O5tu!Ipoyib8iXqy}TeJ;4+_7r<1kV0v5?Kv>fYp zg>9L`;XwXa&W7-jf|9~uP2iyF5`5AJ`Q~p4eBU$MCC00`rcSF>`&0fbd^_eqR+}mK z4n*PMMa&FOcc)vTUR zlDUAn-mh`ahi_`f`=39JYTNVjsTa_Y3b1GOIi)6dY)D}xeshB0T8Eov5%UhWd1)u}kjEQ|LDo{tqKKrYIfVz~@dp!! zMOnah@vp)%_-jDTUG09l+;{CkDCH|Q{NqX*uHa1YxFShy*1+;J`gywKaz|2Q{lG8x zP?KBur`}r`!WLKXY_K;C8$EWG>jY3UIh{+BLv0=2)KH%P}6xE2kg)%(-uA6lC?u8}{K(#P*c zE9C8t*u%j2r_{;Rpe1A{9nNXU;b_N0vNgyK!EZVut~}+R2rcbsHilqsOviYh-pYX= zHw@53nlmwYI5W5KP>&`dBZe0Jn?nAdC^HY1wlR6$u^PbpB#AS&5L6zqrXN&7*N2Q` z+Rae1EwS)H=aVSIkr8Ek^1jy2iS2o7mqm~Mr&g5=jjt7VxwglQ^`h#Mx+x2v|9ZAwE$i_9918MjJxTMr?n!bZ6n$}y11u8I9COTU`Z$Fi z!AeAQLMw^gp_{+0QTEJrhL424pVDp%wpku~XRlD3iv{vQ!lAf!_jyqd_h}+Tr1XG| z`*FT*NbPqvHCUsYAkFnM`@l4u_QH&bszpUK#M~XLJt{%?00GXY?u_{gj3Hvs!=N(I z(=AuWPijyoU!r?aFTsa8pLB&cx}$*%;K$e*XqF{~*rA-qn)h^!(-;e}O#B$|S~c+U zN4vyOK0vmtx$5K!?g*+J@G1NmlEI=pyZXZ69tAv=@`t%ag_Hk{LP~OH9iE)I= zaJ69b4kuCkV0V zo(M0#>phpQ_)@j;h%m{-a*LGi(72TP)ws2w*@4|C-3+;=5DmC4s7Lp95%n%@Ko zfdr3-a7m*dys9iIci$A=4NPJ`HfJ;hujLgU)ZRuJI`n;Pw|yksu!#LQnJ#dJysgNb z@@qwR^wrk(jbq4H?d!lNyy72~Dnn87KxsgQ!)|*m(DRM+eC$wh7KnS-mho3|KE)7h zK3k;qZ;K1Lj6uEXLYUYi)1FN}F@-xJ z@@3Hb84sl|j{4$3J}aTY@cbX@pzB_qM~APljrjju6P0tY{C@ zpUCOz_NFmALMv1*blCcwUD3?U6tYs+N%cmJ98D%3)%)Xu^uvzF zS5O!sc#X6?EwsYkvPo6A%O8&y8sCCQH<%f2togVwW&{M;PR!a(ZT_A+jVAbf{@5kL zB@Z(hb$3U{T_}SKA_CoQVU-;j>2J=L#lZ~aQCFg-d<9rzs$_gO&d5N6eFSc z1ml8)P*FSi+k@!^M9nDWR5e@ATD8oxtDu=36Iv2!;dZzidIS(PCtEuXAtlBb1;H%Z zwnC^Ek*D)EX4#Q>R$$WA2sxC_t(!!6Tr?C#@{3}n{<^o;9id1RA&-Pig1e-2B1XpG zliNjgmd3c&%A}s>qf{_j#!Z`fu0xIwm4L0)OF=u(OEmp;bLCIaZX$&J_^Z%4Sq4GZ zPn6sV_#+6pJmDN_lx@1;Zw6Md_p0w9h6mHtzpuIEwNn>OnuRSC2=>fP^Hqgc)xu^4 z<3!s`cORHJh#?!nKI`Et7{3C27+EuH)Gw1f)aoP|B3y?fuVfvpYYmmukx0ya-)TQX zR{ggy5cNf4X|g)nl#jC9p>7|09_S7>1D2GTRBUTW zAkQ=JMRogZqG#v;^=11O6@rPPwvJkr{bW-Qg8`q8GoD#K`&Y+S#%&B>SGRL>;ZunM@49!}Uy zN|bBCJ%sO;@3wl0>0gbl3L@1^O60ONObz8ZI7nder>(udj-jt`;yj^nTQ$L9`OU9W zX4alF#$|GiR47%x@s&LV>2Sz2R6?;2R~5k6V>)nz!o_*1Y!$p>BC5&?hJg_MiE6UBy>RkVZj`9UWbRkN-Hk!S`=BS3t3uyX6)7SF#)71*}`~Ogz z1rap5H6~dhBJ83;q-Y<5V35C2&F^JI-it(=5D#v!fAi9p#UwV~2tZQI+W(Dv?1t9? zfh*xpxxO{-(VGB>!Q&0%^YW_F!@aZS#ucP|YaD#>wd1Fv&Z*SR&mc;asi}1G) z_H>`!akh-Zxq9#io(7%;a$)w+{QH)Y$?UK1Dt^4)up!Szcxnu}kn$0afcfJL#IL+S z5gF_Y30j;{lNrG6m~$Ay?)*V9fZuU@3=kd40=LhazjFrau>(Y>SJNtOz>8x_X-BlA zIpl{i>OarVGj1v(4?^1`R}aQB&WCRQzS~;7R{tDZG=HhgrW@B`W|#cdyj%YBky)P= zpxuOZkW>S6%q7U{VsB#G(^FMsH5QuGXhb(sY+!-R8Bmv6Sx3WzSW<1MPPN1!&PurYky(@`bP9tz z52}LH9Q?+FF5jR6-;|+GVdRA!qtd;}*-h&iIw3Tq3qF9sDIb1FFxGbo&fbG5n8$3F zyY&PWL{ys^dTO}oZ#@sIX^BKW*bon=;te9j5k+T%wJ zNJtoN1~YVj4~YRrlZl)b&kJqp+Z`DqT!la$x&&IxgOQw#yZd-nBP3!7FijBXD|IsU8Zl^ zc6?MKpJQ+7ka|tZQLfchD$PD|;K(9FiLE|eUZX#EZxhG!S-63C$jWX1Yd!6-Yxi-u zjULIr|0-Q%D9jz}IF~S%>0(jOqZ(Ln<$9PxiySr&2Oic7vb<8q=46)Ln%Z|<*z5&> z3f~Zw@m;vR(bESB<=Jqkxn(=#hQw42l(7)h`vMQQTttz9XW6^|^8EK7qhju4r_c*b zJIi`)MB$w@9epwdIfnEBR+?~);yd6C(LeMC& zn&&N*?-g&BBJcV;8&UoZi4Lmxcj16ojlxR~zMrf=O_^i1wGb9X-0@6_rpjPYemIin zmJb+;lHe;Yp=8G)Q(L1bzH*}I>}uAqhj4;g)PlvD9_e_ScR{Ipq|$8NvAvLD8MYr}xl=bU~)f%B3E>r3Bu9_t|ThF3C5~BdOve zEbk^r&r#PT&?^V1cb{72yEWH}TXEE}w>t!cY~rA+hNOTK8FAtIEoszp!qqptS&;r$ zaYV-NX96-h$6aR@1xz6_E0^N49mU)-v#bwtGJm)ibygzJ8!7|WIrcb`$XH~^!a#s& z{Db-0IOTFq#9!^j!n_F}#Z_nX{YzBK8XLPVmc&X`fT7!@$U-@2KM9soGbmOSAmqV z{nr$L^MBo_u^Joyf0E^=eo{Rt0{{e$IFA(#*kP@SQd6lWT2-#>` zP1)7_@IO!9lk>Zt?#CU?cuhiLF&)+XEM9B)cS(gvQT!X3`wL*{fArTS;Ak`J<84du zALKPz4}3nlG8Fo^MH0L|oK2-4xIY!~Oux~1sw!+It)&D3p;+N8AgqKI`ld6v71wy8I!eP0o~=RVcFQR2Gr(eP_JbSytoQ$Yt}l*4r@A8Me94y z8cTDWhqlq^qoAhbOzGBXv^Wa4vUz$(7B!mX`T=x_ueKRRDfg&Uc-e1+z4x$jyW_Pm zp?U;-R#xt^Z8Ev~`m`iL4*c#65Nn)q#=Y0l1AuD&+{|8-Gsij3LUZXpM0Bx0u7WWm zH|%yE@-#XEph2}-$-thl+S;__ciBxSSzHveP%~v}5I%u!z_l_KoW{KRx2=eB33umE zIYFtu^5=wGU`Jab8#}cnYry@9p5UE#U|VVvx_4l49JQ;jQdp(uw=$^A$EA$LM%vmE zvdEOaIcp5qX8wX{mYf0;#51~imYYPn4=k&#DsKTxo{_Mg*;S495?OBY?#gv=edYC* z^O@-sd-qa+U24xvcbL0@C7_6o!$`)sVr-jSJE4XQUQ$?L7}2(}Eixqv;L8AdJAVqc zq}RPgpnDb@E_;?6K58r3h4-!4rT4Ab#rLHLX?eMOfluJk=3i1@Gt1i#iA=O`M0@x! z(HtJP9BMHXEzuD93m|B&woj0g6T?f#^)>J>|I4C5?Gam>n9!8CT%~aT;=oco5d6U8 zMXl(=W;$ND_8+DD*?|5bJ!;8ebESXMUKBAf7YBwNVJibGaJ*(2G`F%wx)grqVPjudiaq^Kl&g$8A2 zWMxMr@_$c}d+;_B`#kUX-t|4VKH&_f^^EP0&=DPLW)H)UzBG%%Tra*5 z%$kyZe3I&S#gfie^z5)!twG={3Cuh)FdeA!Kj<-9** zvT*5%Tb`|QbE!iW-XcOuy39>D3oe6x{>&<#E$o8Ac|j)wq#kQzz|ATd=Z0K!p2$QE zPu?jL8Lb^y3_CQE{*}sTDe!2!dtlFjq&YLY@2#4>XS`}v#PLrpvc4*@q^O{mmnr5D zmyJq~t?8>FWU5vZdE(%4cuZuao0GNjp3~Dt*SLaxI#g_u>hu@k&9Ho*#CZP~lFJHj z(e!SYlLigyc?&5-YxlE{uuk$9b&l6d`uIlpg_z15dPo*iU&|Khx2*A5Fp;8iK_bdP z?T6|^7@lcx2j0T@x>X7|kuuBSB7<^zeY~R~4McconTxA2flHC0_jFxmSTv-~?zVT| zG_|yDqa9lkF*B6_{j=T>=M8r<0s;@z#h)3BQ4NLl@`Xr__o7;~M&dL3J8fP&zLfDfy z);ckcTev{@OUlZ`bCo(-3? z1u1xD`PKgSg?RqeVVsF<1SLF;XYA@Bsa&cY!I48ZJn1V<3d!?s=St?TLo zC0cNr`qD*M#s6f~X>SCNVkva^9A2ZP>CoJ9bvgXe_c}WdX-)pHM5m7O zrHt#g$F0AO+nGA;7dSJ?)|Mo~cf{z2L)Rz!`fpi73Zv)H=a5K)*$5sf_IZypi($P5 zsPwUc4~P-J1@^3C6-r9{V-u0Z&Sl7vNfmuMY4yy*cL>_)BmQF!8Om9Dej%cHxbIzA zhtV0d{=%cr?;bpBPjt@4w=#<>k5ee=TiWAXM2~tUGfm z$s&!Dm0R^V$}fOR*B^kGaipi~rx~A2cS0;t&khV1a4u38*XRUP~f za!rZMtay8bsLt6yFYl@>-y^31(*P!L^^s@mslZy(SMsv9bVoX`O#yBgEcjCmGpyc* zeH$Dw6vB5P*;jor+JOX@;6K#+xc)Z9B8M=x2a@Wx-{snPGpRmOC$zpsqW*JCh@M2Y z#K+M(>=#d^>Of9C`))h<=Bsy)6zaMJ&x-t%&+UcpLjV`jo4R2025 zXaG8EA!0lQa)|dx-@{O)qP6`$rhCkoQqZ`^SW8g-kOwrwsK8 z3ms*AIcyj}-1x&A&vSq{r=QMyp3CHdWH35!sad#!Sm>^|-|afB+Q;|Iq@LFgqIp#Z zD1%H+3I?6RGnk&IFo|u+E0dCxXz4yI^1i!QTu7uvIEH>i3rR{srcST`LIRwdV1P;W z+%AN1NIf@xxvVLiSX`8ILA8MzNqE&7>%jMzGt9wm78bo9<;h*W84i29^w!>V>{N+S zd`5Zmz^G;f=icvoOZfK5#1ctx*~UwD=ab4DGQXehQ!XYnak*dee%YN$_ZPL%KZuz$ zD;$PpT;HM^$KwtQm@7uvT`i6>Hae1CoRVM2)NL<2-k2PiX=eAx+-6j#JI?M}(tuBW zkF%jjLR)O`gI2fcPBxF^HeI|DWwQWHVR!;;{BXXHskxh8F@BMDn`oEi-NHt;CLymW z=KSv5)3dyzec0T5B*`g-MQ<;gz=nIWKUi9ko<|4I(-E0k$QncH>E4l z**1w&#={&zv4Tvhgz#c29`m|;lU-jmaXFMC11 z*dlXDMEOG>VoLMc>!rApwOu2prKSi*!w%`yzGmS+k(zm*CsLK*wv{S_0WX^8A-rKy zbk^Gf_92^7iB_uUF)EE+ET4d|X|>d&mdN?x@vxKAQk`O+r4Qdu>XGy(a(19g;=jU} zFX{O*_NG>!$@jh!U369Lnc+D~qch3uT+_Amyi}*k#LAAwh}k8IPK5a-WZ81ufD>l> z$4cF}GSz>ce`3FAic}6W4Z7m9KGO?(eWqi@L|5Hq0@L|&2flN1PVl}XgQ2q*_n2s3 zt5KtowNkTYB5b;SVuoXA@i5irXO)A&%7?V`1@HGCB&)Wgk+l|^XXChq;u(nyPB}b3 zY>m5jkxpZgi)zfbgv&ec4Zqdvm+D<?Im*mXweS9H+V>)zF#Zp3)bhl$PbISY{5=_z!8&*Jv~NYtI-g!>fDs zmvL5O^U%!^VaKA9gvKw|5?-jk>~%CVGvctKmP$kpnpfN{D8@X*Aazi$txfa%vd-|E z>kYmV66W!lNekJPom29LdZ%(I+ZLZYTXzTg*to~m?7vp%{V<~>H+2}PQ?PPAq`36R z<%wR8v6UkS>Wt#hzGk#44W<%9S=nBfB);6clKwnxY}T*w21Qc3_?IJ@4gYzC7s;WP zVQNI(M=S=JT#xsZy7G`cR(BP9*je0bfeN8JN5~zY(DDs0t{LpHOIbN);?T-69Pf3R zSNe*&p2%AwXHL>__g+xd4Hlc_vu<25H?(`nafS%)3UPP7_4;gk-9ckt8SJRTv5v0M z_Hww`qPudL?ajIR&X*;$y-`<)6dxx1U~5eGS13CB!lX;3w7n&lDDiArbAhSycd}+b zya_3p@A`$kQy;|NJZ~s44Hqo7Hwt}X86NK=(ey>lgWTtGL6k@Gy;PbO!M%1~Wcn2k zUFP|*5d>t-X*RU8g%>|(wwj*~#l4z^Aatf^DWd1Wj#Q*AY0D^V@sC`M zjJc6qXu0I7Y*2;;gGu!plAFzG=J;1%eIOdn zQA>J&e05UN*7I5@yRhK|lbBSfJ+5Uq;!&HV@xfPZrgD}kE*1DSq^=%{o%|LChhl#0 zlMb<^a6ixzpd{kNZr|3jTGeEzuo}-eLT-)Q$#b{!vKx8Tg}swCni>{#%vDY$Ww$84 zew3c9BBovqb}_&BRo#^!G(1Eg((BScRZ}C)Oz?y`T5wOrv);)b^4XR8 zhJo7+<^7)qB>I;46!GySzdneZ>n_E1oWZY;kf94#)s)kWjuJN1c+wbVoNQcmnv}{> zN0pF+Sl3E}UQ$}slSZeLJrwT>Sr}#V(dVaezCQl2|4LN`7L7v&siYR|r7M(*JYfR$ zst3=YaDw$FSc{g}KHO&QiKxuhEzF{f%RJLKe3p*7=oo`WNP)M(9X1zIQPP0XHhY3c znrP{$4#Ol$A0s|4S7Gx2L23dv*Gv2o;h((XVn+9+$qvm}s%zi6nI-_s6?mG! zj{DV;qesJb&owKeEK?=J>UcAlYckA7Sl+I&IN=yasrZOkejir*kE@SN`fk<8Fgx*$ zy&fE6?}G)d_N`){P~U@1jRVA|2*69)KSe_}!~?+`Yb{Y=O~_+@!j<&oVQQMnhoIRU zA0CyF1OFfkK44n*JD~!2!SCPM;PRSk%1XL=0&rz00wxPs&-_eapJy#$h!eqY%nS0{ z!aGg58JIJPF3_ci%n)QSVpa2H`vIe$RD43;#IRfDV&Ibit z+?>HW4{2wOfC6Fw)}4x}i1maDxcE1qi@BS*qcxD2gE@h3#4cgU*D-&3z7D|tVZWt= z-Cy2+*Cm@P4GN_TPUtaVyVesbVDazF@)j8VJ4>XZv!f%}&eO1SvIgr}4`A*3#vat< z_MoByL(qW6L7SFZ#|Gc1fFN)L2PxY+{B8tJp+pxRyz*87)vXR}*=&ahXjBlQKguuf zX6x<<6fQulE^C*KH8~W%ptpaC0l?b=_{~*U4?5Vt;dgM4t_{&UZ1C2j?b>b+5}{IF_CUyvz-@QZPMlJ)r_tS$9kH%RPv#2_nMb zRLj5;chJ72*U`Z@Dqt4$@_+k$%|8m(HqLG!qT4P^DdfvGf&){gKnGCX#H0!;W=AGP zbA&Z`-__a)VTS}kKFjWGk z%|>yE?t*EJ!qeQ%dPk$;xIQ+P0;()PCBDgjJm6Buj{f^awNoVx+9<|lg3%-$G(*f) zll6oOkN|yamn1uyl2*N-lnqRI1cvs_JxLTeahEK=THV$Sz*gQhKNb*p0fNoda#-&F zB-qJgW^g}!TtM|0bS2QZekW7_tKu%GcJ!4?lObt0z_$mZ4rbQ0o=^curCs3bJK6sq z9fu-aW-l#>z~ca(B;4yv;2RZ?tGYAU)^)Kz{L|4oPj zdOf_?de|#yS)p2v8-N||+XL=O*%3+y)oI(HbM)Ds?q8~HPzIP(vs*G`iddbWq}! z(2!VjP&{Z1w+%eUq^ '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# 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"' + +# 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 + which java >/dev/null 2>&1 || 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 + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + 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 + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# 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/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..ac1b06f93 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@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=. +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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..b71004546 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = '1-sprint-mission' + diff --git a/src/main/java/com/sprint/mission/Main.java b/src/main/java/com/sprint/mission/Main.java new file mode 100644 index 000000000..d2527f1b1 --- /dev/null +++ b/src/main/java/com/sprint/mission/Main.java @@ -0,0 +1,17 @@ +package com.sprint.mission; + +//TIP To Run code, press or +// click the icon in the gutter. +public class Main { + public static void main(String[] args) { + //TIP Press with your caret at the highlighted text + // to see how IntelliJ IDEA suggests fixing it. + System.out.printf("Hello and welcome!"); + + for (int i = 1; i <= 5; i++) { + //TIP Press to start debugging your code. We have set one breakpoint + // for you, but you can always add more by pressing . + System.out.println("i = " + i); + } + } +} \ No newline at end of file From ef7e36208a66de81cfeeb6f05327fa062b0c838f Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 8 Jan 2025 23:32:04 +0900 Subject: [PATCH 002/115] Create entity class and service interface --- .../mission/discodeit/entity/Channel.java | 34 +++++++++++++++++++ .../mission/discodeit/entity/Message.java | 32 +++++++++++++++++ .../sprint/mission/discodeit/entity/User.java | 32 +++++++++++++++++ .../discodeit/service/ChannelService.java | 13 +++++++ .../discodeit/service/MessageService.java | 15 ++++++++ .../discodeit/service/UserService.java | 14 ++++++++ 6 files changed, 140 insertions(+) create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Channel.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Message.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/User.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/ChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/MessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/UserService.java diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java new file mode 100644 index 000000000..a8232d90e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -0,0 +1,34 @@ +package com.sprint.mission.discodeit.entity; + +import java.util.List; +import java.util.UUID; + +public class Channel { + private UUID id; + private Long createdAt; + private Long updatedAt; + private List members; + private String name; + + public Channel(List members, String name) { + this.id = UUID.randomUUID(); + this.createdAt = System.currentTimeMillis(); + this.updatedAt = null; + this.members = members; + this.name = name; + } + + public List getMembers() { + return members; + } + + public String getName() { + return name; + } + + public void update(String name, List members) { + this.name = name; + this.members = members; + this.updatedAt = System.currentTimeMillis(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java new file mode 100644 index 000000000..1c4af918d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -0,0 +1,32 @@ +package com.sprint.mission.discodeit.entity; + +import java.util.UUID; + +public class Message { + private UUID id; + private Long createdAt; + private Long updatedAt; + private String content; + private User toUser; + + public Message(String content, User toUser) { + this.id = UUID.randomUUID(); + this.createdAt = System.currentTimeMillis(); + this.updatedAt = null; + this.content = content; + this.toUser = toUser; + } + + public String getContent() { + return content; + } + + public User getToUser() { + return toUser; + } + + public void update(String content) { + this.content = content; + this.updatedAt = System.currentTimeMillis(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java new file mode 100644 index 000000000..8c887fcf8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -0,0 +1,32 @@ +package com.sprint.mission.discodeit.entity; + +import java.util.UUID; + +public class User { + private UUID id; + private Long createdAt; + private Long updatedAt; + private String name; + private String password; + + public User(String name, String password) { + this.id = UUID.randomUUID(); + this.createdAt = System.currentTimeMillis(); + this.updatedAt = null; + this.name = name; + this.password = password; + } + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public void update(String password) { + this.password = password; + this.updatedAt = System.currentTimeMillis(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java new file mode 100644 index 000000000..46eaaf9a1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.Channel; + +public interface ChannelService { + void createChannel(); + + Channel getChannelById(); + + Channel updateChannel(); + + void deleteChannel(); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java new file mode 100644 index 000000000..566716783 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.Message; + +public interface MessageService { + + void createMessage(); + + Message getMessageById(); + + Message updateMessage(); + + void deleteMessage(); + +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java new file mode 100644 index 000000000..9695612f8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.entity.User; + +public interface UserService { + void createUser(); + + User getUserById(); + + User updateUser(); + + void deleteUser(); + +} From c62a7c14655e3f22adb74c5be9bd33f66d6ae98d Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 8 Jan 2025 23:33:37 +0900 Subject: [PATCH 003/115] Exclude Main class --- src/main/java/com/sprint/mission/Main.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/Main.java diff --git a/src/main/java/com/sprint/mission/Main.java b/src/main/java/com/sprint/mission/Main.java deleted file mode 100644 index d2527f1b1..000000000 --- a/src/main/java/com/sprint/mission/Main.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sprint.mission; - -//TIP To Run code, press or -// click the icon in the gutter. -public class Main { - public static void main(String[] args) { - //TIP Press with your caret at the highlighted text - // to see how IntelliJ IDEA suggests fixing it. - System.out.printf("Hello and welcome!"); - - for (int i = 1; i <= 5; i++) { - //TIP Press to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - System.out.println("i = " + i); - } - } -} \ No newline at end of file From c6688d8dc7409c574e10fd8c25f09e0728b4e3fc Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 8 Jan 2025 23:38:45 +0900 Subject: [PATCH 004/115] Update entity class add getter method --- .../com/sprint/mission/discodeit/entity/Channel.java | 12 ++++++++++++ .../com/sprint/mission/discodeit/entity/Message.java | 12 ++++++++++++ .../com/sprint/mission/discodeit/entity/User.java | 12 ++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index a8232d90e..e779260db 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -26,6 +26,18 @@ public String getName() { return name; } + public UUID getId() { + return id; + } + + public Long getCreatedAt() { + return createdAt; + } + + public Long getUpdatedAt() { + return updatedAt; + } + public void update(String name, List members) { this.name = name; this.members = members; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 1c4af918d..ffa0c62d6 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -25,6 +25,18 @@ public User getToUser() { return toUser; } + public UUID getId() { + return id; + } + + public Long getCreatedAt() { + return createdAt; + } + + public Long getUpdatedAt() { + return updatedAt; + } + public void update(String content) { this.content = content; this.updatedAt = System.currentTimeMillis(); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 8c887fcf8..9543d5e68 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -25,6 +25,18 @@ public String getPassword() { return password; } + public UUID getId() { + return id; + } + + public Long getCreatedAt() { + return createdAt; + } + + public Long getUpdatedAt() { + return updatedAt; + } + public void update(String password) { this.password = password; this.updatedAt = System.currentTimeMillis(); From 46efe920f3f776f5cdd74a6e2d9bcde69dadfd3b Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 9 Jan 2025 09:54:49 +0900 Subject: [PATCH 005/115] Implement business logic for User, Message, Channel Service --- .../mission/discodeit/JavaApplication.java | 7 +++ .../mission/discodeit/entity/Channel.java | 5 +- .../discodeit/service/ChannelService.java | 11 ++-- .../discodeit/service/MessageService.java | 10 ++-- .../discodeit/service/UserService.java | 10 ++-- .../service/jcf/JCFChannelService.java | 60 +++++++++++++++++++ .../service/jcf/JCFMessageService.java | 59 ++++++++++++++++++ .../discodeit/service/jcf/JCFUserSerivce.java | 58 ++++++++++++++++++ 8 files changed, 205 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/JavaApplication.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java new file mode 100644 index 000000000..21f54cd33 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit; + +public class JavaApplication { + public static void main(String[] args) { + + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index e779260db..0ec12b33b 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -38,9 +38,8 @@ public Long getUpdatedAt() { return updatedAt; } - public void update(String name, List members) { - this.name = name; - this.members = members; + public void update(User user) { + members.add(user); this.updatedAt = System.currentTimeMillis(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 46eaaf9a1..380c9ce5b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,13 +1,16 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; + +import java.util.UUID; public interface ChannelService { - void createChannel(); + void createChannel(Channel channel); - Channel getChannelById(); + Channel getChannelById(UUID id); - Channel updateChannel(); + Channel updateChannelById(UUID id, User newUser); - void deleteChannel(); + void deleteChannel(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 566716783..59e1838f8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -2,14 +2,16 @@ import com.sprint.mission.discodeit.entity.Message; +import java.util.UUID; + public interface MessageService { - void createMessage(); + void createMessage(Message message); - Message getMessageById(); + Message getMessageById(UUID id); - Message updateMessage(); + Message updateMessageId(UUID id, String newContent); - void deleteMessage(); + void deleteMessage(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 9695612f8..e38b6d3fc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -2,13 +2,15 @@ import com.sprint.mission.discodeit.entity.User; +import java.util.UUID; + public interface UserService { - void createUser(); + void createUser(User user); - User getUserById(); + User getUserById(UUID id); - User updateUser(); + User updateUserPasswordById(UUID id, String newPass); - void deleteUser(); + void deleteUser(User user); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java new file mode 100644 index 000000000..b9ada4b9b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -0,0 +1,60 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.ChannelService; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + +public class JCFChannelService implements ChannelService { + private final Map channelRepository; + + public JCFChannelService() { + this.channelRepository = new HashMap<>(); + } + + @Override + public void createChannel(Channel channel) { + if (channelRepository.get(channel.getId()) == null) { + channelRepository.put(channel.getId(), channel); + System.out.println("채널 생성이 완료되었습니다."); + } else { + System.out.println("이미 존재하는 채널입니다."); + } + } + + @Override + public Channel getChannelById(UUID id) { + if (channelRepository.get(id) != null) { + return channelRepository.get(id); + } else { + System.out.println("유효하지 않는 채널 ID이거나 존재하지 않는 채널입니다"); + return null; + } + } + + @Override + public Channel updateChannelById(UUID id, User newUser) { //새로운 유저가 채널에 들어갈때 + if (channelRepository.get(id) != null) { + Channel channel = getChannelById(id); + channel.update(newUser); + return channel; + } else { + System.out.println("유효하지 않는 채널 ID이거나 존재하지 않는 채널입니다."); + return null; + } + } + + @Override + public void deleteChannel(Channel channel) { + if (channelRepository.get(channel.getId()) != null) { + channelRepository.remove(channel.getId()); + System.out.println("채널 삭제가 완료되었습니다."); + } else { + System.out.println("채널이 존재하지 않거나 이미 삭제된 채널입니다"); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java new file mode 100644 index 000000000..ddde7e109 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -0,0 +1,59 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.service.MessageService; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + +public class JCFMessageService implements MessageService { + private final Map messageRepository; + + public JCFMessageService() { + this.messageRepository = new HashMap<>(); + } + + @Override + public void createMessage(Message message) { + if (messageRepository.get(message.getId()) == null) { + messageRepository.put(message.getId(), message); + System.out.println("메시지 생성이 완료되었습니다"); + } else { + System.out.println("이미 존재하는 메시지입니다"); + } + } + + @Override + public Message getMessageById(UUID id) { + if (messageRepository.get(id) != null) { + return messageRepository.get(id); + } else { + System.out.println("유효하지 않는 ID이거나 존재하지 않는 메시지입니다"); + return null; + } + } + + @Override + public Message updateMessageId(UUID id, String newContent) { + if (messageRepository.get(id) != null) { + Message message = messageRepository.get(id); + message.update(newContent); + return message; + } else { + System.out.println("유효하지 않는 ID이거나 존재하지 않는 메시지입니다"); + return null; + } + } + + @Override + public void deleteMessage(Message message) { + if (messageRepository.get(message.getId()) != null) { + messageRepository.remove(message.getId()); + System.out.println("메시지 삭제가 완료되었습니다"); + } else { + System.out.println("존재하지 않는 메시지입니다"); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java new file mode 100644 index 000000000..b3f4175ad --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java @@ -0,0 +1,58 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class JCFUserSerivce implements UserService { + private final Map userRepository; + + public JCFUserSerivce() { + this.userRepository = new HashMap<>(); + } + + @Override + public void createUser(User user) { + if (userRepository.get(user.getId()) == null) { + userRepository.put(user.getId(), user); + System.out.println("사용자 생성이 완료되었습니다."); + } else { + System.out.println("이미 존재하는 사용자입니다."); + } + } + + @Override + public User getUserById(UUID id) { + if (userRepository.get(id) != null) { + return userRepository.get(id); + } else { + System.out.println("유효하지 않는 사용자 ID이거나 존재하지 않는 사용자입니다"); + return null; + } + } + + @Override + public User updateUserPasswordById(UUID id, String newPass) { + if (userRepository.get(id) != null) { + User user = getUserById(id); + user.update(newPass); + return user; + } else { + System.out.println("존재하지 않는 사용자입니다"); + return null; + } + } + + @Override + public void deleteUser(User user) { + if (userRepository.get(user.getId()) != null) { + userRepository.remove(user.getId()); + System.out.println("사용자 삭제가 완료되었습니다."); + } else { + System.out.println("존재하지 않는 사용자입니다"); + } + } +} From 6622cdbe872de00928da80f935f305eb0cddf67d Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 9 Jan 2025 09:59:09 +0900 Subject: [PATCH 006/115] Update Message class --- .../java/com/sprint/mission/discodeit/entity/Message.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index ffa0c62d6..5f9485170 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -7,13 +7,15 @@ public class Message { private Long createdAt; private Long updatedAt; private String content; + private User fromUser; private User toUser; - public Message(String content, User toUser) { + public Message(String content, User fromUser ,User toUser) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; this.content = content; + this.fromUser = fromUser; this.toUser = toUser; } @@ -37,6 +39,10 @@ public Long getUpdatedAt() { return updatedAt; } + public User getFromUser() { + return fromUser; + } + public void update(String content) { this.content = content; this.updatedAt = System.currentTimeMillis(); From 8674e1f6d282d30957ad82045161e12e5153086f Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 9 Jan 2025 12:58:32 +0900 Subject: [PATCH 007/115] Add JavaApplication --- .../mission/discodeit/JavaApplication.java | 47 +++++++++++++++++++ .../mission/discodeit/entity/Channel.java | 20 +++++++- .../mission/discodeit/entity/Message.java | 14 +++++- .../sprint/mission/discodeit/entity/User.java | 20 +++++++- .../discodeit/service/ChannelService.java | 5 +- .../discodeit/service/MessageService.java | 6 ++- .../discodeit/service/UserService.java | 5 +- .../service/jcf/JCFChannelService.java | 32 ++++++++----- .../service/jcf/JCFMessageService.java | 30 ++++++++---- .../discodeit/service/jcf/JCFUserSerivce.java | 27 +++++++---- 10 files changed, 169 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 21f54cd33..31cff8d59 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -1,7 +1,54 @@ package com.sprint.mission.discodeit; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserSerivce; + +import java.util.List; + public class JavaApplication { + private static UserService userService = new JCFUserSerivce(); + private static MessageService messageService = new JCFMessageService(userService); + private static ChannelService channelService = new JCFChannelService(userService); + public static void main(String[] args) { + System.out.println("=========== User Service Test ==========="); + User user1 = userService.createUser("kim", "010-1234-1234", "1234"); + User user2 = userService.createUser("kim", "010-1234-1234", "1234"); + System.out.println(userService.getAllUser()); + User updateUser1 = userService.updateUserPasswordById(user1.getId(), "1111"); + System.out.println("updateUser1 = " + updateUser1); + userService.deleteUser(user1); + System.out.println(userService.getAllUser()); + + System.out.println("=========== Message Service Test ==========="); + User fromUser = userService.createUser("kim", "010-1111-1111", "1234"); + User toUser = userService.createUser("Lee", "010-2222-2222", "1234"); + Message message1 = messageService.createMessage("Simple content", fromUser, toUser); + System.out.println("message1 = " + message1); + Message updateMessage = messageService.updateMessageId(message1.getId(), "Update content"); + System.out.println("updateMessage = " + updateMessage); + messageService.deleteMessage(message1); + System.out.println(messageService.getAllMessages()); + + System.out.println("=========== Channel Service Test ==========="); + User owner = userService.createUser("1", "010-3333-3333", "1234"); + User member1 = userService.createUser("2", "010-4444-3333", "1234"); + User member2 = userService.createUser("3", "010-5555-3333", "1234"); + User member3 = userService.createUser("4", "010-6666-3333", "1234"); + List members = List.of(owner, member1, member2, member3); + Channel codeitChannel = channelService.createChannel(members, "Codeit", owner); + System.out.println("codeitChannel = " + codeitChannel); + User addUser = userService.createUser("5", "010-7777-3333", "1234"); + System.out.println("find channel : " + channelService.getChannelById(codeitChannel.getId())); + channelService.deleteChannel(codeitChannel); + System.out.println(channelService.getAllChannel()); } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 0ec12b33b..e424efbce 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -9,13 +9,15 @@ public class Channel { private Long updatedAt; private List members; private String name; + private User creator; - public Channel(List members, String name) { + public Channel(List members, String name, User creator) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; this.members = members; this.name = name; + this.creator = creator; } public List getMembers() { @@ -38,8 +40,24 @@ public Long getUpdatedAt() { return updatedAt; } + public User getCreator() { + return creator; + } + public void update(User user) { members.add(user); this.updatedAt = System.currentTimeMillis(); } + + @Override + public String toString() { + return "Channel{" + + "id=" + id + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + ", members=" + members + + ", name='" + name + '\'' + + ", creator=" + creator + + '}'; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 5f9485170..adfee9852 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -10,7 +10,7 @@ public class Message { private User fromUser; private User toUser; - public Message(String content, User fromUser ,User toUser) { + public Message(String content, User fromUser , User toUser) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; @@ -47,4 +47,16 @@ public void update(String content) { this.content = content; this.updatedAt = System.currentTimeMillis(); } + + @Override + public String toString() { + return "Message{" + + "id=" + id + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + ", content='" + content + '\'' + + ", fromUser=" + fromUser + + ", toUser=" + toUser + + '}'; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 9543d5e68..1c3754e5e 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -7,13 +7,15 @@ public class User { private Long createdAt; private Long updatedAt; private String name; + private String phone; private String password; - public User(String name, String password) { + public User(String name, String phone, String password) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; this.name = name; + this.phone = phone; this.password = password; } @@ -37,8 +39,24 @@ public Long getUpdatedAt() { return updatedAt; } + public String getPhone() { + return phone; + } + public void update(String password) { this.password = password; this.updatedAt = System.currentTimeMillis(); } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + ", name='" + name + '\'' + + ", phone='" + phone + '\'' + + ", password='" + password + '\'' + + '}'; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 380c9ce5b..67fbc361a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -3,14 +3,17 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import java.util.List; import java.util.UUID; public interface ChannelService { - void createChannel(Channel channel); + Channel createChannel(List members, String name, User creator); Channel getChannelById(UUID id); Channel updateChannelById(UUID id, User newUser); + List getAllChannel(); + void deleteChannel(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 59e1838f8..8ed5af548 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,17 +1,21 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import java.util.List; import java.util.UUID; public interface MessageService { - void createMessage(Message message); + Message createMessage(String content, User fromUser, User toUser); Message getMessageById(UUID id); Message updateMessageId(UUID id, String newContent); + List getAllMessages(); + void deleteMessage(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index e38b6d3fc..212692a4f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -2,13 +2,16 @@ import com.sprint.mission.discodeit.entity.User; +import java.util.List; import java.util.UUID; public interface UserService { - void createUser(User user); + User createUser(String name, String phone, String password); User getUserById(UUID id); + List getAllUser(); + User updateUserPasswordById(UUID id, String newPass); void deleteUser(User user); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index b9ada4b9b..8cba11e9a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -3,27 +3,32 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.UserService; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public class JCFChannelService implements ChannelService { private final Map channelRepository; + private UserService userService; - public JCFChannelService() { + public JCFChannelService(UserService userService) { + this.userService = userService; this.channelRepository = new HashMap<>(); } @Override - public void createChannel(Channel channel) { - if (channelRepository.get(channel.getId()) == null) { - channelRepository.put(channel.getId(), channel); - System.out.println("채널 생성이 완료되었습니다."); - } else { - System.out.println("이미 존재하는 채널입니다."); + public Channel createChannel(List members, String name, User creator) { + for (Channel channel : channelRepository.values()) { + if (channel.getName() == name) { + System.out.println("이미 존재하는 채널입니다"); + return null; + } } + Channel channel = new Channel(members, name, creator); + channelRepository.put(channel.getId(), channel); + System.out.println("채널이 생성되었습니다."); + return channel; } @Override @@ -39,7 +44,7 @@ public Channel getChannelById(UUID id) { @Override public Channel updateChannelById(UUID id, User newUser) { //새로운 유저가 채널에 들어갈때 if (channelRepository.get(id) != null) { - Channel channel = getChannelById(id); + Channel channel = channelRepository.get(id); channel.update(newUser); return channel; } else { @@ -48,6 +53,11 @@ public Channel updateChannelById(UUID id, User newUser) { //새로운 유저가 } } + @Override + public List getAllChannel() { + return new ArrayList<>(channelRepository.values()); + } + @Override public void deleteChannel(Channel channel) { if (channelRepository.get(channel.getId()) != null) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index ddde7e109..986233706 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -1,28 +1,33 @@ package com.sprint.mission.discodeit.service.jcf; import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public class JCFMessageService implements MessageService { private final Map messageRepository; + private UserService userService; - public JCFMessageService() { + public JCFMessageService(UserService userService) { this.messageRepository = new HashMap<>(); + this.userService = userService; } @Override - public void createMessage(Message message) { - if (messageRepository.get(message.getId()) == null) { - messageRepository.put(message.getId(), message); - System.out.println("메시지 생성이 완료되었습니다"); - } else { - System.out.println("이미 존재하는 메시지입니다"); + public Message createMessage(String content, User fromUser, User toUser) { + List users = userService.getAllUser(); + if (!(users.contains(fromUser) && users.contains(toUser))) { + System.out.println("수신자와 송신자를 확인해주세요"); + return null; } + Message message = new Message(content, fromUser, toUser); + messageRepository.put(message.getId(), message); + System.out.println("메시지 생성이 완료되었습니다"); + return message; } @Override @@ -47,6 +52,11 @@ public Message updateMessageId(UUID id, String newContent) { } } + @Override + public List getAllMessages() { + return new ArrayList<>(messageRepository.values()); + } + @Override public void deleteMessage(Message message) { if (messageRepository.get(message.getId()) != null) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java index b3f4175ad..af85e0b53 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java @@ -3,9 +3,7 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.service.UserService; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public class JCFUserSerivce implements UserService { private final Map userRepository; @@ -15,13 +13,17 @@ public JCFUserSerivce() { } @Override - public void createUser(User user) { - if (userRepository.get(user.getId()) == null) { - userRepository.put(user.getId(), user); - System.out.println("사용자 생성이 완료되었습니다."); - } else { - System.out.println("이미 존재하는 사용자입니다."); + public User createUser(String name, String phone, String password) { + for (User user : userRepository.values()) { + if (user.getPhone().equals(phone)) { + System.out.println("이미 해당 전화번호를 가진 사용자가 존재합니다."); + return null; // 이미 존재하면 반환 + } } + User createUser = new User(name, phone, password); + userRepository.put(createUser.getId(), createUser); + System.out.println("사용자 생성이 완료되었습니다."); + return createUser; } @Override @@ -34,6 +36,11 @@ public User getUserById(UUID id) { } } + @Override + public List getAllUser() { + return new ArrayList<>(userRepository.values()); + } + @Override public User updateUserPasswordById(UUID id, String newPass) { if (userRepository.get(id) != null) { @@ -50,7 +57,7 @@ public User updateUserPasswordById(UUID id, String newPass) { public void deleteUser(User user) { if (userRepository.get(user.getId()) != null) { userRepository.remove(user.getId()); - System.out.println("사용자 삭제가 완료되었습니다."); + System.out.println("사용자 " + user.getName() + " 삭제가 완료되었습니다."); } else { System.out.println("존재하지 않는 사용자입니다"); } From 98373b3c90fec75246ba8b240f1069eb71bff9c5 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 9 Jan 2025 16:43:40 +0900 Subject: [PATCH 008/115] Update JavaApplication --- src/main/java/com/sprint/mission/discodeit/JavaApplication.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 31cff8d59..c98262e62 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -48,7 +48,5 @@ public static void main(String[] args) { User addUser = userService.createUser("5", "010-7777-3333", "1234"); System.out.println("find channel : " + channelService.getChannelById(codeitChannel.getId())); channelService.deleteChannel(codeitChannel); - System.out.println(channelService.getAllChannel()); - } } From 275fc73bc26be3a91bedc0cc36cf534471c92fbe Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 10 Jan 2025 10:32:16 +0900 Subject: [PATCH 009/115] Refactor --- .../mission/discodeit/JavaApplication.java | 124 ++++++++++++++---- .../mission/discodeit/entity/Channel.java | 31 ++++- .../mission/discodeit/entity/Message.java | 24 +++- .../sprint/mission/discodeit/entity/User.java | 43 ++++-- .../sprint/mission/discodeit/log/MyLog.java | 19 +++ .../discodeit/service/ChannelService.java | 14 +- .../discodeit/service/MessageService.java | 9 +- .../discodeit/service/UserService.java | 10 +- .../service/jcf/JCFChannelService.java | 53 ++++---- .../service/jcf/JCFMessageService.java | 42 +++--- .../discodeit/service/jcf/JCFUserSerivce.java | 43 +++--- 11 files changed, 283 insertions(+), 129 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/log/MyLog.java diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index c98262e62..6ff2ffe7b 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -3,6 +3,7 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -18,35 +19,100 @@ public class JavaApplication { private static ChannelService channelService = new JCFChannelService(userService); public static void main(String[] args) { - System.out.println("=========== User Service Test ==========="); - User user1 = userService.createUser("kim", "010-1234-1234", "1234"); - User user2 = userService.createUser("kim", "010-1234-1234", "1234"); + System.out.println("<회원 생성하기>"); + MyLog user1 = userService.createUser("김민준", "010-1111-1111", "1234"); + MyLog user1_1 = userService.createUser("홍지훈", "010-1111-1111", "1234"); + MyLog user2 = userService.createUser("이서윤", "010-2222-1111", "1234"); + MyLog user3 = userService.createUser("박지훈", "010-3333-1111", "1234"); + MyLog user4 = userService.createUser("최지아", "010-4444-1111", "1234"); + MyLog user5 = userService.createUser("정다은", "010-5555-1111", "1234"); + System.out.println(user1.getData() + user1.getMessage()); + System.out.print("동일한 전화번호로 회원가입을 진행한 다른 사람 : "); + System.out.println(user1_1.getMessage()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<회원 전체 조회하기>"); + List users = userService.getAllUser(); + System.out.println(users); + System.out.println(); + System.out.println("<단일 회원 조회하기>"); + MyLog findUser1 = userService.getUserById("010-1111-1111"); + System.out.println(findUser1.getData() + " " +findUser1.getMessage()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<회원 비밀번호 업데이트 하기>"); + MyLog updateUser1 = userService.updateUserPassword("010-1111-1111", "0912"); + System.out.println(updateUser1.getData() + " " + updateUser1.getMessage()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<회원 정보 삭제하기>"); + MyLog deleteUser1 = userService.deleteUser(user1.getData()); + System.out.println(deleteUser1.getData() + deleteUser1.getMessage()); System.out.println(userService.getAllUser()); - User updateUser1 = userService.updateUserPasswordById(user1.getId(), "1111"); - System.out.println("updateUser1 = " + updateUser1); - userService.deleteUser(user1); - System.out.println(userService.getAllUser()); - - System.out.println("=========== Message Service Test ==========="); - User fromUser = userService.createUser("kim", "010-1111-1111", "1234"); - User toUser = userService.createUser("Lee", "010-2222-2222", "1234"); - Message message1 = messageService.createMessage("Simple content", fromUser, toUser); - System.out.println("message1 = " + message1); - Message updateMessage = messageService.updateMessageId(message1.getId(), "Update content"); - System.out.println("updateMessage = " + updateMessage); - messageService.deleteMessage(message1); - System.out.println(messageService.getAllMessages()); - - System.out.println("=========== Channel Service Test ==========="); - User owner = userService.createUser("1", "010-3333-3333", "1234"); - User member1 = userService.createUser("2", "010-4444-3333", "1234"); - User member2 = userService.createUser("3", "010-5555-3333", "1234"); - User member3 = userService.createUser("4", "010-6666-3333", "1234"); - List members = List.of(owner, member1, member2, member3); - Channel codeitChannel = channelService.createChannel(members, "Codeit", owner); - System.out.println("codeitChannel = " + codeitChannel); - User addUser = userService.createUser("5", "010-7777-3333", "1234"); - System.out.println("find channel : " + channelService.getChannelById(codeitChannel.getId())); - channelService.deleteChannel(codeitChannel); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<메시지 생성하기>"); + MyLog message2To3 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2.getData(), user3.getData()); + System.out.println(message2To3.getData()); + MyLog message3To2 = messageService.createMessage("네 만나서 반갑습니다!", user3.getData(), user2.getData()); + System.out.println(message3To2.getData()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<전체 메시지 조회하기>"); + List allMessages = messageService.getAllMessages(); + System.out.println(allMessages); + System.out.println("<단일 메시지 조회하기>"); + MyLog> getMessage = messageService.getMessageByUser(user2.getData(), user3.getData()); + System.out.println(getMessage.getData()); + MyLog> getMessageByDiff = messageService.getMessageByUser(user2.getData(), user4.getData()); + System.out.println("user2 -> user4 메시지 조회: " + getMessageByDiff.getMessage()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<메시지 내용 수정하기>"); + messageService.updateMessageId(message2To3.getData().getId(), "메시지 내용 업데이트"); + System.out.println(message2To3.getData()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<메시지 삭제하기>"); + MyLog deleteMessage = messageService.deleteMessage(message2To3.getData()); + System.out.println("user2 -> user3: " + deleteMessage.getMessage()); + System.out.println("전체 메시지 조회하기: " + messageService.getAllMessages()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<채널 생성하기>"); + MyLog channel1 = channelService.createChannel(userService.getAllUser(), "코드잇 디스코드", user2.getData()); + MyLog channel2 = channelService.createChannel(userService.getAllUser(), "코테 준비", user3.getData()); + System.out.println(channel1.getData()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<채널 단일 조회하기>"); + MyLog findChannel1 = channelService.getChannelByName("코드잇 디스코드"); + System.out.println("코드잇 디스코드 채널 찾기 : " + findChannel1.getData()); + System.out.println("<전체 채널 조회하기>"); + List allChannel = channelService.getAllChannel(); + System.out.println(allChannel); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<채널에 새로운 멤버 추가하기>"); + User newUser = new User("홍길동", "010-1234-4321", "1234"); + MyLog updateChannel2 = channelService.updateChannel("코테 준비", newUser); + System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2.getData()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<채널 삭제하기>"); + MyLog deleteChannel1 = channelService.deleteChannel("코테 준비"); + System.out.println("코테 준비 채널 삭제하기: " + deleteChannel1.getMessage()); + System.out.println(channelService.getAllChannel()); } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index e424efbce..3d9fb0554 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,7 +1,12 @@ package com.sprint.mission.discodeit.entity; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; public class Channel { private UUID id; @@ -45,19 +50,35 @@ public User getCreator() { } public void update(User user) { - members.add(user); + this.members.add(user); this.updatedAt = System.currentTimeMillis(); } @Override public String toString() { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + String createdAtFormatted = createdAt != null + ? LocalDateTime.ofInstant(Instant.ofEpochMilli(createdAt), ZoneId.systemDefault()).format(formatter) + : "N/A"; + String updatedAtFormatted = updatedAt != null + ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) + : "N/A"; + + String creatorName = creator != null ? creator.getName() : "Unknown"; + + String membersNames = (members != null && !members.isEmpty()) + ? members.stream().map(User::getName).collect(Collectors.joining(", ")) + : "No members"; + return "Channel{" + "id=" + id + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - ", members=" + members + + ", createdAt=" + createdAtFormatted + + ", updatedAt=" + updatedAtFormatted + + ", members=" + membersNames + ", name='" + name + '\'' + - ", creator=" + creator + + ", creator='" + creatorName + '\'' + '}'; } + } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index adfee9852..327107ca8 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,5 +1,9 @@ package com.sprint.mission.discodeit.entity; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.UUID; public class Message { @@ -50,13 +54,25 @@ public void update(String content) { @Override public String toString() { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + String createdAtFormatted = createdAt != null + ? LocalDateTime.ofInstant(Instant.ofEpochMilli(createdAt), ZoneId.systemDefault()).format(formatter) + : "N/A"; + String updatedAtFormatted = updatedAt != null + ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) + : "N/A"; + + String fromUserName = fromUser != null ? fromUser.getName() : "Unknown"; + String toUserName = toUser != null ? toUser.getName() : "Unknown"; + return "Message{" + "id=" + id + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + + ", createdAt=" + createdAtFormatted + + ", updatedAt=" + updatedAtFormatted + ", content='" + content + '\'' + - ", fromUser=" + fromUser + - ", toUser=" + toUser + + ", fromUser='" + fromUserName + '\'' + + ", toUser='" + toUserName + '\'' + '}'; } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 1c3754e5e..073d2cce6 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,5 +1,10 @@ package com.sprint.mission.discodeit.entity; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Objects; import java.util.UUID; public class User { @@ -48,15 +53,37 @@ public void update(String password) { this.updatedAt = System.currentTimeMillis(); } + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(createdAt, user.createdAt) && Objects.equals(updatedAt, user.updatedAt) && Objects.equals(name, user.name) && Objects.equals(phone, user.phone) && Objects.equals(password, user.password); + } + + @Override + public int hashCode() { + return Objects.hash(id, createdAt, updatedAt, name, phone, password); + } + @Override public String toString() { - return "User{" + - "id=" + id + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - ", name='" + name + '\'' + - ", phone='" + phone + '\'' + - ", password='" + password + '\'' + - '}'; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + String createdAtFormatted = createdAt != null + ? LocalDateTime.ofInstant(Instant.ofEpochMilli(createdAt), ZoneId.systemDefault()).format(formatter) + : "N/A"; + String updatedAtFormatted = updatedAt != null + ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) + : "N/A"; + + return "User {\n" + + " id=" + id + ",\n" + + " name='" + name + "',\n" + + " phone='" + phone + "',\n" + + " password='" + password + "',\n" + + " createdAt=" + createdAtFormatted + ",\n" + + " updatedAt=" + updatedAtFormatted + "\n" + + "}"; } + } diff --git a/src/main/java/com/sprint/mission/discodeit/log/MyLog.java b/src/main/java/com/sprint/mission/discodeit/log/MyLog.java new file mode 100644 index 000000000..bc98d3020 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/log/MyLog.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.log; + +public class MyLog { + private final T data; + private final String message; + + public MyLog(T data, String message) { + this.data = data; + this.message = message; + } + + public T getData() { + return data; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 67fbc361a..8076f21f9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -2,18 +2,20 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import java.util.List; -import java.util.UUID; public interface ChannelService { - Channel createChannel(List members, String name, User creator); + MyLog createChannel(List members, String name, User creator); - Channel getChannelById(UUID id); - - Channel updateChannelById(UUID id, User newUser); + MyLog getChannelByName(String name); List getAllChannel(); - void deleteChannel(Channel channel); + MyLog updateChannel(String name, User newUser); + + + + MyLog deleteChannel(String name); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 8ed5af548..2801c3e47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -2,20 +2,21 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import java.util.List; import java.util.UUID; public interface MessageService { - Message createMessage(String content, User fromUser, User toUser); + MyLog createMessage(String content, User fromUser, User toUser); - Message getMessageById(UUID id); + MyLog> getMessageByUser(User fromUser, User toUser); - Message updateMessageId(UUID id, String newContent); + MyLog updateMessageId(UUID id, String newContent); List getAllMessages(); - void deleteMessage(Message message); + MyLog deleteMessage(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 212692a4f..8098cd2d0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,19 +1,19 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import java.util.List; -import java.util.UUID; public interface UserService { - User createUser(String name, String phone, String password); + MyLog createUser(String name, String phone, String password); - User getUserById(UUID id); + MyLog getUserById(String phone); List getAllUser(); - User updateUserPasswordById(UUID id, String newPass); + MyLog updateUserPassword(String phone, String newPass); - void deleteUser(User user); + MyLog deleteUser(User user); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 8cba11e9a..cf8def05d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.UserService; @@ -18,39 +19,40 @@ public JCFChannelService(UserService userService) { } @Override - public Channel createChannel(List members, String name, User creator) { + public MyLog createChannel(List members, String name, User creator) { for (Channel channel : channelRepository.values()) { if (channel.getName() == name) { - System.out.println("이미 존재하는 채널입니다"); - return null; + return new MyLog<>(null, "이미 존재하는 채널입니다"); } } Channel channel = new Channel(members, name, creator); channelRepository.put(channel.getId(), channel); - System.out.println("채널이 생성되었습니다."); - return channel; + return new MyLog<>(channel, "채널 생성이 완료되었습니다"); } @Override - public Channel getChannelById(UUID id) { - if (channelRepository.get(id) != null) { - return channelRepository.get(id); - } else { - System.out.println("유효하지 않는 채널 ID이거나 존재하지 않는 채널입니다"); - return null; + public MyLog getChannelByName(String name) { + for (Channel channel : channelRepository.values()) { + if (channel.getName() == name) { + return new MyLog<>(channel, "입력하신 이름에 해당하는 채널을 발견하였습니다"); + } } + return new MyLog<>(null, "입력하신 이름에 해당하는 채널이 존재하지 않습니다"); } @Override - public Channel updateChannelById(UUID id, User newUser) { //새로운 유저가 채널에 들어갈때 - if (channelRepository.get(id) != null) { - Channel channel = channelRepository.get(id); - channel.update(newUser); - return channel; - } else { - System.out.println("유효하지 않는 채널 ID이거나 존재하지 않는 채널입니다."); - return null; + public MyLog updateChannel(String name, User newUser) {//새로운 유저가 채널에 들어갈때 + List users = userService.getAllUser(); + if (!users.contains(newUser)) { + userService.createUser(newUser.getName(), newUser.getPhone(), newUser.getPhone()); + } + for (Channel channel : channelRepository.values()) { + if (channel.getName() == name) { + channel.update(newUser); + return new MyLog<>(channel, "신규 회원이 채널에 등록되었습니다"); + } } + return new MyLog<>(null, "해당하는 채널을 찾지 못했습니다"); } @Override @@ -59,12 +61,13 @@ public List getAllChannel() { } @Override - public void deleteChannel(Channel channel) { - if (channelRepository.get(channel.getId()) != null) { - channelRepository.remove(channel.getId()); - System.out.println("채널 삭제가 완료되었습니다."); - } else { - System.out.println("채널이 존재하지 않거나 이미 삭제된 채널입니다"); + public MyLog deleteChannel(String name) { + for (Channel channel : channelRepository.values()) { + if (channel.getName() == name) { + channelRepository.remove(channel.getId()); + return new MyLog<>(channel, "해당 채널이 삭제되었습니다"); + } } + return new MyLog<>(null, "해당하는 채널이 존재하지 않습니다"); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 986233706..c690a549b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -18,38 +19,40 @@ public JCFMessageService(UserService userService) { } @Override - public Message createMessage(String content, User fromUser, User toUser) { + public MyLog createMessage(String content, User fromUser, User toUser) { List users = userService.getAllUser(); if (!(users.contains(fromUser) && users.contains(toUser))) { - System.out.println("수신자와 송신자를 확인해주세요"); - return null; + return new MyLog<>(null, "송수신자를 다시 확인해주세요"); } Message message = new Message(content, fromUser, toUser); messageRepository.put(message.getId(), message); - System.out.println("메시지 생성이 완료되었습니다"); - return message; + return new MyLog<>(message, "메시지 생성이 완료되었습니다"); } + // 메시지를 보낸 회원이 메시지 조회하기 @Override - public Message getMessageById(UUID id) { - if (messageRepository.get(id) != null) { - return messageRepository.get(id); - } else { - System.out.println("유효하지 않는 ID이거나 존재하지 않는 메시지입니다"); - return null; + public MyLog> getMessageByUser(User fromUser, User toUser) { + List messages = new ArrayList<>(); + for (Message message : messageRepository.values()) { + if (message.getFromUser().equals(fromUser) && message.getToUser().equals(toUser)) { + messages.add(message); + } + } + if (!messages.isEmpty()) { + return new MyLog<>(messages, "메시지 조회가 완료되었습니다"); } + + return new MyLog<>(null, "메시지가 조회되지 않습니다"); } @Override - public Message updateMessageId(UUID id, String newContent) { + public MyLog updateMessageId(UUID id, String newContent) { if (messageRepository.get(id) != null) { Message message = messageRepository.get(id); message.update(newContent); - return message; - } else { - System.out.println("유효하지 않는 ID이거나 존재하지 않는 메시지입니다"); - return null; + return new MyLog<>(message, "업데이트가 완료되었습니다"); } + return new MyLog<>(null, "존재하지 않는 메시지입니다"); } @Override @@ -58,12 +61,11 @@ public List getAllMessages() { } @Override - public void deleteMessage(Message message) { + public MyLog deleteMessage(Message message) { if (messageRepository.get(message.getId()) != null) { messageRepository.remove(message.getId()); - System.out.println("메시지 삭제가 완료되었습니다"); - } else { - System.out.println("존재하지 않는 메시지입니다"); + return new MyLog<>(message, "해당 메시지를 삭제하였습니다"); } + return new MyLog<>(null, "존재하지 않는 메시지입니다"); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java index af85e0b53..602f9b751 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.service.jcf; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.UserService; import java.util.*; @@ -13,27 +14,25 @@ public JCFUserSerivce() { } @Override - public User createUser(String name, String phone, String password) { + public MyLog createUser(String name, String phone, String password) { for (User user : userRepository.values()) { if (user.getPhone().equals(phone)) { - System.out.println("이미 해당 전화번호를 가진 사용자가 존재합니다."); - return null; // 이미 존재하면 반환 + return new MyLog<>(null, "이미 존재하는 아이디 입니다"); } } User createUser = new User(name, phone, password); userRepository.put(createUser.getId(), createUser); - System.out.println("사용자 생성이 완료되었습니다."); - return createUser; + return new MyLog<>(createUser, " 저장이 완료되었습니다"); } @Override - public User getUserById(UUID id) { - if (userRepository.get(id) != null) { - return userRepository.get(id); - } else { - System.out.println("유효하지 않는 사용자 ID이거나 존재하지 않는 사용자입니다"); - return null; + public MyLog getUserById(String phone) { + for (User user : userRepository.values()) { + if (user.getPhone() == phone) { + return new MyLog<>(user, "해당 아이디의 유저를 발견하였습니다"); + } } + return new MyLog<>(null, "해당 아이디를 가진 유저가 존재하지 않습니다"); } @Override @@ -42,24 +41,22 @@ public List getAllUser() { } @Override - public User updateUserPasswordById(UUID id, String newPass) { - if (userRepository.get(id) != null) { - User user = getUserById(id); - user.update(newPass); - return user; - } else { - System.out.println("존재하지 않는 사용자입니다"); - return null; + public MyLog updateUserPassword(String phone, String newPass) { + for (User user : userRepository.values()) { + if (user.getPhone() == phone) { + user.update(newPass); + return new MyLog<>(user, " 비밀번호 변경이 완료되었습니다"); + } } + return new MyLog<>(null, "입력하신 아이디에 해당하는 유저가 존재하지 않습니다"); } @Override - public void deleteUser(User user) { + public MyLog deleteUser(User user) { if (userRepository.get(user.getId()) != null) { userRepository.remove(user.getId()); - System.out.println("사용자 " + user.getName() + " 삭제가 완료되었습니다."); - } else { - System.out.println("존재하지 않는 사용자입니다"); + return new MyLog<>(user, " 삭제를 완료하였습니다"); } + return new MyLog<>(null, "존재하지 않는 사용자입니다"); } } From 61d0de24226ef92d889dfee88dd6e2eb7906cd24 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 10 Jan 2025 10:45:08 +0900 Subject: [PATCH 010/115] Update Service --- build.gradle | 1 + .../mission/discodeit/JavaApplication.java | 164 +++++++++++++----- .../mission/discodeit/entity/Channel.java | 22 ++- .../mission/discodeit/entity/Message.java | 38 ++-- .../sprint/mission/discodeit/entity/User.java | 33 ++-- .../mission/discodeit/error/ChannelError.java | 19 ++ .../mission/discodeit/error/MessageError.java | 17 ++ .../mission/discodeit/error/UserError.java | 20 +++ .../sprint/mission/discodeit/log/MyLog.java | 19 -- .../discodeit/service/ChannelService.java | 13 +- .../discodeit/service/MessageService.java | 15 +- .../discodeit/service/UserService.java | 9 +- .../service/jcf/JCFChannelService.java | 77 +++++--- .../service/jcf/JCFMessageService.java | 94 +++++++--- .../discodeit/service/jcf/JCFUserSerivce.java | 64 +++++-- 15 files changed, 426 insertions(+), 179 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/error/ChannelError.java create mode 100644 src/main/java/com/sprint/mission/discodeit/error/MessageError.java create mode 100644 src/main/java/com/sprint/mission/discodeit/error/UserError.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/log/MyLog.java diff --git a/build.gradle b/build.gradle index 668101a29..e5d950da9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'checkstyle' } group = 'com.sprint.mission' diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 6ff2ffe7b..949b854ef 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -3,7 +3,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -14,21 +13,37 @@ import java.util.List; public class JavaApplication { - private static UserService userService = new JCFUserSerivce(); - private static MessageService messageService = new JCFMessageService(userService); - private static ChannelService channelService = new JCFChannelService(userService); - public static void main(String[] args) { + UserService userService = JCFUserSerivce.getInstance(); + MessageService messageService = JCFMessageService.getInstance(); + ChannelService channelService = JCFChannelService.getInstance(); + System.out.println("<회원 생성하기>"); - MyLog user1 = userService.createUser("김민준", "010-1111-1111", "1234"); - MyLog user1_1 = userService.createUser("홍지훈", "010-1111-1111", "1234"); - MyLog user2 = userService.createUser("이서윤", "010-2222-1111", "1234"); - MyLog user3 = userService.createUser("박지훈", "010-3333-1111", "1234"); - MyLog user4 = userService.createUser("최지아", "010-4444-1111", "1234"); - MyLog user5 = userService.createUser("정다은", "010-5555-1111", "1234"); - System.out.println(user1.getData() + user1.getMessage()); - System.out.print("동일한 전화번호로 회원가입을 진행한 다른 사람 : "); - System.out.println(user1_1.getMessage()); + User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh!"); + User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh!"); + User user3 = userService.createUser("박지훈", "010-3333-1111", "Abcdefgh!"); + User user4 = userService.createUser("최지아", "010-4444-1111", "Abcdefgh!"); + User user5 = userService.createUser("정다은", "010-5555-1111", "Abcdefgh!"); + System.out.println(" - 회원 생성 시 발생할 수 있는 문제"); + System.out.print(" - 1. 동일한 전화번호로 회원 가입을 진행 : "); + try { + User user1_1 = userService.createUser("홍지훈", "010-1111-1111", "Abcdefgh!"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.print(" - 2. 올바르지 않은 전화번호 형식 : "); + try { + User unCorrectPhone = userService.createUser("김철수", "010-12345-12345", "Abcdefgh!"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.print(" - 3. 올바르지 않은 비밀번호 형식 : "); + try { + User unCorrectPass = userService.createUser("김영미", "010-1234-4321", "1234"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.println("회원 생성 시 문제가 발생하면 저장되지 않음을 확인: " + userService.getAllUser()); System.out.println(); System.out.println("==============================================================================="); System.out.println(); @@ -37,82 +52,139 @@ public static void main(String[] args) { System.out.println(users); System.out.println(); System.out.println("<단일 회원 조회하기>"); - MyLog findUser1 = userService.getUserById("010-1111-1111"); - System.out.println(findUser1.getData() + " " +findUser1.getMessage()); + User findUser1 = userService.getUserById("010-1111-1111"); + System.out.println("findUser : " + findUser1); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<회원 비밀번호 업데이트 하기>"); - MyLog updateUser1 = userService.updateUserPassword("010-1111-1111", "0912"); - System.out.println(updateUser1.getData() + " " + updateUser1.getMessage()); + User updateUser1 = userService.updateUserPassword("010-1111-1111", "Zdefdasdf!@"); + System.out.println("UpdatePassword : " + updateUser1); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<회원 정보 삭제하기>"); - MyLog deleteUser1 = userService.deleteUser(user1.getData()); - System.out.println(deleteUser1.getData() + deleteUser1.getMessage()); + userService.deleteUser("010-1111-1111"); System.out.println(userService.getAllUser()); + System.out.print(" - 회원 삭제 시 저장되어 있지 않는 회원일 경우 문제가 발생 : "); + try { + User unRegisterUser = new User("김미영", "010-4343-3434", "Rasdffa1234!"); + userService.deleteUser("010-4343-3434"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } System.out.println(); System.out.println("==============================================================================="); System.out.println(); + System.out.println("<메시지를 보낼 수 있는 테스트 채널을 생성함>"); + Channel testChannel = channelService.createChannel(userService.getAllUser(), "테스트1", user2); + Channel testChannel2 = channelService.createChannel(userService.getAllUser(), "테스트2", user3); + System.out.println(testChannel); System.out.println("<메시지 생성하기>"); - MyLog message2To3 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2.getData(), user3.getData()); - System.out.println(message2To3.getData()); - MyLog message3To2 = messageService.createMessage("네 만나서 반갑습니다!", user3.getData(), user2.getData()); - System.out.println(message3To2.getData()); + Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); + Message message2_2 = messageService.createMessage("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, testChannel); + Message message3_1 = messageService.createMessage("테스트 확인 용 메시지입니다!", user3, testChannel2); + System.out.println(message2_1); + Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, testChannel); + System.out.println(message3); + System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); + System.out.println(" - 1. 내용이 작성되지 않은 메시지 : "); + try { + Message message4 = messageService.createMessage("", user4, testChannel); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.print(" - 2. 채널에 등록되지 않은 회원이 메시지를 보낼 때 : "); + User unRegistUser1 = userService.createUser("미등록회원", "010-1919-9191", "Abcdefgh!"); + try { + Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); + } catch (Exception e) { + System.out.println(e.getMessage()); + } System.out.println(); System.out.println("==============================================================================="); System.out.println(); - System.out.println("<전체 메시지 조회하기>"); - List allMessages = messageService.getAllMessages(); + System.out.println("<하나의 채널에서 전체 메시지 조회하기>"); + System.out.print("테스트 1채널 전체 메시지 조회"); + List allMessages = messageService.getMessageByChannel("테스트1"); System.out.println(allMessages); + System.out.println(); + System.out.print("테스트 2채널 전체 메시지 조회"); + List allMessages2 = messageService.getMessageByChannel("테스트2"); + System.out.println(allMessages2); System.out.println("<단일 메시지 조회하기>"); - MyLog> getMessage = messageService.getMessageByUser(user2.getData(), user3.getData()); - System.out.println(getMessage.getData()); - MyLog> getMessageByDiff = messageService.getMessageByUser(user2.getData(), user4.getData()); - System.out.println("user2 -> user4 메시지 조회: " + getMessageByDiff.getMessage()); + List getMessage = messageService.getMessageByUser(user2); + System.out.println(getMessage); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 내용 수정하기>"); - messageService.updateMessageId(message2To3.getData().getId(), "메시지 내용 업데이트"); - System.out.println(message2To3.getData()); + Message updateMessage = messageService.updateMessageContent(message2_1.getId(), "메시지 내용 업데이트"); + System.out.println(updateMessage); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 삭제하기>"); - MyLog deleteMessage = messageService.deleteMessage(message2To3.getData()); - System.out.println("user2 -> user3: " + deleteMessage.getMessage()); + messageService.deleteMessage(message2_1); System.out.println("전체 메시지 조회하기: " + messageService.getAllMessages()); + System.out.print("임시로 만든 회원 삭제하기 : "); + userService.deleteUser("010-1919-9191"); + System.out.println("임시로 만든 채널 삭제하기 : "); + boolean deleteResult1 = channelService.deleteChannel("테스트1"); + boolean deleteResult2 = channelService.deleteChannel("테스트2"); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 생성하기>"); - MyLog channel1 = channelService.createChannel(userService.getAllUser(), "코드잇 디스코드", user2.getData()); - MyLog channel2 = channelService.createChannel(userService.getAllUser(), "코테 준비", user3.getData()); - System.out.println(channel1.getData()); + Channel channel1 = channelService.createChannel(userService.getAllUser(), "코드잇 디스코드", user2); + Channel channel2 = channelService.createChannel(userService.getAllUser(), "코테 준비", user3); + User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); + channelService.createChannel(userService.getAllUser(), "자바 공부합시다", channelCreator); + System.out.println(channel1); + System.out.println(channel2); + System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); + System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); + try { + Channel sameChannel = channelService.createChannel(userService.getAllUser(), "코드잇 디스코드", user4); + } catch (Exception e) { + System.out.println(e.getMessage()); + } System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 단일 조회하기>"); - MyLog findChannel1 = channelService.getChannelByName("코드잇 디스코드"); - System.out.println("코드잇 디스코드 채널 찾기 : " + findChannel1.getData()); + Channel findChannel1 = channelService.getChannelByName("코드잇 디스코드"); + System.out.println("코드잇 디스코드 채널 찾기 : " + findChannel1); System.out.println("<전체 채널 조회하기>"); List allChannel = channelService.getAllChannel(); System.out.println(allChannel); + System.out.println("<하나의 회원이 포함되어 있는 채널 조회>"); + List channelsByUserId = channelService.getChannelsByUserId(channelCreator); + System.out.println("김자바 회원이 포함되어 있는 채널 조회 : " + channelsByUserId); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널에 새로운 멤버 추가하기>"); - User newUser = new User("홍길동", "010-1234-4321", "1234"); - MyLog updateChannel2 = channelService.updateChannel("코테 준비", newUser); - System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2.getData()); + User newUser = userService.createUser("홍길동", "010-1234-4321", "Abcdefgh!"); + Channel updateChannel2 = channelService.addUserToChannel("코테 준비", newUser); + System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2); + System.out.println("<채널에 있는 멤버 채널 나가기>"); + channelService.removeUserFromChannel(channel2.getName(), user4); + System.out.println(channel2); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 삭제하기>"); - MyLog deleteChannel1 = channelService.deleteChannel("코테 준비"); - System.out.println("코테 준비 채널 삭제하기: " + deleteChannel1.getMessage()); - System.out.println(channelService.getAllChannel()); + channelService.deleteChannel("코테 준비"); + System.out.println("전체 채널 조회하기 : " + channelService.getAllChannel()); + System.out.print(" - 채널 삭제 시 잘못된 채널명을 입력하면 문제가 발생 : "); + try { + channelService.deleteChannel("잘못된이름"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 3d9fb0554..21e609a10 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -4,6 +4,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -25,14 +26,6 @@ public Channel(List members, String name, User creator) { this.creator = creator; } - public List getMembers() { - return members; - } - - public String getName() { - return name; - } - public UUID getId() { return id; } @@ -45,6 +38,14 @@ public Long getUpdatedAt() { return updatedAt; } + public List getMembers() { + return members; + } + + public String getName() { + return name; + } + public User getCreator() { return creator; } @@ -54,6 +55,11 @@ public void update(User user) { this.updatedAt = System.currentTimeMillis(); } + public void removeUser(User user) { + members.remove(user); + this.updatedAt = System.currentTimeMillis(); + } + @Override public String toString() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 327107ca8..a23c66047 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -11,24 +11,16 @@ public class Message { private Long createdAt; private Long updatedAt; private String content; - private User fromUser; - private User toUser; + private User writer; + private Channel channel; - public Message(String content, User fromUser , User toUser) { + public Message(String content, User writer, Channel channel) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; this.content = content; - this.fromUser = fromUser; - this.toUser = toUser; - } - - public String getContent() { - return content; - } - - public User getToUser() { - return toUser; + this.writer = writer; + this.channel = channel; } public UUID getId() { @@ -43,8 +35,16 @@ public Long getUpdatedAt() { return updatedAt; } - public User getFromUser() { - return fromUser; + public String getContent() { + return content; + } + + public User getWriter() { + return writer; + } + + public Channel getChannel() { + return channel; } public void update(String content) { @@ -63,16 +63,16 @@ public String toString() { ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) : "N/A"; - String fromUserName = fromUser != null ? fromUser.getName() : "Unknown"; - String toUserName = toUser != null ? toUser.getName() : "Unknown"; + String writerUserName = writer != null ? writer.getName() : "Unknown"; + String useChannelName = channel != null ? channel.getName() : "Unknown"; return "Message{" + "id=" + id + ", createdAt=" + createdAtFormatted + ", updatedAt=" + updatedAtFormatted + ", content='" + content + '\'' + - ", fromUser='" + fromUserName + '\'' + - ", toUser='" + toUserName + '\'' + + ", writer='" + writerUserName + '\'' + + ", channel='" + useChannelName + '\'' + '}'; } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 073d2cce6..6c24cc47e 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -24,14 +24,6 @@ public User(String name, String phone, String password) { this.password = password; } - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - public UUID getId() { return id; } @@ -44,25 +36,46 @@ public Long getUpdatedAt() { return updatedAt; } + public String getName() { + return name; + } + public String getPhone() { return phone; } + public String getPassword() { + return password; + } + public void update(String password) { this.password = password; this.updatedAt = System.currentTimeMillis(); } + // 유효성 검사 + //핸드폰 번호 형식을 지켜야 한다. + public static boolean isValidPhone(String phoneNumber) { + String phoneRegex = "^010-\\d{4}-\\d{4}$"; + return phoneNumber.matches(phoneRegex); + } + + //8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 한다 + public static boolean isValidPassword(String password) { + String passwordRegex = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$"; + return password.matches(passwordRegex); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; User user = (User) o; - return Objects.equals(id, user.id) && Objects.equals(createdAt, user.createdAt) && Objects.equals(updatedAt, user.updatedAt) && Objects.equals(name, user.name) && Objects.equals(phone, user.phone) && Objects.equals(password, user.password); + return Objects.equals(phone, user.phone); } @Override public int hashCode() { - return Objects.hash(id, createdAt, updatedAt, name, phone, password); + return Objects.hashCode(phone); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java b/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java new file mode 100644 index 000000000..463dd50f6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.error; + +public enum ChannelError { + DUPLICATE_NAME("이미 존재하는 채널입니다"), + CANNOTFOUND_NAME("해당 채널 이름이 존재하지 않습니다"), + EMPTY_CHANNEL("등록된 채널이 없습니다"), + EMPTY_USER("해당 아이디로 등록된 회원이 없습니다"), + ; + + private String message; + + ChannelError(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/error/MessageError.java b/src/main/java/com/sprint/mission/discodeit/error/MessageError.java new file mode 100644 index 000000000..397f45689 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/error/MessageError.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.error; + +public enum MessageError { + EMPTY_CONTENT("내용을 입력해주세요"), + EMPTY_MESSAGE("보낸 메시지가 없습니다"), + ; + + private String message; + + MessageError(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/error/UserError.java b/src/main/java/com/sprint/mission/discodeit/error/UserError.java new file mode 100644 index 000000000..7a4b9674b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/error/UserError.java @@ -0,0 +1,20 @@ +package com.sprint.mission.discodeit.error; + +public enum UserError { + CANNOTFOUND_PHONE("해당 아이디를 찾을 수가 없습니다."), + DUPLICATE_PHONE("이미 존재하는 아이디 입니다."), + INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), + INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), + EMPTY_USER("저장된 회원이 없습니다"), + CANNOTFOUND_USER("해당하는 회원을 찾을 수 없습니다"); + + private final String message; + + UserError(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/log/MyLog.java b/src/main/java/com/sprint/mission/discodeit/log/MyLog.java deleted file mode 100644 index bc98d3020..000000000 --- a/src/main/java/com/sprint/mission/discodeit/log/MyLog.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sprint.mission.discodeit.log; - -public class MyLog { - private final T data; - private final String message; - - public MyLog(T data, String message) { - this.data = data; - this.message = message; - } - - public T getData() { - return data; - } - - public String getMessage() { - return message; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 8076f21f9..58938078c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -2,20 +2,23 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; import java.util.List; public interface ChannelService { - MyLog createChannel(List members, String name, User creator); + Channel createChannel(List members, String name, User creator); - MyLog getChannelByName(String name); + Channel getChannelByName(String name); List getAllChannel(); - MyLog updateChannel(String name, User newUser); + List getChannelsByUserId(User user); + Channel addUserToChannel(String name, User newUser); + Channel removeUserFromChannel(String name, User removeUser); - MyLog deleteChannel(String name); + boolean deleteChannel(String name); + +// void removeUserFromAllChannels(User user); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 2801c3e47..afdbc3c47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,22 +1,27 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; import java.util.List; import java.util.UUID; public interface MessageService { - MyLog createMessage(String content, User fromUser, User toUser); + Message createMessage(String content, User writer, Channel channel); - MyLog> getMessageByUser(User fromUser, User toUser); + List getMessageByUser(User writer); - MyLog updateMessageId(UUID id, String newContent); + List getMessageByChannel(String channelName); + + Message updateMessageContent(UUID id, String newContent); List getAllMessages(); - MyLog deleteMessage(Message message); + boolean deleteMessageByWriter(User writer, UUID messageId); // 작성자가 특정 메시지를 삭제하기 + + void deleteAllMessageByWriter(User writer); // 작성자 회원이 삭제되었을 때 해당 메시지도 모두 조회되면 안된다 + void deleteAllMessageByChannel(Channel channel); // 채널이 사라졌을 때 해당 채널에 속한 메시지도 모두 조회되면 안 됨 } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 8098cd2d0..b7414c895 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,19 +1,18 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; import java.util.List; public interface UserService { - MyLog createUser(String name, String phone, String password); + User createUser(String name, String phone, String password); - MyLog getUserById(String phone); + User getUserById(String phone); List getAllUser(); - MyLog updateUserPassword(String phone, String newPass); + User updateUserPassword(String phone, String newPass); - MyLog deleteUser(User user); + boolean deleteUser(String phone); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index cf8def05d..74ae0c030 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -1,73 +1,110 @@ package com.sprint.mission.discodeit.service.jcf; import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; + import java.util.*; +import static com.sprint.mission.discodeit.error.ChannelError.*; + public class JCFChannelService implements ChannelService { private final Map channelRepository; - private UserService userService; + private static final ChannelService instance = new JCFChannelService(); + private final MessageService messageService; - public JCFChannelService(UserService userService) { - this.userService = userService; + private JCFChannelService() { this.channelRepository = new HashMap<>(); + this.messageService = JCFMessageService.getInstance(); + } + + public static ChannelService getInstance() { + return instance; } @Override - public MyLog createChannel(List members, String name, User creator) { + public Channel createChannel(List members, String name, User creator) throws IllegalArgumentException { for (Channel channel : channelRepository.values()) { if (channel.getName() == name) { - return new MyLog<>(null, "이미 존재하는 채널입니다"); + throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); } } Channel channel = new Channel(members, name, creator); channelRepository.put(channel.getId(), channel); - return new MyLog<>(channel, "채널 생성이 완료되었습니다"); + return channel; } @Override - public MyLog getChannelByName(String name) { + public Channel getChannelByName(String name) { for (Channel channel : channelRepository.values()) { if (channel.getName() == name) { - return new MyLog<>(channel, "입력하신 이름에 해당하는 채널을 발견하였습니다"); + return channel; } } - return new MyLog<>(null, "입력하신 이름에 해당하는 채널이 존재하지 않습니다"); + throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); } @Override - public MyLog updateChannel(String name, User newUser) {//새로운 유저가 채널에 들어갈때 - List users = userService.getAllUser(); - if (!users.contains(newUser)) { - userService.createUser(newUser.getName(), newUser.getPhone(), newUser.getPhone()); + public List getChannelsByUserId(User user) { + List channels = new ArrayList<>(); + for (Channel channel : channelRepository.values()) { + if (channel.getMembers().contains(user)) { + channels.add(channel); + } + } + if (!channels.isEmpty()) { + return channels; } + throw new IllegalArgumentException(EMPTY_CHANNEL.getMessage()); + } + + @Override + public Channel addUserToChannel(String name, User newUser) {//새로운 유저가 채널에 들어갈때 for (Channel channel : channelRepository.values()) { if (channel.getName() == name) { channel.update(newUser); - return new MyLog<>(channel, "신규 회원이 채널에 등록되었습니다"); + return channel; } } - return new MyLog<>(null, "해당하는 채널을 찾지 못했습니다"); + throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); } @Override public List getAllChannel() { + if (channelRepository.values() == null) { + throw new IllegalArgumentException(EMPTY_CHANNEL.getMessage()); + } return new ArrayList<>(channelRepository.values()); } @Override - public MyLog deleteChannel(String name) { + public Channel removeUserFromChannel(String name, User removeUser) { + for (Channel channel : channelRepository.values()) { + if (channel.getName() == name) { + channel.removeUser(removeUser); + return channel; + } + } + throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); + } + + @Override + public boolean deleteChannel(String name) { // 채널 삭제 시 해당 채널에 있는 메시지도 모두 삭제 for (Channel channel : channelRepository.values()) { if (channel.getName() == name) { channelRepository.remove(channel.getId()); - return new MyLog<>(channel, "해당 채널이 삭제되었습니다"); + System.out.println(channel.getName() + " 채널이 삭제되었습니다"); + for (Message message : messageService.getMessageByChannel(channel.getName())) { + messageService.deleteAllMessageByChannel(channel); + } + return true; } } - return new MyLog<>(null, "해당하는 채널이 존재하지 않습니다"); + throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index c690a549b..8d058230a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -1,71 +1,113 @@ package com.sprint.mission.discodeit.service.jcf; +import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; import java.util.*; +import static com.sprint.mission.discodeit.error.MessageError.*; + public class JCFMessageService implements MessageService { private final Map messageRepository; - private UserService userService; + private static final MessageService instance = new JCFMessageService(); - public JCFMessageService(UserService userService) { + private JCFMessageService() { this.messageRepository = new HashMap<>(); - this.userService = userService; + } + + public static MessageService getInstance() { + return instance; } @Override - public MyLog createMessage(String content, User fromUser, User toUser) { - List users = userService.getAllUser(); - if (!(users.contains(fromUser) && users.contains(toUser))) { - return new MyLog<>(null, "송수신자를 다시 확인해주세요"); + public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { + if (content.isEmpty()) { + throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } - Message message = new Message(content, fromUser, toUser); + + Message message = new Message(content, writer, channel); messageRepository.put(message.getId(), message); - return new MyLog<>(message, "메시지 생성이 완료되었습니다"); + return message; } // 메시지를 보낸 회원이 메시지 조회하기 @Override - public MyLog> getMessageByUser(User fromUser, User toUser) { + public List getMessageByUser(User writer) { List messages = new ArrayList<>(); for (Message message : messageRepository.values()) { - if (message.getFromUser().equals(fromUser) && message.getToUser().equals(toUser)) { + if (message.getWriter().equals(writer)) { messages.add(message); } } if (!messages.isEmpty()) { - return new MyLog<>(messages, "메시지 조회가 완료되었습니다"); + return messages; } - return new MyLog<>(null, "메시지가 조회되지 않습니다"); + throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); } @Override - public MyLog updateMessageId(UUID id, String newContent) { - if (messageRepository.get(id) != null) { - Message message = messageRepository.get(id); - message.update(newContent); - return new MyLog<>(message, "업데이트가 완료되었습니다"); + public List getMessageByChannel(String channelName) { + List messages = new ArrayList<>(); + for (Message message : messageRepository.values()) { + if (message.getChannel().getName() == channelName) { + messages.add(message); + } + } + if (!messages.isEmpty()) { + return messages; + } + throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + } + + + @Override + public Message updateMessageContent(UUID id, String newContent) { + Message findMessage = messageRepository.get(id); + if (newContent.isEmpty()) { + throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } - return new MyLog<>(null, "존재하지 않는 메시지입니다"); + findMessage.update(newContent); + return findMessage; } @Override public List getAllMessages() { + if (messageRepository.values() == null) { + throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + } return new ArrayList<>(messageRepository.values()); } @Override - public MyLog deleteMessage(Message message) { - if (messageRepository.get(message.getId()) != null) { - messageRepository.remove(message.getId()); - return new MyLog<>(message, "해당 메시지를 삭제하였습니다"); + public boolean deleteMessageByWriter(User writer, UUID messageId) { // 작성자만 본인 메시지를 삭제할 수 있다. + for (Message message : messageRepository.values()) { + if (message.getWriter().equals(writer) && message.getId() == messageId) { + messageRepository.remove(messageId); + return true; + } + } + throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + } + + @Override + public void deleteAllMessageByWriter(User writer) { + for (Message message : messageRepository.values()) { + if (message.getWriter().getPhone().equals(writer.getPhone())) { + messageRepository.remove(message.getId()); + } + } + } + + @Override + public void deleteAllMessageByChannel(Channel channel) { + for (Message message : messageRepository.values()) { + if (message.getChannel().getName().equals(channel.getName())) { + messageRepository.remove(message.getId()); + } } - return new MyLog<>(null, "존재하지 않는 메시지입니다"); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java index 602f9b751..559b1f343 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java @@ -1,62 +1,94 @@ package com.sprint.mission.discodeit.service.jcf; +import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.log.MyLog; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import java.util.*; +import static com.sprint.mission.discodeit.error.UserError.*; + public class JCFUserSerivce implements UserService { + private static final UserService instance = new JCFUserSerivce(); private final Map userRepository; + private final MessageService messageService; + private final ChannelService channelService; - public JCFUserSerivce() { + private JCFUserSerivce() { this.userRepository = new HashMap<>(); + this.messageService = JCFMessageService.getInstance(); + this.channelService = JCFChannelService.getInstance(); + } + + public static UserService getInstance() { + return instance; } @Override - public MyLog createUser(String name, String phone, String password) { + public User createUser(String name, String phone, String password) throws IllegalArgumentException { + if (!User.isValidPassword(password)) { + throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + } + + if (!User.isValidPhone(phone)) { + throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + } + for (User user : userRepository.values()) { if (user.getPhone().equals(phone)) { - return new MyLog<>(null, "이미 존재하는 아이디 입니다"); + throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); } } User createUser = new User(name, phone, password); userRepository.put(createUser.getId(), createUser); - return new MyLog<>(createUser, " 저장이 완료되었습니다"); + return createUser; } @Override - public MyLog getUserById(String phone) { + public User getUserById(String phone) { for (User user : userRepository.values()) { if (user.getPhone() == phone) { - return new MyLog<>(user, "해당 아이디의 유저를 발견하였습니다"); + return user; } } - return new MyLog<>(null, "해당 아이디를 가진 유저가 존재하지 않습니다"); + throw new IllegalArgumentException(CANNOTFOUND_PHONE.getMessage()); } @Override public List getAllUser() { + if (userRepository.values() == null) { + throw new IllegalArgumentException(EMPTY_USER.getMessage()); + } + return new ArrayList<>(userRepository.values()); } @Override - public MyLog updateUserPassword(String phone, String newPass) { + public User updateUserPassword(String phone, String newPass) { for (User user : userRepository.values()) { if (user.getPhone() == phone) { user.update(newPass); - return new MyLog<>(user, " 비밀번호 변경이 완료되었습니다"); + return user; } } - return new MyLog<>(null, "입력하신 아이디에 해당하는 유저가 존재하지 않습니다"); + throw new IllegalArgumentException(CANNOTFOUND_PHONE.getMessage()); } @Override - public MyLog deleteUser(User user) { - if (userRepository.get(user.getId()) != null) { - userRepository.remove(user.getId()); - return new MyLog<>(user, " 삭제를 완료하였습니다"); + public boolean deleteUser(String phone) { // 유저 정보 삭제 시 유저가 보낸 메시지와 채널 모두 조회가 되면 안된다. + for (User user : userRepository.values()) { + if (user.getPhone() == phone) { + userRepository.remove(user.getId()); + System.out.println(user.getName() + "님의 정보가 삭제되었습니다"); + messageService.deleteAllMessageByWriter(user); + for (Channel channel : channelService.getChannelsByUserId(user)) { + channel.removeUser(user); + } + return true; + } } - return new MyLog<>(null, "존재하지 않는 사용자입니다"); + throw new IllegalArgumentException(CANNOTFOUND_USER.getMessage()); } } From 7291f70613630b39d460727903cd6b03fd04a629 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 16 Jan 2025 09:46:13 +0900 Subject: [PATCH 011/115] Refactor the service code --- .../mission/discodeit/JavaApplication.java | 78 ++++++------- .../mission/discodeit/entity/Channel.java | 18 ++- .../sprint/mission/discodeit/entity/User.java | 21 ---- .../mission/discodeit/error/ChannelError.java | 5 +- .../mission/discodeit/error/MessageError.java | 3 +- .../mission/discodeit/error/UserError.java | 5 +- .../mission/discodeit/factory/Factory.java | 26 +++++ .../discodeit/service/ChannelService.java | 13 ++- .../discodeit/service/MessageService.java | 10 +- .../discodeit/service/UserService.java | 10 +- .../service/jcf/JCFChannelService.java | 108 ++++++++++-------- .../service/jcf/JCFMessageService.java | 90 ++++++++------- .../discodeit/service/jcf/JCFUserSerivce.java | 94 --------------- .../discodeit/service/jcf/JCFUserService.java | 85 ++++++++++++++ .../mission/discodeit/util/ValidPass.java | 9 ++ .../mission/discodeit/util/ValidPhone.java | 8 ++ 16 files changed, 316 insertions(+), 267 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/factory/Factory.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/ValidPass.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 949b854ef..68df95b59 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -8,22 +8,22 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.jcf.JCFChannelService; import com.sprint.mission.discodeit.service.jcf.JCFMessageService; -import com.sprint.mission.discodeit.service.jcf.JCFUserSerivce; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; import java.util.List; public class JavaApplication { public static void main(String[] args) { - UserService userService = JCFUserSerivce.getInstance(); - MessageService messageService = JCFMessageService.getInstance(); - ChannelService channelService = JCFChannelService.getInstance(); + UserService userService = new JCFUserService(); + MessageService messageService = new JCFMessageService(); + ChannelService channelService = new JCFChannelService(); System.out.println("<회원 생성하기>"); - User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh!"); - User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh!"); - User user3 = userService.createUser("박지훈", "010-3333-1111", "Abcdefgh!"); - User user4 = userService.createUser("최지아", "010-4444-1111", "Abcdefgh!"); - User user5 = userService.createUser("정다은", "010-5555-1111", "Abcdefgh!"); + User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); + User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh12312!!"); + User user3 = userService.createUser("박지훈", "010-3333-1111", "Abcdefgh12312!!"); + User user4 = userService.createUser("이채은", "010-4444-1111", "Abcdefgh12312!!"); + User user5 = userService.createUser("정다은", "010-5555-1111", "Abcdefgh12312!!"); System.out.println(" - 회원 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 동일한 전화번호로 회원 가입을 진행 : "); try { @@ -52,24 +52,24 @@ public static void main(String[] args) { System.out.println(users); System.out.println(); System.out.println("<단일 회원 조회하기>"); - User findUser1 = userService.getUserById("010-1111-1111"); + User findUser1 = userService.getUserByPhone("010-1111-1111"); System.out.println("findUser : " + findUser1); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<회원 비밀번호 업데이트 하기>"); - User updateUser1 = userService.updateUserPassword("010-1111-1111", "Zdefdasdf!@"); + User updateUser1 = userService.updateUserPassword(user1, "Zdefdasdf!@"); System.out.println("UpdatePassword : " + updateUser1); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<회원 정보 삭제하기>"); - userService.deleteUser("010-1111-1111"); + userService.deleteUser(user1); System.out.println(userService.getAllUser()); System.out.print(" - 회원 삭제 시 저장되어 있지 않는 회원일 경우 문제가 발생 : "); try { User unRegisterUser = new User("김미영", "010-4343-3434", "Rasdffa1234!"); - userService.deleteUser("010-4343-3434"); + userService.deleteUser(unRegisterUser); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -77,8 +77,10 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지를 보낼 수 있는 테스트 채널을 생성함>"); - Channel testChannel = channelService.createChannel(userService.getAllUser(), "테스트1", user2); - Channel testChannel2 = channelService.createChannel(userService.getAllUser(), "테스트2", user3); + Channel testChannel = channelService.createChannel(new Channel("테스트1", user2)); + Channel testChannel2 = channelService.createChannel(new Channel("테스트2", user3)); + testChannel.addManyUser(userService.getAllUser()); + testChannel2.addManyUser(userService.getAllUser()); System.out.println(testChannel); System.out.println("<메시지 생성하기>"); Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); @@ -88,7 +90,7 @@ public static void main(String[] args) { Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, testChannel); System.out.println(message3); System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); - System.out.println(" - 1. 내용이 작성되지 않은 메시지 : "); + System.out.print(" - 1. 내용이 작성되지 않은 메시지 : "); try { Message message4 = messageService.createMessage("", user4, testChannel); } catch (Exception e) { @@ -102,15 +104,16 @@ public static void main(String[] args) { System.out.println(e.getMessage()); } System.out.println(); + System.out.println("user2 = " + user2); System.out.println("==============================================================================="); System.out.println(); System.out.println("<하나의 채널에서 전체 메시지 조회하기>"); System.out.print("테스트 1채널 전체 메시지 조회"); - List allMessages = messageService.getMessageByChannel("테스트1"); + List allMessages = messageService.getMessageByChannel(testChannel); System.out.println(allMessages); System.out.println(); System.out.print("테스트 2채널 전체 메시지 조회"); - List allMessages2 = messageService.getMessageByChannel("테스트2"); + List allMessages2 = messageService.getMessageByChannel(testChannel2); System.out.println(allMessages2); System.out.println("<단일 메시지 조회하기>"); List getMessage = messageService.getMessageByUser(user2); @@ -125,27 +128,29 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 삭제하기>"); - messageService.deleteMessage(message2_1); - System.out.println("전체 메시지 조회하기: " + messageService.getAllMessages()); + messageService.removeMessageByWriter(user2, message2_1.getId()); + System.out.println("전체 메시지 조회하기: " + messageService.getMessageByUser(user2)); System.out.print("임시로 만든 회원 삭제하기 : "); - userService.deleteUser("010-1919-9191"); + userService.deleteUser(unRegistUser1); System.out.println("임시로 만든 채널 삭제하기 : "); - boolean deleteResult1 = channelService.deleteChannel("테스트1"); - boolean deleteResult2 = channelService.deleteChannel("테스트2"); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 생성하기>"); - Channel channel1 = channelService.createChannel(userService.getAllUser(), "코드잇 디스코드", user2); - Channel channel2 = channelService.createChannel(userService.getAllUser(), "코테 준비", user3); + Channel channel1 = channelService.createChannel(new Channel("코드잇 디스코드", user2)); + Channel channel2 = channelService.createChannel(new Channel("코테 준비", user3)); + channel1.addManyUser(userService.getAllUser()); + channel2.addManyUser(userService.getAllUser()); User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); - channelService.createChannel(userService.getAllUser(), "자바 공부합시다", channelCreator); + System.out.println("channelCreator = " + channelCreator.getId()); + Channel javaChannel = channelService.createChannel(new Channel("자바 공부합시다", channelCreator)); + channelService.addManyUserToChannel(javaChannel, userService.getAllUser()); System.out.println(channel1); System.out.println(channel2); System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); try { - Channel sameChannel = channelService.createChannel(userService.getAllUser(), "코드잇 디스코드", user4); + Channel sameChannel = channelService.createChannel(new Channel("코드잇 디스코드", user4)); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -156,8 +161,7 @@ public static void main(String[] args) { Channel findChannel1 = channelService.getChannelByName("코드잇 디스코드"); System.out.println("코드잇 디스코드 채널 찾기 : " + findChannel1); System.out.println("<전체 채널 조회하기>"); - List allChannel = channelService.getAllChannel(); - System.out.println(allChannel); + System.out.println(channelService.getAllChannel()); System.out.println("<하나의 회원이 포함되어 있는 채널 조회>"); List channelsByUserId = channelService.getChannelsByUserId(channelCreator); System.out.println("김자바 회원이 포함되어 있는 채널 조회 : " + channelsByUserId); @@ -166,23 +170,17 @@ public static void main(String[] args) { System.out.println(); System.out.println("<채널에 새로운 멤버 추가하기>"); User newUser = userService.createUser("홍길동", "010-1234-4321", "Abcdefgh!"); - Channel updateChannel2 = channelService.addUserToChannel("코테 준비", newUser); + Channel updateChannel2 = channelService.addUserToChannel(channel2, newUser); System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2); System.out.println("<채널에 있는 멤버 채널 나가기>"); - channelService.removeUserFromChannel(channel2.getName(), user4); + channelService.removeUserToChannel(channel2, user3); System.out.println(channel2); System.out.println(); System.out.println("==============================================================================="); System.out.println(); - System.out.println("<채널 삭제하기>"); - channelService.deleteChannel("코테 준비"); - System.out.println("전체 채널 조회하기 : " + channelService.getAllChannel()); - System.out.print(" - 채널 삭제 시 잘못된 채널명을 입력하면 문제가 발생 : "); - try { - channelService.deleteChannel("잘못된이름"); - } catch (Exception e) { - System.out.println(e.getMessage()); - } + System.out.println("<채널 삭제하기> : 코테 준비 채널 삭제"); + channelService.deleteChannel(channel2); + System.out.println(channelService.getAllChannel()); System.out.println(); System.out.println("==============================================================================="); System.out.println(); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 21e609a10..24ac861b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -5,6 +5,7 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -16,14 +17,16 @@ public class Channel { private List members; private String name; private User creator; + private List messages; - public Channel(List members, String name, User creator) { + public Channel(String name, User creator) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; - this.members = members; + this.members = new ArrayList<>(Arrays.asList(creator)); this.name = name; this.creator = creator; + this.messages = new ArrayList<>(); } public UUID getId() { @@ -50,11 +53,19 @@ public User getCreator() { return creator; } - public void update(User user) { + public List getMessages() { + return messages; + } + + public void addUser(User user) { this.members.add(user); this.updatedAt = System.currentTimeMillis(); } + public void addManyUser(List users) { + this.members.addAll(users); + } + public void removeUser(User user) { members.remove(user); this.updatedAt = System.currentTimeMillis(); @@ -84,6 +95,7 @@ public String toString() { ", members=" + membersNames + ", name='" + name + '\'' + ", creator='" + creatorName + '\'' + + ", messages= " + messages + '\'' + '}'; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 6c24cc47e..523c67f40 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -4,7 +4,6 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.Objects; import java.util.UUID; public class User { @@ -53,31 +52,12 @@ public void update(String password) { this.updatedAt = System.currentTimeMillis(); } - // 유효성 검사 - //핸드폰 번호 형식을 지켜야 한다. - public static boolean isValidPhone(String phoneNumber) { - String phoneRegex = "^010-\\d{4}-\\d{4}$"; - return phoneNumber.matches(phoneRegex); - } - //8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 한다 public static boolean isValidPassword(String password) { String passwordRegex = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$"; return password.matches(passwordRegex); } - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return Objects.equals(phone, user.phone); - } - - @Override - public int hashCode() { - return Objects.hashCode(phone); - } - @Override public String toString() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -98,5 +78,4 @@ public String toString() { " updatedAt=" + updatedAtFormatted + "\n" + "}"; } - } diff --git a/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java b/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java index 463dd50f6..7131548ca 100644 --- a/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java +++ b/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java @@ -2,9 +2,8 @@ public enum ChannelError { DUPLICATE_NAME("이미 존재하는 채널입니다"), - CANNOTFOUND_NAME("해당 채널 이름이 존재하지 않습니다"), - EMPTY_CHANNEL("등록된 채널이 없습니다"), - EMPTY_USER("해당 아이디로 등록된 회원이 없습니다"), + CANNOT_FOUND_NAME("해당 채널 이름이 존재하지 않습니다"), + CANNOT_FOUND_CHANNEL("등록된 채널이 없습니다"), ; private String message; diff --git a/src/main/java/com/sprint/mission/discodeit/error/MessageError.java b/src/main/java/com/sprint/mission/discodeit/error/MessageError.java index 397f45689..b0997c1f1 100644 --- a/src/main/java/com/sprint/mission/discodeit/error/MessageError.java +++ b/src/main/java/com/sprint/mission/discodeit/error/MessageError.java @@ -2,7 +2,8 @@ public enum MessageError { EMPTY_CONTENT("내용을 입력해주세요"), - EMPTY_MESSAGE("보낸 메시지가 없습니다"), + CANNOT_FOUND_MESSAGE("보낸 메시지가 없습니다"), + INVALID_WRITER("작성자가 올바르지 않습니다") ; private String message; diff --git a/src/main/java/com/sprint/mission/discodeit/error/UserError.java b/src/main/java/com/sprint/mission/discodeit/error/UserError.java index 7a4b9674b..0cadf1a1c 100644 --- a/src/main/java/com/sprint/mission/discodeit/error/UserError.java +++ b/src/main/java/com/sprint/mission/discodeit/error/UserError.java @@ -1,12 +1,11 @@ package com.sprint.mission.discodeit.error; public enum UserError { - CANNOTFOUND_PHONE("해당 아이디를 찾을 수가 없습니다."), + CANNOT_FOUND_PHONE("해당 아이디를 찾을 수가 없습니다."), DUPLICATE_PHONE("이미 존재하는 아이디 입니다."), INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), - EMPTY_USER("저장된 회원이 없습니다"), - CANNOTFOUND_USER("해당하는 회원을 찾을 수 없습니다"); + CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"); private final String message; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/Factory.java b/src/main/java/com/sprint/mission/discodeit/factory/Factory.java new file mode 100644 index 000000000..5be2aaa16 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/factory/Factory.java @@ -0,0 +1,26 @@ +package com.sprint.mission.discodeit.factory; + +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; + +public class Factory { + private static final UserService userService = new JCFUserService(); + private static final MessageService messageService = new JCFMessageService(); + private static final ChannelService channelService = new JCFChannelService(); + + public static UserService getUserService() { + return userService; + } + + public static MessageService getMessageService() { + return messageService; + } + + public static ChannelService getChannelService() { + return channelService; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 58938078c..32eb72d71 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -4,21 +4,24 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.UUID; public interface ChannelService { - Channel createChannel(List members, String name, User creator); + Channel createChannel(Channel channel); Channel getChannelByName(String name); + boolean channelExist(UUID uuid); + List getAllChannel(); List getChannelsByUserId(User user); - Channel addUserToChannel(String name, User newUser); + Channel addUserToChannel(Channel channel, User newUser); - Channel removeUserFromChannel(String name, User removeUser); + Channel addManyUserToChannel(Channel channel, List users); - boolean deleteChannel(String name); + Channel removeUserToChannel(Channel channel, User removeUser); -// void removeUserFromAllChannels(User user); + void deleteChannel(Channel removeChannel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index afdbc3c47..0ab2ed2e4 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -13,15 +13,13 @@ public interface MessageService { List getMessageByUser(User writer); - List getMessageByChannel(String channelName); + List getMessageByChannel(Channel channel); Message updateMessageContent(UUID id, String newContent); - List getAllMessages(); + void removeMessageByWriter(User writer, UUID uuid); - boolean deleteMessageByWriter(User writer, UUID messageId); // 작성자가 특정 메시지를 삭제하기 + void deleteMessageWithWriter(User writer); // 작성자가 특정 메시지를 삭제하기 - void deleteAllMessageByWriter(User writer); // 작성자 회원이 삭제되었을 때 해당 메시지도 모두 조회되면 안된다 - - void deleteAllMessageByChannel(Channel channel); // 채널이 사라졌을 때 해당 채널에 속한 메시지도 모두 조회되면 안 됨 + void deleteMessageWithChannel(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index b7414c895..4b3db7b13 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -3,16 +3,20 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; +import java.util.UUID; public interface UserService { User createUser(String name, String phone, String password); - User getUserById(String phone); + User getUserByPhone(String phone); + + boolean userExists(UUID uuid); List getAllUser(); - User updateUserPassword(String phone, String newPass); + User updateUserPassword(User user, String newPass); - boolean deleteUser(String phone); + void deleteUser(User removeUser); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 74ae0c030..41edd33a2 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -1,42 +1,44 @@ package com.sprint.mission.discodeit.service.jcf; import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import java.util.*; +import java.util.stream.Collectors; import static com.sprint.mission.discodeit.error.ChannelError.*; +import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; public class JCFChannelService implements ChannelService { private final Map channelRepository; - private static final ChannelService instance = new JCFChannelService(); + private final UserService userService; private final MessageService messageService; - private JCFChannelService() { + public JCFChannelService() { this.channelRepository = new HashMap<>(); - this.messageService = JCFMessageService.getInstance(); - } - - public static ChannelService getInstance() { - return instance; + this.userService = Factory.getUserService(); + this.messageService = Factory.getMessageService(); } @Override - public Channel createChannel(List members, String name, User creator) throws IllegalArgumentException { - for (Channel channel : channelRepository.values()) { - if (channel.getName() == name) { + public Channel createChannel(Channel createChannel) throws IllegalArgumentException { + for (Channel channel : channelRepository.values()) { // 채널 이름이 중복되면 안 됨 + if (channel.getName() == createChannel.getName()) { throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); } } - Channel channel = new Channel(members, name, creator); - channelRepository.put(channel.getId(), channel); - return channel; +// if (userService.getUserByPhone(createChannel.getCreator().getPhone()) == null) { +// throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); +// } + + channelRepository.put(createChannel.getId(), createChannel); + return createChannel; } @Override @@ -46,65 +48,75 @@ public Channel getChannelByName(String name) { return channel; } } - throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); + throw new IllegalArgumentException(CANNOT_FOUND_NAME.getMessage()); + } + + @Override + public boolean channelExist(UUID uuid) { + return channelRepository.containsKey(uuid); + } + + @Override + public List getAllChannel() { + return channelRepository.values().stream() + .collect(Collectors.toList()); } @Override public List getChannelsByUserId(User user) { +// if (!userService.userExists(user.getId())) { +// throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); +// } List channels = new ArrayList<>(); for (Channel channel : channelRepository.values()) { if (channel.getMembers().contains(user)) { channels.add(channel); } } - if (!channels.isEmpty()) { - return channels; - } - throw new IllegalArgumentException(EMPTY_CHANNEL.getMessage()); + return channels; } @Override - public Channel addUserToChannel(String name, User newUser) {//새로운 유저가 채널에 들어갈때 - for (Channel channel : channelRepository.values()) { - if (channel.getName() == name) { - channel.update(newUser); - return channel; - } + public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유저가 채널에 들어갈때 + if (!channelRepository.containsKey(channel.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + if (userService.userExists(newUser.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } - throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); + channel.addUser(newUser); + return channel; } @Override - public List getAllChannel() { - if (channelRepository.values() == null) { - throw new IllegalArgumentException(EMPTY_CHANNEL.getMessage()); + public Channel addManyUserToChannel(Channel channel, List users) { + if (!channelRepository.containsKey(channel.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } - return new ArrayList<>(channelRepository.values()); + channel.addManyUser(users); + return channel; } @Override - public Channel removeUserFromChannel(String name, User removeUser) { - for (Channel channel : channelRepository.values()) { - if (channel.getName() == name) { - channel.removeUser(removeUser); - return channel; - } + public Channel removeUserToChannel(Channel channel, User removeUser) { + if (!channelRepository.containsKey(channel.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + + if (userService.userExists(removeUser.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } - throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); + channel.removeUser(removeUser); + return channel; } @Override - public boolean deleteChannel(String name) { // 채널 삭제 시 해당 채널에 있는 메시지도 모두 삭제 - for (Channel channel : channelRepository.values()) { - if (channel.getName() == name) { - channelRepository.remove(channel.getId()); - System.out.println(channel.getName() + " 채널이 삭제되었습니다"); - for (Message message : messageService.getMessageByChannel(channel.getName())) { - messageService.deleteAllMessageByChannel(channel); - } - return true; - } + public void deleteChannel(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. + if (!channelRepository.containsKey(channel.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } - throw new IllegalArgumentException(CANNOTFOUND_NAME.getMessage()); + + messageService.deleteMessageWithChannel(channel); + channelRepository.remove(channel.getId()); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 8d058230a..30f4f57ff 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -3,23 +3,27 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.factory.Factory; +import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; import java.util.*; +import static com.sprint.mission.discodeit.error.ChannelError.CANNOT_FOUND_CHANNEL; import static com.sprint.mission.discodeit.error.MessageError.*; +import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; public class JCFMessageService implements MessageService { private final Map messageRepository; - private static final MessageService instance = new JCFMessageService(); + private final UserService userService; + private final ChannelService channelService; - private JCFMessageService() { + public JCFMessageService() { this.messageRepository = new HashMap<>(); - } - - public static MessageService getInstance() { - return instance; + this.userService = Factory.getUserService(); + this.channelService = Factory.getChannelService(); } @Override @@ -28,6 +32,14 @@ public Message createMessage(String content, User writer, Channel channel) throw throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } + if (userService.userExists(writer.getId())) { // 해당 작성자가 존재하는가 + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + + if (channelService.channelExist(channel.getId())) { // 해당 채널이 존재하는가? + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + Message message = new Message(content, writer, channel); messageRepository.put(message.getId(), message); return message; @@ -36,31 +48,30 @@ public Message createMessage(String content, User writer, Channel channel) throw // 메시지를 보낸 회원이 메시지 조회하기 @Override public List getMessageByUser(User writer) { + if (userService.userExists(writer.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } List messages = new ArrayList<>(); for (Message message : messageRepository.values()) { - if (message.getWriter().equals(writer)) { + if (message.getWriter().getPhone().equals(writer.getPhone())) { messages.add(message); } } - if (!messages.isEmpty()) { - return messages; - } - - throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + return messages; } @Override - public List getMessageByChannel(String channelName) { + public List getMessageByChannel(Channel channel) { + if (channelService.channelExist(channel.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } List messages = new ArrayList<>(); for (Message message : messageRepository.values()) { - if (message.getChannel().getName() == channelName) { + if (message.getChannel().getName().equals(channel.getName())) { messages.add(message); } } - if (!messages.isEmpty()) { - return messages; - } - throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + return messages; } @@ -75,38 +86,37 @@ public Message updateMessageContent(UUID id, String newContent) { } @Override - public List getAllMessages() { - if (messageRepository.values() == null) { - throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작성한 메시지 삭제하기 + if (!messageRepository.containsKey(uuid)) { + throw new IllegalArgumentException(CANNOT_FOUND_MESSAGE.getMessage()); } - return new ArrayList<>(messageRepository.values()); - } - - @Override - public boolean deleteMessageByWriter(User writer, UUID messageId) { // 작성자만 본인 메시지를 삭제할 수 있다. - for (Message message : messageRepository.values()) { - if (message.getWriter().equals(writer) && message.getId() == messageId) { - messageRepository.remove(messageId); - return true; - } + Message findMessage = messageRepository.get(uuid); + if (!findMessage.getWriter().getId().equals(writer.getId())) { + throw new IllegalArgumentException(INVALID_WRITER.getMessage()); } - throw new IllegalArgumentException(EMPTY_MESSAGE.getMessage()); + messageRepository.remove(uuid); } + @Override - public void deleteAllMessageByWriter(User writer) { - for (Message message : messageRepository.values()) { - if (message.getWriter().getPhone().equals(writer.getPhone())) { - messageRepository.remove(message.getId()); + public void deleteMessageWithWriter(User writer) { // 유저가 삭제될 때 메시지도 삭제되는 메서드 + Iterator iterator = messageRepository.values().iterator(); + while (iterator.hasNext()) { + Message message = iterator.next(); + if (Objects.equals(message.getWriter().getId(), writer.getId())) { + iterator.remove(); } } } + @Override - public void deleteAllMessageByChannel(Channel channel) { - for (Message message : messageRepository.values()) { - if (message.getChannel().getName().equals(channel.getName())) { - messageRepository.remove(message.getId()); + public void deleteMessageWithChannel(Channel channel) { // 채널이 삭제될 때 메시지도 없애는 메소드 + Iterator iterator = messageRepository.values().iterator(); + while (iterator.hasNext()) { + Message message = iterator.next(); + if (Objects.equals(message.getChannel().getId(), channel.getId())) { + iterator.remove(); } } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java deleted file mode 100644 index 559b1f343..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserSerivce.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.*; - -import static com.sprint.mission.discodeit.error.UserError.*; - -public class JCFUserSerivce implements UserService { - private static final UserService instance = new JCFUserSerivce(); - private final Map userRepository; - private final MessageService messageService; - private final ChannelService channelService; - - private JCFUserSerivce() { - this.userRepository = new HashMap<>(); - this.messageService = JCFMessageService.getInstance(); - this.channelService = JCFChannelService.getInstance(); - } - - public static UserService getInstance() { - return instance; - } - - @Override - public User createUser(String name, String phone, String password) throws IllegalArgumentException { - if (!User.isValidPassword(password)) { - throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); - } - - if (!User.isValidPhone(phone)) { - throw new IllegalArgumentException(INVALID_PHONE.getMessage()); - } - - for (User user : userRepository.values()) { - if (user.getPhone().equals(phone)) { - throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); - } - } - User createUser = new User(name, phone, password); - userRepository.put(createUser.getId(), createUser); - return createUser; - } - - @Override - public User getUserById(String phone) { - for (User user : userRepository.values()) { - if (user.getPhone() == phone) { - return user; - } - } - throw new IllegalArgumentException(CANNOTFOUND_PHONE.getMessage()); - } - - @Override - public List getAllUser() { - if (userRepository.values() == null) { - throw new IllegalArgumentException(EMPTY_USER.getMessage()); - } - - return new ArrayList<>(userRepository.values()); - } - - @Override - public User updateUserPassword(String phone, String newPass) { - for (User user : userRepository.values()) { - if (user.getPhone() == phone) { - user.update(newPass); - return user; - } - } - throw new IllegalArgumentException(CANNOTFOUND_PHONE.getMessage()); - } - - @Override - public boolean deleteUser(String phone) { // 유저 정보 삭제 시 유저가 보낸 메시지와 채널 모두 조회가 되면 안된다. - for (User user : userRepository.values()) { - if (user.getPhone() == phone) { - userRepository.remove(user.getId()); - System.out.println(user.getName() + "님의 정보가 삭제되었습니다"); - messageService.deleteAllMessageByWriter(user); - for (Channel channel : channelService.getChannelsByUserId(user)) { - channel.removeUser(user); - } - return true; - } - } - throw new IllegalArgumentException(CANNOTFOUND_USER.getMessage()); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java new file mode 100644 index 000000000..d1d77656b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -0,0 +1,85 @@ +package com.sprint.mission.discodeit.service.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.factory.Factory; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.ValidPass; +import com.sprint.mission.discodeit.util.ValidPhone; + +import java.util.*; + +import static com.sprint.mission.discodeit.error.UserError.*; + +public class JCFUserService implements UserService { + private final Map userRepository; + private final MessageService messageService; + private final ChannelService channelService; + + public JCFUserService() { + this.userRepository = new HashMap<>(); + this.messageService = Factory.getMessageService(); + this.channelService = Factory.getChannelService(); + } + + + @Override + public User createUser(String name, String phone, String password) throws IllegalArgumentException { + if (!ValidPass.isValidPassword(password)) { + throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + } + + if (!ValidPhone.isValidPhone(phone)) { + throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + } + + if (userRepository.values().stream() + .anyMatch(user -> user.getPhone().equals(phone))) { + throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + } + User user = new User(name, phone, password); + userRepository.put(user.getId(), user); + return user; + } + + @Override + public User getUserByPhone(String phone) { + return userRepository.values().stream() + .filter(user -> user.getPhone().equals(phone)) + .findFirst() + .orElseThrow(() -> new NoSuchElementException(CANNOT_FOUND_PHONE.getMessage())); + } + + @Override + public List getAllUser() { + return new ArrayList<>(userRepository.values()); + } + + @Override + public User updateUserPassword(User updateUser, String newPass) { + if (!userExists(updateUser.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + User findUser = userRepository.get(updateUser.getId()); + findUser.update(newPass); + return findUser; + } + + @Override + public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 보낸 메시지와 채널 모두 조회가 되면 안된다. + if (!userExists(removeUser.getId())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + messageService.deleteMessageWithWriter(removeUser); + channelService.getAllChannel().stream() + .forEach(channel -> channel.getMembers() + .removeIf(user -> user.getId().equals(removeUser.getId()))); + userRepository.remove(removeUser.getId()); + } + + @Override + public boolean userExists(UUID uuid) { + return userRepository.containsKey(uuid); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/util/ValidPass.java b/src/main/java/com/sprint/mission/discodeit/util/ValidPass.java new file mode 100644 index 000000000..f534a096e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/ValidPass.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.util; + +public class ValidPass { + //8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 한다 + public static boolean isValidPassword(String password) { + String passwordRegex = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$"; + return password.matches(passwordRegex); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java b/src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java new file mode 100644 index 000000000..3c2f76d82 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.util; + +public class ValidPhone { + public static boolean isValidPhone(String phoneNumber) { + String phoneRegex = "^010-\\d{4}-\\d{4}$"; + return phoneNumber.matches(phoneRegex); + } +} From ee39c05a2c6a7bb6010a2ece6c039e184a7efc43 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 16 Jan 2025 19:59:03 +0900 Subject: [PATCH 012/115] Refactor the service code --- .../mission/discodeit/JavaApplication.java | 23 +++++++++++-------- .../mission/discodeit/entity/Channel.java | 8 +------ .../discodeit/service/ChannelService.java | 5 ++-- .../discodeit/service/MessageService.java | 2 -- .../discodeit/service/UserService.java | 4 ++-- .../service/jcf/JCFChannelService.java | 21 +++++++---------- .../service/jcf/JCFMessageService.java | 16 ++----------- .../discodeit/service/jcf/JCFUserService.java | 21 +++++++++-------- 8 files changed, 41 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 68df95b59..fc3f9e111 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -11,6 +11,7 @@ import com.sprint.mission.discodeit.service.jcf.JCFUserService; import java.util.List; +import java.util.Optional; public class JavaApplication { public static void main(String[] args) { @@ -52,7 +53,7 @@ public static void main(String[] args) { System.out.println(users); System.out.println(); System.out.println("<단일 회원 조회하기>"); - User findUser1 = userService.getUserByPhone("010-1111-1111"); + Optional findUser1 = userService.getUserByPhone("010-1111-1111"); System.out.println("findUser : " + findUser1); System.out.println(); System.out.println("==============================================================================="); @@ -77,8 +78,8 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지를 보낼 수 있는 테스트 채널을 생성함>"); - Channel testChannel = channelService.createChannel(new Channel("테스트1", user2)); - Channel testChannel2 = channelService.createChannel(new Channel("테스트2", user3)); + Channel testChannel = channelService.createChannel("테스트1", user4); + Channel testChannel2 = channelService.createChannel("테스트2", user5); testChannel.addManyUser(userService.getAllUser()); testChannel2.addManyUser(userService.getAllUser()); System.out.println(testChannel); @@ -107,7 +108,7 @@ public static void main(String[] args) { System.out.println("user2 = " + user2); System.out.println("==============================================================================="); System.out.println(); - System.out.println("<하나의 채널에서 전체 메시지 조회하기>"); + System.out.println("<특정 채널에서 전체 메시지 조회하기>"); System.out.print("테스트 1채널 전체 메시지 조회"); List allMessages = messageService.getMessageByChannel(testChannel); System.out.println(allMessages); @@ -137,20 +138,20 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 생성하기>"); - Channel channel1 = channelService.createChannel(new Channel("코드잇 디스코드", user2)); - Channel channel2 = channelService.createChannel(new Channel("코테 준비", user3)); + Channel channel1 = channelService.createChannel("코드잇 디스코드", user2); + System.out.println("channel1 = " + channel1); + Channel channel2 = channelService.createChannel("코테 준비", user3); channel1.addManyUser(userService.getAllUser()); channel2.addManyUser(userService.getAllUser()); User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); - System.out.println("channelCreator = " + channelCreator.getId()); - Channel javaChannel = channelService.createChannel(new Channel("자바 공부합시다", channelCreator)); + Channel javaChannel = channelService.createChannel("자바 공부합시다", channelCreator); channelService.addManyUserToChannel(javaChannel, userService.getAllUser()); System.out.println(channel1); System.out.println(channel2); System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); try { - Channel sameChannel = channelService.createChannel(new Channel("코드잇 디스코드", user4)); + Channel sameChannel = channelService.createChannel("코드잇 디스코드", user4); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -158,7 +159,7 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 단일 조회하기>"); - Channel findChannel1 = channelService.getChannelByName("코드잇 디스코드"); + Optional findChannel1 = channelService.getChannelByName("코드잇 디스코드"); System.out.println("코드잇 디스코드 채널 찾기 : " + findChannel1); System.out.println("<전체 채널 조회하기>"); System.out.println(channelService.getAllChannel()); @@ -184,5 +185,7 @@ public static void main(String[] args) { System.out.println(); System.out.println("==============================================================================="); System.out.println(); + System.out.println("<심화> - 채널을 삭제하면 해당 채널에 있던 메시지가 조회되면 안된다."); + } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 24ac861b3..d84b35aab 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -17,7 +17,6 @@ public class Channel { private List members; private String name; private User creator; - private List messages; public Channel(String name, User creator) { this.id = UUID.randomUUID(); @@ -26,7 +25,6 @@ public Channel(String name, User creator) { this.members = new ArrayList<>(Arrays.asList(creator)); this.name = name; this.creator = creator; - this.messages = new ArrayList<>(); } public UUID getId() { @@ -53,10 +51,6 @@ public User getCreator() { return creator; } - public List getMessages() { - return messages; - } - public void addUser(User user) { this.members.add(user); this.updatedAt = System.currentTimeMillis(); @@ -64,6 +58,7 @@ public void addUser(User user) { public void addManyUser(List users) { this.members.addAll(users); + this.updatedAt = System.currentTimeMillis(); } public void removeUser(User user) { @@ -95,7 +90,6 @@ public String toString() { ", members=" + membersNames + ", name='" + name + '\'' + ", creator='" + creatorName + '\'' + - ", messages= " + messages + '\'' + '}'; } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 32eb72d71..eaff10ccf 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -4,12 +4,13 @@ import com.sprint.mission.discodeit.entity.User; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface ChannelService { - Channel createChannel(Channel channel); + Channel createChannel(String name, User creator); - Channel getChannelByName(String name); + Optional getChannelByName(String name); boolean channelExist(UUID uuid); diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 0ab2ed2e4..79a5f0add 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -19,7 +19,5 @@ public interface MessageService { void removeMessageByWriter(User writer, UUID uuid); - void deleteMessageWithWriter(User writer); // 작성자가 특정 메시지를 삭제하기 - void deleteMessageWithChannel(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 4b3db7b13..3e7cc112e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -9,9 +9,9 @@ public interface UserService { User createUser(String name, String phone, String password); - User getUserByPhone(String phone); + Optional getUserByPhone(String phone); - boolean userExists(UUID uuid); + boolean userExists(String phone); List getAllUser(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 41edd33a2..f0b71a4e0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -27,28 +27,26 @@ public JCFChannelService() { } @Override - public Channel createChannel(Channel createChannel) throws IllegalArgumentException { + public Channel createChannel(String name, User creator) throws IllegalArgumentException { for (Channel channel : channelRepository.values()) { // 채널 이름이 중복되면 안 됨 - if (channel.getName() == createChannel.getName()) { + if (channel.getName().equals(name)) { throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); } } -// if (userService.getUserByPhone(createChannel.getCreator().getPhone()) == null) { -// throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); -// } + Channel createChannel = new Channel(name, creator); channelRepository.put(createChannel.getId(), createChannel); return createChannel; } @Override - public Channel getChannelByName(String name) { + public Optional getChannelByName(String name) { for (Channel channel : channelRepository.values()) { if (channel.getName() == name) { - return channel; + return Optional.of(channel); } } - throw new IllegalArgumentException(CANNOT_FOUND_NAME.getMessage()); + return Optional.empty(); } @Override @@ -64,9 +62,6 @@ public List getAllChannel() { @Override public List getChannelsByUserId(User user) { -// if (!userService.userExists(user.getId())) { -// throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); -// } List channels = new ArrayList<>(); for (Channel channel : channelRepository.values()) { if (channel.getMembers().contains(user)) { @@ -81,7 +76,7 @@ public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유 if (!channelRepository.containsKey(channel.getId())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } - if (userService.userExists(newUser.getId())) { + if (userService.userExists(newUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } channel.addUser(newUser); @@ -103,7 +98,7 @@ public Channel removeUserToChannel(Channel channel, User removeUser) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } - if (userService.userExists(removeUser.getId())) { + if (userService.userExists(removeUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } channel.removeUser(removeUser); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 30f4f57ff..f9fb18b82 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -32,7 +32,7 @@ public Message createMessage(String content, User writer, Channel channel) throw throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } - if (userService.userExists(writer.getId())) { // 해당 작성자가 존재하는가 + if (userService.userExists(writer.getPhone())) { // 해당 작성자가 존재하는가 throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } @@ -48,7 +48,7 @@ public Message createMessage(String content, User writer, Channel channel) throw // 메시지를 보낸 회원이 메시지 조회하기 @Override public List getMessageByUser(User writer) { - if (userService.userExists(writer.getId())) { + if (userService.userExists(writer.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } List messages = new ArrayList<>(); @@ -98,18 +98,6 @@ public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작 } - @Override - public void deleteMessageWithWriter(User writer) { // 유저가 삭제될 때 메시지도 삭제되는 메서드 - Iterator iterator = messageRepository.values().iterator(); - while (iterator.hasNext()) { - Message message = iterator.next(); - if (Objects.equals(message.getWriter().getId(), writer.getId())) { - iterator.remove(); - } - } - } - - @Override public void deleteMessageWithChannel(Channel channel) { // 채널이 삭제될 때 메시지도 없애는 메소드 Iterator iterator = messageRepository.values().iterator(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index d1d77656b..f14618e56 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -44,11 +44,10 @@ public User createUser(String name, String phone, String password) throws Illega } @Override - public User getUserByPhone(String phone) { + public Optional getUserByPhone(String phone) { return userRepository.values().stream() .filter(user -> user.getPhone().equals(phone)) - .findFirst() - .orElseThrow(() -> new NoSuchElementException(CANNOT_FOUND_PHONE.getMessage())); + .findFirst(); } @Override @@ -58,7 +57,7 @@ public List getAllUser() { @Override public User updateUserPassword(User updateUser, String newPass) { - if (!userExists(updateUser.getId())) { + if (!userExists(updateUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } User findUser = userRepository.get(updateUser.getId()); @@ -67,11 +66,10 @@ public User updateUserPassword(User updateUser, String newPass) { } @Override - public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 보낸 메시지와 채널 모두 조회가 되면 안된다. - if (!userExists(removeUser.getId())) { + public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 속해있던 채널에 해당 유저가 삭제되어야 한다. + if (!userExists(removeUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } - messageService.deleteMessageWithWriter(removeUser); channelService.getAllChannel().stream() .forEach(channel -> channel.getMembers() .removeIf(user -> user.getId().equals(removeUser.getId()))); @@ -79,7 +77,12 @@ public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 } @Override - public boolean userExists(UUID uuid) { - return userRepository.containsKey(uuid); + public boolean userExists(String phone) { + for (User user : userRepository.values()) { + if (user.getPhone().equals(phone)) { + return true; + } + } + return false; } } From 39073cbb9d430d08b177af7bdc29e14240ca9fd3 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 10:09:00 +0900 Subject: [PATCH 013/115] Add fileservice class --- .../mission/discodeit/service/file/FileChannelService.java | 4 ++++ .../mission/discodeit/service/file/FileMessageService.java | 4 ++++ .../mission/discodeit/service/file/FileUserService.java | 5 +++++ 3 files changed, 13 insertions(+) create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java new file mode 100644 index 000000000..e159eeb1a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.service.file; + +public class FileChannelService { +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java new file mode 100644 index 000000000..f0adb3c54 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.service.file; + +public class FileMessageService { +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java new file mode 100644 index 000000000..df2f264b0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.service.file; + +public class FileUserService { + +} From 3b19d120de9d307d4dbcb5754b6148fa0c1193bc Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 10:46:48 +0900 Subject: [PATCH 014/115] Add Factory interface --- .../mission/discodeit/JavaApplication.java | 13 +++- .../mission/discodeit/factory/Factory.java | 23 ++----- .../mission/discodeit/factory/JCFFactory.java | 42 +++++++++++++ .../discodeit/service/ChannelService.java | 2 + .../discodeit/service/MessageService.java | 1 + .../discodeit/service/UserService.java | 2 + .../service/file/FileChannelService.java | 61 ++++++++++++++++++- .../service/file/FileMessageService.java | 46 +++++++++++++- .../service/file/FileUserService.java | 44 ++++++++++++- .../service/jcf/JCFChannelService.java | 13 ++-- .../service/jcf/JCFMessageService.java | 13 ++-- .../discodeit/service/jcf/JCFUserService.java | 12 ++-- 12 files changed, 232 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index fc3f9e111..7e2086e35 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -3,6 +3,8 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.factory.Factory; +import com.sprint.mission.discodeit.factory.JCFFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -15,9 +17,14 @@ public class JavaApplication { public static void main(String[] args) { - UserService userService = new JCFUserService(); - MessageService messageService = new JCFMessageService(); - ChannelService channelService = new JCFChannelService(); + Factory factory = JCFFactory.getInstance(); + UserService userService = factory.getUserService(); + MessageService messageService = factory.getMessageService(); + ChannelService channelService = factory.getChannelService(); + userService.setDependency(messageService, channelService); + messageService.setDependency(userService, channelService); + channelService.setDependency(userService,messageService); + System.out.println("<회원 생성하기>"); User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); diff --git a/src/main/java/com/sprint/mission/discodeit/factory/Factory.java b/src/main/java/com/sprint/mission/discodeit/factory/Factory.java index 5be2aaa16..9f082f6b7 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/Factory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/Factory.java @@ -3,24 +3,9 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.jcf.JCFChannelService; -import com.sprint.mission.discodeit.service.jcf.JCFMessageService; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; -public class Factory { - private static final UserService userService = new JCFUserService(); - private static final MessageService messageService = new JCFMessageService(); - private static final ChannelService channelService = new JCFChannelService(); - - public static UserService getUserService() { - return userService; - } - - public static MessageService getMessageService() { - return messageService; - } - - public static ChannelService getChannelService() { - return channelService; - } +public interface Factory { + UserService getUserService(); + MessageService getMessageService(); + ChannelService getChannelService(); } diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java new file mode 100644 index 000000000..c3ee1151f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java @@ -0,0 +1,42 @@ +package com.sprint.mission.discodeit.factory; + +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; + +public class JCFFactory implements Factory{ + private static JCFFactory instance; + private UserService userService; + private MessageService messageService; + private ChannelService channelService; + + private JCFFactory() { + this.userService = new JCFUserService(); + this.messageService = new JCFMessageService(); + this.channelService = new JCFChannelService(); + } + + public static JCFFactory getInstance() { + if (instance == null) { + instance = new JCFFactory(); + } + return instance; + } + @Override + public UserService getUserService() { + return userService; + } + + @Override + public MessageService getMessageService() { + return messageService; + } + + @Override + public ChannelService getChannelService() { + return channelService; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index eaff10ccf..5527c005c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -8,6 +8,8 @@ import java.util.UUID; public interface ChannelService { + void setDependency(UserService userService, MessageService messageService); + Channel createChannel(String name, User creator); Optional getChannelByName(String name); diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 79a5f0add..47086e7d5 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -8,6 +8,7 @@ import java.util.UUID; public interface MessageService { + void setDependency(UserService userService, ChannelService channelService); Message createMessage(String content, User writer, Channel channel); diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 3e7cc112e..3725a3711 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -7,6 +7,8 @@ import java.util.UUID; public interface UserService { + void setDependency(MessageService messageService, ChannelService channelService); + User createUser(String name, String phone, String password); Optional getUserByPhone(String phone); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index e159eeb1a..21e51636d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -1,4 +1,63 @@ package com.sprint.mission.discodeit.service.file; -public class FileChannelService { +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class FileChannelService implements ChannelService { + @Override + public void setDependency(UserService userService, MessageService messageService) { + + } + + @Override + public Channel createChannel(String name, User creator) { + return null; + } + + @Override + public Optional getChannelByName(String name) { + return Optional.empty(); + } + + @Override + public boolean channelExist(UUID uuid) { + return false; + } + + @Override + public List getAllChannel() { + return List.of(); + } + + @Override + public List getChannelsByUserId(User user) { + return List.of(); + } + + @Override + public Channel addUserToChannel(Channel channel, User newUser) { + return null; + } + + @Override + public Channel addManyUserToChannel(Channel channel, List users) { + return null; + } + + @Override + public Channel removeUserToChannel(Channel channel, User removeUser) { + return null; + } + + @Override + public void deleteChannel(Channel removeChannel) { + + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index f0adb3c54..cd17bf129 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -1,4 +1,48 @@ package com.sprint.mission.discodeit.service.file; -public class FileMessageService { +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.util.List; +import java.util.UUID; + +public class FileMessageService implements MessageService { + @Override + public void setDependency(UserService userService, ChannelService channelService) { + + } + + @Override + public Message createMessage(String content, User writer, Channel channel) { + return null; + } + + @Override + public List getMessageByUser(User writer) { + return List.of(); + } + + @Override + public List getMessageByChannel(Channel channel) { + return List.of(); + } + + @Override + public Message updateMessageContent(UUID id, String newContent) { + return null; + } + + @Override + public void removeMessageByWriter(User writer, UUID uuid) { + + } + + @Override + public void deleteMessageWithChannel(Channel channel) { + + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index df2f264b0..41309ded5 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -1,5 +1,47 @@ package com.sprint.mission.discodeit.service.file; -public class FileUserService { +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import java.util.List; +import java.util.Optional; + +public class FileUserService implements UserService { + + @Override + public void setDependency(MessageService messageService, ChannelService channelService) { + + } + + @Override + public User createUser(String name, String phone, String password) { + return null; + } + + @Override + public Optional getUserByPhone(String phone) { + return Optional.empty(); + } + + @Override + public boolean userExists(String phone) { + return false; + } + + @Override + public List getAllUser() { + return List.of(); + } + + @Override + public User updateUserPassword(User user, String newPass) { + return null; + } + + @Override + public void deleteUser(User removeUser) { + + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index f0b71a4e0..5e237fd3a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -17,13 +16,17 @@ public class JCFChannelService implements ChannelService { private final Map channelRepository; - private final UserService userService; - private final MessageService messageService; + private UserService userService; + private MessageService messageService; public JCFChannelService() { this.channelRepository = new HashMap<>(); - this.userService = Factory.getUserService(); - this.messageService = Factory.getMessageService(); + } + + @Override + public void setDependency(UserService userService, MessageService messageService) { + this.userService = userService; + this.messageService = messageService; } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index f9fb18b82..fad406f60 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -3,7 +3,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -17,13 +16,17 @@ public class JCFMessageService implements MessageService { private final Map messageRepository; - private final UserService userService; - private final ChannelService channelService; + private UserService userService; + private ChannelService channelService; public JCFMessageService() { this.messageRepository = new HashMap<>(); - this.userService = Factory.getUserService(); - this.channelService = Factory.getChannelService(); + } + + @Override + public void setDependency(UserService userService, ChannelService channelService) { + this.userService = userService; + this.channelService = channelService; } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index f14618e56..0a85d9c49 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.service.jcf; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -14,15 +13,18 @@ public class JCFUserService implements UserService { private final Map userRepository; - private final MessageService messageService; - private final ChannelService channelService; + private MessageService messageService; + private ChannelService channelService; public JCFUserService() { this.userRepository = new HashMap<>(); - this.messageService = Factory.getMessageService(); - this.channelService = Factory.getChannelService(); } + @Override + public void setDependency(MessageService messageService, ChannelService channelService) { + this.messageService = messageService; + this.channelService = channelService; + } @Override public User createUser(String name, String phone, String password) throws IllegalArgumentException { From 41b54b1639e0b7d88663cfca12f0adc41d45e096 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 13:57:40 +0900 Subject: [PATCH 015/115] Update main code --- .../discodeit/factory/FileFactory.java | 42 +++++++++ .../discodeit/service/ChannelService.java | 2 +- .../service/file/FileChannelService.java | 25 +++++- .../service/file/FileMessageService.java | 23 +++++ .../service/file/FileUserService.java | 85 +++++++++++++++++-- .../service/jcf/JCFChannelService.java | 9 +- .../service/jcf/JCFMessageService.java | 8 +- .../discodeit/service/jcf/JCFUserService.java | 9 +- .../mission/discodeit/util/FileIOUtil.java | 32 +++++++ 9 files changed, 210 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java new file mode 100644 index 000000000..a47b5c510 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java @@ -0,0 +1,42 @@ +package com.sprint.mission.discodeit.factory; + +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.file.FileChannelService; +import com.sprint.mission.discodeit.service.file.FileMessageService; +import com.sprint.mission.discodeit.service.file.FileUserService; + +public class FileFactory implements Factory{ + private static FileFactory instance; + private UserService userService; + private MessageService messageService; + private ChannelService channelService; + + private FileFactory() { + this.userService = new FileUserService("users.dat"); + this.messageService = new FileMessageService("messages.dat"); + this.channelService = new FileChannelService("channels.dat"); + } + + public static FileFactory getInstance() { + if (instance == null) { + instance = new FileFactory(); + } + return instance; + } + @Override + public UserService getUserService() { + return userService; + } + + @Override + public MessageService getMessageService() { + return messageService; + } + + @Override + public ChannelService getChannelService() { + return channelService; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 5527c005c..2fc340072 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -14,7 +14,7 @@ public interface ChannelService { Optional getChannelByName(String name); - boolean channelExist(UUID uuid); + boolean channelExist(String name); List getAllChannel(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 21e51636d..8b35a19c1 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -6,11 +6,34 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.UUID; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + public class FileChannelService implements ChannelService { + private final Path filePath; + private UserService userService; + private MessageService messageService; + + public FileChannelService(String filePath) { + this.filePath = Paths.get(filePath); + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("Error initializing user repository file", e); + } + } + } + @Override public void setDependency(UserService userService, MessageService messageService) { @@ -27,7 +50,7 @@ public Optional getChannelByName(String name) { } @Override - public boolean channelExist(UUID uuid) { + public boolean channelExist(String name) { return false; } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index cd17bf129..7058a6dc9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -7,10 +7,33 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; import java.util.List; import java.util.UUID; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + public class FileMessageService implements MessageService { + private final Path filePath; + private UserService userService; + private ChannelService channelService; + + public FileMessageService(String filePath) { + this.filePath = Paths.get(filePath); + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("Error initializing user repository file", e); + } + } + } + @Override public void setDependency(UserService userService, ChannelService channelService) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 41309ded5..8e0f9278e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -4,44 +4,111 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.ValidPass; +import com.sprint.mission.discodeit.util.ValidPhone; -import java.util.List; -import java.util.Optional; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; + +import static com.sprint.mission.discodeit.error.UserError.*; +import static com.sprint.mission.discodeit.util.FileIOUtil.*; public class FileUserService implements UserService { + private final Path filePath; + private MessageService messageService; + private ChannelService channelService; + + public FileUserService(String filePath) { + this.filePath = Paths.get(filePath); + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("Error initializing user repository file", e); + } + } + } @Override public void setDependency(MessageService messageService, ChannelService channelService) { - + this.messageService = messageService; + this.channelService = channelService; } @Override public User createUser(String name, String phone, String password) { - return null; + if (!ValidPass.isValidPassword(password)) { + throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + } + + if (!ValidPhone.isValidPhone(phone)) { + throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + } + Map users = loadFromFile(filePath); + if (users.values().stream() + .anyMatch(user -> user.getPhone().equals(phone))) { + throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + } + + User createUser = new User(name, phone, password); + users.put(createUser.getId(), createUser); + saveToFile(users, filePath); + return createUser; } @Override public Optional getUserByPhone(String phone) { - return Optional.empty(); + Map users = loadFromFile(filePath); + return users.values().stream() + .filter(user -> user.getPhone().equals(phone)) + .findFirst(); } @Override public boolean userExists(String phone) { + Map users = loadFromFile(filePath); + for (User user : users.values()) { + if (user.getPhone() == phone) { + return true; + } + } return false; } @Override public List getAllUser() { - return List.of(); + Map users = loadFromFile(filePath); + return users.values() + .stream() + .collect(Collectors.toList()); } + @Override - public User updateUserPassword(User user, String newPass) { - return null; + public User updateUserPassword(User updateUser, String newPass) { + Map users = loadFromFile(filePath); + if (!userExists(updateUser.getPhone())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + User findUser = users.get(updateUser.getId()); + findUser.update(newPass); + return findUser; } @Override public void deleteUser(User removeUser) { - + Map users = loadFromFile(filePath); + if (!userExists(removeUser.getPhone())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + channelService.getAllChannel().stream() + .forEach(channel -> channel.getMembers() + .removeIf(user -> user.getId().equals(removeUser.getId()))); + users.remove(removeUser.getId()); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 5e237fd3a..07e4d195c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -53,8 +53,9 @@ public Optional getChannelByName(String name) { } @Override - public boolean channelExist(UUID uuid) { - return channelRepository.containsKey(uuid); + public boolean channelExist(String name) { + return channelRepository.values().stream() + .anyMatch(user -> user.getName().equals(name)); } @Override @@ -79,7 +80,7 @@ public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유 if (!channelRepository.containsKey(channel.getId())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } - if (userService.userExists(newUser.getPhone())) { + if (!userService.userExists(newUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } channel.addUser(newUser); @@ -101,7 +102,7 @@ public Channel removeUserToChannel(Channel channel, User removeUser) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } - if (userService.userExists(removeUser.getPhone())) { + if (!userService.userExists(removeUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } channel.removeUser(removeUser); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index fad406f60..4ecc939cb 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -35,11 +35,11 @@ public Message createMessage(String content, User writer, Channel channel) throw throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } - if (userService.userExists(writer.getPhone())) { // 해당 작성자가 존재하는가 + if (!userService.userExists(writer.getPhone())) { // 해당 작성자가 존재하는가 throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } - if (channelService.channelExist(channel.getId())) { // 해당 채널이 존재하는가? + if (!channelService.channelExist(channel.getName())) { // 해당 채널이 존재하는가? throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } @@ -51,7 +51,7 @@ public Message createMessage(String content, User writer, Channel channel) throw // 메시지를 보낸 회원이 메시지 조회하기 @Override public List getMessageByUser(User writer) { - if (userService.userExists(writer.getPhone())) { + if (!userService.userExists(writer.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } List messages = new ArrayList<>(); @@ -65,7 +65,7 @@ public List getMessageByUser(User writer) { @Override public List getMessageByChannel(Channel channel) { - if (channelService.channelExist(channel.getId())) { + if (!channelService.channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } List messages = new ArrayList<>(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 0a85d9c49..df74aa607 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -80,11 +80,8 @@ public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 @Override public boolean userExists(String phone) { - for (User user : userRepository.values()) { - if (user.getPhone().equals(phone)) { - return true; - } - } - return false; + return userRepository.values() + .stream() + .anyMatch(user -> user.getPhone().equals(phone)); } } diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java new file mode 100644 index 000000000..ea3bb4ce5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -0,0 +1,32 @@ +package com.sprint.mission.discodeit.util; + +import java.io.*; +import java.nio.file.*; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class FileIOUtil { + + public static Map loadFromFile(Path filePath) { + if (!Files.exists(filePath)) { + return new HashMap<>(); + } + try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(filePath))) { + return (Map) ois.readObject(); + } catch (EOFException e) { + return new HashMap<>(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("파일을 읽어오는 도중 문제가 발생하였습니다.", e); + } + } + + public static void saveToFile(Map data, Path filePath) { + try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(filePath))) { + oos.writeObject(data); + } catch (IOException e) { + throw new RuntimeException("파일 저장 도중 문제가 발생하였습니다.", e); + } + } +} + From 5b8a4245c1dad5696024b0620ffcf9f03811bdee Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 14:39:57 +0900 Subject: [PATCH 016/115] Add repository interface each service --- channels.dat | Bin 0 -> 1492 bytes messages.dat | Bin 0 -> 4798 bytes .../mission/discodeit/JavaApplication.java | 15 +++- .../mission/discodeit/entity/Channel.java | 3 +- .../mission/discodeit/entity/Message.java | 3 +- .../sprint/mission/discodeit/entity/User.java | 3 +- .../repository/ChannelRepository.java | 4 + .../repository/MessageRepository.java | 4 + .../discodeit/repository/UserRepository.java | 4 + .../service/file/FileChannelService.java | 83 +++++++++++++++--- .../service/file/FileMessageService.java | 78 +++++++++++++--- .../service/file/FileUserService.java | 4 +- .../service/jcf/JCFChannelService.java | 8 +- users.dat | Bin 0 -> 1119 bytes 14 files changed, 176 insertions(+), 33 deletions(-) create mode 100644 channels.dat create mode 100644 messages.dat create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java create mode 100644 users.dat diff --git a/channels.dat b/channels.dat new file mode 100644 index 0000000000000000000000000000000000000000..22eefbdd04a533affe3151da6f029cdc9ef097ad GIT binary patch literal 1492 zcma))ZA=tL7{}-K?!*IMXbr{$i4YQP+OW&s*-+F(P6+}Y{bFhBHY)v#{EW{_SXjOa8ohcG-jtd5f^tTYg2NbyX8(L`$Nsi;7J1qV89CC?XolNJP8n zjRGgjFxYe~o_|yRK0twaKH&0ekVBC7A_NM3gop`pa)9wEa$v0wmLVlM9AmSObNo$>vY*hDhxL=lV+uV!uQw z0KzH&w%GovnF_4-#;Z6;+B<%sQTSrt-^Ks4&*U;YC%e3KJ7n+jf%z(@>+Oohr*o$& zC^AeZb9*Bf1r}RsS|=HG@Y|mEgg@?#mi$)3Nf$QT5pWqpqsIA8V<>{aVsERThiw6Y zb$eKMSs4NgE7{75)i^3x94gVU<1UwEX3nc=+%95$_@jFz1Gl*$JFqnXhc51h#28>} zcaW95TpUIqKiSo79F8XsUu9JbX=Li6=l-~(#gSMsTs~R<$UJqJYZ`v0!^{>vf0mju zGwQ%U58Fon`h3W_Dz#@@Sp%-%N{sXypG1-;4!y7;4~|Sj%S@%BY}R6|w9vQ_!?>kJ zJd(K9nZ_L`nwofUq~&y-^g(MS>%C<@&c=0{XW6((3%8FdHg<%LR^5Kw;U8a9^C|KF zRDU8Gf0_Sp{kflYNPi7~Vgdm1k4(PL-#+qS~|CV@?U3i;~5ZOD%!Y>5G>V zmm|skvqp3f_n#&{wDo=V>nl?IHxDX*ul=&-vmC^G=MtwLTg2VlC-2T1Yb!mq{L&M4 wyzVFBE}rhrL1Qrf!eMaZ$hcdbi+i2PeIu4QI%u3cSel5%@Cf7Kz_}WJ3QlwZQ2+n{ literal 0 HcmV?d00001 diff --git a/messages.dat b/messages.dat new file mode 100644 index 0000000000000000000000000000000000000000..7e23dbe84c1e28fbb5428b6516cfad20e1246cf9 GIT binary patch literal 4798 zcmeHKe@q)y9Df`zeobJI5zWN3*%HyMEoB;uS3Ud=i zK|-s*)`s$MU6z`FZ?ld>0MonF5rK@ch>?(TGIqb7Q;(= zxx2pixzG3WzMuDfZ!`pwSq5x6NY;@`JETp@mr2&BC2h$m-+p>E@4y#{fT#fJCM&70 zAa&5nRDv{UWGL2XHR&C;7fJzc8|zciH5>gfSmq*Fb#-O=RBz&(&)lja08s@tnkbTm z`)I>%8nRU&!)#r6a@g8-zzef7vp=uky@{`9_hccg?K-Pj$=Vp&0+nW(WofHLsi#?; zRZr1SNm(Eb8vt0?=&4lk&x1tp$^$gI%urI-vq5+c#ri|VF~as zyG<_+I|Pn`6b;x=&(M%!Ab2t^e$_0+lsIhhN)ir7+Y?B?V!3S)Bw1u0rjR0pVrB4S zng$^1_%0PmV5ZD96vIj*(a4Gbaoy><)wy+s00~tf zxsEj1DF*|xg&Yw&y<*4TY8&c5db)B03>*h70)YBv<2}b02ar0uFCkyJAZA7 z9_nIjOX;WDNS3X)GD6%aoMfBPYKa{i4mwlhHWy^^6Y=iN_g^#qabrCH_fpb)Zf_z4 zX}o`&KkMZEO%P<2)#&t8t-+`++Nmy*%OQBEP+h2a3N?iqHJb?13IA!)Qn~l8j66J@ z0LwO`uyYqZRK_r51J>Tr{AGUcHPW955-LFwOE*$jDU?V__=@S|2zZ->>lzT10^b(N zpUUam{?Y8)fxX{Pj}~mzsF4D}i%r~_DL#M{$doD&768Y-L;xx7tcdG=>&~qWS8HWM zk51fIU$6KvtgLf@9|*)$wg|PDz#$R1i`c>+vY#lvHrt}R{%q-K3_RrJT!H_ZvZqmt z34B)sZu|S2+VMXx`I8@?J91E7=|I5Tn3o@J3iY?gWV{nK5g7GP54F1ajzFkmQY}D+ z=WxClg2y;#K*kNbxnn-wIUwW4e8I79zGH%OwIk|sN%v};3yETKNwtlGDIS{_o~K1} zVuVd>=g)(NZHJ5337bf{Wk4!Wf=km$;p(d^ay+DhwuvDNM&Oa4AKO_rzM?|wIC8=71 zQ)hQHv&69w;jvX=vn*SCh;jMM;cdrn{xVs{ThIO<2Un|FR5li%W_*2Lr zsJ?id+;B7B(r``xxE%uuu5G_Jz8#f4{^ldvLznSKyT+F}%{>bDD24 zH+QH%pe{Nuz4W>8)o6vKC`z8LVqGVCH{YH9s{6pn3iInVh3c};gwHK2ETd64tYUFn zFD#Lbu~dmQC@f+&MRr-wKv1x-0h5J#y}W-?#`lfLxDgNU8bCFMA8d`b-_l@Pd>G9Z zad5_C$71ZaTy>2lm*>jwcaJ62-ndtKIi@Whg#DIS;G}c5Zi~paXcZSJsl;)l*oyaC zPb}YW#XN`z85%K^4(IlFQG7A~rqGY*+R^ia{+BuVd?hsJc52ZHD2qEY$(=aMo%DzL Z+"); User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index d84b35aab..1e0b0744a 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.entity; +import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; @@ -10,7 +11,7 @@ import java.util.UUID; import java.util.stream.Collectors; -public class Channel { +public class Channel implements Serializable { private UUID id; private Long createdAt; private Long updatedAt; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index a23c66047..94c99d859 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.entity; +import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.UUID; -public class Message { +public class Message implements Serializable { private UUID id; private Long createdAt; private Long updatedAt; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 523c67f40..0477a69ad 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.entity; +import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.UUID; -public class User { +public class User implements Serializable { private UUID id; private Long createdAt; private Long updatedAt; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java new file mode 100644 index 000000000..293de39c7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.repository; + +public interface ChannelRepository { +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java new file mode 100644 index 000000000..211520bfc --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.repository; + +public class MessageRepository { +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java new file mode 100644 index 000000000..0ab7c94fb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.repository; + +public interface UserRepository { +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 8b35a19c1..9dc0b35f9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -10,13 +10,16 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; +import static com.sprint.mission.discodeit.error.UserError.DUPLICATE_PHONE; +import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +import static com.sprint.mission.discodeit.error.ChannelError.*; +import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; + public class FileChannelService implements ChannelService { private final Path filePath; private UserService userService; @@ -36,51 +39,105 @@ public FileChannelService(String filePath) { @Override public void setDependency(UserService userService, MessageService messageService) { - + this.userService = userService; + this.messageService = messageService; } @Override public Channel createChannel(String name, User creator) { - return null; + Map channels = loadFromFile(filePath); + for (Channel channel : channels.values()) { + if (channelExist(name)) { + throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + } + } + Channel createChannel = new Channel(name, creator); + channels.put(createChannel.getId(), createChannel); + saveToFile(channels, filePath); + return createChannel; } @Override public Optional getChannelByName(String name) { + Map channels = loadFromFile(filePath); + for (Channel channel : channels.values()) { + if (channel.getName() == name) { + return Optional.of(channel); + } + } return Optional.empty(); } @Override public boolean channelExist(String name) { - return false; + Map channels = loadFromFile(filePath); + return channels.values().stream() + .anyMatch(user -> user.getName().equals(name)); } @Override public List getAllChannel() { - return List.of(); + Map channels = loadFromFile(filePath); + return channels.values().stream() + .collect(Collectors.toList()); } @Override public List getChannelsByUserId(User user) { - return List.of(); + Map channels = loadFromFile(filePath); + List list = new ArrayList<>(); + for (Channel channel : channels.values()) { + if (channel.getMembers().contains(user)) { + list.add(channel); + } + } + return list; } @Override public Channel addUserToChannel(Channel channel, User newUser) { - return null; + Map channels = loadFromFile(filePath); + if (!channelExist(channel.getName())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + if (!userService.userExists(newUser.getPhone())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + channel.addUser(newUser); + return channel; } @Override public Channel addManyUserToChannel(Channel channel, List users) { - return null; + if (!channelExist(channel.getName())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + channel.addManyUser(users); + return channel; } @Override public Channel removeUserToChannel(Channel channel, User removeUser) { - return null; + if (!channelExist(channel.getName())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + + if (!userService.userExists(removeUser.getPhone())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + channel.removeUser(removeUser); + return channel; } @Override - public void deleteChannel(Channel removeChannel) { + public void deleteChannel(Channel channel) { + Map channels = loadFromFile(filePath); + if (!channelExist(channel.getName())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + + messageService.deleteMessageWithChannel(channel); + channels.remove(channel.getId()); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 7058a6dc9..073b3719e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -6,15 +6,17 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; +import java.util.*; +import static com.sprint.mission.discodeit.error.ChannelError.*; +import static com.sprint.mission.discodeit.error.MessageError.*; +import static com.sprint.mission.discodeit.error.UserError.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageService implements MessageService { @@ -36,36 +38,92 @@ public FileMessageService(String filePath) { @Override public void setDependency(UserService userService, ChannelService channelService) { - + this.userService = userService; + this.channelService = channelService; } @Override public Message createMessage(String content, User writer, Channel channel) { - return null; + Map messages = FileIOUtil.loadFromFile(filePath); + if (content.isEmpty()) { + throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + } + if (!userService.userExists(writer.getPhone())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + + if (!channelService.channelExist(channel.getName())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + Message message = new Message(content, writer, channel); + messages.put(message.getId(), message); + FileIOUtil.saveToFile(messages, filePath); + return message; } @Override public List getMessageByUser(User writer) { - return List.of(); + Map messages = FileIOUtil.loadFromFile(filePath); + if (!userService.userExists(writer.getPhone())) { + throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + } + List list = new ArrayList<>(); + for (Message message : messages.values()) { + if (message.getWriter().getPhone().equals(writer.getPhone())) { + list.add(message); + } + } + return list; } @Override public List getMessageByChannel(Channel channel) { - return List.of(); + Map messages = FileIOUtil.loadFromFile(filePath); + if (!channelService.channelExist(channel.getName())) { + throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); + } + List list = new ArrayList<>(); + for (Message message : messages.values()) { + if (message.getChannel().getName().equals(channel.getName())) { + list.add(message); + } + } + return list; } @Override public Message updateMessageContent(UUID id, String newContent) { - return null; + Map messages = FileIOUtil.loadFromFile(filePath); + Message findMessage = messages.get(id); + if (newContent.isEmpty()) { + throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + } + findMessage.update(newContent); + return findMessage; } @Override public void removeMessageByWriter(User writer, UUID uuid) { - + Map messages = FileIOUtil.loadFromFile(filePath); + if (!messages.containsKey(uuid)) { + throw new IllegalArgumentException(CANNOT_FOUND_MESSAGE.getMessage()); + } + Message findMessage = messages.get(uuid); + if (!findMessage.getWriter().getId().equals(writer.getId())) { + throw new IllegalArgumentException(INVALID_WRITER.getMessage()); + } + messages.remove(uuid); } @Override public void deleteMessageWithChannel(Channel channel) { - + Map messages = FileIOUtil.loadFromFile(filePath); + Iterator iterator = messages.values().iterator(); + while (iterator.hasNext()) { + Message message = iterator.next(); + if (Objects.equals(message.getChannel().getId(), channel.getId())) { + iterator.remove(); + } + } } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 8e0f9278e..a973033b0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -42,6 +42,7 @@ public void setDependency(MessageService messageService, ChannelService channelS @Override public User createUser(String name, String phone, String password) { + Map users = loadFromFile(filePath); if (!ValidPass.isValidPassword(password)) { throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); } @@ -49,7 +50,6 @@ public User createUser(String name, String phone, String password) { if (!ValidPhone.isValidPhone(phone)) { throw new IllegalArgumentException(INVALID_PHONE.getMessage()); } - Map users = loadFromFile(filePath); if (users.values().stream() .anyMatch(user -> user.getPhone().equals(phone))) { throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); @@ -73,7 +73,7 @@ public Optional getUserByPhone(String phone) { public boolean userExists(String phone) { Map users = loadFromFile(filePath); for (User user : users.values()) { - if (user.getPhone() == phone) { + if (user.getPhone().equals(phone)) { return true; } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 07e4d195c..ddc77a775 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -77,7 +77,7 @@ public List getChannelsByUserId(User user) { @Override public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유저가 채널에 들어갈때 - if (!channelRepository.containsKey(channel.getId())) { + if (!channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } if (!userService.userExists(newUser.getPhone())) { @@ -89,7 +89,7 @@ public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유 @Override public Channel addManyUserToChannel(Channel channel, List users) { - if (!channelRepository.containsKey(channel.getId())) { + if (!channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } channel.addManyUser(users); @@ -98,7 +98,7 @@ public Channel addManyUserToChannel(Channel channel, List users) { @Override public Channel removeUserToChannel(Channel channel, User removeUser) { - if (!channelRepository.containsKey(channel.getId())) { + if (!channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } @@ -111,7 +111,7 @@ public Channel removeUserToChannel(Channel channel, User removeUser) { @Override public void deleteChannel(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. - if (!channelRepository.containsKey(channel.getId())) { + if (!channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } diff --git a/users.dat b/users.dat new file mode 100644 index 0000000000000000000000000000000000000000..ff0eb91c0ab67b8d7e8b423a62566a594e02346d GIT binary patch literal 1119 zcmaLUPfXKL90%}6$AAe4V)TL}E*v1yb#$FU^dKN1ZVWC+;!Vq1w&J>$_6?@-4=SJ$ zghe3oZwBIm2O<0kCa7Et2Qd;74=1?L3D|g2=id&aslj@@|}FB|A?uEW{Z%WZ@;ePGZD?S*!EK^SRPqV;4q#W4`%#OHuiVQ>vQDQ(BAxP>b?Dm`Pv(6u{=kmUlQrv8nCbF6wx$B~OXhZ!l z3t5VPPMK*_{H>@{%q2`DVbaHRGb#gtYD*u_89Fk#ekD-#VRfP~-$o?RS5*A~(l?&9 z%2NwU0O@=G)nlV0Hy-c0xVD_K*l>9C(9=y~sq#|-d|kzJw?=OpQAPs0j&4E~ululE zrODG<{A&G{ed$E$lLUHD)zPo(l+k{Tl<|Hfuc&0S$dCWXu8;RJ54>Kc$09K5$N zKQH$TCUDWQnhj>s6g$X{-|rgcem?hW3qn^L^%n0=H}qX~No2{>{mSFk;P9PYvnEkR H)A0TQ3xs>Q literal 0 HcmV?d00001 From a3bbd93db042e7629b8387487f0a0ba2fc14b928 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 16:19:34 +0900 Subject: [PATCH 017/115] Add repository file --- channels.dat | Bin 1492 -> 0 bytes messages.dat | Bin 4798 -> 0 bytes .../mission/discodeit/JavaApplication.java | 39 +++++++++++------- .../mission/discodeit/entity/Channel.java | 2 +- .../discodeit/factory/FileFactory.java | 12 +++--- .../mission/discodeit/factory/JCFFactory.java | 6 +-- .../repository/MessageRepository.java | 2 +- .../discodeit/service/MessageService.java | 2 +- .../service/basic/BasicChannelService.java | 4 ++ .../service/basic/BasicMessageService.java | 4 ++ .../service/basic/BasicUserService.java | 4 ++ .../service/file/FileChannelService.java | 18 ++++---- .../service/file/FileMessageService.java | 26 +++++------- .../service/file/FileUserService.java | 9 ++-- .../service/jcf/JCFChannelService.java | 15 ++++--- .../service/jcf/JCFMessageService.java | 18 +++----- users.dat | Bin 1119 -> 0 bytes 17 files changed, 83 insertions(+), 78 deletions(-) delete mode 100644 channels.dat delete mode 100644 messages.dat create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java delete mode 100644 users.dat diff --git a/channels.dat b/channels.dat deleted file mode 100644 index 22eefbdd04a533affe3151da6f029cdc9ef097ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1492 zcma))ZA=tL7{}-K?!*IMXbr{$i4YQP+OW&s*-+F(P6+}Y{bFhBHY)v#{EW{_SXjOa8ohcG-jtd5f^tTYg2NbyX8(L`$Nsi;7J1qV89CC?XolNJP8n zjRGgjFxYe~o_|yRK0twaKH&0ekVBC7A_NM3gop`pa)9wEa$v0wmLVlM9AmSObNo$>vY*hDhxL=lV+uV!uQw z0KzH&w%GovnF_4-#;Z6;+B<%sQTSrt-^Ks4&*U;YC%e3KJ7n+jf%z(@>+Oohr*o$& zC^AeZb9*Bf1r}RsS|=HG@Y|mEgg@?#mi$)3Nf$QT5pWqpqsIA8V<>{aVsERThiw6Y zb$eKMSs4NgE7{75)i^3x94gVU<1UwEX3nc=+%95$_@jFz1Gl*$JFqnXhc51h#28>} zcaW95TpUIqKiSo79F8XsUu9JbX=Li6=l-~(#gSMsTs~R<$UJqJYZ`v0!^{>vf0mju zGwQ%U58Fon`h3W_Dz#@@Sp%-%N{sXypG1-;4!y7;4~|Sj%S@%BY}R6|w9vQ_!?>kJ zJd(K9nZ_L`nwofUq~&y-^g(MS>%C<@&c=0{XW6((3%8FdHg<%LR^5Kw;U8a9^C|KF zRDU8Gf0_Sp{kflYNPi7~Vgdm1k4(PL-#+qS~|CV@?U3i;~5ZOD%!Y>5G>V zmm|skvqp3f_n#&{wDo=V>nl?IHxDX*ul=&-vmC^G=MtwLTg2VlC-2T1Yb!mq{L&M4 wyzVFBE}rhrL1Qrf!eMaZ$hcdbi+i2PeIu4QI%u3cSel5%@Cf7Kz_}WJ3QlwZQ2+n{ diff --git a/messages.dat b/messages.dat deleted file mode 100644 index 7e23dbe84c1e28fbb5428b6516cfad20e1246cf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4798 zcmeHKe@q)y9Df`zeobJI5zWN3*%HyMEoB;uS3Ud=i zK|-s*)`s$MU6z`FZ?ld>0MonF5rK@ch>?(TGIqb7Q;(= zxx2pixzG3WzMuDfZ!`pwSq5x6NY;@`JETp@mr2&BC2h$m-+p>E@4y#{fT#fJCM&70 zAa&5nRDv{UWGL2XHR&C;7fJzc8|zciH5>gfSmq*Fb#-O=RBz&(&)lja08s@tnkbTm z`)I>%8nRU&!)#r6a@g8-zzef7vp=uky@{`9_hccg?K-Pj$=Vp&0+nW(WofHLsi#?; zRZr1SNm(Eb8vt0?=&4lk&x1tp$^$gI%urI-vq5+c#ri|VF~as zyG<_+I|Pn`6b;x=&(M%!Ab2t^e$_0+lsIhhN)ir7+Y?B?V!3S)Bw1u0rjR0pVrB4S zng$^1_%0PmV5ZD96vIj*(a4Gbaoy><)wy+s00~tf zxsEj1DF*|xg&Yw&y<*4TY8&c5db)B03>*h70)YBv<2}b02ar0uFCkyJAZA7 z9_nIjOX;WDNS3X)GD6%aoMfBPYKa{i4mwlhHWy^^6Y=iN_g^#qabrCH_fpb)Zf_z4 zX}o`&KkMZEO%P<2)#&t8t-+`++Nmy*%OQBEP+h2a3N?iqHJb?13IA!)Qn~l8j66J@ z0LwO`uyYqZRK_r51J>Tr{AGUcHPW955-LFwOE*$jDU?V__=@S|2zZ->>lzT10^b(N zpUUam{?Y8)fxX{Pj}~mzsF4D}i%r~_DL#M{$doD&768Y-L;xx7tcdG=>&~qWS8HWM zk51fIU$6KvtgLf@9|*)$wg|PDz#$R1i`c>+vY#lvHrt}R{%q-K3_RrJT!H_ZvZqmt z34B)sZu|S2+VMXx`I8@?J91E7=|I5Tn3o@J3iY?gWV{nK5g7GP54F1ajzFkmQY}D+ z=WxClg2y;#K*kNbxnn-wIUwW4e8I79zGH%OwIk|sN%v};3yETKNwtlGDIS{_o~K1} zVuVd>=g)(NZHJ5337bf{Wk4!Wf=km$;p(d^ay+DhwuvDNM&Oa4AKO_rzM?|wIC8=71 zQ)hQHv&69w;jvX=vn*SCh;jMM;cdrn{xVs{ThIO<2Un|FR5li%W_*2Lr zsJ?id+;B7B(r``xxE%uuu5G_Jz8#f4{^ldvLznSKyT+F}%{>bDD24 zH+QH%pe{Nuz4W>8)o6vKC`z8LVqGVCH{YH9s{6pn3iInVh3c};gwHK2ETd64tYUFn zFD#Lbu~dmQC@f+&MRr-wKv1x-0h5J#y}W-?#`lfLxDgNU8bCFMA8d`b-_l@Pd>G9Z zad5_C$71ZaTy>2lm*>jwcaJ62-ndtKIi@Whg#DIS;G}c5Zi~paXcZSJsl;)l*oyaC zPb}YW#XN`z85%K^4(IlFQG7A~rqGY*+R^ia{+BuVd?hsJc52ZHD2qEY$(=aMo%DzL Z+"); - User updateUser1 = userService.updateUserPassword(user1, "Zdefdasdf!@"); - System.out.println("UpdatePassword : " + updateUser1); + userService.updateUserPassword(user1, "Zdefdasdf!@"); + System.out.println("UpdatePassword : " + user1); System.out.println(); System.out.println("==============================================================================="); System.out.println(); @@ -118,7 +116,7 @@ public static void main(String[] args) { System.out.println(e.getMessage()); } System.out.print(" - 2. 채널에 등록되지 않은 회원이 메시지를 보낼 때 : "); - User unRegistUser1 = userService.createUser("미등록회원", "010-1919-9191", "Abcdefgh!"); + User unRegistUser1 = new User("미등록회원", "010-1919-9191", "Abcdefgh!"); try { Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); } catch (Exception e) { @@ -143,17 +141,18 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 내용 수정하기>"); - Message updateMessage = messageService.updateMessageContent(message2_1.getId(), "메시지 내용 업데이트"); - System.out.println(updateMessage); + messageService.updateMessageContent(message2_1, "메시지 내용 업데이트"); + System.out.println(message2_1); System.out.println(); System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 삭제하기>"); messageService.removeMessageByWriter(user2, message2_1.getId()); System.out.println("전체 메시지 조회하기: " + messageService.getMessageByUser(user2)); - System.out.print("임시로 만든 회원 삭제하기 : "); - userService.deleteUser(unRegistUser1); System.out.println("임시로 만든 채널 삭제하기 : "); + channelService.deleteChannel(testChannel); + channelService.deleteChannel(testChannel2); + System.out.println(channelService.getAllChannel()); System.out.println(); System.out.println("==============================================================================="); System.out.println(); @@ -206,6 +205,14 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<심화> - 채널을 삭제하면 해당 채널에 있던 메시지가 조회되면 안된다."); - + System.out.println("코드잇 채널에 메시지를 여러 개 생성"); + messageService.createMessage("안녕하세요 처음 인사드립니다.", user3, channel1); + messageService.createMessage("안녕하세요 만나서 반갑습니다.", user4, channel1); + messageService.createMessage("오 디스코드는 처음 들어와보네요!.", user5, channel1); + System.out.println("코드잇 채널 삭제 이전 해당 채널에 존재하는 메시지 출력해보기"); + System.out.println(messageService.getMessageByChannel(channel1)); + System.out.println("코드잇 채널 삭제 이후 해당 채널에 존재하는 메시지 출력해보기"); + channelService.deleteChannel(channel1); + System.out.println(messageService.getMessageByChannel(channel1)); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 1e0b0744a..c7931455b 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -23,7 +23,7 @@ public Channel(String name, User creator) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; - this.members = new ArrayList<>(Arrays.asList(creator)); + this.members = new ArrayList<>(); this.name = name; this.creator = creator; } diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java index a47b5c510..fa809dfd5 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java @@ -9,14 +9,14 @@ public class FileFactory implements Factory{ private static FileFactory instance; - private UserService userService; - private MessageService messageService; - private ChannelService channelService; + private final UserService userService; + private final MessageService messageService; + private final ChannelService channelService; private FileFactory() { - this.userService = new FileUserService("users.dat"); - this.messageService = new FileMessageService("messages.dat"); - this.channelService = new FileChannelService("channels.dat"); + this.userService = new FileUserService("./result/users.dat"); + this.messageService = new FileMessageService("./result/messages.dat"); + this.channelService = new FileChannelService("./result/channels.dat"); } public static FileFactory getInstance() { diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java index c3ee1151f..7079d1b32 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java @@ -9,9 +9,9 @@ public class JCFFactory implements Factory{ private static JCFFactory instance; - private UserService userService; - private MessageService messageService; - private ChannelService channelService; + private final UserService userService; + private final MessageService messageService; + private final ChannelService channelService; private JCFFactory() { this.userService = new JCFUserService(); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 211520bfc..f0ba4a208 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,4 +1,4 @@ package com.sprint.mission.discodeit.repository; -public class MessageRepository { +public interface MessageRepository { } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 47086e7d5..b0f9528cb 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -16,7 +16,7 @@ public interface MessageService { List getMessageByChannel(Channel channel); - Message updateMessageContent(UUID id, String newContent); + Message updateMessageContent(Message message, String newContent); void removeMessageByWriter(User writer, UUID uuid); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java new file mode 100644 index 000000000..e3d4469f0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.service.basic; + +public class BasicChannelService { +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java new file mode 100644 index 000000000..87a7ec0c2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.service.basic; + +public class BasicMessageService { +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java new file mode 100644 index 000000000..7dc7a319d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.service.basic; + +public class BasicUserService { +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 9dc0b35f9..623aef152 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -13,7 +13,6 @@ import java.util.*; import java.util.stream.Collectors; -import static com.sprint.mission.discodeit.error.UserError.DUPLICATE_PHONE; import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @@ -32,7 +31,7 @@ public FileChannelService(String filePath) { Files.createFile(this.filePath); saveToFile(new HashMap<>(), this.filePath); } catch (IOException e) { - throw new RuntimeException("Error initializing user repository file", e); + throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } } @@ -61,7 +60,7 @@ public Channel createChannel(String name, User creator) { public Optional getChannelByName(String name) { Map channels = loadFromFile(filePath); for (Channel channel : channels.values()) { - if (channel.getName() == name) { + if (channel.getName().equals(name)) { return Optional.of(channel); } } @@ -85,13 +84,11 @@ public List getAllChannel() { @Override public List getChannelsByUserId(User user) { Map channels = loadFromFile(filePath); - List list = new ArrayList<>(); - for (Channel channel : channels.values()) { - if (channel.getMembers().contains(user)) { - list.add(channel); - } - } - return list; + return channels.values().stream() + .filter(channel -> channel.getMembers().stream() + .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) + ) + .collect(Collectors.toList()); } @Override @@ -139,5 +136,6 @@ public void deleteChannel(Channel channel) { messageService.deleteMessageWithChannel(channel); channels.remove(channel.getId()); + saveToFile(channels, filePath); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 073b3719e..34eb99bbc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -31,7 +31,7 @@ public FileMessageService(String filePath) { Files.createFile(this.filePath); saveToFile(new HashMap<>(), this.filePath); } catch (IOException e) { - throw new RuntimeException("Error initializing user repository file", e); + throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } } @@ -79,9 +79,6 @@ public List getMessageByUser(User writer) { @Override public List getMessageByChannel(Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); - if (!channelService.channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } List list = new ArrayList<>(); for (Message message : messages.values()) { if (message.getChannel().getName().equals(channel.getName())) { @@ -92,14 +89,15 @@ public List getMessageByChannel(Channel channel) { } @Override - public Message updateMessageContent(UUID id, String newContent) { + public Message updateMessageContent(Message updateMessage, String newContent) { Map messages = FileIOUtil.loadFromFile(filePath); - Message findMessage = messages.get(id); if (newContent.isEmpty()) { throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } - findMessage.update(newContent); - return findMessage; + updateMessage.update(newContent); + messages.put(updateMessage.getId(), updateMessage); + saveToFile(messages, filePath); + return updateMessage; } @Override @@ -118,12 +116,10 @@ public void removeMessageByWriter(User writer, UUID uuid) { @Override public void deleteMessageWithChannel(Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); - Iterator iterator = messages.values().iterator(); - while (iterator.hasNext()) { - Message message = iterator.next(); - if (Objects.equals(message.getChannel().getId(), channel.getId())) { - iterator.remove(); - } - } + getMessageByChannel(channel).stream() + .map(Message::getId) + .forEach(messages::remove); + + FileIOUtil.saveToFile(messages, filePath); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index a973033b0..60693fd44 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -29,7 +29,7 @@ public FileUserService(String filePath) { Files.createFile(this.filePath); saveToFile(new HashMap<>(), this.filePath); } catch (IOException e) { - throw new RuntimeException("Error initializing user repository file", e); + throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } } @@ -95,9 +95,10 @@ public User updateUserPassword(User updateUser, String newPass) { if (!userExists(updateUser.getPhone())) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } - User findUser = users.get(updateUser.getId()); - findUser.update(newPass); - return findUser; + updateUser.update(newPass); + users.put(updateUser.getId(), updateUser); + saveToFile(users, filePath); + return updateUser; } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index ddc77a775..10a745c10 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -45,7 +45,7 @@ public Channel createChannel(String name, User creator) throws IllegalArgumentEx @Override public Optional getChannelByName(String name) { for (Channel channel : channelRepository.values()) { - if (channel.getName() == name) { + if (channel.getName().equals(name)) { return Optional.of(channel); } } @@ -66,15 +66,14 @@ public List getAllChannel() { @Override public List getChannelsByUserId(User user) { - List channels = new ArrayList<>(); - for (Channel channel : channelRepository.values()) { - if (channel.getMembers().contains(user)) { - channels.add(channel); - } - } - return channels; + return channelRepository.values().stream() + .filter(channel -> channel.getMembers().stream() + .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) + ) + .collect(Collectors.toList()); } + @Override public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유저가 채널에 들어갈때 if (!channelExist(channel.getName())) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 4ecc939cb..23720f96b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -65,9 +65,6 @@ public List getMessageByUser(User writer) { @Override public List getMessageByChannel(Channel channel) { - if (!channelService.channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } List messages = new ArrayList<>(); for (Message message : messageRepository.values()) { if (message.getChannel().getName().equals(channel.getName())) { @@ -79,8 +76,7 @@ public List getMessageByChannel(Channel channel) { @Override - public Message updateMessageContent(UUID id, String newContent) { - Message findMessage = messageRepository.get(id); + public Message updateMessageContent(Message findMessage, String newContent) { if (newContent.isEmpty()) { throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); } @@ -102,13 +98,9 @@ public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작 @Override - public void deleteMessageWithChannel(Channel channel) { // 채널이 삭제될 때 메시지도 없애는 메소드 - Iterator iterator = messageRepository.values().iterator(); - while (iterator.hasNext()) { - Message message = iterator.next(); - if (Objects.equals(message.getChannel().getId(), channel.getId())) { - iterator.remove(); - } - } + public void deleteMessageWithChannel(Channel channel) { + getMessageByChannel(channel).stream() + .map(Message::getId) + .forEach(messageRepository::remove); } } diff --git a/users.dat b/users.dat deleted file mode 100644 index ff0eb91c0ab67b8d7e8b423a62566a594e02346d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmaLUPfXKL90%}6$AAe4V)TL}E*v1yb#$FU^dKN1ZVWC+;!Vq1w&J>$_6?@-4=SJ$ zghe3oZwBIm2O<0kCa7Et2Qd;74=1?L3D|g2=id&aslj@@|}FB|A?uEW{Z%WZ@;ePGZD?S*!EK^SRPqV;4q#W4`%#OHuiVQ>vQDQ(BAxP>b?Dm`Pv(6u{=kmUlQrv8nCbF6wx$B~OXhZ!l z3t5VPPMK*_{H>@{%q2`DVbaHRGb#gtYD*u_89Fk#ekD-#VRfP~-$o?RS5*A~(l?&9 z%2NwU0O@=G)nlV0Hy-c0xVD_K*l>9C(9=y~sq#|-d|kzJw?=OpQAPs0j&4E~ululE zrODG<{A&G{ed$E$lLUHD)zPo(l+k{Tl<|Hfuc&0S$dCWXu8;RJ54>Kc$09K5$N zKQH$TCUDWQnhj>s6g$X{-|rgcem?hW3qn^L^%n0=H}qX~No2{>{mSFk;P9PYvnEkR H)A0TQ3xs>Q From 006a424339cf9bed960debf55a1bf4a6f8242bcb Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 17:41:51 +0900 Subject: [PATCH 018/115] Add convertJson method --- build.gradle | 1 + json/channels.json | 59 ++++++++++++++++++ json/messages.json | 1 + json/users.json | 58 +++++++++++++++++ result/channels.dat | Bin 0 -> 1351 bytes result/messages.dat | Bin 0 -> 82 bytes result/users.dat | Bin 0 -> 1052 bytes .../mission/discodeit/JavaApplication.java | 16 ++--- .../sprint/mission/discodeit/entity/User.java | 13 ++++ .../service/file/FileChannelService.java | 8 +++ .../mission/discodeit/util/FileIOUtil.java | 22 ++++++- 11 files changed, 169 insertions(+), 9 deletions(-) create mode 100644 json/channels.json create mode 100644 json/messages.json create mode 100644 json/users.json create mode 100644 result/channels.dat create mode 100644 result/messages.dat create mode 100644 result/users.dat diff --git a/build.gradle b/build.gradle index e5d950da9..de4e8093d 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ repositories { } dependencies { + implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3' testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' } diff --git a/json/channels.json b/json/channels.json new file mode 100644 index 000000000..852b71665 --- /dev/null +++ b/json/channels.json @@ -0,0 +1,59 @@ +{ + "5cc6a9cd-071d-42b6-8d34-6505dc918f46" : { + "id" : "5cc6a9cd-071d-42b6-8d34-6505dc918f46", + "createdAt" : 1737362370130, + "updatedAt" : 1737362370132, + "members" : [ { + "id" : "b37c2425-ccdb-4cfe-8fb3-324bafb54542", + "createdAt" : 1737362370044, + "updatedAt" : null, + "name" : "이채은", + "phone" : "010-4444-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "e6d307c8-cfe0-4bad-b5a2-c50c68f5ee09", + "createdAt" : 1737362370039, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "48dce37f-9ee2-4e1c-8611-1074b120147f", + "createdAt" : 1737362370022, + "updatedAt" : 1737362370076, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" + }, { + "id" : "368916ad-16ea-4875-89fa-e0ecb36f98d8", + "createdAt" : 1737362370128, + "updatedAt" : null, + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" + }, { + "id" : "67f512fc-1865-4f46-93e8-819779931c1d", + "createdAt" : 1737362370041, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "d20cd8dc-f1ac-4992-8b83-4c737dbfb0cd", + "createdAt" : 1737362370045, + "updatedAt" : null, + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" + } ], + "name" : "자바 공부합시다", + "creator" : { + "id" : "368916ad-16ea-4875-89fa-e0ecb36f98d8", + "createdAt" : 1737362370128, + "updatedAt" : null, + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" + } + } +} \ No newline at end of file diff --git a/json/messages.json b/json/messages.json new file mode 100644 index 000000000..6f31cf5a2 --- /dev/null +++ b/json/messages.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/json/users.json b/json/users.json new file mode 100644 index 000000000..e748c2dbf --- /dev/null +++ b/json/users.json @@ -0,0 +1,58 @@ +{ + "b37c2425-ccdb-4cfe-8fb3-324bafb54542" : { + "id" : "b37c2425-ccdb-4cfe-8fb3-324bafb54542", + "createdAt" : 1737362370044, + "updatedAt" : null, + "name" : "이채은", + "phone" : "010-4444-1111", + "password" : "Abcdefgh12312!!" + }, + "e6d307c8-cfe0-4bad-b5a2-c50c68f5ee09" : { + "id" : "e6d307c8-cfe0-4bad-b5a2-c50c68f5ee09", + "createdAt" : 1737362370039, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, + "48dce37f-9ee2-4e1c-8611-1074b120147f" : { + "id" : "48dce37f-9ee2-4e1c-8611-1074b120147f", + "createdAt" : 1737362370022, + "updatedAt" : 1737362370076, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" + }, + "368916ad-16ea-4875-89fa-e0ecb36f98d8" : { + "id" : "368916ad-16ea-4875-89fa-e0ecb36f98d8", + "createdAt" : 1737362370128, + "updatedAt" : null, + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" + }, + "33b0f258-f521-4015-aa24-7b8ff6d6f02b" : { + "id" : "33b0f258-f521-4015-aa24-7b8ff6d6f02b", + "createdAt" : 1737362370138, + "updatedAt" : null, + "name" : "홍길동", + "phone" : "010-1234-4321", + "password" : "Abcdefgh!" + }, + "67f512fc-1865-4f46-93e8-819779931c1d" : { + "id" : "67f512fc-1865-4f46-93e8-819779931c1d", + "createdAt" : 1737362370041, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, + "d20cd8dc-f1ac-4992-8b83-4c737dbfb0cd" : { + "id" : "d20cd8dc-f1ac-4992-8b83-4c737dbfb0cd", + "createdAt" : 1737362370045, + "updatedAt" : null, + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" + } +} \ No newline at end of file diff --git a/result/channels.dat b/result/channels.dat new file mode 100644 index 0000000000000000000000000000000000000000..0101df4d4e88408c22ef99e2b97ff1ff76920053 GIT binary patch literal 1351 zcmb`FT}TvB6vwZt+qP=8R!9#D*#|`7PVU-=^pIMa+Gvsa5i2&)GxvX>|$sfciAg&sr-i|(CSKepQFp#yWdhcowg{^x&h zR|pu90+Nn#6`a+J1-CVyL#`rDHkw{Pc$j?jMJzDnfq1vX@p+sBOG*JSW0wMvOLFr* zd1p4DkyyEytQPXc5ZKarSZQg&?xEJ$=@!og#sCb3Akhsugi8cxu7FV?NbpE=nNPl) z35{b{>hg{}>U?TS%^f7HO%BOpMY1A@*y<4w5+u>e3&R)NnbQCkvB2z5AcrBJgE6qMR1xFmL?^>aqH_leOj=n|FxbeF7L4A43AbS8S}=MG zrW8Si95V>~9FDrh&;cpV13hI>L6JpPK$sNcM9u>-SiV3-2__R!9cHi0>oSjn)4=GH z=lr8;t(sc@$NG`FweJidrVtn_IJX!26kyRz)_yAX(%u)lno<)Q$NdHXd@{L+#&d5c z4-(pje{qnGcWdP4-jX%LHNV)W>Cz^rJ5zWZx;L|6vCJV_E->80OF8v0#c8_qRKeBYN(~!8devY z(eZWtwtYPVdvg0vu3JCyhW$YlsqJ^vz8bZ?8iQrC>N0Hh3|rc)#!M3F86F_^ zJaA(;(KR(`{`AuHGNA1=~nO1%J}P7n3ZwZ}rME`C}i>bi6N4(fthe z45mHljjg$o|YYUlnT|L3+JCq(Xt5XlmF$$B9Ni4y6A?_XPc`UQc|5$%V$=> z{dq)mu(wIQT^+i1DXJTG5>egwu7myOS#;`t@6*x5S7Tqg3a(O{uQvt#fxq3~77{wx che5Lb6jx954+ICRLrtBkzm1%aFzb--Co3J=hyVZp literal 0 HcmV?d00001 diff --git a/result/messages.dat b/result/messages.dat new file mode 100644 index 0000000000000000000000000000000000000000..496eab0e4aaf72fb4a7a365fdfb2959c0977536c GIT binary patch literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 fJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-fS45kZuA$C literal 0 HcmV?d00001 diff --git a/result/users.dat b/result/users.dat new file mode 100644 index 0000000000000000000000000000000000000000..5c570e217a66ef4127fbaf379f9290594c4a9646 GIT binary patch literal 1052 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05LnzFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#K+Z#ME?ztz=gbB&7XncF`9fM#hV=jZAb7ZhdYmFVSW z78hsc=jo+n7ANPYq-K`rrRJ4nmQ?D67N-_1JG0b1Sm|gB69bzM17~tkYGO%hiepI$ zgMbgnIr=$?dFlE-`FZKqJ`7BmDR6O+pY=h`1d6ldCFZ74i$DPOZ^B(!hU@`p} z#2x4=f!4j++3XI3-Qd0qPNuAHY^2yY(H!2Bywm58iCfpK-&i zQ*5o+E00o4d*20sd?gF9=FPkbuQyBqvSDEc3oQ$CV@q92V-sU&XsuGI?*De}gSPR8 zPZ3`g9YnF18wD~~8EDqqnZ2)e?0DTj6N|aPI5E*RF*bt5!sHi?(<>*-$fkc4`XiC* z?}lma+n*qFHGyWm-Z1se@`kswJ8;H=F%TffLU*%Iaqa#MXD{*Gxbtz1=Oiqq{{@+@ W4>bMFf~l{&m*7i5ra%BOy#fH->S{Is literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 6b2ea7c60..3bb97f73c 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -9,6 +9,7 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; @@ -19,8 +20,8 @@ public class JavaApplication { public static void main(String[] args) { - Factory factory = JCFFactory.getInstance(); -// Factory factory = FileFactory.getInstance(); +// Factory factory = JCFFactory.getInstance(); + Factory factory = FileFactory.getInstance(); UserService userService = factory.getUserService(); MessageService messageService = factory.getMessageService(); ChannelService channelService = factory.getChannelService(); @@ -158,10 +159,9 @@ public static void main(String[] args) { System.out.println(); System.out.println("<채널 생성하기>"); Channel channel1 = channelService.createChannel("코드잇 디스코드", user2); - System.out.println("channel1 = " + channel1); Channel channel2 = channelService.createChannel("코테 준비", user3); - channel1.addManyUser(userService.getAllUser()); - channel2.addManyUser(userService.getAllUser()); + channelService.addManyUserToChannel(channel1, userService.getAllUser()); + channelService.addManyUserToChannel(channel2, userService.getAllUser()); User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); Channel javaChannel = channelService.createChannel("자바 공부합시다", channelCreator); channelService.addManyUserToChannel(javaChannel, userService.getAllUser()); @@ -178,8 +178,7 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 단일 조회하기>"); - Optional findChannel1 = channelService.getChannelByName("코드잇 디스코드"); - System.out.println("코드잇 디스코드 채널 찾기 : " + findChannel1); + System.out.println("코드잇 디스코드 채널 찾기 : " + channelService.getChannelByName("코드잇 디스코드")); System.out.println("<전체 채널 조회하기>"); System.out.println(channelService.getAllChannel()); System.out.println("<하나의 회원이 포함되어 있는 채널 조회>"); @@ -214,5 +213,8 @@ public static void main(String[] args) { System.out.println("코드잇 채널 삭제 이후 해당 채널에 존재하는 메시지 출력해보기"); channelService.deleteChannel(channel1); System.out.println(messageService.getMessageByChannel(channel1)); + FileIOUtil.convertDatToJson(Paths.get("./result/users.dat"), Paths.get("./json/users.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/messages.dat"), Paths.get("./json/messages.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/channels.dat"), Paths.get("./json/channels.json")); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 0477a69ad..7b2e737a7 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.Objects; import java.util.UUID; public class User implements Serializable { @@ -59,6 +60,18 @@ public static boolean isValidPassword(String password) { return password.matches(passwordRegex); } + @Override + public boolean equals(Object object) { + if (object == null || getClass() != object.getClass()) return false; + User user = (User) object; + return Objects.equals(phone, user.phone); + } + + @Override + public int hashCode() { + return Objects.hashCode(phone); + } + @Override public String toString() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 623aef152..e5372627f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -101,20 +101,26 @@ public Channel addUserToChannel(Channel channel, User newUser) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } channel.addUser(newUser); + channels.put(channel.getId(), channel); + saveToFile(channels, filePath); return channel; } @Override public Channel addManyUserToChannel(Channel channel, List users) { + Map channels = loadFromFile(filePath); if (!channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } channel.addManyUser(users); + channels.put(channel.getId(), channel); + saveToFile(channels, filePath); return channel; } @Override public Channel removeUserToChannel(Channel channel, User removeUser) { + Map channels = loadFromFile(filePath); if (!channelExist(channel.getName())) { throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); } @@ -123,6 +129,8 @@ public Channel removeUserToChannel(Channel channel, User removeUser) { throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); } channel.removeUser(removeUser); + channels.put(channel.getId(), channel); + saveToFile(channels, filePath); return channel; } diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index ea3bb4ce5..8f78cb56c 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -1,7 +1,13 @@ package com.sprint.mission.discodeit.util; -import java.io.*; -import java.nio.file.*; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.EOFException; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -28,5 +34,17 @@ public static void saveToFile(Map data, Path filePath) { throw new RuntimeException("파일 저장 도중 문제가 발생하였습니다.", e); } } + + //.dat 파일을 읽기 쉬운 Json 파일로 변환하는 메서드 + public static void convertDatToJson(Path datFilePath, Path jsonFilePath) { + Map data = loadFromFile(datFilePath); + + ObjectMapper objectMapper = new ObjectMapper(); + try { + objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFilePath.toFile(), data); + } catch (IOException e) { + throw new RuntimeException("JSON 파일로 변환하는 도중 문제가 발생하였습니다.", e); + } + } } From 70be29cc95616a7dadf2828c7c759d2e3449822d Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 18:29:33 +0900 Subject: [PATCH 019/115] Add JCF, File repository --- json/channels.json | 88 ++++++++++++++---- json/messages.json | 61 +++++++++++- json/users.json | 68 +++++++------- result/channels.dat | Bin 1351 -> 1999 bytes result/messages.dat | Bin 82 -> 1389 bytes result/users.dat | Bin 1052 -> 1052 bytes .../mission/discodeit/JavaApplication.java | 16 ++-- .../repository/ChannelRepository.java | 4 + .../repository/MessageRepository.java | 5 + .../discodeit/repository/UserRepository.java | 3 + .../repository/jcf/JCFChannelRepository.java | 12 +++ .../repository/jcf/JCFMessageRepository.java | 13 +++ .../repository/jcf/JCFUserRepository.java | 11 +++ 13 files changed, 218 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java diff --git a/json/channels.json b/json/channels.json index 852b71665..f983448a2 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,46 +1,96 @@ { - "5cc6a9cd-071d-42b6-8d34-6505dc918f46" : { - "id" : "5cc6a9cd-071d-42b6-8d34-6505dc918f46", - "createdAt" : 1737362370130, - "updatedAt" : 1737362370132, + "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4" : { + "id" : "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4", + "createdAt" : 1737362918439, + "updatedAt" : 1737362918460, "members" : [ { - "id" : "b37c2425-ccdb-4cfe-8fb3-324bafb54542", - "createdAt" : 1737362370044, + "id" : "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6", + "createdAt" : 1737362918346, + "updatedAt" : 1737362918396, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" + }, { + "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", + "createdAt" : 1737362918366, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "e6d307c8-cfe0-4bad-b5a2-c50c68f5ee09", - "createdAt" : 1737362370039, + "id" : "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec", + "createdAt" : 1737362918362, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "48dce37f-9ee2-4e1c-8611-1074b120147f", - "createdAt" : 1737362370022, - "updatedAt" : 1737362370076, + "id" : "fe97c977-5eff-49db-b0f8-02b89f1b6630", + "createdAt" : 1737362918367, + "updatedAt" : null, + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "2418d752-a8a2-48f4-ba29-18be27945a2b", + "createdAt" : 1737362918456, + "updatedAt" : null, + "name" : "홍길동", + "phone" : "010-1234-4321", + "password" : "Abcdefgh!" + } ], + "name" : "코테 준비", + "creator" : { + "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", + "createdAt" : 1737362918364, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + } + }, + "41bba8b5-1092-4149-b55e-6b28356f2f5f" : { + "id" : "41bba8b5-1092-4149-b55e-6b28356f2f5f", + "createdAt" : 1737362918448, + "updatedAt" : 1737362918450, + "members" : [ { + "id" : "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6", + "createdAt" : 1737362918346, + "updatedAt" : 1737362918396, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, { - "id" : "368916ad-16ea-4875-89fa-e0ecb36f98d8", - "createdAt" : 1737362370128, + "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", + "createdAt" : 1737362918366, + "updatedAt" : null, + "name" : "이채은", + "phone" : "010-4444-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "20d05816-e6cc-4810-8573-e6d6b4d395d6", + "createdAt" : 1737362918446, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", "password" : "Abcdefgh!" }, { - "id" : "67f512fc-1865-4f46-93e8-819779931c1d", - "createdAt" : 1737362370041, + "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", + "createdAt" : 1737362918364, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "d20cd8dc-f1ac-4992-8b83-4c737dbfb0cd", - "createdAt" : 1737362370045, + "id" : "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec", + "createdAt" : 1737362918362, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "fe97c977-5eff-49db-b0f8-02b89f1b6630", + "createdAt" : 1737362918367, "updatedAt" : null, "name" : "정다은", "phone" : "010-5555-1111", @@ -48,8 +98,8 @@ } ], "name" : "자바 공부합시다", "creator" : { - "id" : "368916ad-16ea-4875-89fa-e0ecb36f98d8", - "createdAt" : 1737362370128, + "id" : "20d05816-e6cc-4810-8573-e6d6b4d395d6", + "createdAt" : 1737362918446, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", diff --git a/json/messages.json b/json/messages.json index 6f31cf5a2..b7926d061 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1 +1,60 @@ -{ } \ No newline at end of file +{ + "8a591869-9404-4f35-bb39-a60e037f0825" : { + "id" : "8a591869-9404-4f35-bb39-a60e037f0825", + "createdAt" : 1737362918443, + "updatedAt" : null, + "content" : "열심히 하겠습니다!!", + "writer" : { + "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", + "createdAt" : 1737362918364, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, + "channel" : { + "id" : "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4", + "createdAt" : 1737362918439, + "updatedAt" : null, + "members" : [ ], + "name" : "코테 준비", + "creator" : { + "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", + "createdAt" : 1737362918364, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + } + } + }, + "0bfd6b1f-26d0-46d6-b203-ae3eb0f19ef6" : { + "id" : "0bfd6b1f-26d0-46d6-b203-ae3eb0f19ef6", + "createdAt" : 1737362918440, + "updatedAt" : null, + "content" : "열심히 공부하는 코테 준비 채널입니다!", + "writer" : { + "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", + "createdAt" : 1737362918366, + "updatedAt" : null, + "name" : "이채은", + "phone" : "010-4444-1111", + "password" : "Abcdefgh12312!!" + }, + "channel" : { + "id" : "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4", + "createdAt" : 1737362918439, + "updatedAt" : null, + "members" : [ ], + "name" : "코테 준비", + "creator" : { + "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", + "createdAt" : 1737362918364, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + } + } + } +} \ No newline at end of file diff --git a/json/users.json b/json/users.json index e748c2dbf..14ba9afe6 100644 --- a/json/users.json +++ b/json/users.json @@ -1,55 +1,55 @@ { - "b37c2425-ccdb-4cfe-8fb3-324bafb54542" : { - "id" : "b37c2425-ccdb-4cfe-8fb3-324bafb54542", - "createdAt" : 1737362370044, + "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6" : { + "id" : "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6", + "createdAt" : 1737362918346, + "updatedAt" : 1737362918396, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" + }, + "20443f00-739f-46b5-aed6-2944ddadf4e5" : { + "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", + "createdAt" : 1737362918366, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, - "e6d307c8-cfe0-4bad-b5a2-c50c68f5ee09" : { - "id" : "e6d307c8-cfe0-4bad-b5a2-c50c68f5ee09", - "createdAt" : 1737362370039, + "2418d752-a8a2-48f4-ba29-18be27945a2b" : { + "id" : "2418d752-a8a2-48f4-ba29-18be27945a2b", + "createdAt" : 1737362918456, "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, - "48dce37f-9ee2-4e1c-8611-1074b120147f" : { - "id" : "48dce37f-9ee2-4e1c-8611-1074b120147f", - "createdAt" : 1737362370022, - "updatedAt" : 1737362370076, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" + "name" : "홍길동", + "phone" : "010-1234-4321", + "password" : "Abcdefgh!" }, - "368916ad-16ea-4875-89fa-e0ecb36f98d8" : { - "id" : "368916ad-16ea-4875-89fa-e0ecb36f98d8", - "createdAt" : 1737362370128, + "20d05816-e6cc-4810-8573-e6d6b4d395d6" : { + "id" : "20d05816-e6cc-4810-8573-e6d6b4d395d6", + "createdAt" : 1737362918446, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", "password" : "Abcdefgh!" }, - "33b0f258-f521-4015-aa24-7b8ff6d6f02b" : { - "id" : "33b0f258-f521-4015-aa24-7b8ff6d6f02b", - "createdAt" : 1737362370138, - "updatedAt" : null, - "name" : "홍길동", - "phone" : "010-1234-4321", - "password" : "Abcdefgh!" - }, - "67f512fc-1865-4f46-93e8-819779931c1d" : { - "id" : "67f512fc-1865-4f46-93e8-819779931c1d", - "createdAt" : 1737362370041, + "022b398f-7ec4-49a1-9026-7e0193cafb52" : { + "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", + "createdAt" : 1737362918364, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, - "d20cd8dc-f1ac-4992-8b83-4c737dbfb0cd" : { - "id" : "d20cd8dc-f1ac-4992-8b83-4c737dbfb0cd", - "createdAt" : 1737362370045, + "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec" : { + "id" : "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec", + "createdAt" : 1737362918362, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, + "fe97c977-5eff-49db-b0f8-02b89f1b6630" : { + "id" : "fe97c977-5eff-49db-b0f8-02b89f1b6630", + "createdAt" : 1737362918367, "updatedAt" : null, "name" : "정다은", "phone" : "010-5555-1111", diff --git a/result/channels.dat b/result/channels.dat index 0101df4d4e88408c22ef99e2b97ff1ff76920053..73e4e371d8fd01f96266d2699969be08b0302f83 100644 GIT binary patch delta 691 zcmX@kb)J7h03*}HKpTN&4#A6dz1x1IxApR^GsnCSZ=7q-$o$Mlee!+AnUc@E?-Um@ z)G;tkP^)8{eCl@)leT4l-4V})lc%wm2r{AToqT~w&ycm8g@J*A6|9dBOmZ_YFivTD z=6woc*3=v8cJDkjZyDn%4qZ_#--DAMGMnl?^ZtWH$32LSb=Ndq?ymjvRKdlbp?JRA z*2((J4nVivg2>Kz*R9KSWY3$;kK@%YIeQ09HnHB9sM z;~jUe*eWo|(Gx7nQe0>T3|5#@1F#@UVEO1lw6_*NySC->)N2YCBE+7Z@er6ikx5?+ jtC?bxe=|t~LxswrjK?8*swhszlU68+tq_)HK1LM)!R{12 delta 332 zcmX@lf1GPV03+kXKpTNxlT_9_6Z_p_j;%b)F6*>y<6L`2=DY8LCf{eADS7u@Kye{M z9RpM6uLo~7=g+ud)+x4D?3G99WII-U46T!|G3gnym9sD~FtCBO@qtNh1_s6{O?Th^ zff&`l*~okSR#&IZH7crSZu|V3EXn2|dH3yii0sxyM|m>7zT~^Z#_5%l zWn|O83jL8t^>>>*k;!E8X=ad$zYrDO%|6Ao`!}4u#B<}$$2FdlCVR5zPhQ5Z%5wKz GNCg1n&x?8h diff --git a/result/messages.dat b/result/messages.dat index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..667ecca86833efbc4ac92de35026ca9ff4939d8e 100644 GIT binary patch literal 1389 zcmcJOTSyd97{@g%g3@AX-}pAB^I9B?&|?nfdfb&_|RL~sqH1(dl}P`z6^ zWVakm+0eCbg%q~#DWO_UdB2Vnb2JVSpp;B{i5vU>j?GW zrH^fH4T%JKDriB*yaGWn9&?gsZlC4Jvj|vQqv|o+4nr#>3y{>TNd##GHZ96uJw{qt zP+e>!F`U{ngQ*YXXI>+cxbv8WWCKOf*wQ8dwa)&f&3(aL@68g|H)xG{52MINh*d+QJQBZ>n;~g=Ib~m!KP7L?1P7A*eaR5OT zAR&DGlaNDca~JahuyBT^F7K#Y_o)5PsByOW_ES_5<7P!OxG7Ge>Qm&uvoUD9>223* z%vM}ac5A}vr$6>`d8OU0lhqdq*do_^^($@BbDad1Ry4Rh=z!N(SX5kCSNA;;`z?@A4OT22 zK`beNW-FV6R9wFwj&_`M=!0#M+wCfWRr;AxJv1C0=yXJT&(4lq(7VPWq0UHX(CIXe zj?oBt4923eIm`4kV!5{E`j>%kX+ICG&3;}rZR}c&Ic-5}jvr!vHE$W?Dh^#yE#HG1=dvclm$$3GB7YsX?o^;4`htsdFnNV3lU<^&Ugr5QLQ)mCXvA30^Jeqoc(qH;-iNTLz6DaPIhljWRAs{t brXBO8(+vJiKUp64-}5#W)%PbqXEp@@W&eB{ delta 332 zcmbQkF^6M9uR#B1Bk%QFU7a@9sHmQ~?elNrTvkSoyKny#GSo3JPgY_w)!e%1C{M=M zcbv~Iv!6Kszf0k$R6ikL%|>@{_@$ z`WaY^30>vn-HfKXci%yDFm?WV@Md%Vj2mX1Vr#`-d6Z(B^DbcWWhN8NRVvl}->!Yo zHs0_l;;W*AC>DiLAm=GhZeY^aocyA3dgWvp+4QeMe"); Channel channel1 = channelService.createChannel("코드잇 디스코드", user2); Channel channel2 = channelService.createChannel("코테 준비", user3); + messageService.createMessage("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); + messageService.createMessage("열심히 하겠습니다!!", user3, channel2); channelService.addManyUserToChannel(channel1, userService.getAllUser()); channelService.addManyUserToChannel(channel2, userService.getAllUser()); User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); @@ -197,12 +199,6 @@ public static void main(String[] args) { System.out.println(); System.out.println("==============================================================================="); System.out.println(); - System.out.println("<채널 삭제하기> : 코테 준비 채널 삭제"); - channelService.deleteChannel(channel2); - System.out.println(channelService.getAllChannel()); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); System.out.println("<심화> - 채널을 삭제하면 해당 채널에 있던 메시지가 조회되면 안된다."); System.out.println("코드잇 채널에 메시지를 여러 개 생성"); messageService.createMessage("안녕하세요 처음 인사드립니다.", user3, channel1); @@ -213,8 +209,10 @@ public static void main(String[] args) { System.out.println("코드잇 채널 삭제 이후 해당 채널에 존재하는 메시지 출력해보기"); channelService.deleteChannel(channel1); System.out.println(messageService.getMessageByChannel(channel1)); - FileIOUtil.convertDatToJson(Paths.get("./result/users.dat"), Paths.get("./json/users.json")); - FileIOUtil.convertDatToJson(Paths.get("./result/messages.dat"), Paths.get("./json/messages.json")); - FileIOUtil.convertDatToJson(Paths.get("./result/channels.dat"), Paths.get("./json/channels.json")); + if (factory instanceof FileFactory) { + FileIOUtil.convertDatToJson(Paths.get("./result/users.dat"), Paths.get("./json/users.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/messages.dat"), Paths.get("./json/messages.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/channels.dat"), Paths.get("./json/channels.json")); + } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 293de39c7..cf8edb1f1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,4 +1,8 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; + public interface ChannelRepository { + Channel create(String name, User creator); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index f0ba4a208..900ba5415 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,4 +1,9 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; + public interface MessageRepository { + Message create(String content, User writer, Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 0ab7c94fb..c65ec50b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -1,4 +1,7 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.entity.User; + public interface UserRepository { + User create(String name, String phone, String password); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java new file mode 100644 index 000000000..e3ad63693 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.ChannelRepository; + +public class JCFChannelRepository implements ChannelRepository { + @Override + public Channel create(String name, User creator) { + return null; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java new file mode 100644 index 000000000..1cc356257 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.MessageRepository; + +public class JCFMessageRepository implements MessageRepository { + @Override + public Message create(String content, User writer, Channel channel) { + return null; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java new file mode 100644 index 000000000..3181c497b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + +public class JCFUserRepository implements UserRepository { + @Override + public User create(String name, String phone, String password) { + return null; + } +} From beef1bfe6f01c28195899284c831634e7807ff7f Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 20 Jan 2025 18:46:23 +0900 Subject: [PATCH 020/115] Update repository --- json/channels.json | 108 +++++++++--------- json/messages.json | 36 +++--- json/users.json | 70 ++++++------ result/channels.dat | Bin 1999 -> 0 bytes result/messages.dat | Bin 1389 -> 0 bytes result/users.dat | Bin 1052 -> 0 bytes .../mission/discodeit/JavaApplication.java | 4 +- .../file/FileChannelRepository.java | 49 ++++++++ .../file/FileMessageRepository.java | 50 ++++++++ .../repository/file/FileUserRepository.java | 55 +++++++++ .../repository/jcf/JCFChannelRepository.java | 23 +++- .../repository/jcf/JCFMessageRepository.java | 21 +++- .../repository/jcf/JCFUserRepository.java | 31 ++++- .../service/file/FileChannelService.java | 9 +- .../service/jcf/JCFChannelService.java | 7 +- .../discodeit/service/jcf/JCFUserService.java | 2 +- 16 files changed, 343 insertions(+), 122 deletions(-) delete mode 100644 result/channels.dat delete mode 100644 result/messages.dat delete mode 100644 result/users.dat create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java diff --git a/json/channels.json b/json/channels.json index f983448a2..50343abb7 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,39 +1,39 @@ { - "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4" : { - "id" : "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4", - "createdAt" : 1737362918439, - "updatedAt" : 1737362918460, + "4dd36f67-d385-4eea-a334-887f9cee532c" : { + "id" : "4dd36f67-d385-4eea-a334-887f9cee532c", + "createdAt" : 1737366128033, + "updatedAt" : 1737366128074, "members" : [ { - "id" : "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6", - "createdAt" : 1737362918346, - "updatedAt" : 1737362918396, + "id" : "687b9a63-304c-4f98-a782-6c59394a3e39", + "createdAt" : 1737366127937, + "updatedAt" : null, + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "77361495-8ec4-408c-8780-83104113840f", + "createdAt" : 1737366127904, + "updatedAt" : 1737366127972, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, { - "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", - "createdAt" : 1737362918366, + "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", + "createdAt" : 1737366127934, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec", - "createdAt" : 1737362918362, + "id" : "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36", + "createdAt" : 1737366127929, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "fe97c977-5eff-49db-b0f8-02b89f1b6630", - "createdAt" : 1737362918367, - "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "2418d752-a8a2-48f4-ba29-18be27945a2b", - "createdAt" : 1737362918456, + "id" : "fa2ad4d4-20d2-4a23-9cd1-8be3c2676d61", + "createdAt" : 1737366128065, "updatedAt" : null, "name" : "홍길동", "phone" : "010-1234-4321", @@ -41,65 +41,65 @@ } ], "name" : "코테 준비", "creator" : { - "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", - "createdAt" : 1737362918364, + "id" : "e14dd857-7a6c-4251-b663-928910ae4687", + "createdAt" : 1737366127931, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" } }, - "41bba8b5-1092-4149-b55e-6b28356f2f5f" : { - "id" : "41bba8b5-1092-4149-b55e-6b28356f2f5f", - "createdAt" : 1737362918448, - "updatedAt" : 1737362918450, + "45e43fda-f792-4655-8bd7-35e61552c636" : { + "id" : "45e43fda-f792-4655-8bd7-35e61552c636", + "createdAt" : 1737366128053, + "updatedAt" : 1737366128056, "members" : [ { - "id" : "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6", - "createdAt" : 1737362918346, - "updatedAt" : 1737362918396, + "id" : "e14dd857-7a6c-4251-b663-928910ae4687", + "createdAt" : 1737366127931, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "687b9a63-304c-4f98-a782-6c59394a3e39", + "createdAt" : 1737366127937, + "updatedAt" : null, + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "77361495-8ec4-408c-8780-83104113840f", + "createdAt" : 1737366127904, + "updatedAt" : 1737366127972, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, { - "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", - "createdAt" : 1737362918366, + "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", + "createdAt" : 1737366127934, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "20d05816-e6cc-4810-8573-e6d6b4d395d6", - "createdAt" : 1737362918446, - "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" - }, { - "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", - "createdAt" : 1737362918364, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec", - "createdAt" : 1737362918362, + "id" : "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36", + "createdAt" : 1737366127929, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "fe97c977-5eff-49db-b0f8-02b89f1b6630", - "createdAt" : 1737362918367, + "id" : "b525d206-0ae5-479f-add0-55bcfa5579ae", + "createdAt" : 1737366128052, "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" } ], "name" : "자바 공부합시다", "creator" : { - "id" : "20d05816-e6cc-4810-8573-e6d6b4d395d6", - "createdAt" : 1737362918446, + "id" : "b525d206-0ae5-479f-add0-55bcfa5579ae", + "createdAt" : 1737366128052, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", diff --git a/json/messages.json b/json/messages.json index b7926d061..58cffcad0 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,26 +1,26 @@ { - "8a591869-9404-4f35-bb39-a60e037f0825" : { - "id" : "8a591869-9404-4f35-bb39-a60e037f0825", - "createdAt" : 1737362918443, + "897cd53a-b35c-42e8-8f13-c4c23b08aeca" : { + "id" : "897cd53a-b35c-42e8-8f13-c4c23b08aeca", + "createdAt" : 1737366128035, "updatedAt" : null, "content" : "열심히 하겠습니다!!", "writer" : { - "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", - "createdAt" : 1737362918364, + "id" : "e14dd857-7a6c-4251-b663-928910ae4687", + "createdAt" : 1737366127931, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4", - "createdAt" : 1737362918439, + "id" : "4dd36f67-d385-4eea-a334-887f9cee532c", + "createdAt" : 1737366128033, "updatedAt" : null, "members" : [ ], "name" : "코테 준비", "creator" : { - "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", - "createdAt" : 1737362918364, + "id" : "e14dd857-7a6c-4251-b663-928910ae4687", + "createdAt" : 1737366127931, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", @@ -28,28 +28,28 @@ } } }, - "0bfd6b1f-26d0-46d6-b203-ae3eb0f19ef6" : { - "id" : "0bfd6b1f-26d0-46d6-b203-ae3eb0f19ef6", - "createdAt" : 1737362918440, + "76eb57a4-8cd8-4991-b50c-97ba60a709e5" : { + "id" : "76eb57a4-8cd8-4991-b50c-97ba60a709e5", + "createdAt" : 1737366128034, "updatedAt" : null, "content" : "열심히 공부하는 코테 준비 채널입니다!", "writer" : { - "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", - "createdAt" : 1737362918366, + "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", + "createdAt" : 1737366127934, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "8d85d3da-ccc6-4bc3-a640-53a2baeeb7c4", - "createdAt" : 1737362918439, + "id" : "4dd36f67-d385-4eea-a334-887f9cee532c", + "createdAt" : 1737366128033, "updatedAt" : null, "members" : [ ], "name" : "코테 준비", "creator" : { - "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", - "createdAt" : 1737362918364, + "id" : "e14dd857-7a6c-4251-b663-928910ae4687", + "createdAt" : 1737366127931, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", diff --git a/json/users.json b/json/users.json index 14ba9afe6..5d7e85b2b 100644 --- a/json/users.json +++ b/json/users.json @@ -1,58 +1,58 @@ { - "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6" : { - "id" : "01aa082d-152a-4dc1-95d8-aebbb9ca9ea6", - "createdAt" : 1737362918346, - "updatedAt" : 1737362918396, + "e14dd857-7a6c-4251-b663-928910ae4687" : { + "id" : "e14dd857-7a6c-4251-b663-928910ae4687", + "createdAt" : 1737366127931, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, + "687b9a63-304c-4f98-a782-6c59394a3e39" : { + "id" : "687b9a63-304c-4f98-a782-6c59394a3e39", + "createdAt" : 1737366127937, + "updatedAt" : null, + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" + }, + "77361495-8ec4-408c-8780-83104113840f" : { + "id" : "77361495-8ec4-408c-8780-83104113840f", + "createdAt" : 1737366127904, + "updatedAt" : 1737366127972, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, - "20443f00-739f-46b5-aed6-2944ddadf4e5" : { - "id" : "20443f00-739f-46b5-aed6-2944ddadf4e5", - "createdAt" : 1737362918366, + "a07912b1-e72e-428b-9ff3-b97b360e4a12" : { + "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", + "createdAt" : 1737366127934, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, - "2418d752-a8a2-48f4-ba29-18be27945a2b" : { - "id" : "2418d752-a8a2-48f4-ba29-18be27945a2b", - "createdAt" : 1737362918456, + "fa2ad4d4-20d2-4a23-9cd1-8be3c2676d61" : { + "id" : "fa2ad4d4-20d2-4a23-9cd1-8be3c2676d61", + "createdAt" : 1737366128065, "updatedAt" : null, "name" : "홍길동", "phone" : "010-1234-4321", "password" : "Abcdefgh!" }, - "20d05816-e6cc-4810-8573-e6d6b4d395d6" : { - "id" : "20d05816-e6cc-4810-8573-e6d6b4d395d6", - "createdAt" : 1737362918446, - "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" - }, - "022b398f-7ec4-49a1-9026-7e0193cafb52" : { - "id" : "022b398f-7ec4-49a1-9026-7e0193cafb52", - "createdAt" : 1737362918364, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, - "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec" : { - "id" : "b3e35f26-d243-4bc2-98ee-8b2d0ac4bcec", - "createdAt" : 1737362918362, + "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36" : { + "id" : "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36", + "createdAt" : 1737366127929, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, - "fe97c977-5eff-49db-b0f8-02b89f1b6630" : { - "id" : "fe97c977-5eff-49db-b0f8-02b89f1b6630", - "createdAt" : 1737362918367, + "b525d206-0ae5-479f-add0-55bcfa5579ae" : { + "id" : "b525d206-0ae5-479f-add0-55bcfa5579ae", + "createdAt" : 1737366128052, "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" } } \ No newline at end of file diff --git a/result/channels.dat b/result/channels.dat deleted file mode 100644 index 73e4e371d8fd01f96266d2699969be08b0302f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1999 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05KELFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#Iea|m9v>)rMvy{(sTojK-x7-*Jua(=E}aY0dLUWs0A zW^r+5ex6=RW^r5_pq@R(#? zhB^k;iUN4}fn2Kxc5U~Q31|A1?=vwldNHt;CFYc-RunM^fCCw<$gdP+ciWn&vfNW1 zbTct9R1`2UFivTD=A#ZYO@o*a1bJ`SnWgT*N=IAJf)DI2u+Kp(cBpqiY)&5rj)KJE z;`02W6eypyAR|9770SW%8%Tm1;x_L)#ULKj1hqQG$)|n?F=<=&*B$X(Si->hdc)K= z%NyR#?kHj4cT7r7Nli=7Ff=kYG*VP7Vc<0|G|)8$0$oEOD1aD(CE*Ao5}{*JQDP-1 zE-D%?$<92UIG34$(UXCtII}7h6jBVV)$mVVLNe7#kTDQ~(42 z&E6?*TYD6M@$!0S3)nnpRQlLJOy3%ptznw4AMdz(#a4kyj-Fsq78I2RU>-_n`shJ) zw-!IUw&n8FYYG=4#Gak;5CFOdm=NB~oA7$W6fADDFgLc;wKO&{h9*<2mWu(?9ve6X zvSC{6J#g%g3@AX-}pAB^I9B?&|?nfdfb&_|RL~sqH1(dl}P`z6^ zWVakm+0eCbg%q~#DWO_UdB2Vnb2JVSpp;B{i5vU>j?GW zrH^fH4T%JKDriB*yaGWn9&?gsZlC4Jvj|vQqv|o+4nr#>3y{>TNd##GHZ96uJw{qt zP+e>!F`U{ngQ*YXXI>+cxbv8WWCKOf*wQ8dwa)&f&3(aL@68g|H)xG{52MINh*d+QJQBZ>n;~g=Ib~m!KP7L?1P7A*eaR5OT zAR&DGlaNDca~JahuyBT^F7K#Y_o)5PsByOW_ES_5<7P!OxG7Ge>Qm&uvoUD9>223* z%vM}ac5A}vr$6>`d8OU0lhqdq*do_^^($@BbDad1Ry4Rh=z!N(SX5kCSNA;;`z?@A4OT22 zK`beNW-FV6R9wFwj&_`M=!0#M+wCfWRr;AxJv1C0=yXJT&(4lq(7VPWq0UHX(CIXe zj?oBt4923eIm`4kV!5{E`j>%kX+ICG&3;}rZR}c&Ic-5}jAf67&w!QQWHy3Qyfc5 z7zBJk&e6|F%uCnz$NM{o(yYLFg|g2dwD z^8BKdLWVj9b{_`Tf{gsUR49kDv>*jyA4q_;q5vKWAZzu&)^?qdNmT^wlo+nK$ucIvnH}fXE-Y^A=xfbTemb#Y4CdN>6C#cmi zPCoTJh)LVBzwU_VLQHeL?|{rz2AcJH!_+s+8{W?Dz!@6GK!6+?Gv0OUavj<8X7l5C zwM)+4hp?D_3uL+`&~#8(x6FAnX9-Tzjer2z^bJ3lcFdPfGx#_CWO>|w&)Zl`zYj89 VA7uK1sjs`2;EPF9Ab^-&0RY(^WElVe diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 3ef60a568..6280e4832 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -20,8 +20,8 @@ public class JavaApplication { public static void main(String[] args) { -// Factory factory = JCFFactory.getInstance(); - Factory factory = FileFactory.getInstance(); + Factory factory = JCFFactory.getInstance(); +// Factory factory = FileFactory.getInstance(); UserService userService = factory.getUserService(); MessageService messageService = factory.getMessageService(); ChannelService channelService = factory.getChannelService(); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java new file mode 100644 index 000000000..8fbaf63fe --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -0,0 +1,49 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static com.sprint.mission.discodeit.error.ChannelError.DUPLICATE_NAME; +import static com.sprint.mission.discodeit.error.UserError.DUPLICATE_PHONE; +import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + +public class FileChannelRepository implements ChannelRepository { + private final Path filePath; + + public FileChannelRepository(String filePath) { + this.filePath = Paths.get(filePath); + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } + } + } + @Override + public Channel create(String name, User creator) { + Map channels = loadFromFile(filePath); + if (channels.values().stream() + .anyMatch(user -> user.getName().equals(name))) { + throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + } + + Channel createChannel = new Channel(name, creator); + channels.put(createChannel.getId(), createChannel); + saveToFile(channels, filePath); + return createChannel; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java new file mode 100644 index 000000000..a40c62098 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -0,0 +1,50 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.FileIOUtil; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static com.sprint.mission.discodeit.error.ChannelError.CANNOT_FOUND_CHANNEL; +import static com.sprint.mission.discodeit.error.MessageError.EMPTY_CONTENT; +import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + +public class FileMessageRepository implements MessageRepository { + private final Path filePath; + + public FileMessageRepository(String filePath) { + this.filePath = Paths.get(filePath); + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } + } + } + @Override + public Message create(String content, User writer, Channel channel) { + Map messages = FileIOUtil.loadFromFile(filePath); + if (content.isEmpty()) { + throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + } + + Message message = new Message(content, writer, channel); + messages.put(message.getId(), message); + FileIOUtil.saveToFile(messages, filePath); + return message; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java new file mode 100644 index 000000000..e82f8b1b7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -0,0 +1,55 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.util.ValidPass; +import com.sprint.mission.discodeit.util.ValidPhone; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static com.sprint.mission.discodeit.error.UserError.*; +import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + +public class FileUserRepository implements UserRepository { + private final Path filePath; + + public FileUserRepository(String filePath) { + this.filePath = Paths.get(filePath); + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } + } + } + + @Override + public User create(String name, String phone, String password) { + Map users = loadFromFile(filePath); + if (!ValidPass.isValidPassword(password)) { + throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + } + + if (!ValidPhone.isValidPhone(phone)) { + throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + } + if (users.values().stream() + .anyMatch(user -> user.getPhone().equals(phone))) { + throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + } + + User createUser = new User(name, phone, password); + users.put(createUser.getId(), createUser); + saveToFile(users, filePath); + return createUser; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index e3ad63693..bf110b2b5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,11 +2,32 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ChannelError; import com.sprint.mission.discodeit.repository.ChannelRepository; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static com.sprint.mission.discodeit.error.ChannelError.DUPLICATE_NAME; +import static com.sprint.mission.discodeit.error.UserError.DUPLICATE_PHONE; + public class JCFChannelRepository implements ChannelRepository { + private final Map channelMap; + + public JCFChannelRepository() { + this.channelMap = new HashMap<>(); + } + @Override public Channel create(String name, User creator) { - return null; + if (channelMap.values().stream() + .anyMatch(user -> user.getName().equals(name))) { + throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + } + + Channel createChannel = new Channel(name, creator); + channelMap.put(createChannel.getId(), createChannel); + return createChannel; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 1cc356257..09e487198 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -5,9 +5,28 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.MessageRepository; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + + +import static com.sprint.mission.discodeit.error.MessageError.EMPTY_CONTENT; + + public class JCFMessageRepository implements MessageRepository { + private final Map messageMap; + + public JCFMessageRepository() { + this.messageMap = new HashMap<>(); + } + @Override public Message create(String content, User writer, Channel channel) { - return null; + if (content.isEmpty()) { + throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + } + Message message = new Message(content, writer, channel); + messageMap.put(message.getId(), message); + return message; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 3181c497b..5a583c8e8 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -1,11 +1,40 @@ package com.sprint.mission.discodeit.repository.jcf; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.UserError; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.util.ValidPass; +import com.sprint.mission.discodeit.util.ValidPhone; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static com.sprint.mission.discodeit.error.UserError.*; public class JCFUserRepository implements UserRepository { + private final Map userMap; + + public JCFUserRepository() { + this.userMap = new HashMap<>(); + } + @Override public User create(String name, String phone, String password) { - return null; + if (!ValidPass.isValidPassword(password)) { + throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + } + + if (!ValidPhone.isValidPhone(phone)) { + throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + } + + if (userMap.values().stream() + .anyMatch(user -> user.getPhone().equals(phone))) { + throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + } + User user = new User(name, phone, password); + userMap.put(user.getId(), user); + return user; } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index e5372627f..eb562d6d9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -45,10 +45,9 @@ public void setDependency(UserService userService, MessageService messageService @Override public Channel createChannel(String name, User creator) { Map channels = loadFromFile(filePath); - for (Channel channel : channels.values()) { - if (channelExist(name)) { - throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); - } + if (channels.values().stream() + .anyMatch(user -> user.getName().equals(name))) { + throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); } Channel createChannel = new Channel(name, creator); channels.put(createChannel.getId(), createChannel); @@ -146,4 +145,4 @@ public void deleteChannel(Channel channel) { saveToFile(channels, filePath); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 10a745c10..bed4288d5 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -31,10 +31,9 @@ public void setDependency(UserService userService, MessageService messageService @Override public Channel createChannel(String name, User creator) throws IllegalArgumentException { - for (Channel channel : channelRepository.values()) { // 채널 이름이 중복되면 안 됨 - if (channel.getName().equals(name)) { - throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); - } + if (channelRepository.values().stream() + .anyMatch(user -> user.getName().equals(name))) { + throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); } Channel createChannel = new Channel(name, creator); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index df74aa607..446e31df6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -27,7 +27,7 @@ public void setDependency(MessageService messageService, ChannelService channelS } @Override - public User createUser(String name, String phone, String password) throws IllegalArgumentException { + public User createUser(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); } From 0434dffd367df59a80dc4fb5fbea77480f07beba Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 10:29:45 +0900 Subject: [PATCH 021/115] Add custom exception --- build.gradle | 1 + .../mission/discodeit/entity/Channel.java | 27 ++-------- .../mission/discodeit/entity/Message.java | 27 ++-------- .../sprint/mission/discodeit/entity/User.java | 27 ++-------- .../mission/discodeit/error/ChannelError.java | 18 ------- .../mission/discodeit/error/ErrorCode.java | 24 +++++++++ .../mission/discodeit/error/MessageError.java | 18 ------- .../mission/discodeit/error/UserError.java | 19 ------- .../discodeit/exception/ServiceException.java | 19 +++++++ .../discodeit/factory/FileFactory.java | 2 +- .../mission/discodeit/factory/JCFFactory.java | 8 +-- .../file/FileChannelRepository.java | 8 ++- .../file/FileMessageRepository.java | 9 ++-- .../repository/file/FileUserRepository.java | 10 ++-- .../repository/jcf/JCFChannelRepository.java | 8 ++- .../repository/jcf/JCFMessageRepository.java | 8 ++- .../repository/jcf/JCFUserRepository.java | 11 ++--- .../service/basic/BasicUserService.java | 3 ++ .../service/file/FileChannelService.java | 42 +++++++--------- .../service/file/FileMessageService.java | 40 ++++++++------- .../service/file/FileUserService.java | 13 ++--- .../service/jcf/JCFChannelService.java | 49 ++++++++----------- .../service/jcf/JCFMessageService.java | 45 ++++++++--------- .../discodeit/service/jcf/JCFUserService.java | 20 ++++---- .../mission/discodeit/util/FileIOUtil.java | 3 +- 25 files changed, 184 insertions(+), 275 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/error/ChannelError.java create mode 100644 src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/error/MessageError.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/error/UserError.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java diff --git a/build.gradle b/build.gradle index de4e8093d..e2408b5eb 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ repositories { } dependencies { + compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.36' implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3' testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index c7931455b..3068a5158 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,5 +1,7 @@ package com.sprint.mission.discodeit.entity; +import lombok.Getter; + import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; @@ -11,6 +13,7 @@ import java.util.UUID; import java.util.stream.Collectors; +@Getter public class Channel implements Serializable { private UUID id; private Long createdAt; @@ -28,30 +31,6 @@ public Channel(String name, User creator) { this.creator = creator; } - public UUID getId() { - return id; - } - - public Long getCreatedAt() { - return createdAt; - } - - public Long getUpdatedAt() { - return updatedAt; - } - - public List getMembers() { - return members; - } - - public String getName() { - return name; - } - - public User getCreator() { - return creator; - } - public void addUser(User user) { this.members.add(user); this.updatedAt = System.currentTimeMillis(); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 94c99d859..3602d61d3 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,5 +1,7 @@ package com.sprint.mission.discodeit.entity; +import lombok.Getter; + import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; @@ -7,6 +9,7 @@ import java.time.format.DateTimeFormatter; import java.util.UUID; +@Getter public class Message implements Serializable { private UUID id; private Long createdAt; @@ -24,30 +27,6 @@ public Message(String content, User writer, Channel channel) { this.channel = channel; } - public UUID getId() { - return id; - } - - public Long getCreatedAt() { - return createdAt; - } - - public Long getUpdatedAt() { - return updatedAt; - } - - public String getContent() { - return content; - } - - public User getWriter() { - return writer; - } - - public Channel getChannel() { - return channel; - } - public void update(String content) { this.content = content; this.updatedAt = System.currentTimeMillis(); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 7b2e737a7..930347c6d 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,5 +1,7 @@ package com.sprint.mission.discodeit.entity; +import lombok.Getter; + import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; @@ -8,6 +10,7 @@ import java.util.Objects; import java.util.UUID; +@Getter public class User implements Serializable { private UUID id; private Long createdAt; @@ -25,30 +28,6 @@ public User(String name, String phone, String password) { this.password = password; } - public UUID getId() { - return id; - } - - public Long getCreatedAt() { - return createdAt; - } - - public Long getUpdatedAt() { - return updatedAt; - } - - public String getName() { - return name; - } - - public String getPhone() { - return phone; - } - - public String getPassword() { - return password; - } - public void update(String password) { this.password = password; this.updatedAt = System.currentTimeMillis(); diff --git a/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java b/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java deleted file mode 100644 index 7131548ca..000000000 --- a/src/main/java/com/sprint/mission/discodeit/error/ChannelError.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sprint.mission.discodeit.error; - -public enum ChannelError { - DUPLICATE_NAME("이미 존재하는 채널입니다"), - CANNOT_FOUND_NAME("해당 채널 이름이 존재하지 않습니다"), - CANNOT_FOUND_CHANNEL("등록된 채널이 없습니다"), - ; - - private String message; - - ChannelError(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java new file mode 100644 index 000000000..86f971a54 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.error; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorCode { + EMPTY_CONTENT("내용을 입력해주세요"), + + CANNOT_FOUND_MESSAGE("보낸 메시지가 없습니다"), + CANNOT_FOUND_CHANNEL("해당 채널을 찾을 수가 없습니다."), + CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"), + + DUPLICATE_PHONE("이미 존재하는 아이디 입니다."), + DUPLICATE_CHANNEL("이미 존재하는 채널 이름 입니다."), + + INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), + INVALID_WRITER("작성자가 올바르지 않습니다"), + INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."); + + + private final String description; + } diff --git a/src/main/java/com/sprint/mission/discodeit/error/MessageError.java b/src/main/java/com/sprint/mission/discodeit/error/MessageError.java deleted file mode 100644 index b0997c1f1..000000000 --- a/src/main/java/com/sprint/mission/discodeit/error/MessageError.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sprint.mission.discodeit.error; - -public enum MessageError { - EMPTY_CONTENT("내용을 입력해주세요"), - CANNOT_FOUND_MESSAGE("보낸 메시지가 없습니다"), - INVALID_WRITER("작성자가 올바르지 않습니다") - ; - - private String message; - - MessageError(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/error/UserError.java b/src/main/java/com/sprint/mission/discodeit/error/UserError.java deleted file mode 100644 index 0cadf1a1c..000000000 --- a/src/main/java/com/sprint/mission/discodeit/error/UserError.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sprint.mission.discodeit.error; - -public enum UserError { - CANNOT_FOUND_PHONE("해당 아이디를 찾을 수가 없습니다."), - DUPLICATE_PHONE("이미 존재하는 아이디 입니다."), - INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), - INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), - CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"); - - private final String message; - - UserError(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java new file mode 100644 index 000000000..0bad6b40b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.exception; + +import com.sprint.mission.discodeit.error.ErrorCode; +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ServiceException extends RuntimeException{ + private ErrorCode errorCode; + private String errorMessage; + + public ServiceException(ErrorCode errorCode) { + this.errorCode = errorCode; + this.errorMessage = errorCode.getDescription(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java index fa809dfd5..1b645e926 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java @@ -39,4 +39,4 @@ public MessageService getMessageService() { public ChannelService getChannelService() { return channelService; } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java index 7079d1b32..23350fb23 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java @@ -7,6 +7,8 @@ import com.sprint.mission.discodeit.service.jcf.JCFMessageService; import com.sprint.mission.discodeit.service.jcf.JCFUserService; +import java.util.HashMap; + public class JCFFactory implements Factory{ private static JCFFactory instance; private final UserService userService; @@ -14,9 +16,9 @@ public class JCFFactory implements Factory{ private final ChannelService channelService; private JCFFactory() { - this.userService = new JCFUserService(); - this.messageService = new JCFMessageService(); - this.channelService = new JCFChannelService(); + this.userService = new JCFUserService(new HashMap<>()); + this.messageService = new JCFMessageService(new HashMap<>()); + this.channelService = new JCFChannelService(new HashMap<>()); } public static JCFFactory getInstance() { diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 8fbaf63fe..569a11d04 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,9 +2,9 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; import java.io.IOException; import java.nio.file.Files; @@ -14,8 +14,6 @@ import java.util.Map; import java.util.UUID; -import static com.sprint.mission.discodeit.error.ChannelError.DUPLICATE_NAME; -import static com.sprint.mission.discodeit.error.UserError.DUPLICATE_PHONE; import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @@ -38,7 +36,7 @@ public Channel create(String name, User creator) { Map channels = loadFromFile(filePath); if (channels.values().stream() .anyMatch(user -> user.getName().equals(name))) { - throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); } Channel createChannel = new Channel(name, creator); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index a40c62098..aa1f4b8a2 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -3,9 +3,9 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; @@ -16,9 +16,6 @@ import java.util.Map; import java.util.UUID; -import static com.sprint.mission.discodeit.error.ChannelError.CANNOT_FOUND_CHANNEL; -import static com.sprint.mission.discodeit.error.MessageError.EMPTY_CONTENT; -import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageRepository implements MessageRepository { @@ -39,7 +36,7 @@ public FileMessageRepository(String filePath) { public Message create(String content, User writer, Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); if (content.isEmpty()) { - throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } Message message = new Message(content, writer, channel); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index e82f8b1b7..5fdfb5a10 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -1,6 +1,8 @@ package com.sprint.mission.discodeit.repository.file; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; @@ -12,8 +14,6 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; - -import static com.sprint.mission.discodeit.error.UserError.*; import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @@ -36,15 +36,15 @@ public FileUserRepository(String filePath) { public User create(String name, String phone, String password) { Map users = loadFromFile(filePath); if (!ValidPass.isValidPassword(password)) { - throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + throw new ServiceException(ErrorCode.INVALID_PASSWORD); } if (!ValidPhone.isValidPhone(phone)) { - throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + throw new ServiceException(ErrorCode.INVALID_WRITER); } if (users.values().stream() .anyMatch(user -> user.getPhone().equals(phone))) { - throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } User createUser = new User(name, phone, password); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index bf110b2b5..9a2ee2c4a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,16 +2,14 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ChannelError; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import static com.sprint.mission.discodeit.error.ChannelError.DUPLICATE_NAME; -import static com.sprint.mission.discodeit.error.UserError.DUPLICATE_PHONE; - public class JCFChannelRepository implements ChannelRepository { private final Map channelMap; @@ -23,7 +21,7 @@ public JCFChannelRepository() { public Channel create(String name, User creator) { if (channelMap.values().stream() .anyMatch(user -> user.getName().equals(name))) { - throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); } Channel createChannel = new Channel(name, creator); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 09e487198..b950170bc 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -3,16 +3,14 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.MessageRepository; import java.util.HashMap; import java.util.Map; import java.util.UUID; - -import static com.sprint.mission.discodeit.error.MessageError.EMPTY_CONTENT; - - public class JCFMessageRepository implements MessageRepository { private final Map messageMap; @@ -23,7 +21,7 @@ public JCFMessageRepository() { @Override public Message create(String content, User writer, Channel channel) { if (content.isEmpty()) { - throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } Message message = new Message(content, writer, channel); messageMap.put(message.getId(), message); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 5a583c8e8..5914d6951 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -1,7 +1,8 @@ package com.sprint.mission.discodeit.repository.jcf; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.UserError; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; @@ -10,8 +11,6 @@ import java.util.Map; import java.util.UUID; -import static com.sprint.mission.discodeit.error.UserError.*; - public class JCFUserRepository implements UserRepository { private final Map userMap; @@ -22,16 +21,16 @@ public JCFUserRepository() { @Override public User create(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { - throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + throw new ServiceException(ErrorCode.INVALID_PASSWORD); } if (!ValidPhone.isValidPhone(phone)) { - throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + throw new ServiceException(ErrorCode.INVALID_WRITER); } if (userMap.values().stream() .anyMatch(user -> user.getPhone().equals(phone))) { - throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } User user = new User(name, phone, password); userMap.put(user.getId(), user); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 7dc7a319d..d3c2e1057 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,4 +1,7 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.repository.UserRepository; + public class BasicUserService { } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index eb562d6d9..7d2fb961f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -2,6 +2,8 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -16,9 +18,6 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; -import static com.sprint.mission.discodeit.error.ChannelError.*; -import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; - public class FileChannelService implements ChannelService { private final Path filePath; private UserService userService; @@ -47,7 +46,7 @@ public Channel createChannel(String name, User creator) { Map channels = loadFromFile(filePath); if (channels.values().stream() .anyMatch(user -> user.getName().equals(name))) { - throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); } Channel createChannel = new Channel(name, creator); channels.put(createChannel.getId(), createChannel); @@ -93,12 +92,8 @@ public List getChannelsByUserId(User user) { @Override public Channel addUserToChannel(Channel channel, User newUser) { Map channels = loadFromFile(filePath); - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } - if (!userService.userExists(newUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + validateChannel(channel); + validateUser(newUser); channel.addUser(newUser); channels.put(channel.getId(), channel); saveToFile(channels, filePath); @@ -108,9 +103,7 @@ public Channel addUserToChannel(Channel channel, User newUser) { @Override public Channel addManyUserToChannel(Channel channel, List users) { Map channels = loadFromFile(filePath); - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } + validateChannel(channel); channel.addManyUser(users); channels.put(channel.getId(), channel); saveToFile(channels, filePath); @@ -120,13 +113,8 @@ public Channel addManyUserToChannel(Channel channel, List users) { @Override public Channel removeUserToChannel(Channel channel, User removeUser) { Map channels = loadFromFile(filePath); - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } - - if (!userService.userExists(removeUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + validateChannel(channel); + validateUser(removeUser); channel.removeUser(removeUser); channels.put(channel.getId(), channel); saveToFile(channels, filePath); @@ -136,13 +124,21 @@ public Channel removeUserToChannel(Channel channel, User removeUser) { @Override public void deleteChannel(Channel channel) { Map channels = loadFromFile(filePath); - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } + validateChannel(channel); messageService.deleteMessageWithChannel(channel); channels.remove(channel.getId()); saveToFile(channels, filePath); } + + private void validateUser(User user) { + User findUser = userService.getUserByPhone(user.getPhone()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + + private void validateChannel(Channel channel) { + Channel findChannel = getChannelByName(channel.getName()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 34eb99bbc..5d59f9020 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -3,6 +3,8 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -14,9 +16,6 @@ import java.nio.file.Paths; import java.util.*; -import static com.sprint.mission.discodeit.error.ChannelError.*; -import static com.sprint.mission.discodeit.error.MessageError.*; -import static com.sprint.mission.discodeit.error.UserError.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageService implements MessageService { @@ -46,15 +45,12 @@ public void setDependency(UserService userService, ChannelService channelService public Message createMessage(String content, User writer, Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); if (content.isEmpty()) { - throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); - } - if (!userService.userExists(writer.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } + validateUser(writer); + + validateChannel(channel); - if (!channelService.channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } Message message = new Message(content, writer, channel); messages.put(message.getId(), message); FileIOUtil.saveToFile(messages, filePath); @@ -64,9 +60,9 @@ public Message createMessage(String content, User writer, Channel channel) { @Override public List getMessageByUser(User writer) { Map messages = FileIOUtil.loadFromFile(filePath); - if (!userService.userExists(writer.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + + validateUser(writer); + List list = new ArrayList<>(); for (Message message : messages.values()) { if (message.getWriter().getPhone().equals(writer.getPhone())) { @@ -92,7 +88,7 @@ public List getMessageByChannel(Channel channel) { public Message updateMessageContent(Message updateMessage, String newContent) { Map messages = FileIOUtil.loadFromFile(filePath); if (newContent.isEmpty()) { - throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } updateMessage.update(newContent); messages.put(updateMessage.getId(), updateMessage); @@ -104,12 +100,10 @@ public Message updateMessageContent(Message updateMessage, String newContent) { public void removeMessageByWriter(User writer, UUID uuid) { Map messages = FileIOUtil.loadFromFile(filePath); if (!messages.containsKey(uuid)) { - throw new IllegalArgumentException(CANNOT_FOUND_MESSAGE.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } Message findMessage = messages.get(uuid); - if (!findMessage.getWriter().getId().equals(writer.getId())) { - throw new IllegalArgumentException(INVALID_WRITER.getMessage()); - } + validateUser(writer); messages.remove(uuid); } @@ -122,4 +116,14 @@ public void deleteMessageWithChannel(Channel channel) { FileIOUtil.saveToFile(messages, filePath); } + + private void validateUser(User user) { + User findUser = userService.getUserByPhone(user.getPhone()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + + private void validateChannel(Channel channel) { + Channel findChannel = channelService.getChannelByName(channel.getName()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 60693fd44..782445059 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -1,6 +1,8 @@ package com.sprint.mission.discodeit.service.file; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -14,7 +16,6 @@ import java.util.*; import java.util.stream.Collectors; -import static com.sprint.mission.discodeit.error.UserError.*; import static com.sprint.mission.discodeit.util.FileIOUtil.*; public class FileUserService implements UserService { @@ -44,15 +45,15 @@ public void setDependency(MessageService messageService, ChannelService channelS public User createUser(String name, String phone, String password) { Map users = loadFromFile(filePath); if (!ValidPass.isValidPassword(password)) { - throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + throw new ServiceException(ErrorCode.INVALID_PASSWORD); } if (!ValidPhone.isValidPhone(phone)) { - throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + throw new ServiceException(ErrorCode.INVALID_WRITER); } if (users.values().stream() .anyMatch(user -> user.getPhone().equals(phone))) { - throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } User createUser = new User(name, phone, password); @@ -93,7 +94,7 @@ public List getAllUser() { public User updateUserPassword(User updateUser, String newPass) { Map users = loadFromFile(filePath); if (!userExists(updateUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } updateUser.update(newPass); users.put(updateUser.getId(), updateUser); @@ -105,7 +106,7 @@ public User updateUserPassword(User updateUser, String newPass) { public void deleteUser(User removeUser) { Map users = loadFromFile(filePath); if (!userExists(removeUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } channelService.getAllChannel().stream() .forEach(channel -> channel.getMembers() diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index bed4288d5..231cc5129 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -2,27 +2,23 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; import java.util.*; import java.util.stream.Collectors; -import static com.sprint.mission.discodeit.error.ChannelError.*; -import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; - - +@RequiredArgsConstructor public class JCFChannelService implements ChannelService { private final Map channelRepository; private UserService userService; private MessageService messageService; - public JCFChannelService() { - this.channelRepository = new HashMap<>(); - } - @Override public void setDependency(UserService userService, MessageService messageService) { this.userService = userService; @@ -33,7 +29,7 @@ public void setDependency(UserService userService, MessageService messageService public Channel createChannel(String name, User creator) throws IllegalArgumentException { if (channelRepository.values().stream() .anyMatch(user -> user.getName().equals(name))) { - throw new IllegalArgumentException(DUPLICATE_NAME.getMessage()); + throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); } Channel createChannel = new Channel(name, creator); @@ -75,45 +71,42 @@ public List getChannelsByUserId(User user) { @Override public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유저가 채널에 들어갈때 - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } - if (!userService.userExists(newUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + validateChannel(channel); + validateUser(newUser); channel.addUser(newUser); return channel; } @Override public Channel addManyUserToChannel(Channel channel, List users) { - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } + validateChannel(channel); channel.addManyUser(users); return channel; } @Override public Channel removeUserToChannel(Channel channel, User removeUser) { - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } - - if (!userService.userExists(removeUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + validateChannel(channel); + validateUser(removeUser); channel.removeUser(removeUser); return channel; } @Override public void deleteChannel(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. - if (!channelExist(channel.getName())) { - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } + validateChannel(channel); messageService.deleteMessageWithChannel(channel); channelRepository.remove(channel.getId()); } + + private void validateUser(User user) { + User findUser = userService.getUserByPhone(user.getPhone()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + + private void validateChannel(Channel channel) { + Channel findChannel = getChannelByName(channel.getName()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 23720f96b..1cdf6f82f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -3,26 +3,21 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; import java.util.*; -import static com.sprint.mission.discodeit.error.ChannelError.CANNOT_FOUND_CHANNEL; -import static com.sprint.mission.discodeit.error.MessageError.*; -import static com.sprint.mission.discodeit.error.UserError.CANNOT_FOUND_USER; - - +@RequiredArgsConstructor public class JCFMessageService implements MessageService { private final Map messageRepository; private UserService userService; private ChannelService channelService; - public JCFMessageService() { - this.messageRepository = new HashMap<>(); - } - @Override public void setDependency(UserService userService, ChannelService channelService) { this.userService = userService; @@ -32,16 +27,12 @@ public void setDependency(UserService userService, ChannelService channelService @Override public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { if (content.isEmpty()) { - throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } - if (!userService.userExists(writer.getPhone())) { // 해당 작성자가 존재하는가 - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + validateUser(writer); - if (!channelService.channelExist(channel.getName())) { // 해당 채널이 존재하는가? - throw new IllegalArgumentException(CANNOT_FOUND_CHANNEL.getMessage()); - } + validateChannel(channel); Message message = new Message(content, writer, channel); messageRepository.put(message.getId(), message); @@ -51,9 +42,7 @@ public Message createMessage(String content, User writer, Channel channel) throw // 메시지를 보낸 회원이 메시지 조회하기 @Override public List getMessageByUser(User writer) { - if (!userService.userExists(writer.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); - } + validateUser(writer); List messages = new ArrayList<>(); for (Message message : messageRepository.values()) { if (message.getWriter().getPhone().equals(writer.getPhone())) { @@ -78,7 +67,7 @@ public List getMessageByChannel(Channel channel) { @Override public Message updateMessageContent(Message findMessage, String newContent) { if (newContent.isEmpty()) { - throw new IllegalArgumentException(EMPTY_CONTENT.getMessage()); + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } findMessage.update(newContent); return findMessage; @@ -87,12 +76,10 @@ public Message updateMessageContent(Message findMessage, String newContent) { @Override public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작성한 메시지 삭제하기 if (!messageRepository.containsKey(uuid)) { - throw new IllegalArgumentException(CANNOT_FOUND_MESSAGE.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } + validateUser(writer); Message findMessage = messageRepository.get(uuid); - if (!findMessage.getWriter().getId().equals(writer.getId())) { - throw new IllegalArgumentException(INVALID_WRITER.getMessage()); - } messageRepository.remove(uuid); } @@ -103,4 +90,14 @@ public void deleteMessageWithChannel(Channel channel) { .map(Message::getId) .forEach(messageRepository::remove); } + + private void validateUser(User user) { + User findUser = userService.getUserByPhone(user.getPhone()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + + private void validateChannel(Channel channel) { + Channel findChannel = channelService.getChannelByName(channel.getName()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 446e31df6..5a6e83a59 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -1,25 +1,23 @@ package com.sprint.mission.discodeit.service.jcf; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; +import lombok.RequiredArgsConstructor; import java.util.*; -import static com.sprint.mission.discodeit.error.UserError.*; - +@RequiredArgsConstructor public class JCFUserService implements UserService { private final Map userRepository; private MessageService messageService; private ChannelService channelService; - public JCFUserService() { - this.userRepository = new HashMap<>(); - } - @Override public void setDependency(MessageService messageService, ChannelService channelService) { this.messageService = messageService; @@ -29,16 +27,16 @@ public void setDependency(MessageService messageService, ChannelService channelS @Override public User createUser(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { - throw new IllegalArgumentException(INVALID_PASSWORD.getMessage()); + throw new ServiceException(ErrorCode.INVALID_PASSWORD); } if (!ValidPhone.isValidPhone(phone)) { - throw new IllegalArgumentException(INVALID_PHONE.getMessage()); + throw new ServiceException(ErrorCode.INVALID_WRITER); } if (userRepository.values().stream() .anyMatch(user -> user.getPhone().equals(phone))) { - throw new IllegalArgumentException(DUPLICATE_PHONE.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } User user = new User(name, phone, password); userRepository.put(user.getId(), user); @@ -60,7 +58,7 @@ public List getAllUser() { @Override public User updateUserPassword(User updateUser, String newPass) { if (!userExists(updateUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } User findUser = userRepository.get(updateUser.getId()); findUser.update(newPass); @@ -70,7 +68,7 @@ public User updateUserPassword(User updateUser, String newPass) { @Override public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 속해있던 채널에 해당 유저가 삭제되어야 한다. if (!userExists(removeUser.getPhone())) { - throw new IllegalArgumentException(CANNOT_FOUND_USER.getMessage()); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } channelService.getAllChannel().stream() .forEach(channel -> channel.getMembers() diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index 8f78cb56c..0c87ec382 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -46,5 +46,4 @@ public static void convertDatToJson(Path datFilePath, Path jsonFilePath) { throw new RuntimeException("JSON 파일로 변환하는 도중 문제가 발생하였습니다.", e); } } -} - +} \ No newline at end of file From 4d8d7d59a328b361023b1d72278a99452780dd0a Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 11:26:42 +0900 Subject: [PATCH 022/115] Update JCFRepository --- .../mission/discodeit/dto/ChannelDTO.java | 33 ++++++++++++++ .../mission/discodeit/dto/MessageDTO.java | 33 ++++++++++++++ .../mission/discodeit/error/ErrorCode.java | 1 - .../repository/ChannelRepository.java | 13 +++++- .../repository/MessageRepository.java | 16 ++++++- .../discodeit/repository/UserRepository.java | 11 ++++- .../repository/jcf/JCFChannelRepository.java | 44 ++++++++++++++----- .../repository/jcf/JCFMessageRepository.java | 43 ++++++++++++++---- .../repository/jcf/JCFUserRepository.java | 42 +++++++++--------- .../service/jcf/JCFMessageService.java | 20 +++------ 10 files changed, 198 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java new file mode 100644 index 000000000..522de3318 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.User; +import lombok.*; + +import java.util.List; +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ChannelDTO { + private UUID id; + private Long createdAt; + private Long updatedAt; + private List members; + private String channelName; + private String creatorId; + + public static ChannelDTO fromEntity(Channel channel) { + return ChannelDTO.builder() + .id(channel.getId()) + .createdAt(channel.getCreatedAt()) + .updatedAt(channel.getUpdatedAt()) + .members(channel.getMembers()) + .channelName(channel.getName()) + .creatorId(channel.getCreator().getPhone()) + .build(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java new file mode 100644 index 000000000..926f33012 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.dto; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import lombok.*; + +import java.util.UUID; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MessageDTO { + private UUID id; + private Long createdAt; + private Long updatedAt; + private String content; + private String writerId; + private String channelName; + + public static MessageDTO fromEntity(Message message) { + return MessageDTO.builder() + .id(message.getId()) + .createdAt(message.getCreatedAt()) + .updatedAt(message.getUpdatedAt()) + .content(message.getContent()) + .writerId(message.getWriter().getPhone()) + .channelName(message.getChannel().getName()) + .build(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java index 86f971a54..a2f7164e9 100644 --- a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java @@ -19,6 +19,5 @@ public enum ErrorCode { INVALID_WRITER("작성자가 올바르지 않습니다"), INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."); - private final String description; } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index cf8edb1f1..2343d3f0a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -3,6 +3,17 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import java.util.List; +import java.util.Optional; + public interface ChannelRepository { - Channel create(String name, User creator); + Channel save(Channel channel); + + Optional getByName(String channelName); + + List getByUser(User user); + + List getAll(); + + void delete(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 900ba5415..acf2a3018 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -4,6 +4,20 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + public interface MessageRepository { - Message create(String content, User writer, Channel channel); + Message save(Message message); + + Optional findById(UUID uuid); + + List findByUser(User user); + + List findByChannel(Channel channel); + + List findAll(); + + void delete(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index c65ec50b3..9f9c2eff5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -2,6 +2,15 @@ import com.sprint.mission.discodeit.entity.User; +import java.util.List; +import java.util.Optional; + public interface UserRepository { - User create(String name, String phone, String password); + User save(User user); + + Optional findByPhone(String phone); + + List findAll(); + + void delete(User user); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 9a2ee2c4a..3bb947e87 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -6,9 +6,8 @@ import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; public class JCFChannelRepository implements ChannelRepository { private final Map channelMap; @@ -18,14 +17,35 @@ public JCFChannelRepository() { } @Override - public Channel create(String name, User creator) { - if (channelMap.values().stream() - .anyMatch(user -> user.getName().equals(name))) { - throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); - } - - Channel createChannel = new Channel(name, creator); - channelMap.put(createChannel.getId(), createChannel); - return createChannel; + public Channel save(Channel channel) { + channelMap.put(channel.getId(), channel); + return channel; + } + + @Override + public Optional getByName(String channelName) { + return channelMap.values().stream() + .filter(channel -> channel.getName().equals(channelName)) + .findFirst(); + } + + @Override + public List getByUser(User user) { + return channelMap.values().stream() + .filter(channel -> channel.getMembers().stream() + .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) + ) + .collect(Collectors.toList()); + } + + @Override + public List getAll() { + return channelMap.values().stream() + .collect(Collectors.toList()); + } + + @Override + public void delete(Channel channel) { + channelMap.remove(channel.getId()); } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index b950170bc..4dd6d3644 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -7,9 +7,8 @@ import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.MessageRepository; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; public class JCFMessageRepository implements MessageRepository { private final Map messageMap; @@ -19,12 +18,40 @@ public JCFMessageRepository() { } @Override - public Message create(String content, User writer, Channel channel) { - if (content.isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - Message message = new Message(content, writer, channel); + public Message save(Message message) { messageMap.put(message.getId(), message); return message; } + + @Override + public Optional findById(UUID uuid) { + return messageMap.values().stream() + .filter(message -> message.getId().equals(uuid)) + .findFirst(); + } + + @Override + public List findByUser(User user) { + return messageMap.values().stream() + .filter(message -> message.getWriter().getPhone().equals(user.getPhone())) + .collect(Collectors.toList()); + } + + @Override + public List findByChannel(Channel channel) { + return messageMap.values().stream() + .filter(message -> message.getChannel().getName().equals(channel.getName())) + .collect(Collectors.toList()); + } + + @Override + public List findAll() { + return messageMap.values().stream() + .collect(Collectors.toList()); + } + + @Override + public void delete(Message message) { + messageMap.remove(message.getId()); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 5914d6951..08e5a92cd 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -1,15 +1,10 @@ package com.sprint.mission.discodeit.repository.jcf; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.util.ValidPass; -import com.sprint.mission.discodeit.util.ValidPhone; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; public class JCFUserRepository implements UserRepository { private final Map userMap; @@ -19,21 +14,26 @@ public JCFUserRepository() { } @Override - public User create(String name, String phone, String password) { - if (!ValidPass.isValidPassword(password)) { - throw new ServiceException(ErrorCode.INVALID_PASSWORD); - } - - if (!ValidPhone.isValidPhone(phone)) { - throw new ServiceException(ErrorCode.INVALID_WRITER); - } - - if (userMap.values().stream() - .anyMatch(user -> user.getPhone().equals(phone))) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - User user = new User(name, phone, password); + public User save(User user) { userMap.put(user.getId(), user); return user; } + + @Override + public Optional findByPhone(String phone) { + return userMap.values().stream() + .filter(user -> user.getPhone().equals(phone)) + .findFirst(); + } + + @Override + public List findAll() { + return userMap.values().stream() + .collect(Collectors.toList()); + } + + @Override + public void delete(User user) { + userMap.remove(user.getId()); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 1cdf6f82f..b9e160f3a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor; import java.util.*; +import java.util.stream.Collectors; @RequiredArgsConstructor public class JCFMessageService implements MessageService { @@ -43,24 +44,17 @@ public Message createMessage(String content, User writer, Channel channel) throw @Override public List getMessageByUser(User writer) { validateUser(writer); - List messages = new ArrayList<>(); - for (Message message : messageRepository.values()) { - if (message.getWriter().getPhone().equals(writer.getPhone())) { - messages.add(message); - } - } - return messages; + return messageRepository.values().stream() + .filter(message -> message.getWriter().getPhone().equals(writer.getPhone())) + .collect(Collectors.toList()); } @Override public List getMessageByChannel(Channel channel) { List messages = new ArrayList<>(); - for (Message message : messageRepository.values()) { - if (message.getChannel().getName().equals(channel.getName())) { - messages.add(message); - } - } - return messages; + return messageRepository.values().stream() + .filter(message -> message.getChannel().getName().equals(channel.getName())) + .collect(Collectors.toList()); } From f7743a3625a102b0b7c3d4c34dfc346a502918e7 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 11:30:02 +0900 Subject: [PATCH 023/115] Update JCFRepository --- .../repository/file/FileUserRepository.java | 41 ++++++++----------- .../repository/jcf/JCFChannelRepository.java | 2 - .../repository/jcf/JCFMessageRepository.java | 2 - 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 5fdfb5a10..d0ab795b8 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -1,20 +1,16 @@ package com.sprint.mission.discodeit.repository.file; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.util.ValidPass; -import com.sprint.mission.discodeit.util.ValidPhone; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; +import java.util.List; +import java.util.Optional; + import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileUserRepository implements UserRepository { @@ -33,23 +29,22 @@ public FileUserRepository(String filePath) { } @Override - public User create(String name, String phone, String password) { - Map users = loadFromFile(filePath); - if (!ValidPass.isValidPassword(password)) { - throw new ServiceException(ErrorCode.INVALID_PASSWORD); - } + public User save(User user) { + return null; + } - if (!ValidPhone.isValidPhone(phone)) { - throw new ServiceException(ErrorCode.INVALID_WRITER); - } - if (users.values().stream() - .anyMatch(user -> user.getPhone().equals(phone))) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } + @Override + public Optional findByPhone(String phone) { + return Optional.empty(); + } + + @Override + public List findAll() { + return List.of(); + } + + @Override + public void delete(User user) { - User createUser = new User(name, phone, password); - users.put(createUser.getId(), createUser); - saveToFile(users, filePath); - return createUser; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 3bb947e87..a3734e340 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,8 +2,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; import java.util.*; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 4dd6d3644..56de6bbe9 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -3,8 +3,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.MessageRepository; import java.util.*; From 6a5ef6065c89692e02906a577796676acc47e089 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 11:33:13 +0900 Subject: [PATCH 024/115] Update JCFService --- .../mission/discodeit/repository/file/FileUserRepository.java | 2 +- .../com/sprint/mission/discodeit/service/ChannelService.java | 2 +- .../sprint/mission/discodeit/service/jcf/JCFChannelService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index d0ab795b8..1b33d8482 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -30,7 +30,7 @@ public FileUserRepository(String filePath) { @Override public User save(User user) { - return null; + } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 2fc340072..a2142d40a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -14,7 +14,7 @@ public interface ChannelService { Optional getChannelByName(String name); - boolean channelExist(String name); + boolean channelExists(String name); List getAllChannel(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 231cc5129..1c1f5b1cd 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -48,7 +48,7 @@ public Optional getChannelByName(String name) { } @Override - public boolean channelExist(String name) { + public boolean channelExists(String name) { return channelRepository.values().stream() .anyMatch(user -> user.getName().equals(name)); } From 403f62535f1c39b6e03510b44cdf5a23a9582fb3 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 13:17:55 +0900 Subject: [PATCH 025/115] Modify method name create --- .../mission/discodeit/JavaApplication.java | 54 +++++++++---------- .../repository/ChannelRepository.java | 2 +- .../repository/MessageRepository.java | 2 +- .../discodeit/repository/UserRepository.java | 2 +- .../file/FileChannelRepository.java | 3 ++ .../file/FileMessageRepository.java | 43 ++++++++++----- .../repository/file/FileUserRepository.java | 26 ++++++--- .../repository/jcf/JCFChannelRepository.java | 3 +- .../repository/jcf/JCFMessageRepository.java | 3 +- .../repository/jcf/JCFUserRepository.java | 3 +- .../discodeit/service/ChannelService.java | 3 +- .../discodeit/service/MessageService.java | 2 +- .../discodeit/service/UserService.java | 3 +- .../service/file/FileChannelService.java | 2 +- .../service/file/FileMessageService.java | 2 +- .../service/file/FileUserService.java | 2 +- .../service/jcf/JCFChannelService.java | 2 +- .../service/jcf/JCFMessageService.java | 2 +- .../discodeit/service/jcf/JCFUserService.java | 2 +- 19 files changed, 95 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 6280e4832..bb0136a08 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -39,27 +39,27 @@ public static void main(String[] args) { System.out.println("<회원 생성하기>"); - User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); - User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh12312!!"); - User user3 = userService.createUser("박지훈", "010-3333-1111", "Abcdefgh12312!!"); - User user4 = userService.createUser("이채은", "010-4444-1111", "Abcdefgh12312!!"); - User user5 = userService.createUser("정다은", "010-5555-1111", "Abcdefgh12312!!"); + User user1 = userService.create("김민준", "010-1111-1111", "Abcdefgh12312!"); + User user2 = userService.create("이서윤", "010-2222-1111", "Abcdefgh12312!!"); + User user3 = userService.create("박지훈", "010-3333-1111", "Abcdefgh12312!!"); + User user4 = userService.create("이채은", "010-4444-1111", "Abcdefgh12312!!"); + User user5 = userService.create("정다은", "010-5555-1111", "Abcdefgh12312!!"); System.out.println(" - 회원 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 동일한 전화번호로 회원 가입을 진행 : "); try { - User user1_1 = userService.createUser("홍지훈", "010-1111-1111", "Abcdefgh!"); + User user1_1 = userService.create("홍지훈", "010-1111-1111", "Abcdefgh!"); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 2. 올바르지 않은 전화번호 형식 : "); try { - User unCorrectPhone = userService.createUser("김철수", "010-12345-12345", "Abcdefgh!"); + User unCorrectPhone = userService.create("김철수", "010-12345-12345", "Abcdefgh!"); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 3. 올바르지 않은 비밀번호 형식 : "); try { - User unCorrectPass = userService.createUser("김영미", "010-1234-4321", "1234"); + User unCorrectPass = userService.create("김영미", "010-1234-4321", "1234"); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -97,29 +97,29 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지를 보낼 수 있는 테스트 채널을 생성함>"); - Channel testChannel = channelService.createChannel("테스트1", user4); - Channel testChannel2 = channelService.createChannel("테스트2", user5); + Channel testChannel = channelService.create("테스트1", user4); + Channel testChannel2 = channelService.create("테스트2", user5); testChannel.addManyUser(userService.getAllUser()); testChannel2.addManyUser(userService.getAllUser()); System.out.println(testChannel); System.out.println("<메시지 생성하기>"); - Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); - Message message2_2 = messageService.createMessage("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, testChannel); - Message message3_1 = messageService.createMessage("테스트 확인 용 메시지입니다!", user3, testChannel2); + Message message2_1 = messageService.create("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); + Message message2_2 = messageService.create("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, testChannel); + Message message3_1 = messageService.create("테스트 확인 용 메시지입니다!", user3, testChannel2); System.out.println(message2_1); - Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, testChannel); + Message message3 = messageService.create("네 만나서 반갑습니다!", user3, testChannel); System.out.println(message3); System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 내용이 작성되지 않은 메시지 : "); try { - Message message4 = messageService.createMessage("", user4, testChannel); + Message message4 = messageService.create("", user4, testChannel); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 2. 채널에 등록되지 않은 회원이 메시지를 보낼 때 : "); User unRegistUser1 = new User("미등록회원", "010-1919-9191", "Abcdefgh!"); try { - Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); + Message unregistMessage = messageService.create("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -158,21 +158,21 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널 생성하기>"); - Channel channel1 = channelService.createChannel("코드잇 디스코드", user2); - Channel channel2 = channelService.createChannel("코테 준비", user3); - messageService.createMessage("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); - messageService.createMessage("열심히 하겠습니다!!", user3, channel2); + Channel channel1 = channelService.create("코드잇 디스코드", user2); + Channel channel2 = channelService.create("코테 준비", user3); + messageService.create("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); + messageService.create("열심히 하겠습니다!!", user3, channel2); channelService.addManyUserToChannel(channel1, userService.getAllUser()); channelService.addManyUserToChannel(channel2, userService.getAllUser()); - User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); - Channel javaChannel = channelService.createChannel("자바 공부합시다", channelCreator); + User channelCreator = userService.create("김자바", "010-8739-9343", "Abcdefgh!"); + Channel javaChannel = channelService.create("자바 공부합시다", channelCreator); channelService.addManyUserToChannel(javaChannel, userService.getAllUser()); System.out.println(channel1); System.out.println(channel2); System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); try { - Channel sameChannel = channelService.createChannel("코드잇 디스코드", user4); + Channel sameChannel = channelService.create("코드잇 디스코드", user4); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -190,7 +190,7 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널에 새로운 멤버 추가하기>"); - User newUser = userService.createUser("홍길동", "010-1234-4321", "Abcdefgh!"); + User newUser = userService.create("홍길동", "010-1234-4321", "Abcdefgh!"); Channel updateChannel2 = channelService.addUserToChannel(channel2, newUser); System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2); System.out.println("<채널에 있는 멤버 채널 나가기>"); @@ -201,9 +201,9 @@ public static void main(String[] args) { System.out.println(); System.out.println("<심화> - 채널을 삭제하면 해당 채널에 있던 메시지가 조회되면 안된다."); System.out.println("코드잇 채널에 메시지를 여러 개 생성"); - messageService.createMessage("안녕하세요 처음 인사드립니다.", user3, channel1); - messageService.createMessage("안녕하세요 만나서 반갑습니다.", user4, channel1); - messageService.createMessage("오 디스코드는 처음 들어와보네요!.", user5, channel1); + messageService.create("안녕하세요 처음 인사드립니다.", user3, channel1); + messageService.create("안녕하세요 만나서 반갑습니다.", user4, channel1); + messageService.create("오 디스코드는 처음 들어와보네요!.", user5, channel1); System.out.println("코드잇 채널 삭제 이전 해당 채널에 존재하는 메시지 출력해보기"); System.out.println(messageService.getMessageByChannel(channel1)); System.out.println("코드잇 채널 삭제 이후 해당 채널에 존재하는 메시지 출력해보기"); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 2343d3f0a..770e7c7be 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -15,5 +15,5 @@ public interface ChannelRepository { List getAll(); - void delete(Channel channel); + Channel delete(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index acf2a3018..fd8eac233 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -19,5 +19,5 @@ public interface MessageRepository { List findAll(); - void delete(Message message); + Message delete(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 9f9c2eff5..de3b6a39e 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -12,5 +12,5 @@ public interface UserRepository { List findAll(); - void delete(User user); + User delete(User user); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 569a11d04..17a556fa0 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -5,6 +5,7 @@ import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; import java.nio.file.Files; @@ -19,6 +20,7 @@ public class FileChannelRepository implements ChannelRepository { private final Path filePath; + private final Map channelMap; public FileChannelRepository(String filePath) { this.filePath = Paths.get(filePath); @@ -30,6 +32,7 @@ public FileChannelRepository(String filePath) { throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } + this.channelMap = FileIOUtil.loadFromFile(this.filePath); } @Override public Channel create(String name, User creator) { diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index aa1f4b8a2..73003c663 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -3,8 +3,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.util.FileIOUtil; @@ -12,14 +10,13 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageRepository implements MessageRepository { private final Path filePath; + private final Map messageMap; public FileMessageRepository(String filePath) { this.filePath = Paths.get(filePath); @@ -31,17 +28,35 @@ public FileMessageRepository(String filePath) { throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } + this.messageMap = FileIOUtil.loadFromFile(this.filePath); } - @Override - public Message create(String content, User writer, Channel channel) { - Map messages = FileIOUtil.loadFromFile(filePath); - if (content.isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - Message message = new Message(content, writer, channel); - messages.put(message.getId(), message); - FileIOUtil.saveToFile(messages, filePath); + @Override + public Message save(Message message) { + messageMap.put(message.getId(), message); + FileIOUtil.saveToFile(messageMap, filePath); return message; } + + @Override + public Optional findById(UUID uuid) { + + } + + @Override + public List findByUser(User user) { + } + + @Override + public List findByChannel(Channel channel) { + } + + @Override + public List findAll() { + } + + @Override + public Message delete(Message message) { + return null; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 1b33d8482..136b84c3f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -1,20 +1,22 @@ package com.sprint.mission.discodeit.repository.file; +import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileUserRepository implements UserRepository { private final Path filePath; + private final Map userMap; public FileUserRepository(String filePath) { this.filePath = Paths.get(filePath); @@ -26,25 +28,33 @@ public FileUserRepository(String filePath) { throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } + this.userMap = FileIOUtil.loadFromFile(this.filePath); } @Override public User save(User user) { - + userMap.put(user.getId(), user); + FileIOUtil.saveToFile(userMap, filePath); + return user; } @Override public Optional findByPhone(String phone) { - return Optional.empty(); + return userMap.values().stream() + .filter(user -> user.getPhone().equals(phone)) + .findFirst(); } @Override public List findAll() { - return List.of(); + return userMap.values().stream() + .collect(Collectors.toList()); } @Override - public void delete(User user) { - + public User delete(User user) { + userMap.remove(user.getId()); + FileIOUtil.saveToFile(userMap, filePath); + return user; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index a3734e340..32a38e5f2 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -43,7 +43,8 @@ public List getAll() { } @Override - public void delete(Channel channel) { + public Channel delete(Channel channel) { channelMap.remove(channel.getId()); + return channel; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 56de6bbe9..5cb6914ee 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -49,7 +49,8 @@ public List findAll() { } @Override - public void delete(Message message) { + public Message delete(Message message) { messageMap.remove(message.getId()); + return message; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 08e5a92cd..23fc4dedf 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -33,7 +33,8 @@ public List findAll() { } @Override - public void delete(User user) { + public User delete(User user) { userMap.remove(user.getId()); + return user; } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index a2142d40a..ddbabb531 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -5,12 +5,11 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; public interface ChannelService { void setDependency(UserService userService, MessageService messageService); - Channel createChannel(String name, User creator); + Channel create(String name, User creator); Optional getChannelByName(String name); diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index b0f9528cb..7ab3499ea 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -10,7 +10,7 @@ public interface MessageService { void setDependency(UserService userService, ChannelService channelService); - Message createMessage(String content, User writer, Channel channel); + Message create(String content, User writer, Channel channel); List getMessageByUser(User writer); diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 3725a3711..46ebccc9b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -4,12 +4,11 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; public interface UserService { void setDependency(MessageService messageService, ChannelService channelService); - User createUser(String name, String phone, String password); + User create(String name, String phone, String password); Optional getUserByPhone(String phone); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 7d2fb961f..298c6e9e7 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -42,7 +42,7 @@ public void setDependency(UserService userService, MessageService messageService } @Override - public Channel createChannel(String name, User creator) { + public Channel create(String name, User creator) { Map channels = loadFromFile(filePath); if (channels.values().stream() .anyMatch(user -> user.getName().equals(name))) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 5d59f9020..d785c7a6c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -42,7 +42,7 @@ public void setDependency(UserService userService, ChannelService channelService } @Override - public Message createMessage(String content, User writer, Channel channel) { + public Message create(String content, User writer, Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 782445059..e582ec4da 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -42,7 +42,7 @@ public void setDependency(MessageService messageService, ChannelService channelS } @Override - public User createUser(String name, String phone, String password) { + public User create(String name, String phone, String password) { Map users = loadFromFile(filePath); if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 1c1f5b1cd..a8c8499a1 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -26,7 +26,7 @@ public void setDependency(UserService userService, MessageService messageService } @Override - public Channel createChannel(String name, User creator) throws IllegalArgumentException { + public Channel create(String name, User creator) throws IllegalArgumentException { if (channelRepository.values().stream() .anyMatch(user -> user.getName().equals(name))) { throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index b9e160f3a..921566c05 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -26,7 +26,7 @@ public void setDependency(UserService userService, ChannelService channelService } @Override - public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { + public Message create(String content, User writer, Channel channel) throws IllegalArgumentException { if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 5a6e83a59..cef4c964f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -25,7 +25,7 @@ public void setDependency(MessageService messageService, ChannelService channelS } @Override - public User createUser(String name, String phone, String password) { + public User create(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } From 9b466dbaae7c848c2b7cc28861cbcf4853e3ce47 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 13:48:35 +0900 Subject: [PATCH 026/115] Remove setter from DTO --- src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java | 1 - src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java index 522de3318..0d2fdcb13 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java @@ -8,7 +8,6 @@ import java.util.UUID; @Getter -@Setter @NoArgsConstructor @AllArgsConstructor @Builder diff --git a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java index 926f33012..1158fccf5 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java @@ -8,7 +8,6 @@ import java.util.UUID; @Getter -@Setter @NoArgsConstructor @AllArgsConstructor @Builder From 95c9de031e4bda5612e1a3f28704a4c9a67910ea Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 14:41:06 +0900 Subject: [PATCH 027/115] Repository code implementation completed --- .../mission/discodeit/JavaApplication.java | 2 +- .../mission/discodeit/dto/ChannelDTO.java | 1 + .../mission/discodeit/dto/MessageDTO.java | 1 + .../file/FileChannelRepository.java | 52 +++++++++++++------ .../file/FileMessageRepository.java | 21 ++++++-- .../repository/file/FileUserRepository.java | 9 ++-- .../discodeit/service/ChannelService.java | 2 +- .../service/file/FileChannelService.java | 4 +- .../service/jcf/JCFChannelService.java | 2 +- 9 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index bb0136a08..5d89e7df9 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -184,7 +184,7 @@ public static void main(String[] args) { System.out.println("<전체 채널 조회하기>"); System.out.println(channelService.getAllChannel()); System.out.println("<하나의 회원이 포함되어 있는 채널 조회>"); - List channelsByUserId = channelService.getChannelsByUserId(channelCreator); + List channelsByUserId = channelService.getChannelsByUser(channelCreator); System.out.println("김자바 회원이 포함되어 있는 채널 조회 : " + channelsByUserId); System.out.println(); System.out.println("==============================================================================="); diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java index 0d2fdcb13..522de3318 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java @@ -8,6 +8,7 @@ import java.util.UUID; @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder diff --git a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java index 1158fccf5..926f33012 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java @@ -8,6 +8,7 @@ import java.util.UUID; @Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 17a556fa0..6f7e4c2cf 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,8 +2,6 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.util.FileIOUtil; @@ -11,9 +9,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @@ -32,19 +29,42 @@ public FileChannelRepository(String filePath) { throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } - this.channelMap = FileIOUtil.loadFromFile(this.filePath); + this.channelMap = loadFromFile(this.filePath); } + @Override - public Channel create(String name, User creator) { - Map channels = loadFromFile(filePath); - if (channels.values().stream() - .anyMatch(user -> user.getName().equals(name))) { - throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); - } + public Channel save(Channel channel) { + channelMap.put(channel.getId(), channel); + saveToFile(channelMap, filePath); + return channel; + } - Channel createChannel = new Channel(name, creator); - channels.put(createChannel.getId(), createChannel); - saveToFile(channels, filePath); - return createChannel; + @Override + public Optional getByName(String channelName) { + return channelMap.values().stream() + .filter(channel -> channel.getName().equals(channelName)) + .findFirst(); + } + + @Override + public List getByUser(User user) { + return channelMap.values().stream() + .filter(channel -> channel.getMembers().stream() + .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) + ) + .collect(Collectors.toList()); + } + + @Override + public List getAll() { + return channelMap.values().stream() + .collect(Collectors.toList()); + } + + @Override + public Channel delete(Channel channel) { + channelMap.remove(channel.getId()); + saveToFile(channelMap, filePath); + return channel; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 73003c663..2a4f09d58 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -4,14 +4,15 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.stream.Collectors; +import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageRepository implements MessageRepository { @@ -28,35 +29,45 @@ public FileMessageRepository(String filePath) { throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } - this.messageMap = FileIOUtil.loadFromFile(this.filePath); + this.messageMap = loadFromFile(this.filePath); } @Override public Message save(Message message) { messageMap.put(message.getId(), message); - FileIOUtil.saveToFile(messageMap, filePath); + saveToFile(messageMap, filePath); return message; } @Override public Optional findById(UUID uuid) { - + return Optional.of(messageMap.get(uuid)); } @Override public List findByUser(User user) { + return messageMap.values().stream() + .filter(message -> message.getWriter().getPhone().equals(user.getPhone())) + .collect(Collectors.toList()); } @Override public List findByChannel(Channel channel) { + return messageMap.values().stream() + .filter(message -> message.getChannel().getName().equals(channel.getName())) + .collect(Collectors.toList()); } @Override public List findAll() { + return messageMap.values().stream() + .collect(Collectors.toList()); } @Override public Message delete(Message message) { - return null; + messageMap.remove(message.getId()); + saveToFile(messageMap, filePath); + return message; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 136b84c3f..99c0d724a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -1,9 +1,7 @@ package com.sprint.mission.discodeit.repository.file; -import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; import java.nio.file.Files; @@ -12,6 +10,7 @@ import java.util.*; import java.util.stream.Collectors; +import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileUserRepository implements UserRepository { @@ -28,13 +27,13 @@ public FileUserRepository(String filePath) { throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } - this.userMap = FileIOUtil.loadFromFile(this.filePath); + this.userMap = loadFromFile(this.filePath); } @Override public User save(User user) { userMap.put(user.getId(), user); - FileIOUtil.saveToFile(userMap, filePath); + saveToFile(userMap, filePath); return user; } @@ -54,7 +53,7 @@ public List findAll() { @Override public User delete(User user) { userMap.remove(user.getId()); - FileIOUtil.saveToFile(userMap, filePath); + saveToFile(userMap, filePath); return user; } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index ddbabb531..5e1c6a590 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -17,7 +17,7 @@ public interface ChannelService { List getAllChannel(); - List getChannelsByUserId(User user); + List getChannelsByUser(User user); Channel addUserToChannel(Channel channel, User newUser); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 298c6e9e7..836c3a1f3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -66,7 +66,7 @@ public Optional getChannelByName(String name) { } @Override - public boolean channelExist(String name) { + public boolean channelExists(String name) { Map channels = loadFromFile(filePath); return channels.values().stream() .anyMatch(user -> user.getName().equals(name)); @@ -80,7 +80,7 @@ public List getAllChannel() { } @Override - public List getChannelsByUserId(User user) { + public List getChannelsByUser(User user) { Map channels = loadFromFile(filePath); return channels.values().stream() .filter(channel -> channel.getMembers().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index a8c8499a1..5499ae032 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -60,7 +60,7 @@ public List getAllChannel() { } @Override - public List getChannelsByUserId(User user) { + public List getChannelsByUser(User user) { return channelRepository.values().stream() .filter(channel -> channel.getMembers().stream() .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) From 8eab77b663df200d3ccd2ae86b14b26be61f6513 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 15:08:20 +0900 Subject: [PATCH 028/115] Refactor code --- json/channels.json | 104 +++++++++--------- json/messages.json | 36 +++--- json/users.json | 68 ++++++------ result/channels.ser | Bin 0 -> 1999 bytes result/messages.ser | Bin 0 -> 1389 bytes result/users.ser | Bin 0 -> 1052 bytes .../mission/discodeit/JavaApplication.java | 59 +++++----- .../discodeit/factory/FileFactory.java | 6 +- .../discodeit/service/MessageService.java | 4 +- .../discodeit/service/UserService.java | 2 +- .../service/basic/BasicChannelService.java | 4 +- .../service/basic/BasicMessageService.java | 2 + .../service/basic/BasicUserService.java | 48 +++++++- .../service/file/FileMessageService.java | 2 +- .../service/file/FileUserService.java | 2 +- .../service/jcf/JCFMessageService.java | 2 +- .../discodeit/service/jcf/JCFUserService.java | 2 +- 17 files changed, 195 insertions(+), 146 deletions(-) create mode 100644 result/channels.ser create mode 100644 result/messages.ser create mode 100644 result/users.ser diff --git a/json/channels.json b/json/channels.json index 50343abb7..46ee7d805 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,39 +1,39 @@ { - "4dd36f67-d385-4eea-a334-887f9cee532c" : { - "id" : "4dd36f67-d385-4eea-a334-887f9cee532c", - "createdAt" : 1737366128033, - "updatedAt" : 1737366128074, + "c92d7b49-170e-46f8-99b5-a8fa89c2b229" : { + "id" : "c92d7b49-170e-46f8-99b5-a8fa89c2b229", + "createdAt" : 1737439317883, + "updatedAt" : 1737439317912, "members" : [ { - "id" : "687b9a63-304c-4f98-a782-6c59394a3e39", - "createdAt" : 1737366127937, + "id" : "73d05f70-f613-425d-ab28-aa4be458410c", + "createdAt" : 1737439317746, "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", + "name" : "이채은", + "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "77361495-8ec4-408c-8780-83104113840f", - "createdAt" : 1737366127904, - "updatedAt" : 1737366127972, + "id" : "a2cf182d-3077-4cb7-946b-8ee16ece001d", + "createdAt" : 1737439317701, + "updatedAt" : 1737439317800, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, { - "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", - "createdAt" : 1737366127934, + "id" : "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9", + "createdAt" : 1737439317736, "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", + "name" : "이서윤", + "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36", - "createdAt" : 1737366127929, + "id" : "ea0544b9-6ced-472c-87a5-36a3c33f36cb", + "createdAt" : 1737439317752, "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", + "name" : "정다은", + "phone" : "010-5555-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "fa2ad4d4-20d2-4a23-9cd1-8be3c2676d61", - "createdAt" : 1737366128065, + "id" : "e1985c35-7994-4a6a-be95-efbe2fd397a2", + "createdAt" : 1737439317904, "updatedAt" : null, "name" : "홍길동", "phone" : "010-1234-4321", @@ -41,65 +41,65 @@ } ], "name" : "코테 준비", "creator" : { - "id" : "e14dd857-7a6c-4251-b663-928910ae4687", - "createdAt" : 1737366127931, + "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", + "createdAt" : 1737439317741, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" } }, - "45e43fda-f792-4655-8bd7-35e61552c636" : { - "id" : "45e43fda-f792-4655-8bd7-35e61552c636", - "createdAt" : 1737366128053, - "updatedAt" : 1737366128056, + "91a8177e-8760-45f2-bc83-29d4acfe657b" : { + "id" : "91a8177e-8760-45f2-bc83-29d4acfe657b", + "createdAt" : 1737439317892, + "updatedAt" : 1737439317895, "members" : [ { - "id" : "e14dd857-7a6c-4251-b663-928910ae4687", - "createdAt" : 1737366127931, + "id" : "a65f816b-fc86-4600-96ce-ea86d935032b", + "createdAt" : 1737439317891, + "updatedAt" : null, + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" + }, { + "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", + "createdAt" : 1737439317741, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "687b9a63-304c-4f98-a782-6c59394a3e39", - "createdAt" : 1737366127937, + "id" : "73d05f70-f613-425d-ab28-aa4be458410c", + "createdAt" : 1737439317746, "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", + "name" : "이채은", + "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "77361495-8ec4-408c-8780-83104113840f", - "createdAt" : 1737366127904, - "updatedAt" : 1737366127972, + "id" : "a2cf182d-3077-4cb7-946b-8ee16ece001d", + "createdAt" : 1737439317701, + "updatedAt" : 1737439317800, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, { - "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", - "createdAt" : 1737366127934, - "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36", - "createdAt" : 1737366127929, + "id" : "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9", + "createdAt" : 1737439317736, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "b525d206-0ae5-479f-add0-55bcfa5579ae", - "createdAt" : 1737366128052, + "id" : "ea0544b9-6ced-472c-87a5-36a3c33f36cb", + "createdAt" : 1737439317752, "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" } ], "name" : "자바 공부합시다", "creator" : { - "id" : "b525d206-0ae5-479f-add0-55bcfa5579ae", - "createdAt" : 1737366128052, + "id" : "a65f816b-fc86-4600-96ce-ea86d935032b", + "createdAt" : 1737439317891, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", diff --git a/json/messages.json b/json/messages.json index 58cffcad0..cd7182285 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,26 +1,26 @@ { - "897cd53a-b35c-42e8-8f13-c4c23b08aeca" : { - "id" : "897cd53a-b35c-42e8-8f13-c4c23b08aeca", - "createdAt" : 1737366128035, + "45e96717-a043-427d-ae32-eb528284b923" : { + "id" : "45e96717-a043-427d-ae32-eb528284b923", + "createdAt" : 1737439317886, "updatedAt" : null, "content" : "열심히 하겠습니다!!", "writer" : { - "id" : "e14dd857-7a6c-4251-b663-928910ae4687", - "createdAt" : 1737366127931, + "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", + "createdAt" : 1737439317741, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "4dd36f67-d385-4eea-a334-887f9cee532c", - "createdAt" : 1737366128033, + "id" : "c92d7b49-170e-46f8-99b5-a8fa89c2b229", + "createdAt" : 1737439317883, "updatedAt" : null, "members" : [ ], "name" : "코테 준비", "creator" : { - "id" : "e14dd857-7a6c-4251-b663-928910ae4687", - "createdAt" : 1737366127931, + "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", + "createdAt" : 1737439317741, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", @@ -28,28 +28,28 @@ } } }, - "76eb57a4-8cd8-4991-b50c-97ba60a709e5" : { - "id" : "76eb57a4-8cd8-4991-b50c-97ba60a709e5", - "createdAt" : 1737366128034, + "b3e6fd88-1319-432b-89a7-37870fa71b15" : { + "id" : "b3e6fd88-1319-432b-89a7-37870fa71b15", + "createdAt" : 1737439317884, "updatedAt" : null, "content" : "열심히 공부하는 코테 준비 채널입니다!", "writer" : { - "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", - "createdAt" : 1737366127934, + "id" : "73d05f70-f613-425d-ab28-aa4be458410c", + "createdAt" : 1737439317746, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "4dd36f67-d385-4eea-a334-887f9cee532c", - "createdAt" : 1737366128033, + "id" : "c92d7b49-170e-46f8-99b5-a8fa89c2b229", + "createdAt" : 1737439317883, "updatedAt" : null, "members" : [ ], "name" : "코테 준비", "creator" : { - "id" : "e14dd857-7a6c-4251-b663-928910ae4687", - "createdAt" : 1737366127931, + "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", + "createdAt" : 1737439317741, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", diff --git a/json/users.json b/json/users.json index 5d7e85b2b..d7139b70f 100644 --- a/json/users.json +++ b/json/users.json @@ -1,58 +1,58 @@ { - "e14dd857-7a6c-4251-b663-928910ae4687" : { - "id" : "e14dd857-7a6c-4251-b663-928910ae4687", - "createdAt" : 1737366127931, + "a65f816b-fc86-4600-96ce-ea86d935032b" : { + "id" : "a65f816b-fc86-4600-96ce-ea86d935032b", + "createdAt" : 1737439317891, "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" + "name" : "김자바", + "phone" : "010-8739-9343", + "password" : "Abcdefgh!" }, - "687b9a63-304c-4f98-a782-6c59394a3e39" : { - "id" : "687b9a63-304c-4f98-a782-6c59394a3e39", - "createdAt" : 1737366127937, + "a5420cc0-aab7-4d7d-9d6c-db18f739886d" : { + "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", + "createdAt" : 1737439317741, "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", + "name" : "박지훈", + "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, - "77361495-8ec4-408c-8780-83104113840f" : { - "id" : "77361495-8ec4-408c-8780-83104113840f", - "createdAt" : 1737366127904, - "updatedAt" : 1737366127972, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" - }, - "a07912b1-e72e-428b-9ff3-b97b360e4a12" : { - "id" : "a07912b1-e72e-428b-9ff3-b97b360e4a12", - "createdAt" : 1737366127934, + "73d05f70-f613-425d-ab28-aa4be458410c" : { + "id" : "73d05f70-f613-425d-ab28-aa4be458410c", + "createdAt" : 1737439317746, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, - "fa2ad4d4-20d2-4a23-9cd1-8be3c2676d61" : { - "id" : "fa2ad4d4-20d2-4a23-9cd1-8be3c2676d61", - "createdAt" : 1737366128065, + "e1985c35-7994-4a6a-be95-efbe2fd397a2" : { + "id" : "e1985c35-7994-4a6a-be95-efbe2fd397a2", + "createdAt" : 1737439317904, "updatedAt" : null, "name" : "홍길동", "phone" : "010-1234-4321", "password" : "Abcdefgh!" }, - "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36" : { - "id" : "fdefdb3b-2ec9-4801-ad62-5f9ed2aa1c36", - "createdAt" : 1737366127929, + "a2cf182d-3077-4cb7-946b-8ee16ece001d" : { + "id" : "a2cf182d-3077-4cb7-946b-8ee16ece001d", + "createdAt" : 1737439317701, + "updatedAt" : 1737439317800, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" + }, + "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9" : { + "id" : "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9", + "createdAt" : 1737439317736, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, - "b525d206-0ae5-479f-add0-55bcfa5579ae" : { - "id" : "b525d206-0ae5-479f-add0-55bcfa5579ae", - "createdAt" : 1737366128052, + "ea0544b9-6ced-472c-87a5-36a3c33f36cb" : { + "id" : "ea0544b9-6ced-472c-87a5-36a3c33f36cb", + "createdAt" : 1737439317752, "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" } } \ No newline at end of file diff --git a/result/channels.ser b/result/channels.ser new file mode 100644 index 0000000000000000000000000000000000000000..5a965902084d3a26e9dfe7cea7bc4d092fe00d88 GIT binary patch literal 1999 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05KELFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#KU+`8gd=b=rSCv~em#rfQR0L{`)&d=2=E-1>(E78l% zEH2K>&(llEEKbf(NzE+LOU*0EEUDCU&PdG5OU?0}zJzOE-nn!p1~wlC&g7!h#FEq$ z$C45T0UwZy^m7vP()E4v^U|$-7}&wm`9&oRT0TH4^dVO0L#@z8d7koT6IS?V6FbhHI6_`vQ0`y9k#hk6IZ=Ja9UC`c?W zF3&GYf$~`kGV=3Mp&U%Vfh4#gZsU7f4B|1(&ABb{-LfNhsT0qERoi`QOBgs`Zj!DTWscGpMhDOGQMv96h47>)02D-*Tplb*O1rS59BphKxB6KV&N~{FM zMMdK!*_p=^=Q1-edNQySXI7bMk}Bk%nP z>hzX5Z{{q)>2xC?!0GfK5QE#7nk_zTZ+7|>tIN)ux9&P1gBMJF-Ms`~n3w_qE`#|e zKn&hD_5D8m%hMM@wV+5X|Z>O$&(>({6+fY(&dj$Z~ CdZ+II literal 0 HcmV?d00001 diff --git a/result/messages.ser b/result/messages.ser new file mode 100644 index 0000000000000000000000000000000000000000..dbc1e2c189afc7fe65726f77439c08dedc4b7695 GIT binary patch literal 1389 zcmcJOUr19?9LIlNr*mqXDP$HgQq13Wwvxh|JCF;7Jwj0~Mw|kB{Gs9x$ zbU{8SC9&v1GfJZTQv?C(l+NeVYwjBjg8V!Ph8wiLAQ8LINtn0XgUk zD?4`q8-<;DbS|Plj*3~+Vy&(2-48~y7cPbRcn-KGC=4P2lNQlmFB04Y1tEEH6;^Il zCk~#C+~2t8i@)@0Lwyg`s`SbsCstHZBF>PAu_#MUpNPG(4~fKyBqEY7XEVZB@T1+9 zxYcT(zsEtY2h84pAW0}lz~P}9yrIFTH26gg-q7G1jPhF6DNBUz5-9dC5Y2pmhF)FR_>qIGCdla!g6$}*LXrNC=tT$G*;(f%N7fY#e~NJc zVFe&-xS!a%DQ(4aUH}%(wO8YNTQ)q8{24XPmT5mv5istQRh^sSZ3SBJw@R@h(Mqdc=Y{+th35zEY zOA4UV#O5#+*B%Zh`_7kZW4(#{5rsgRc5z0FO(w5I%abFQ=BKV|gR_ZPG!YxK+x4SU zG`7!Qb=h0#FfKd%3rWc6^#A|> literal 0 HcmV?d00001 diff --git a/result/users.ser b/result/users.ser new file mode 100644 index 0000000000000000000000000000000000000000..04c56c90e486ec8fc7d73a1fdeb384df3bf65bcf GIT binary patch literal 1052 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05LnzFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#I;JNK&XrYW=bviQdAKW%OdK(jQG^K zLBI#(9Q~ZcymWn^{JeB)9|oq(6u3CZ&-x%|0>xSK5_3~a7=(~?1eXA<2I=7_NGvWc z&o4?TWT<0c_hDcy$jHx2g>pDc3sNBVfdp793gDptvQ`glZTFK2XZn@zGchoFF|d{; z=9H#Z6fp>Zg9@z3uQWF)wWw{)R9WsR54xEc7%B=F7#OFtm+&`(3}r51;C!{S;my1W zuQyBqvK^C>Q&Q8?GZaf0cnu5O}ZrPE$)QRW7s_nkD zU{Mw@$q6x+?=46nKhUh#8>YTl-tcyIM+pNz%v?hwV?!fFnCZqqplb*OP}5gytnz*m z;mA{bA->?7uv07+(?5Ys7X_OBX6}|Z8(ZGYZNO=|2@oKgzHjRLefpQDFM2p5#B3 z&&oP^tK(8^j=c9HEcU(t`9~8PS}k+l%vpjnw2XiNIkeiBnk_zTZ+7|>tIN)ux9&Pv aO#cBgT_0rnf~l{&m*9&FQy_qtUI74PR$W8@ literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 5d89e7df9..c1cc1bdca 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -5,7 +5,6 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.factory.FileFactory; -import com.sprint.mission.discodeit.factory.JCFFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -20,8 +19,8 @@ public class JavaApplication { public static void main(String[] args) { - Factory factory = JCFFactory.getInstance(); -// Factory factory = FileFactory.getInstance(); +// Factory factory = JCFFactory.getInstance(); + Factory factory = FileFactory.getInstance(); UserService userService = factory.getUserService(); MessageService messageService = factory.getMessageService(); ChannelService channelService = factory.getChannelService(); @@ -30,36 +29,36 @@ public static void main(String[] args) { channelService.setDependency(userService,messageService); try { - Files.deleteIfExists(Paths.get("./result/users.dat")); - Files.deleteIfExists(Paths.get("./result/messages.dat")); - Files.deleteIfExists(Paths.get("./result/channels.dat")); + Files.deleteIfExists(Paths.get("./result/users.ser")); + Files.deleteIfExists(Paths.get("./result/messages.ser")); + Files.deleteIfExists(Paths.get("./result/channels.ser")); } catch (IOException e) { System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); } System.out.println("<회원 생성하기>"); - User user1 = userService.create("김민준", "010-1111-1111", "Abcdefgh12312!"); - User user2 = userService.create("이서윤", "010-2222-1111", "Abcdefgh12312!!"); - User user3 = userService.create("박지훈", "010-3333-1111", "Abcdefgh12312!!"); - User user4 = userService.create("이채은", "010-4444-1111", "Abcdefgh12312!!"); - User user5 = userService.create("정다은", "010-5555-1111", "Abcdefgh12312!!"); + User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); + User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh12312!!"); + User user3 = userService.createUser("박지훈", "010-3333-1111", "Abcdefgh12312!!"); + User user4 = userService.createUser("이채은", "010-4444-1111", "Abcdefgh12312!!"); + User user5 = userService.createUser("정다은", "010-5555-1111", "Abcdefgh12312!!"); System.out.println(" - 회원 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 동일한 전화번호로 회원 가입을 진행 : "); try { - User user1_1 = userService.create("홍지훈", "010-1111-1111", "Abcdefgh!"); + User user1_1 = userService.createUser("홍지훈", "010-1111-1111", "Abcdefgh!"); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 2. 올바르지 않은 전화번호 형식 : "); try { - User unCorrectPhone = userService.create("김철수", "010-12345-12345", "Abcdefgh!"); + User unCorrectPhone = userService.createUser("김철수", "010-12345-12345", "Abcdefgh!"); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 3. 올바르지 않은 비밀번호 형식 : "); try { - User unCorrectPass = userService.create("김영미", "010-1234-4321", "1234"); + User unCorrectPass = userService.createUser("김영미", "010-1234-4321", "1234"); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -103,23 +102,23 @@ public static void main(String[] args) { testChannel2.addManyUser(userService.getAllUser()); System.out.println(testChannel); System.out.println("<메시지 생성하기>"); - Message message2_1 = messageService.create("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); - Message message2_2 = messageService.create("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, testChannel); - Message message3_1 = messageService.create("테스트 확인 용 메시지입니다!", user3, testChannel2); + Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); + Message message2_2 = messageService.createMessage("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, testChannel); + Message message3_1 = messageService.createMessage("테스트 확인 용 메시지입니다!", user3, testChannel2); System.out.println(message2_1); - Message message3 = messageService.create("네 만나서 반갑습니다!", user3, testChannel); + Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, testChannel); System.out.println(message3); System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 내용이 작성되지 않은 메시지 : "); try { - Message message4 = messageService.create("", user4, testChannel); + Message message4 = messageService.createMessage("", user4, testChannel); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 2. 채널에 등록되지 않은 회원이 메시지를 보낼 때 : "); User unRegistUser1 = new User("미등록회원", "010-1919-9191", "Abcdefgh!"); try { - Message unregistMessage = messageService.create("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); + Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -160,11 +159,11 @@ public static void main(String[] args) { System.out.println("<채널 생성하기>"); Channel channel1 = channelService.create("코드잇 디스코드", user2); Channel channel2 = channelService.create("코테 준비", user3); - messageService.create("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); - messageService.create("열심히 하겠습니다!!", user3, channel2); + messageService.createMessage("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); + messageService.createMessage("열심히 하겠습니다!!", user3, channel2); channelService.addManyUserToChannel(channel1, userService.getAllUser()); channelService.addManyUserToChannel(channel2, userService.getAllUser()); - User channelCreator = userService.create("김자바", "010-8739-9343", "Abcdefgh!"); + User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); Channel javaChannel = channelService.create("자바 공부합시다", channelCreator); channelService.addManyUserToChannel(javaChannel, userService.getAllUser()); System.out.println(channel1); @@ -190,7 +189,7 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<채널에 새로운 멤버 추가하기>"); - User newUser = userService.create("홍길동", "010-1234-4321", "Abcdefgh!"); + User newUser = userService.createUser("홍길동", "010-1234-4321", "Abcdefgh!"); Channel updateChannel2 = channelService.addUserToChannel(channel2, newUser); System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2); System.out.println("<채널에 있는 멤버 채널 나가기>"); @@ -201,18 +200,18 @@ public static void main(String[] args) { System.out.println(); System.out.println("<심화> - 채널을 삭제하면 해당 채널에 있던 메시지가 조회되면 안된다."); System.out.println("코드잇 채널에 메시지를 여러 개 생성"); - messageService.create("안녕하세요 처음 인사드립니다.", user3, channel1); - messageService.create("안녕하세요 만나서 반갑습니다.", user4, channel1); - messageService.create("오 디스코드는 처음 들어와보네요!.", user5, channel1); + messageService.createMessage("안녕하세요 처음 인사드립니다.", user3, channel1); + messageService.createMessage("안녕하세요 만나서 반갑습니다.", user4, channel1); + messageService.createMessage("오 디스코드는 처음 들어와보네요!.", user5, channel1); System.out.println("코드잇 채널 삭제 이전 해당 채널에 존재하는 메시지 출력해보기"); System.out.println(messageService.getMessageByChannel(channel1)); System.out.println("코드잇 채널 삭제 이후 해당 채널에 존재하는 메시지 출력해보기"); channelService.deleteChannel(channel1); System.out.println(messageService.getMessageByChannel(channel1)); if (factory instanceof FileFactory) { - FileIOUtil.convertDatToJson(Paths.get("./result/users.dat"), Paths.get("./json/users.json")); - FileIOUtil.convertDatToJson(Paths.get("./result/messages.dat"), Paths.get("./json/messages.json")); - FileIOUtil.convertDatToJson(Paths.get("./result/channels.dat"), Paths.get("./json/channels.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); + FileIOUtil.convertDatToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java index 1b645e926..008162f45 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java @@ -14,9 +14,9 @@ public class FileFactory implements Factory{ private final ChannelService channelService; private FileFactory() { - this.userService = new FileUserService("./result/users.dat"); - this.messageService = new FileMessageService("./result/messages.dat"); - this.channelService = new FileChannelService("./result/channels.dat"); + this.userService = new FileUserService("./result/users.ser"); + this.messageService = new FileMessageService("./result/messages.ser"); + this.channelService = new FileChannelService("./result/channels.ser"); } public static FileFactory getInstance() { diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 7ab3499ea..2302f3b21 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -10,7 +10,7 @@ public interface MessageService { void setDependency(UserService userService, ChannelService channelService); - Message create(String content, User writer, Channel channel); + Message createMessage(String content, User writer, Channel channel); List getMessageByUser(User writer); @@ -20,5 +20,5 @@ public interface MessageService { void removeMessageByWriter(User writer, UUID uuid); - void deleteMessageWithChannel(Channel channel); + void deleteMessage(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 46ebccc9b..5e3a65231 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -8,7 +8,7 @@ public interface UserService { void setDependency(MessageService messageService, ChannelService channelService); - User create(String name, String phone, String password); + User createUser(String name, String phone, String password); Optional getUserByPhone(String phone); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index e3d4469f0..59f6acc96 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,4 +1,6 @@ package com.sprint.mission.discodeit.service.basic; -public class BasicChannelService { +import com.sprint.mission.discodeit.service.ChannelService; + +public class BasicChannelService { } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 87a7ec0c2..f2480b8e8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,4 +1,6 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.service.MessageService; + public class BasicMessageService { } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index d3c2e1057..46fc27d99 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -2,6 +2,52 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; -public class BasicUserService { +import java.util.List; +import java.util.Optional; + +public class BasicUserService implements UserService{ + private final UserRepository userRepository; + + public BasicUserService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public void setDependency(MessageService messageService, ChannelService channelService) { + + } + + @Override + public User createUser(String name, String phone, String password) { + return null; + } + + @Override + public Optional getUserByPhone(String phone) { + return Optional.empty(); + } + + @Override + public boolean userExists(String phone) { + return false; + } + + @Override + public List getAllUser() { + return List.of(); + } + + @Override + public User updateUserPassword(User user, String newPass) { + return null; + } + + @Override + public void deleteUser(User removeUser) { + + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index d785c7a6c..5d59f9020 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -42,7 +42,7 @@ public void setDependency(UserService userService, ChannelService channelService } @Override - public Message create(String content, User writer, Channel channel) { + public Message createMessage(String content, User writer, Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index e582ec4da..782445059 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -42,7 +42,7 @@ public void setDependency(MessageService messageService, ChannelService channelS } @Override - public User create(String name, String phone, String password) { + public User createUser(String name, String phone, String password) { Map users = loadFromFile(filePath); if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 921566c05..b9e160f3a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -26,7 +26,7 @@ public void setDependency(UserService userService, ChannelService channelService } @Override - public Message create(String content, User writer, Channel channel) throws IllegalArgumentException { + public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index cef4c964f..5a6e83a59 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -25,7 +25,7 @@ public void setDependency(MessageService messageService, ChannelService channelS } @Override - public User create(String name, String phone, String password) { + public User createUser(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } From d1659c0120a6aacf3ad51991ba681df8df67e070 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 15:49:59 +0900 Subject: [PATCH 029/115] Update Service --- json/channels.json | 106 +++++++++--------- json/messages.json | 48 ++++---- json/users.json | 66 +++++------ result/channels.ser | Bin 1999 -> 1999 bytes result/messages.ser | Bin 1389 -> 1389 bytes result/users.ser | Bin 1052 -> 1052 bytes .../mission/discodeit/JavaApplication.java | 10 +- .../discodeit/config/Configuration.java | 5 + .../mission/discodeit/factory/JCFFactory.java | 6 +- .../discodeit/service/ChannelService.java | 2 +- .../discodeit/service/UserService.java | 1 - .../service/basic/BasicUserService.java | 49 +------- .../service/file/FileChannelService.java | 6 +- .../service/file/FileMessageService.java | 5 +- .../service/file/FileUserService.java | 2 + .../service/jcf/JCFChannelService.java | 16 +-- .../service/jcf/JCFMessageService.java | 16 +-- .../discodeit/service/jcf/JCFUserService.java | 1 + 18 files changed, 158 insertions(+), 181 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/config/Configuration.java diff --git a/json/channels.json b/json/channels.json index 46ee7d805..ca73a1a33 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,39 +1,39 @@ { - "c92d7b49-170e-46f8-99b5-a8fa89c2b229" : { - "id" : "c92d7b49-170e-46f8-99b5-a8fa89c2b229", - "createdAt" : 1737439317883, - "updatedAt" : 1737439317912, + "35137c5a-6b42-4ddd-a815-97e11ca60f56" : { + "id" : "35137c5a-6b42-4ddd-a815-97e11ca60f56", + "createdAt" : 1737442168176, + "updatedAt" : 1737442168210, "members" : [ { - "id" : "73d05f70-f613-425d-ab28-aa4be458410c", - "createdAt" : 1737439317746, + "id" : "9fc4ae20-f124-412a-9dba-21965d09c71c", + "createdAt" : 1737442167969, "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", + "name" : "이서윤", + "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "a2cf182d-3077-4cb7-946b-8ee16ece001d", - "createdAt" : 1737439317701, - "updatedAt" : 1737439317800, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" - }, { - "id" : "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9", - "createdAt" : 1737439317736, + "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", + "createdAt" : 1737442167977, "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", + "name" : "이채은", + "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "ea0544b9-6ced-472c-87a5-36a3c33f36cb", - "createdAt" : 1737439317752, + "id" : "0b950654-21fb-4a11-9cf7-a197abd37bbc", + "createdAt" : 1737442167990, "updatedAt" : null, "name" : "정다은", "phone" : "010-5555-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "e1985c35-7994-4a6a-be95-efbe2fd397a2", - "createdAt" : 1737439317904, + "id" : "3935b48c-fbff-4de8-947e-3695b2c8b968", + "createdAt" : 1737442167937, + "updatedAt" : 1737442168077, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" + }, { + "id" : "c361661c-8625-490f-b10c-084aa21b22b2", + "createdAt" : 1737442168201, "updatedAt" : null, "name" : "홍길동", "phone" : "010-1234-4321", @@ -41,65 +41,65 @@ } ], "name" : "코테 준비", "creator" : { - "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", - "createdAt" : 1737439317741, + "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", + "createdAt" : 1737442167974, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" } }, - "91a8177e-8760-45f2-bc83-29d4acfe657b" : { - "id" : "91a8177e-8760-45f2-bc83-29d4acfe657b", - "createdAt" : 1737439317892, - "updatedAt" : 1737439317895, + "707e444d-1744-4516-a818-0fc27cad2c28" : { + "id" : "707e444d-1744-4516-a818-0fc27cad2c28", + "createdAt" : 1737442168192, + "updatedAt" : 1737442168195, "members" : [ { - "id" : "a65f816b-fc86-4600-96ce-ea86d935032b", - "createdAt" : 1737439317891, + "id" : "ae463e42-d1ca-491c-94b0-494ae06281ea", + "createdAt" : 1737442168191, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", "password" : "Abcdefgh!" }, { - "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", - "createdAt" : 1737439317741, + "id" : "9fc4ae20-f124-412a-9dba-21965d09c71c", + "createdAt" : 1737442167969, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, { + "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", + "createdAt" : 1737442167974, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "73d05f70-f613-425d-ab28-aa4be458410c", - "createdAt" : 1737439317746, + "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", + "createdAt" : 1737442167977, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, { - "id" : "a2cf182d-3077-4cb7-946b-8ee16ece001d", - "createdAt" : 1737439317701, - "updatedAt" : 1737439317800, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" - }, { - "id" : "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9", - "createdAt" : 1737439317736, - "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "ea0544b9-6ced-472c-87a5-36a3c33f36cb", - "createdAt" : 1737439317752, + "id" : "0b950654-21fb-4a11-9cf7-a197abd37bbc", + "createdAt" : 1737442167990, "updatedAt" : null, "name" : "정다은", "phone" : "010-5555-1111", "password" : "Abcdefgh12312!!" + }, { + "id" : "3935b48c-fbff-4de8-947e-3695b2c8b968", + "createdAt" : 1737442167937, + "updatedAt" : 1737442168077, + "name" : "김민준", + "phone" : "010-1111-1111", + "password" : "Zdefdasdf!@" } ], "name" : "자바 공부합시다", "creator" : { - "id" : "a65f816b-fc86-4600-96ce-ea86d935032b", - "createdAt" : 1737439317891, + "id" : "ae463e42-d1ca-491c-94b0-494ae06281ea", + "createdAt" : 1737442168191, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", diff --git a/json/messages.json b/json/messages.json index cd7182285..93d24d419 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,26 +1,26 @@ { - "45e96717-a043-427d-ae32-eb528284b923" : { - "id" : "45e96717-a043-427d-ae32-eb528284b923", - "createdAt" : 1737439317886, + "07e11227-2424-4213-8dc9-e91fd20e1e48" : { + "id" : "07e11227-2424-4213-8dc9-e91fd20e1e48", + "createdAt" : 1737442168179, "updatedAt" : null, - "content" : "열심히 하겠습니다!!", + "content" : "열심히 공부하는 코테 준비 채널입니다!", "writer" : { - "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", - "createdAt" : 1737439317741, + "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", + "createdAt" : 1737442167977, "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", + "name" : "이채은", + "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "c92d7b49-170e-46f8-99b5-a8fa89c2b229", - "createdAt" : 1737439317883, + "id" : "35137c5a-6b42-4ddd-a815-97e11ca60f56", + "createdAt" : 1737442168176, "updatedAt" : null, "members" : [ ], "name" : "코테 준비", "creator" : { - "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", - "createdAt" : 1737439317741, + "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", + "createdAt" : 1737442167974, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", @@ -28,28 +28,28 @@ } } }, - "b3e6fd88-1319-432b-89a7-37870fa71b15" : { - "id" : "b3e6fd88-1319-432b-89a7-37870fa71b15", - "createdAt" : 1737439317884, + "6601315d-bb57-4163-8d27-41f0697242a8" : { + "id" : "6601315d-bb57-4163-8d27-41f0697242a8", + "createdAt" : 1737442168184, "updatedAt" : null, - "content" : "열심히 공부하는 코테 준비 채널입니다!", + "content" : "열심히 하겠습니다!!", "writer" : { - "id" : "73d05f70-f613-425d-ab28-aa4be458410c", - "createdAt" : 1737439317746, + "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", + "createdAt" : 1737442167974, "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", + "name" : "박지훈", + "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "c92d7b49-170e-46f8-99b5-a8fa89c2b229", - "createdAt" : 1737439317883, + "id" : "35137c5a-6b42-4ddd-a815-97e11ca60f56", + "createdAt" : 1737442168176, "updatedAt" : null, "members" : [ ], "name" : "코테 준비", "creator" : { - "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", - "createdAt" : 1737439317741, + "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", + "createdAt" : 1737442167974, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", diff --git a/json/users.json b/json/users.json index d7139b70f..ce0c061c9 100644 --- a/json/users.json +++ b/json/users.json @@ -1,58 +1,58 @@ { - "a65f816b-fc86-4600-96ce-ea86d935032b" : { - "id" : "a65f816b-fc86-4600-96ce-ea86d935032b", - "createdAt" : 1737439317891, + "ae463e42-d1ca-491c-94b0-494ae06281ea" : { + "id" : "ae463e42-d1ca-491c-94b0-494ae06281ea", + "createdAt" : 1737442168191, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", "password" : "Abcdefgh!" }, - "a5420cc0-aab7-4d7d-9d6c-db18f739886d" : { - "id" : "a5420cc0-aab7-4d7d-9d6c-db18f739886d", - "createdAt" : 1737439317741, + "9fc4ae20-f124-412a-9dba-21965d09c71c" : { + "id" : "9fc4ae20-f124-412a-9dba-21965d09c71c", + "createdAt" : 1737442167969, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, + "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1" : { + "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", + "createdAt" : 1737442167974, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, - "73d05f70-f613-425d-ab28-aa4be458410c" : { - "id" : "73d05f70-f613-425d-ab28-aa4be458410c", - "createdAt" : 1737439317746, + "16a06eb1-560a-48ee-ae26-86b4cec545e1" : { + "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", + "createdAt" : 1737442167977, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, - "e1985c35-7994-4a6a-be95-efbe2fd397a2" : { - "id" : "e1985c35-7994-4a6a-be95-efbe2fd397a2", - "createdAt" : 1737439317904, + "0b950654-21fb-4a11-9cf7-a197abd37bbc" : { + "id" : "0b950654-21fb-4a11-9cf7-a197abd37bbc", + "createdAt" : 1737442167990, "updatedAt" : null, - "name" : "홍길동", - "phone" : "010-1234-4321", - "password" : "Abcdefgh!" + "name" : "정다은", + "phone" : "010-5555-1111", + "password" : "Abcdefgh12312!!" }, - "a2cf182d-3077-4cb7-946b-8ee16ece001d" : { - "id" : "a2cf182d-3077-4cb7-946b-8ee16ece001d", - "createdAt" : 1737439317701, - "updatedAt" : 1737439317800, + "3935b48c-fbff-4de8-947e-3695b2c8b968" : { + "id" : "3935b48c-fbff-4de8-947e-3695b2c8b968", + "createdAt" : 1737442167937, + "updatedAt" : 1737442168077, "name" : "김민준", "phone" : "010-1111-1111", "password" : "Zdefdasdf!@" }, - "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9" : { - "id" : "da88d25d-6c1f-4be2-a0c8-21aecf9a6ac9", - "createdAt" : 1737439317736, + "c361661c-8625-490f-b10c-084aa21b22b2" : { + "id" : "c361661c-8625-490f-b10c-084aa21b22b2", + "createdAt" : 1737442168201, "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, - "ea0544b9-6ced-472c-87a5-36a3c33f36cb" : { - "id" : "ea0544b9-6ced-472c-87a5-36a3c33f36cb", - "createdAt" : 1737439317752, - "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" + "name" : "홍길동", + "phone" : "010-1234-4321", + "password" : "Abcdefgh!" } } \ No newline at end of file diff --git a/result/channels.ser b/result/channels.ser index 5a965902084d3a26e9dfe7cea7bc4d092fe00d88..82d682ec6a4744e3d4e3590693bee1bebbb55d59 100644 GIT binary patch delta 604 zcmX@lf1ZCrufPh?=?`U=@rRiT*F%DZavL?%-Vt&^`YxdF8-glL(&OL1B(=W&_&N7gBPRB_ar{DIj) zX@1X2i0nGGwk_w5x;_+Jkhd|6%i~=M1LvE$Ti$GJncToGGdYS`8fefqh|)RV7fxS& zxq1)xRJIVs-(G@~Jy{%pvW*bgDRpL3H=Wp-VQIRh=l6f#7nA##O?Bt@@`7dgz$7;V z1LKtT`MsSG9UFN#ycS6-Z91HoCexb delta 594 zcmX@lf1ZCrufWW$D}Hqz+N60>x7t&j&+W&?x%Q0ACH&Qs?=#MnEa7`wT*y$zz%)1K zw#0YKj@+eAJO@^7_pO~gk;xQ8>*Q-pZa^)cAX-*ytnz*m;mA{bA->?7uv6^hK4u4? z>`{p9ltIG%7fnJmr1Gl+s&fATVR KRhAO|_6h(%(c@15 diff --git a/result/messages.ser b/result/messages.ser index dbc1e2c189afc7fe65726f77439c08dedc4b7695..ed75d94e13612895eaaa5bf5186a14115f750b09 100644 GIT binary patch delta 318 zcmaFM^_FWwuR!m~m-3hR`Mm{`=P}KcoZqvoxR9Za zfoaJ*6W$FnOAc;-xa$qiDetPu0nDZXD@3P1lv&0fW-440mF?tvck)zb&&k(V9P8)z zf^{($fGI&R$;ZIJIHi4l&q|1a>(tt|oIC3JP;5co#xO3AcO?v*Z{}`!v$5sP+y;=1 zVkHc`28IT@CP1KT2m}zbn0nP6KV%j;tw>`ujNKjXm<%?J1x#|o>@fgY)Qin>JiZY_ Z_YK%I$;k(pUHRwtR)E~3TmT}~D*%%ya{T}R delta 317 zcmaFM^_FWwufRH^*FjA!JC$8uri(9dcB-Acfl*`Q(QAy%CH&Qs=P}KcEa7`wT*y$z zz%)1Kw#0YKj@+eAJO@^7_pO~Az-%fobL)yPWnB-$%V4Ttpv>D73L>9y63Ndt7 zfHg`^KENCwR>EHca)Dd{79&4_#h6xWtnz*m;mA{bA->?7uv2Ua1LvE$Ti$GJc{8^G Wq*twkf!Dy$K-UBabPa)^paKAjCvmj^ diff --git a/result/users.ser b/result/users.ser index 04c56c90e486ec8fc7d73a1fdeb384df3bf65bcf..9755358be72fb7f7e41c074d56d8f1faf02a96f9 100644 GIT binary patch delta 344 zcmbQkF^6M9ufUWIo?Z`<8egq*vvaz5%2Q_JTvkTr`Mvd%mol1a>{6T-%XwU8{*iSG zA5|Q+iVGR)7+An0Cj$fHl=k^O3qeBsllz!WHJ7|I;oTs!!GHWl3Z_NJF=EksbE-NE*34inCrHrN;IkzRgTXy6wb>ca& zYP)Z3aUnw;0}GhsWME*N(q6*%79_+!If2PkbG61Q?)4x1@(Zd-rrj=8?vM^QiPXMWwp8Sbf(*Z2YG$p(5Vct0g*+u6ibPdXV zwqxqyJBnT9asKEt-B5u)jvS0^(V_P>oZmW0O>(@V*mgE diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index c1cc1bdca..2f20ec1bb 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -5,9 +5,16 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.factory.FileFactory; +import com.sprint.mission.discodeit.factory.JCFFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.file.FileChannelService; +import com.sprint.mission.discodeit.service.file.FileMessageService; +import com.sprint.mission.discodeit.service.file.FileUserService; +import com.sprint.mission.discodeit.service.jcf.JCFChannelService; +import com.sprint.mission.discodeit.service.jcf.JCFMessageService; +import com.sprint.mission.discodeit.service.jcf.JCFUserService; import com.sprint.mission.discodeit.util.FileIOUtil; @@ -26,8 +33,7 @@ public static void main(String[] args) { ChannelService channelService = factory.getChannelService(); userService.setDependency(messageService, channelService); messageService.setDependency(userService, channelService); - channelService.setDependency(userService,messageService); - + channelService.setDependency(messageService, userService); try { Files.deleteIfExists(Paths.get("./result/users.ser")); Files.deleteIfExists(Paths.get("./result/messages.ser")); diff --git a/src/main/java/com/sprint/mission/discodeit/config/Configuration.java b/src/main/java/com/sprint/mission/discodeit/config/Configuration.java new file mode 100644 index 000000000..36020840f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/Configuration.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.config; + +public class Configuration { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java index 23350fb23..b008df27c 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java @@ -11,9 +11,9 @@ public class JCFFactory implements Factory{ private static JCFFactory instance; - private final UserService userService; - private final MessageService messageService; - private final ChannelService channelService; + private final JCFUserService userService; + private final JCFMessageService messageService; + private final JCFChannelService channelService; private JCFFactory() { this.userService = new JCFUserService(new HashMap<>()); diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 5e1c6a590..8e2e9f93c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -7,7 +7,7 @@ import java.util.Optional; public interface ChannelService { - void setDependency(UserService userService, MessageService messageService); + void setDependency(MessageService messageService, UserService userService); Channel create(String name, User creator); diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 5e3a65231..3455386d0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -19,5 +19,4 @@ public interface UserService { User updateUserPassword(User user, String newPass); void deleteUser(User removeUser); - } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 46fc27d99..bbfe49c64 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,53 +1,10 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; -import java.util.List; -import java.util.Optional; -public class BasicUserService implements UserService{ - private final UserRepository userRepository; +@RequiredArgsConstructor +public class BasicUserService { - public BasicUserService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - public void setDependency(MessageService messageService, ChannelService channelService) { - - } - - @Override - public User createUser(String name, String phone, String password) { - return null; - } - - @Override - public Optional getUserByPhone(String phone) { - return Optional.empty(); - } - - @Override - public boolean userExists(String phone) { - return false; - } - - @Override - public List getAllUser() { - return List.of(); - } - - @Override - public User updateUserPassword(User user, String newPass) { - return null; - } - - @Override - public void deleteUser(User removeUser) { - - } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 836c3a1f3..74e624f6b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -7,6 +7,7 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import lombok.Setter; import java.io.IOException; import java.nio.file.Files; @@ -18,6 +19,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Setter public class FileChannelService implements ChannelService { private final Path filePath; private UserService userService; @@ -36,7 +38,7 @@ public FileChannelService(String filePath) { } @Override - public void setDependency(UserService userService, MessageService messageService) { + public void setDependency(MessageService messageService, UserService userService) { this.userService = userService; this.messageService = messageService; } @@ -126,7 +128,7 @@ public void deleteChannel(Channel channel) { Map channels = loadFromFile(filePath); validateChannel(channel); - messageService.deleteMessageWithChannel(channel); + messageService.deleteMessage(channel); channels.remove(channel.getId()); saveToFile(channels, filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 5d59f9020..9c3933511 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -9,6 +9,7 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.FileIOUtil; +import lombok.Setter; import java.io.IOException; import java.nio.file.Files; @@ -18,6 +19,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Setter public class FileMessageService implements MessageService { private final Path filePath; private UserService userService; @@ -34,7 +36,6 @@ public FileMessageService(String filePath) { } } } - @Override public void setDependency(UserService userService, ChannelService channelService) { this.userService = userService; @@ -108,7 +109,7 @@ public void removeMessageByWriter(User writer, UUID uuid) { } @Override - public void deleteMessageWithChannel(Channel channel) { + public void deleteMessage(Channel channel) { Map messages = FileIOUtil.loadFromFile(filePath); getMessageByChannel(channel).stream() .map(Message::getId) diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 782445059..e7335341a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -8,6 +8,7 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; +import lombok.Setter; import java.io.IOException; import java.nio.file.Files; @@ -18,6 +19,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; +@Setter public class FileUserService implements UserService { private final Path filePath; private MessageService messageService; diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 5499ae032..db6b52a8a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -8,23 +8,19 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import lombok.RequiredArgsConstructor; +import lombok.Setter; import java.util.*; import java.util.stream.Collectors; @RequiredArgsConstructor +@Setter public class JCFChannelService implements ChannelService { private final Map channelRepository; private UserService userService; private MessageService messageService; - @Override - public void setDependency(UserService userService, MessageService messageService) { - this.userService = userService; - this.messageService = messageService; - } - @Override public Channel create(String name, User creator) throws IllegalArgumentException { if (channelRepository.values().stream() @@ -37,6 +33,12 @@ public Channel create(String name, User creator) throws IllegalArgumentException return createChannel; } + @Override + public void setDependency(MessageService messageService, UserService userService) { + this.messageService = messageService; + this.userService = userService; + } + @Override public Optional getChannelByName(String name) { for (Channel channel : channelRepository.values()) { @@ -96,7 +98,7 @@ public Channel removeUserToChannel(Channel channel, User removeUser) { public void deleteChannel(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. validateChannel(channel); - messageService.deleteMessageWithChannel(channel); + messageService.deleteMessage(channel); channelRepository.remove(channel.getId()); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index b9e160f3a..e552279f6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -9,22 +9,18 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import lombok.RequiredArgsConstructor; +import lombok.Setter; import java.util.*; import java.util.stream.Collectors; @RequiredArgsConstructor +@Setter public class JCFMessageService implements MessageService { private final Map messageRepository; private UserService userService; private ChannelService channelService; - @Override - public void setDependency(UserService userService, ChannelService channelService) { - this.userService = userService; - this.channelService = channelService; - } - @Override public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { if (content.isEmpty()) { @@ -40,6 +36,12 @@ public Message createMessage(String content, User writer, Channel channel) throw return message; } + @Override + public void setDependency(UserService userService, ChannelService channelService) { + this.userService = userService; + this.channelService = channelService; + } + // 메시지를 보낸 회원이 메시지 조회하기 @Override public List getMessageByUser(User writer) { @@ -79,7 +81,7 @@ public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작 @Override - public void deleteMessageWithChannel(Channel channel) { + public void deleteMessage(Channel channel) { getMessageByChannel(channel).stream() .map(Message::getId) .forEach(messageRepository::remove); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 5a6e83a59..411f1666f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -9,6 +9,7 @@ import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; import lombok.RequiredArgsConstructor; +import lombok.Setter; import java.util.*; From 787cfef8a005a5dadb235288e678743ceff7ac34 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 17:35:29 +0900 Subject: [PATCH 030/115] Refactoring channel service --- json/channels.json | 115 ++------------ json/messages.json | 140 +++++++++++++----- json/users.json | 46 ++---- result/channels.ser | Bin 1999 -> 758 bytes result/messages.ser | Bin 1389 -> 1979 bytes result/users.ser | Bin 1052 -> 805 bytes .../mission/discodeit/JavaApplication.java | 128 ++++++---------- .../discodeit/config/Configuration.java | 5 - .../mission/discodeit/dto/ChannelDTO.java | 33 ----- .../mission/discodeit/dto/MessageDTO.java | 33 ----- .../mission/discodeit/entity/Channel.java | 34 ++--- .../discodeit/factory/FileFactory.java | 6 +- .../mission/discodeit/factory/JCFFactory.java | 6 +- .../repository/ChannelRepository.java | 2 - .../file/FileChannelRepository.java | 14 +- .../file/FileMessageRepository.java | 5 +- .../repository/file/FileUserRepository.java | 6 +- .../repository/jcf/JCFChannelRepository.java | 9 -- .../discodeit/service/ChannelService.java | 15 +- .../discodeit/service/MessageService.java | 4 +- .../discodeit/service/UserService.java | 4 - .../service/basic/BasicUserService.java | 3 +- .../service/file/FileChannelService.java | 75 ++-------- .../service/file/FileMessageService.java | 24 +-- .../service/file/FileUserService.java | 40 ++--- .../service/jcf/JCFChannelService.java | 59 ++------ .../service/jcf/JCFMessageService.java | 20 ++- .../discodeit/service/jcf/JCFUserService.java | 15 +- .../mission/discodeit/util/ChannelType.java | 5 + 29 files changed, 271 insertions(+), 575 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/config/Configuration.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/ChannelType.java diff --git a/json/channels.json b/json/channels.json index ca73a1a33..9f8ee56ce 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,109 +1,18 @@ { - "35137c5a-6b42-4ddd-a815-97e11ca60f56" : { - "id" : "35137c5a-6b42-4ddd-a815-97e11ca60f56", - "createdAt" : 1737442168176, - "updatedAt" : 1737442168210, - "members" : [ { - "id" : "9fc4ae20-f124-412a-9dba-21965d09c71c", - "createdAt" : 1737442167969, - "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", - "createdAt" : 1737442167977, - "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "0b950654-21fb-4a11-9cf7-a197abd37bbc", - "createdAt" : 1737442167990, - "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "3935b48c-fbff-4de8-947e-3695b2c8b968", - "createdAt" : 1737442167937, - "updatedAt" : 1737442168077, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" - }, { - "id" : "c361661c-8625-490f-b10c-084aa21b22b2", - "createdAt" : 1737442168201, - "updatedAt" : null, - "name" : "홍길동", - "phone" : "010-1234-4321", - "password" : "Abcdefgh!" - } ], + "f0f161db-8761-4ead-903e-aad4c4678f3d" : { + "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", + "createdAt" : 1737448411089, + "updatedAt" : null, "name" : "코테 준비", - "creator" : { - "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", - "createdAt" : 1737442167974, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - } + "description" : "코테 준비용 채널입니다.", + "channelType" : "VOICE" }, - "707e444d-1744-4516-a818-0fc27cad2c28" : { - "id" : "707e444d-1744-4516-a818-0fc27cad2c28", - "createdAt" : 1737442168192, - "updatedAt" : 1737442168195, - "members" : [ { - "id" : "ae463e42-d1ca-491c-94b0-494ae06281ea", - "createdAt" : 1737442168191, - "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" - }, { - "id" : "9fc4ae20-f124-412a-9dba-21965d09c71c", - "createdAt" : 1737442167969, - "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", - "createdAt" : 1737442167974, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", - "createdAt" : 1737442167977, - "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "0b950654-21fb-4a11-9cf7-a197abd37bbc", - "createdAt" : 1737442167990, - "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" - }, { - "id" : "3935b48c-fbff-4de8-947e-3695b2c8b968", - "createdAt" : 1737442167937, - "updatedAt" : 1737442168077, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" - } ], + "5f3b3809-eebb-49c5-8f9f-1d6ee558712b" : { + "id" : "5f3b3809-eebb-49c5-8f9f-1d6ee558712b", + "createdAt" : 1737448411097, + "updatedAt" : null, "name" : "자바 공부합시다", - "creator" : { - "id" : "ae463e42-d1ca-491c-94b0-494ae06281ea", - "createdAt" : 1737442168191, - "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" - } + "description" : "자바 공부용 채널입니다.", + "channelType" : "TEXT" } } \ No newline at end of file diff --git a/json/messages.json b/json/messages.json index 93d24d419..b89cdf429 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,60 +1,134 @@ { - "07e11227-2424-4213-8dc9-e91fd20e1e48" : { - "id" : "07e11227-2424-4213-8dc9-e91fd20e1e48", - "createdAt" : 1737442168179, + "7559c20d-5a2b-47a3-a1fe-27e90760fe59" : { + "id" : "7559c20d-5a2b-47a3-a1fe-27e90760fe59", + "createdAt" : 1737448411105, + "updatedAt" : 1737448411120, + "content" : "메시지 내용 업데이트", + "writer" : { + "id" : "09a11f19-0e42-4509-94c7-64d6f5bdd5f4", + "createdAt" : 1737448411020, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, + "channel" : { + "id" : "e6bfb8c6-df59-4b24-9fa9-204b912b679a", + "createdAt" : 1737448411086, + "updatedAt" : 1737448411103, + "name" : "코드잇 디스코드", + "description" : "코드잇 디스코드 채널에 오신 것을 환영합니다.", + "channelType" : "VOICE" + } + }, + "1da40381-6362-478b-a017-3f7786dce855" : { + "id" : "1da40381-6362-478b-a017-3f7786dce855", + "createdAt" : 1737448411094, + "updatedAt" : null, + "content" : "열심히 하겠습니다!!", + "writer" : { + "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", + "createdAt" : 1737448411024, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, + "channel" : { + "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", + "createdAt" : 1737448411089, + "updatedAt" : null, + "name" : "코테 준비", + "description" : "코테 준비용 채널입니다.", + "channelType" : "VOICE" + } + }, + "caedf1c6-057c-4692-8d7b-7bd6448dfff0" : { + "id" : "caedf1c6-057c-4692-8d7b-7bd6448dfff0", + "createdAt" : 1737448411113, + "updatedAt" : null, + "content" : "네 만나서 반갑습니다!", + "writer" : { + "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", + "createdAt" : 1737448411024, + "updatedAt" : null, + "name" : "박지훈", + "phone" : "010-3333-1111", + "password" : "Abcdefgh12312!!" + }, + "channel" : { + "id" : "e6bfb8c6-df59-4b24-9fa9-204b912b679a", + "createdAt" : 1737448411086, + "updatedAt" : 1737448411103, + "name" : "코드잇 디스코드", + "description" : "코드잇 디스코드 채널에 오신 것을 환영합니다.", + "channelType" : "VOICE" + } + }, + "875e684a-8cfa-40ef-b5ee-e3e5f781c23d" : { + "id" : "875e684a-8cfa-40ef-b5ee-e3e5f781c23d", + "createdAt" : 1737448411091, "updatedAt" : null, "content" : "열심히 공부하는 코테 준비 채널입니다!", "writer" : { - "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", - "createdAt" : 1737442167977, + "id" : "db53c2b5-90dd-4f65-a607-3638f05f1d80", + "createdAt" : 1737448411026, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "35137c5a-6b42-4ddd-a815-97e11ca60f56", - "createdAt" : 1737442168176, + "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", + "createdAt" : 1737448411089, "updatedAt" : null, - "members" : [ ], "name" : "코테 준비", - "creator" : { - "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", - "createdAt" : 1737442167974, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - } + "description" : "코테 준비용 채널입니다.", + "channelType" : "VOICE" } }, - "6601315d-bb57-4163-8d27-41f0697242a8" : { - "id" : "6601315d-bb57-4163-8d27-41f0697242a8", - "createdAt" : 1737442168184, + "ebe5151e-1a7d-4ab8-b469-ef2e5e2963f7" : { + "id" : "ebe5151e-1a7d-4ab8-b469-ef2e5e2963f7", + "createdAt" : 1737448411111, "updatedAt" : null, - "content" : "열심히 하겠습니다!!", + "content" : "테스트 확인 용 메시지입니다!", "writer" : { - "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", - "createdAt" : 1737442167974, + "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", + "createdAt" : 1737448411024, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, "channel" : { - "id" : "35137c5a-6b42-4ddd-a815-97e11ca60f56", - "createdAt" : 1737442168176, + "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", + "createdAt" : 1737448411089, + "updatedAt" : null, + "name" : "코테 준비", + "description" : "코테 준비용 채널입니다.", + "channelType" : "VOICE" + } + }, + "3928e8a9-8697-4065-b078-9adcaf4ea925" : { + "id" : "3928e8a9-8697-4065-b078-9adcaf4ea925", + "createdAt" : 1737448411107, + "updatedAt" : null, + "content" : "저는 요즘 스프링에 대해 공부하고 있습니다^^", + "writer" : { + "id" : "09a11f19-0e42-4509-94c7-64d6f5bdd5f4", + "createdAt" : 1737448411020, + "updatedAt" : null, + "name" : "이서윤", + "phone" : "010-2222-1111", + "password" : "Abcdefgh12312!!" + }, + "channel" : { + "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", + "createdAt" : 1737448411089, "updatedAt" : null, - "members" : [ ], "name" : "코테 준비", - "creator" : { - "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", - "createdAt" : 1737442167974, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - } + "description" : "코테 준비용 채널입니다.", + "channelType" : "VOICE" } } } \ No newline at end of file diff --git a/json/users.json b/json/users.json index ce0c061c9..5ccf784f4 100644 --- a/json/users.json +++ b/json/users.json @@ -1,58 +1,42 @@ { - "ae463e42-d1ca-491c-94b0-494ae06281ea" : { - "id" : "ae463e42-d1ca-491c-94b0-494ae06281ea", - "createdAt" : 1737442168191, + "b99b8715-7d50-4e2f-acd6-7ab2e7d75ff4" : { + "id" : "b99b8715-7d50-4e2f-acd6-7ab2e7d75ff4", + "createdAt" : 1737448411096, "updatedAt" : null, "name" : "김자바", "phone" : "010-8739-9343", "password" : "Abcdefgh!" }, - "9fc4ae20-f124-412a-9dba-21965d09c71c" : { - "id" : "9fc4ae20-f124-412a-9dba-21965d09c71c", - "createdAt" : 1737442167969, + "09a11f19-0e42-4509-94c7-64d6f5bdd5f4" : { + "id" : "09a11f19-0e42-4509-94c7-64d6f5bdd5f4", + "createdAt" : 1737448411020, "updatedAt" : null, "name" : "이서윤", "phone" : "010-2222-1111", "password" : "Abcdefgh12312!!" }, - "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1" : { - "id" : "b7e1baec-0cca-4b7a-a4ee-340db01ca4c1", - "createdAt" : 1737442167974, + "ea066c85-cb7f-43b2-b266-eca3d46bc4de" : { + "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", + "createdAt" : 1737448411024, "updatedAt" : null, "name" : "박지훈", "phone" : "010-3333-1111", "password" : "Abcdefgh12312!!" }, - "16a06eb1-560a-48ee-ae26-86b4cec545e1" : { - "id" : "16a06eb1-560a-48ee-ae26-86b4cec545e1", - "createdAt" : 1737442167977, + "db53c2b5-90dd-4f65-a607-3638f05f1d80" : { + "id" : "db53c2b5-90dd-4f65-a607-3638f05f1d80", + "createdAt" : 1737448411026, "updatedAt" : null, "name" : "이채은", "phone" : "010-4444-1111", "password" : "Abcdefgh12312!!" }, - "0b950654-21fb-4a11-9cf7-a197abd37bbc" : { - "id" : "0b950654-21fb-4a11-9cf7-a197abd37bbc", - "createdAt" : 1737442167990, + "b0d79561-1b2c-4cfb-9dc5-0affe9501154" : { + "id" : "b0d79561-1b2c-4cfb-9dc5-0affe9501154", + "createdAt" : 1737448411026, "updatedAt" : null, "name" : "정다은", "phone" : "010-5555-1111", "password" : "Abcdefgh12312!!" - }, - "3935b48c-fbff-4de8-947e-3695b2c8b968" : { - "id" : "3935b48c-fbff-4de8-947e-3695b2c8b968", - "createdAt" : 1737442167937, - "updatedAt" : 1737442168077, - "name" : "김민준", - "phone" : "010-1111-1111", - "password" : "Zdefdasdf!@" - }, - "c361661c-8625-490f-b10c-084aa21b22b2" : { - "id" : "c361661c-8625-490f-b10c-084aa21b22b2", - "createdAt" : 1737442168201, - "updatedAt" : null, - "name" : "홍길동", - "phone" : "010-1234-4321", - "password" : "Abcdefgh!" } } \ No newline at end of file diff --git a/result/channels.ser b/result/channels.ser index 82d682ec6a4744e3d4e3590693bee1bebbb55d59..15c52c057787e9ac89da563e7efb9cc271a28efb 100644 GIT binary patch delta 436 zcmX@l|BZD*ufPPmRacIr_uGE>n0UKA(QoaG`=I80BWELmqr=(_<=$Dpc=IA>kG+0l(uBgDB zl3JWxlvz*$R9nIzCy?=aNX9cjfe-^jMG*rZ$Y4E?!FsNFrMbwG1tkouVg8=Z zu9GJ+de{Fuf3bu?@y*^TZ(Dm5-YjW&y|d-btd$CHHnzNOneb*_>+9~0*WF9>K$bI? zFz})%EGPyEGxg7x&3hVAs2y)@!TD~t=TWdIOC3m#tAv3i#5E!WEX2paz&NG--}##$ p3+GLEy*k%LizMKEw)rs1^EfEA$~&=!X`k76G*} zWv0N51BI48$b%r`a#M4YQj3aFC4DlBOMsFrd5O8HB@9AHt_Usx`UvC>&eDPuh%*Zr z>KIrn3gF=fa;+ZNwcSr9oatA-&&0s!#lTvYm{XcsQN$ns4rH(*zfzFhZEL2=a!+~C z&BVY^QNX~!IHi4lFUT|vVnPt)y=7;Xx(6#AZ9xk@u)DxM2eH_p-T|>WeHb_j5{rw= z^NUiTeAa@D{Jc~s2h(pL32unndX^P~cuY&)nec9qS#ogu!(DH9PI*_AFmS%!F!jyy zhPSgjN*MSZlafeVX_@n8&Jvt%Gy(!7H=-K65@PT=wYDwij=DY+TadRgjLYL4)ZmRRZ{{}O zG}r_Pa2mV~V(^^r3#YHXT)l^TDqD!+Z!bZR!3(Co?p}h=U{fH#X>cRN;3;)xQ#YO1 znPF+VrRVp5-xolGU+rvoy?)P|B|sN*M*$-%C9yaqP0;}wRiIb`8w%DB4cJ~@Fb^e6 zdOIODY~2PA2Oq;4FKhTD^Gkag{*zvl5CXfwF5U`{GOc*A*CdNjF1rNv|m2bM|0P{0S%5AOy0LqD|0RR91 diff --git a/result/messages.ser b/result/messages.ser index ed75d94e13612895eaaa5bf5186a14115f750b09..933f42a22b77e497aa1147b3c0b85d9c15d684b0 100644 GIT binary patch delta 1156 zcmZuwYe_Ta!nRuZKUBC!yZOguLb8eqySZ>yq;wH_$ zPh6&^Ig~}w)EP!dAZAdIMCBj55Mh^{vot7zeyq;O@m(t1UyQbjYea)vIEWz7J#6@W;EP9Z}bHNcA!BHvMs2shJqZ2>KwwJLOmvE zvY{p$h3pPwX{S8BS5T{o^4_o`d$qUG2`#nI;*jb|kfK{oD!(DAxcT$rfsqe|`KuVP zXm(!yIgT@gtJ&=v{lEYTbaKejg1U_qyzEBJP6{=dVZ95ry1jJ+0ndG-ABmJW=xB;< z6R}AGpKsJE1j9X5j{O>Z^E0wzMO;i~b|eELF&i?qpcV&vOdMy}fJbsF9$Ep=zIey^ zt8c#^mN>-Kijz4O{xp=IqljiKzx1oTWIzHo=QUd?OF-zU!NU*?+Gt4KR0CcVmHv$ zi1X#WSxd02TD-(iUs*Y}yZ-OgGw+X)u#0=H^UzRo9nFB{(Bz$xTm6i`FWB z!-<8<<1gh2&B2?*kt7;$L2&!xrolbhh*}3IQkUuOLjKYO`~5-$GXnj(Dw^Nk-|Jkx zHSw$SYST_tkl%FFZiIClrshzWog#Xi33gZGf09l?tI^x&raXQ9@Bv=gJ$>yIYO9^j TbWst{<xK;z>;0h$H2firG0+SvSN@KOiSLG z@NSSS7UtkyuvN?u8wJ4} zm{(RpT(M5AZOgf%t`Ef)03++fKpTNI*Qz!>zaIZ(=j?XT+5kWOjdNKUng5-?F?lJYiOQ7YDc8R4 zz50c7p}ZuYlPhO&AwwMl3z+0&U|^im{_lLxsM delta 496 zcmZ3=Hiu(E03-XvKpTN68$7)pBsIQT=Vs@0@sy{`#<{GF%=3HeCog3*QJK3-aat_r zahdr?)+u~canvdkZE-?-Z1se@`kswJ0|lnNlva{5-?q-*0$x`QP+oJ3-UIGae2JMqI)Gsw=_`q zo4H%wY;1Wmw*jQv)dUE14S}EltcPjN_l46}U#{N6J(Vp)@wb;C7L&GtOi~1yv|#G% z?j=x@>P>+F*`z6TW>Ytv*qLEzx~1p$f8Q5aOlpMKiLMf8^sAi>uh;K+v!tPffjcTC zH7zBvI3-Qdp@f0gz|a6}3zz`whXiEI{9ay&aT|F!ycS6-Z91HoCex"); User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh12312!!"); @@ -101,30 +98,56 @@ public static void main(String[] args) { System.out.println(); System.out.println("==============================================================================="); System.out.println(); - System.out.println("<메시지를 보낼 수 있는 테스트 채널을 생성함>"); - Channel testChannel = channelService.create("테스트1", user4); - Channel testChannel2 = channelService.create("테스트2", user5); - testChannel.addManyUser(userService.getAllUser()); - testChannel2.addManyUser(userService.getAllUser()); - System.out.println(testChannel); + System.out.println("<채널 생성하기>"); + Channel channel1 = channelService.create("코드잇 디스코드", "코드잇용 디스코드 채널입니다.", ChannelType.TEXT); + Channel channel2 = channelService.create("코테 준비", "코테 준비용 채널입니다.", ChannelType.VOICE); + messageService.createMessage("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); + messageService.createMessage("열심히 하겠습니다!!", user3, channel2); + User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); + Channel javaChannel = channelService.create("자바 공부합시다", "자바 공부용 채널입니다.", ChannelType.TEXT); + System.out.println(channel1); + System.out.println(channel2); + System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); + System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); + try { + Channel sameChannel = channelService.create("코드잇 디스코드", "이 방도 코드잇 디스코드 방입니다.", ChannelType.VOICE); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + System.out.println("<채널 설명 변경하기>"); + channelService.updateDescription(channel1, "코드잇 디스코드 채널에 오신 것을 환영합니다."); + System.out.println(channel1); + System.out.println("<채널 타입 변경하기>"); + channelService.updateType(channel1, ChannelType.VOICE); + System.out.println(channel1); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); + System.out.println("<채널 단일 조회하기>"); + System.out.println("코드잇 디스코드 채널 찾기 : " + channelService.getChannelByName("코드잇 디스코드")); + System.out.println("<전체 채널 조회하기>"); + System.out.println(channelService.getAllChannel()); + System.out.println(); + System.out.println("==============================================================================="); + System.out.println(); System.out.println("<메시지 생성하기>"); - Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, testChannel); - Message message2_2 = messageService.createMessage("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, testChannel); - Message message3_1 = messageService.createMessage("테스트 확인 용 메시지입니다!", user3, testChannel2); + Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, channel1); + Message message2_2 = messageService.createMessage("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, channel2); + Message message3_1 = messageService.createMessage("테스트 확인 용 메시지입니다!", user3, channel2); System.out.println(message2_1); - Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, testChannel); + Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, channel1); System.out.println(message3); System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 내용이 작성되지 않은 메시지 : "); try { - Message message4 = messageService.createMessage("", user4, testChannel); + Message message4 = messageService.createMessage("", user4, channel1); } catch (Exception e) { System.out.println(e.getMessage()); } - System.out.print(" - 2. 채널에 등록되지 않은 회원이 메시지를 보낼 때 : "); + System.out.print(" - 2. 등록되지 않은 회원이 메시지를 보낼 때 : "); User unRegistUser1 = new User("미등록회원", "010-1919-9191", "Abcdefgh!"); try { - Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, testChannel); + Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, channel1); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -133,12 +156,12 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<특정 채널에서 전체 메시지 조회하기>"); - System.out.print("테스트 1채널 전체 메시지 조회"); - List allMessages = messageService.getMessageByChannel(testChannel); + System.out.print("코드잇 채널 전체 메시지 조회"); + List allMessages = messageService.getMessageByChannel(channel1); System.out.println(allMessages); System.out.println(); - System.out.print("테스트 2채널 전체 메시지 조회"); - List allMessages2 = messageService.getMessageByChannel(testChannel2); + System.out.print("코테 준비 채널 전체 메시지 조회"); + List allMessages2 = messageService.getMessageByChannel(channel2); System.out.println(allMessages2); System.out.println("<단일 메시지 조회하기>"); List getMessage = messageService.getMessageByUser(user2); @@ -155,65 +178,12 @@ public static void main(String[] args) { System.out.println("<메시지 삭제하기>"); messageService.removeMessageByWriter(user2, message2_1.getId()); System.out.println("전체 메시지 조회하기: " + messageService.getMessageByUser(user2)); - System.out.println("임시로 만든 채널 삭제하기 : "); - channelService.deleteChannel(testChannel); - channelService.deleteChannel(testChannel2); - System.out.println(channelService.getAllChannel()); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<채널 생성하기>"); - Channel channel1 = channelService.create("코드잇 디스코드", user2); - Channel channel2 = channelService.create("코테 준비", user3); - messageService.createMessage("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); - messageService.createMessage("열심히 하겠습니다!!", user3, channel2); - channelService.addManyUserToChannel(channel1, userService.getAllUser()); - channelService.addManyUserToChannel(channel2, userService.getAllUser()); - User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); - Channel javaChannel = channelService.create("자바 공부합시다", channelCreator); - channelService.addManyUserToChannel(javaChannel, userService.getAllUser()); - System.out.println(channel1); - System.out.println(channel2); - System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); - System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); - try { - Channel sameChannel = channelService.create("코드잇 디스코드", user4); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<채널 단일 조회하기>"); - System.out.println("코드잇 디스코드 채널 찾기 : " + channelService.getChannelByName("코드잇 디스코드")); - System.out.println("<전체 채널 조회하기>"); + System.out.println("채널 삭제하기 : "); + channelService.deleteChannel(channel1); System.out.println(channelService.getAllChannel()); - System.out.println("<하나의 회원이 포함되어 있는 채널 조회>"); - List channelsByUserId = channelService.getChannelsByUser(channelCreator); - System.out.println("김자바 회원이 포함되어 있는 채널 조회 : " + channelsByUserId); System.out.println(); System.out.println("==============================================================================="); System.out.println(); - System.out.println("<채널에 새로운 멤버 추가하기>"); - User newUser = userService.createUser("홍길동", "010-1234-4321", "Abcdefgh!"); - Channel updateChannel2 = channelService.addUserToChannel(channel2, newUser); - System.out.println("코테 준비 채널에 신규 회원 추가 : " + updateChannel2); - System.out.println("<채널에 있는 멤버 채널 나가기>"); - channelService.removeUserToChannel(channel2, user3); - System.out.println(channel2); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<심화> - 채널을 삭제하면 해당 채널에 있던 메시지가 조회되면 안된다."); - System.out.println("코드잇 채널에 메시지를 여러 개 생성"); - messageService.createMessage("안녕하세요 처음 인사드립니다.", user3, channel1); - messageService.createMessage("안녕하세요 만나서 반갑습니다.", user4, channel1); - messageService.createMessage("오 디스코드는 처음 들어와보네요!.", user5, channel1); - System.out.println("코드잇 채널 삭제 이전 해당 채널에 존재하는 메시지 출력해보기"); - System.out.println(messageService.getMessageByChannel(channel1)); - System.out.println("코드잇 채널 삭제 이후 해당 채널에 존재하는 메시지 출력해보기"); - channelService.deleteChannel(channel1); - System.out.println(messageService.getMessageByChannel(channel1)); if (factory instanceof FileFactory) { FileIOUtil.convertDatToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); FileIOUtil.convertDatToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); diff --git a/src/main/java/com/sprint/mission/discodeit/config/Configuration.java b/src/main/java/com/sprint/mission/discodeit/config/Configuration.java deleted file mode 100644 index 36020840f..000000000 --- a/src/main/java/com/sprint/mission/discodeit/config/Configuration.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.config; - -public class Configuration { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java deleted file mode 100644 index 522de3318..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/ChannelDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sprint.mission.discodeit.dto; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; -import lombok.*; - -import java.util.List; -import java.util.UUID; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class ChannelDTO { - private UUID id; - private Long createdAt; - private Long updatedAt; - private List members; - private String channelName; - private String creatorId; - - public static ChannelDTO fromEntity(Channel channel) { - return ChannelDTO.builder() - .id(channel.getId()) - .createdAt(channel.getCreatedAt()) - .updatedAt(channel.getUpdatedAt()) - .members(channel.getMembers()) - .channelName(channel.getName()) - .creatorId(channel.getCreator().getPhone()) - .build(); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java deleted file mode 100644 index 926f33012..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/MessageDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sprint.mission.discodeit.dto; - -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; -import lombok.*; - -import java.util.UUID; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class MessageDTO { - private UUID id; - private Long createdAt; - private Long updatedAt; - private String content; - private String writerId; - private String channelName; - - public static MessageDTO fromEntity(Message message) { - return MessageDTO.builder() - .id(message.getId()) - .createdAt(message.getCreatedAt()) - .updatedAt(message.getUpdatedAt()) - .content(message.getContent()) - .writerId(message.getWriter().getPhone()) - .channelName(message.getChannel().getName()) - .build(); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 3068a5158..308fa5dee 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.util.ChannelType; import lombok.Getter; import java.io.Serializable; @@ -18,31 +19,26 @@ public class Channel implements Serializable { private UUID id; private Long createdAt; private Long updatedAt; - private List members; private String name; - private User creator; + private String description; + private ChannelType channelType; - public Channel(String name, User creator) { + public Channel(String name, String description, ChannelType channelType) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); this.updatedAt = null; - this.members = new ArrayList<>(); this.name = name; - this.creator = creator; + this.description = description; + this.channelType = channelType; } - public void addUser(User user) { - this.members.add(user); + public void changeType(ChannelType channelType) { + this.channelType = channelType; this.updatedAt = System.currentTimeMillis(); } - public void addManyUser(List users) { - this.members.addAll(users); - this.updatedAt = System.currentTimeMillis(); - } - - public void removeUser(User user) { - members.remove(user); + public void changeDescription(String description) { + this.description = description; this.updatedAt = System.currentTimeMillis(); } @@ -57,19 +53,13 @@ public String toString() { ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) : "N/A"; - String creatorName = creator != null ? creator.getName() : "Unknown"; - - String membersNames = (members != null && !members.isEmpty()) - ? members.stream().map(User::getName).collect(Collectors.joining(", ")) - : "No members"; - return "Channel{" + "id=" + id + ", createdAt=" + createdAtFormatted + ", updatedAt=" + updatedAtFormatted + - ", members=" + membersNames + + ", description=" + description + ", name='" + name + '\'' + - ", creator='" + creatorName + '\'' + + ", type='" + channelType + '\'' + '}'; } diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java index 008162f45..78ea0c62a 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java @@ -14,9 +14,9 @@ public class FileFactory implements Factory{ private final ChannelService channelService; private FileFactory() { - this.userService = new FileUserService("./result/users.ser"); - this.messageService = new FileMessageService("./result/messages.ser"); - this.channelService = new FileChannelService("./result/channels.ser"); + this.userService = new FileUserService(); + this.channelService = new FileChannelService(); + this.messageService = new FileMessageService(userService, channelService); } public static FileFactory getInstance() { diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java index b008df27c..e42312129 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java @@ -16,9 +16,9 @@ public class JCFFactory implements Factory{ private final JCFChannelService channelService; private JCFFactory() { - this.userService = new JCFUserService(new HashMap<>()); - this.messageService = new JCFMessageService(new HashMap<>()); - this.channelService = new JCFChannelService(new HashMap<>()); + this.userService = new JCFUserService(); + this.channelService = new JCFChannelService(); + this.messageService = new JCFMessageService(userService, channelService); } public static JCFFactory getInstance() { diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 770e7c7be..50ab7190f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -11,8 +11,6 @@ public interface ChannelRepository { Optional getByName(String channelName); - List getByUser(User user); - List getAll(); Channel delete(Channel channel); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 6f7e4c2cf..1b620513d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -16,11 +16,10 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileChannelRepository implements ChannelRepository { - private final Path filePath; + private final Path filePath = Path.of("./result/channels.ser"); private final Map channelMap; - public FileChannelRepository(String filePath) { - this.filePath = Paths.get(filePath); + public FileChannelRepository() { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); @@ -46,15 +45,6 @@ public Optional getByName(String channelName) { .findFirst(); } - @Override - public List getByUser(User user) { - return channelMap.values().stream() - .filter(channel -> channel.getMembers().stream() - .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) - ) - .collect(Collectors.toList()); - } - @Override public List getAll() { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 2a4f09d58..43e5291fa 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -16,11 +16,10 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageRepository implements MessageRepository { - private final Path filePath; + private final Path filePath = Path.of("./result/messages.ser"); private final Map messageMap; - public FileMessageRepository(String filePath) { - this.filePath = Paths.get(filePath); + public FileMessageRepository() { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 99c0d724a..45d1e7cfb 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; @@ -14,11 +13,10 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileUserRepository implements UserRepository { - private final Path filePath; + private final Path filePath = Path.of("./result/users.ser"); private final Map userMap; - public FileUserRepository(String filePath) { - this.filePath = Paths.get(filePath); + public FileUserRepository() { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 32a38e5f2..e6dcb5263 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -27,15 +27,6 @@ public Optional getByName(String channelName) { .findFirst(); } - @Override - public List getByUser(User user) { - return channelMap.values().stream() - .filter(channel -> channel.getMembers().stream() - .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) - ) - .collect(Collectors.toList()); - } - @Override public List getAll() { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 8e2e9f93c..8e97a2dea 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -2,28 +2,21 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.util.ChannelType; import java.util.List; import java.util.Optional; public interface ChannelService { - void setDependency(MessageService messageService, UserService userService); - - Channel create(String name, User creator); + Channel create(String name, String description, ChannelType channelType); Optional getChannelByName(String name); - boolean channelExists(String name); - List getAllChannel(); - List getChannelsByUser(User user); - - Channel addUserToChannel(Channel channel, User newUser); - - Channel addManyUserToChannel(Channel channel, List users); + Channel updateType(Channel channel, ChannelType channelType); - Channel removeUserToChannel(Channel channel, User removeUser); + Channel updateDescription(Channel channel, String description); void deleteChannel(Channel removeChannel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 2302f3b21..121f14d9a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -8,8 +8,6 @@ import java.util.UUID; public interface MessageService { - void setDependency(UserService userService, ChannelService channelService); - Message createMessage(String content, User writer, Channel channel); List getMessageByUser(User writer); @@ -20,5 +18,5 @@ public interface MessageService { void removeMessageByWriter(User writer, UUID uuid); - void deleteMessage(Channel channel); + void deleteMessageByChannel(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 3455386d0..3a77294cb 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -6,14 +6,10 @@ import java.util.Optional; public interface UserService { - void setDependency(MessageService messageService, ChannelService channelService); - User createUser(String name, String phone, String password); Optional getUserByPhone(String phone); - boolean userExists(String phone); - List getAllUser(); User updateUserPassword(User user, String newPass); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index bbfe49c64..68ff11166 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,10 +1,11 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.UserService; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public class BasicUserService { +public class BasicUserService implements UserService { } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 74e624f6b..ae19746cc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -7,6 +7,8 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.ChannelType; +import com.sprint.mission.discodeit.util.FileIOUtil; import lombok.Setter; import java.io.IOException; @@ -19,14 +21,11 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; -@Setter public class FileChannelService implements ChannelService { - private final Path filePath; - private UserService userService; - private MessageService messageService; + private final Path filePath = Path.of("./result/channels.ser"); + private final Map channels = loadFromFile(filePath); - public FileChannelService(String filePath) { - this.filePath = Paths.get(filePath); + public FileChannelService() { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); @@ -38,19 +37,12 @@ public FileChannelService(String filePath) { } @Override - public void setDependency(MessageService messageService, UserService userService) { - this.userService = userService; - this.messageService = messageService; - } - - @Override - public Channel create(String name, User creator) { - Map channels = loadFromFile(filePath); + public Channel create(String name, String description, ChannelType channelType) { if (channels.values().stream() .anyMatch(user -> user.getName().equals(name))) { throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); } - Channel createChannel = new Channel(name, creator); + Channel createChannel = new Channel(name, description, channelType); channels.put(createChannel.getId(), createChannel); saveToFile(channels, filePath); return createChannel; @@ -58,7 +50,6 @@ public Channel create(String name, User creator) { @Override public Optional getChannelByName(String name) { - Map channels = loadFromFile(filePath); for (Channel channel : channels.values()) { if (channel.getName().equals(name)) { return Optional.of(channel); @@ -67,78 +58,38 @@ public Optional getChannelByName(String name) { return Optional.empty(); } - @Override - public boolean channelExists(String name) { - Map channels = loadFromFile(filePath); - return channels.values().stream() - .anyMatch(user -> user.getName().equals(name)); - } - @Override public List getAllChannel() { - Map channels = loadFromFile(filePath); - return channels.values().stream() - .collect(Collectors.toList()); - } - - @Override - public List getChannelsByUser(User user) { - Map channels = loadFromFile(filePath); return channels.values().stream() - .filter(channel -> channel.getMembers().stream() - .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) - ) .collect(Collectors.toList()); } @Override - public Channel addUserToChannel(Channel channel, User newUser) { - Map channels = loadFromFile(filePath); + public Channel updateType(Channel channel, ChannelType channelType) { validateChannel(channel); - validateUser(newUser); - channel.addUser(newUser); + channel.changeType(channelType); channels.put(channel.getId(), channel); - saveToFile(channels, filePath); + FileIOUtil.saveToFile(channels, filePath); return channel; } @Override - public Channel addManyUserToChannel(Channel channel, List users) { - Map channels = loadFromFile(filePath); + public Channel updateDescription(Channel channel, String description) { validateChannel(channel); - channel.addManyUser(users); + channel.changeDescription(description); channels.put(channel.getId(), channel); - saveToFile(channels, filePath); + FileIOUtil.saveToFile(channels, filePath); return channel; } - @Override - public Channel removeUserToChannel(Channel channel, User removeUser) { - Map channels = loadFromFile(filePath); - validateChannel(channel); - validateUser(removeUser); - channel.removeUser(removeUser); - channels.put(channel.getId(), channel); - saveToFile(channels, filePath); - return channel; - } @Override public void deleteChannel(Channel channel) { - Map channels = loadFromFile(filePath); validateChannel(channel); - - messageService.deleteMessage(channel); channels.remove(channel.getId()); - saveToFile(channels, filePath); } - private void validateUser(User user) { - User findUser = userService.getUserByPhone(user.getPhone()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - } - private void validateChannel(Channel channel) { Channel findChannel = getChannelByName(channel.getName()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 9c3933511..883bddf9e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -9,6 +9,7 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.FileIOUtil; +import lombok.RequiredArgsConstructor; import lombok.Setter; import java.io.IOException; @@ -19,14 +20,13 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; -@Setter public class FileMessageService implements MessageService { - private final Path filePath; - private UserService userService; - private ChannelService channelService; + private final Path filePath = Path.of("./result/messages.ser"); + Map messages = FileIOUtil.loadFromFile(filePath); + private final UserService userService; + private final ChannelService channelService; - public FileMessageService(String filePath) { - this.filePath = Paths.get(filePath); + public FileMessageService(UserService userService, ChannelService channelService) { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); @@ -35,16 +35,12 @@ public FileMessageService(String filePath) { throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } - } - @Override - public void setDependency(UserService userService, ChannelService channelService) { this.userService = userService; this.channelService = channelService; } @Override public Message createMessage(String content, User writer, Channel channel) { - Map messages = FileIOUtil.loadFromFile(filePath); if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } @@ -60,8 +56,6 @@ public Message createMessage(String content, User writer, Channel channel) { @Override public List getMessageByUser(User writer) { - Map messages = FileIOUtil.loadFromFile(filePath); - validateUser(writer); List list = new ArrayList<>(); @@ -75,7 +69,6 @@ public List getMessageByUser(User writer) { @Override public List getMessageByChannel(Channel channel) { - Map messages = FileIOUtil.loadFromFile(filePath); List list = new ArrayList<>(); for (Message message : messages.values()) { if (message.getChannel().getName().equals(channel.getName())) { @@ -87,7 +80,6 @@ public List getMessageByChannel(Channel channel) { @Override public Message updateMessageContent(Message updateMessage, String newContent) { - Map messages = FileIOUtil.loadFromFile(filePath); if (newContent.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } @@ -99,7 +91,6 @@ public Message updateMessageContent(Message updateMessage, String newContent) { @Override public void removeMessageByWriter(User writer, UUID uuid) { - Map messages = FileIOUtil.loadFromFile(filePath); if (!messages.containsKey(uuid)) { throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } @@ -109,8 +100,7 @@ public void removeMessageByWriter(User writer, UUID uuid) { } @Override - public void deleteMessage(Channel channel) { - Map messages = FileIOUtil.loadFromFile(filePath); + public void deleteMessageByChannel(Channel channel) { getMessageByChannel(channel).stream() .map(Message::getId) .forEach(messages::remove); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index e7335341a..044ec882e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -19,14 +19,11 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; -@Setter public class FileUserService implements UserService { - private final Path filePath; - private MessageService messageService; - private ChannelService channelService; + private final Path filePath = Path.of("./result/users.ser"); + private final Map users = loadFromFile(filePath); - public FileUserService(String filePath) { - this.filePath = Paths.get(filePath); + public FileUserService() { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); @@ -37,15 +34,8 @@ public FileUserService(String filePath) { } } - @Override - public void setDependency(MessageService messageService, ChannelService channelService) { - this.messageService = messageService; - this.channelService = channelService; - } - @Override public User createUser(String name, String phone, String password) { - Map users = loadFromFile(filePath); if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } @@ -66,26 +56,13 @@ public User createUser(String name, String phone, String password) { @Override public Optional getUserByPhone(String phone) { - Map users = loadFromFile(filePath); return users.values().stream() .filter(user -> user.getPhone().equals(phone)) .findFirst(); } - @Override - public boolean userExists(String phone) { - Map users = loadFromFile(filePath); - for (User user : users.values()) { - if (user.getPhone().equals(phone)) { - return true; - } - } - return false; - } - @Override public List getAllUser() { - Map users = loadFromFile(filePath); return users.values() .stream() .collect(Collectors.toList()); @@ -94,7 +71,6 @@ public List getAllUser() { @Override public User updateUserPassword(User updateUser, String newPass) { - Map users = loadFromFile(filePath); if (!userExists(updateUser.getPhone())) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } @@ -106,13 +82,15 @@ public User updateUserPassword(User updateUser, String newPass) { @Override public void deleteUser(User removeUser) { - Map users = loadFromFile(filePath); if (!userExists(removeUser.getPhone())) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } - channelService.getAllChannel().stream() - .forEach(channel -> channel.getMembers() - .removeIf(user -> user.getId().equals(removeUser.getId()))); users.remove(removeUser.getId()); } + + private boolean userExists(String phone) { + return users.values() + .stream() + .anyMatch(user -> user.getPhone().equals(phone)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index db6b52a8a..98f22f99c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -7,6 +7,7 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.ChannelType; import lombok.RequiredArgsConstructor; import lombok.Setter; @@ -14,31 +15,25 @@ import java.util.*; import java.util.stream.Collectors; -@RequiredArgsConstructor -@Setter public class JCFChannelService implements ChannelService { private final Map channelRepository; - private UserService userService; - private MessageService messageService; + + public JCFChannelService() { + this.channelRepository = new HashMap<>(); + } @Override - public Channel create(String name, User creator) throws IllegalArgumentException { + public Channel create(String name, String description, ChannelType channelType) throws IllegalArgumentException { if (channelRepository.values().stream() .anyMatch(user -> user.getName().equals(name))) { throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); } - Channel createChannel = new Channel(name, creator); + Channel createChannel = new Channel(name, description, channelType); channelRepository.put(createChannel.getId(), createChannel); return createChannel; } - @Override - public void setDependency(MessageService messageService, UserService userService) { - this.messageService = messageService; - this.userService = userService; - } - @Override public Optional getChannelByName(String name) { for (Channel channel : channelRepository.values()) { @@ -49,12 +44,6 @@ public Optional getChannelByName(String name) { return Optional.empty(); } - @Override - public boolean channelExists(String name) { - return channelRepository.values().stream() - .anyMatch(user -> user.getName().equals(name)); - } - @Override public List getAllChannel() { return channelRepository.values().stream() @@ -62,51 +51,25 @@ public List getAllChannel() { } @Override - public List getChannelsByUser(User user) { - return channelRepository.values().stream() - .filter(channel -> channel.getMembers().stream() - .anyMatch(member -> Objects.equals(member.getPhone(), user.getPhone())) - ) - .collect(Collectors.toList()); - } - - - @Override - public Channel addUserToChannel(Channel channel, User newUser) {//새로운 유저가 채널에 들어갈때 + public Channel updateType(Channel channel, ChannelType channelType) { validateChannel(channel); - validateUser(newUser); - channel.addUser(newUser); + channel.changeType(channelType); return channel; } @Override - public Channel addManyUserToChannel(Channel channel, List users) { + public Channel updateDescription(Channel channel, String description) { validateChannel(channel); - channel.addManyUser(users); - return channel; - } - - @Override - public Channel removeUserToChannel(Channel channel, User removeUser) { - validateChannel(channel); - validateUser(removeUser); - channel.removeUser(removeUser); + channel.changeDescription(description); return channel; } @Override public void deleteChannel(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. validateChannel(channel); - - messageService.deleteMessage(channel); channelRepository.remove(channel.getId()); } - private void validateUser(User user) { - User findUser = userService.getUserByPhone(user.getPhone()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - } - private void validateChannel(Channel channel) { Channel findChannel = getChannelByName(channel.getName()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index e552279f6..aed4ef0cc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -14,12 +14,16 @@ import java.util.*; import java.util.stream.Collectors; -@RequiredArgsConstructor -@Setter public class JCFMessageService implements MessageService { private final Map messageRepository; - private UserService userService; - private ChannelService channelService; + private final UserService userService; + private final ChannelService channelService; + + public JCFMessageService(UserService userService, ChannelService channelService) { + this.messageRepository = new HashMap<>(); + this.userService = userService; + this.channelService = channelService; + } @Override public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { @@ -36,12 +40,6 @@ public Message createMessage(String content, User writer, Channel channel) throw return message; } - @Override - public void setDependency(UserService userService, ChannelService channelService) { - this.userService = userService; - this.channelService = channelService; - } - // 메시지를 보낸 회원이 메시지 조회하기 @Override public List getMessageByUser(User writer) { @@ -81,7 +79,7 @@ public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작 @Override - public void deleteMessage(Channel channel) { + public void deleteMessageByChannel(Channel channel) { getMessageByChannel(channel).stream() .map(Message::getId) .forEach(messageRepository::remove); diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 411f1666f..be5fba2ea 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -13,16 +13,11 @@ import java.util.*; -@RequiredArgsConstructor public class JCFUserService implements UserService { private final Map userRepository; - private MessageService messageService; - private ChannelService channelService; - @Override - public void setDependency(MessageService messageService, ChannelService channelService) { - this.messageService = messageService; - this.channelService = channelService; + public JCFUserService() { + this.userRepository = new HashMap<>(); } @Override @@ -71,14 +66,10 @@ public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 if (!userExists(removeUser.getPhone())) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } - channelService.getAllChannel().stream() - .forEach(channel -> channel.getMembers() - .removeIf(user -> user.getId().equals(removeUser.getId()))); userRepository.remove(removeUser.getId()); } - @Override - public boolean userExists(String phone) { + private boolean userExists(String phone) { return userRepository.values() .stream() .anyMatch(user -> user.getPhone().equals(phone)); diff --git a/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java new file mode 100644 index 000000000..75a36bdf1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util; + +public enum ChannelType { + TEXT, VOICE +} From 7de68cba6b376cd7ac503f0a3733603f81e04ea7 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 21 Jan 2025 18:48:55 +0900 Subject: [PATCH 031/115] Complete repository --- .../mission/discodeit/JavaApplication.java | 21 ++--- .../discodeit/{entity => domain}/Channel.java | 6 +- .../discodeit/{entity => domain}/Message.java | 2 +- .../discodeit/{entity => domain}/User.java | 2 +- .../repository/ChannelRepository.java | 7 +- .../repository/MessageRepository.java | 6 +- .../discodeit/repository/UserRepository.java | 2 +- .../file/FileChannelRepository.java | 9 +- .../file/FileMessageRepository.java | 7 +- .../repository/file/FileUserRepository.java | 2 +- .../repository/jcf/JCFChannelRepository.java | 7 +- .../repository/jcf/JCFMessageRepository.java | 6 +- .../repository/jcf/JCFUserRepository.java | 2 +- .../discodeit/service/ChannelService.java | 3 +- .../discodeit/service/MessageService.java | 8 +- .../discodeit/service/UserService.java | 2 +- .../service/basic/BasicChannelService.java | 61 +++++++++++++- .../service/basic/BasicMessageService.java | 84 ++++++++++++++++++- .../service/basic/BasicUserService.java | 59 ++++++++++++- .../service/file/FileChannelService.java | 7 +- .../service/file/FileMessageService.java | 11 +-- .../service/file/FileUserService.java | 6 +- .../service/jcf/JCFChannelService.java | 7 +- .../service/jcf/JCFMessageService.java | 10 +-- .../discodeit/service/jcf/JCFUserService.java | 6 +- .../mission/discodeit/util/ChannelType.java | 2 +- .../mission/discodeit/util/FileIOUtil.java | 2 +- 27 files changed, 252 insertions(+), 95 deletions(-) rename src/main/java/com/sprint/mission/discodeit/{entity => domain}/Channel.java (92%) rename src/main/java/com/sprint/mission/discodeit/{entity => domain}/Message.java (97%) rename src/main/java/com/sprint/mission/discodeit/{entity => domain}/User.java (98%) diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index dd9fa68d4..01a0cf984 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -1,20 +1,13 @@ package com.sprint.mission.discodeit; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.factory.Factory; import com.sprint.mission.discodeit.factory.FileFactory; -import com.sprint.mission.discodeit.factory.JCFFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.file.FileChannelService; -import com.sprint.mission.discodeit.service.file.FileMessageService; -import com.sprint.mission.discodeit.service.file.FileUserService; -import com.sprint.mission.discodeit.service.jcf.JCFChannelService; -import com.sprint.mission.discodeit.service.jcf.JCFMessageService; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; import com.sprint.mission.discodeit.util.ChannelType; import com.sprint.mission.discodeit.util.FileIOUtil; @@ -176,7 +169,7 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 삭제하기>"); - messageService.removeMessageByWriter(user2, message2_1.getId()); + messageService.deleteMessageByWriter(user2, message2_1.getId()); System.out.println("전체 메시지 조회하기: " + messageService.getMessageByUser(user2)); System.out.println("채널 삭제하기 : "); channelService.deleteChannel(channel1); @@ -185,9 +178,9 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); if (factory instanceof FileFactory) { - FileIOUtil.convertDatToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); - FileIOUtil.convertDatToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); - FileIOUtil.convertDatToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); } } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java similarity index 92% rename from src/main/java/com/sprint/mission/discodeit/entity/Channel.java rename to src/main/java/com/sprint/mission/discodeit/domain/Channel.java index 308fa5dee..d1af4160a 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.entity; +package com.sprint.mission.discodeit.domain; import com.sprint.mission.discodeit.util.ChannelType; import lombok.Getter; @@ -8,11 +8,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; @Getter public class Channel implements Serializable { diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java similarity index 97% rename from src/main/java/com/sprint/mission/discodeit/entity/Message.java rename to src/main/java/com/sprint/mission/discodeit/domain/Message.java index 3602d61d3..869c88162 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.entity; +package com.sprint.mission.discodeit.domain; import lombok.Getter; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java similarity index 98% rename from src/main/java/com/sprint/mission/discodeit/entity/User.java rename to src/main/java/com/sprint/mission/discodeit/domain/User.java index 930347c6d..c645c195f 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.entity; +package com.sprint.mission.discodeit.domain; import lombok.Getter; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 50ab7190f..e476f01f5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; import java.util.List; import java.util.Optional; @@ -9,9 +8,9 @@ public interface ChannelRepository { Channel save(Channel channel); - Optional getByName(String channelName); + Optional findByName(String channelName); - List getAll(); + List findAll(); Channel delete(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index fd8eac233..73ba14daf 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,8 +1,8 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index de3b6a39e..f11aab11c 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.User; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 1b620513d..d40b2e58b 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -1,14 +1,11 @@ package com.sprint.mission.discodeit.repository.file; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.util.FileIOUtil; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; @@ -39,14 +36,14 @@ public Channel save(Channel channel) { } @Override - public Optional getByName(String channelName) { + public Optional findByName(String channelName) { return channelMap.values().stream() .filter(channel -> channel.getName().equals(channelName)) .findFirst(); } @Override - public List getAll() { + public List findAll() { return channelMap.values().stream() .collect(Collectors.toList()); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 43e5291fa..1c047289d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -1,14 +1,13 @@ package com.sprint.mission.discodeit.repository.file; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.MessageRepository; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 45d1e7cfb..222d78374 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository.file; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; import java.io.IOException; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index e6dcb5263..7cad19b57 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.repository.jcf; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; import java.util.*; @@ -21,14 +20,14 @@ public Channel save(Channel channel) { } @Override - public Optional getByName(String channelName) { + public Optional findByName(String channelName) { return channelMap.values().stream() .filter(channel -> channel.getName().equals(channelName)) .findFirst(); } @Override - public List getAll() { + public List findAll() { return channelMap.values().stream() .collect(Collectors.toList()); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 5cb6914ee..3a3eabf16 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -1,8 +1,8 @@ package com.sprint.mission.discodeit.repository.jcf; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.MessageRepository; import java.util.*; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 23fc4dedf..f916a4d55 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository.jcf; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; import java.util.*; diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 8e97a2dea..01d0eb031 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.util.ChannelType; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 121f14d9a..d7558ad9e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,8 +1,8 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import java.util.List; import java.util.UUID; @@ -16,7 +16,7 @@ public interface MessageService { Message updateMessageContent(Message message, String newContent); - void removeMessageByWriter(User writer, UUID uuid); + void deleteMessageByWriter(User writer, UUID uuid); void deleteMessageByChannel(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 3a77294cb..c59b973ce 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.User; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 59f6acc96..db924795a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,6 +1,65 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.util.ChannelType; -public class BasicChannelService { +import java.util.List; +import java.util.Optional; + +public class BasicChannelService implements ChannelService { + private final ChannelRepository channelRepository; + + public BasicChannelService(ChannelRepository channelRepository) { + this.channelRepository = channelRepository; + } + + @Override + public Channel create(String name, String description, ChannelType channelType) { + channelRepository.findByName(name).ifPresent(channel -> { + throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL);}); + Channel channel = new Channel(name, description, channelType); + channelRepository.save(channel); + return channel; + } + + @Override + public Optional getChannelByName(String name) { + return channelRepository.findByName(name); + } + + @Override + public List getAllChannel() { + return channelRepository.findAll(); + } + + @Override + public Channel updateType(Channel channel, ChannelType channelType) { + existChannel(channel); + channel.changeType(channelType); + channelRepository.save(channel); + return channel; + } + + @Override + public Channel updateDescription(Channel channel, String description) { + existChannel(channel); + channel.changeDescription(description); + channelRepository.save(channel); + return channel; + } + + @Override + public void deleteChannel(Channel removeChannel) { + existChannel(removeChannel); + channelRepository.delete(removeChannel); + } + + private void existChannel(Channel channel) { + channelRepository.findByName(channel.getName()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index f2480b8e8..6ae3c2bfd 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,6 +1,88 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; -public class BasicMessageService { +import java.util.List; +import java.util.UUID; + +public class BasicMessageService implements MessageService { + private final MessageRepository messageRepository; + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + + public BasicMessageService(MessageRepository messageRepository, UserRepository userRepository, ChannelRepository channelRepository) { + this.userRepository = userRepository; + this.messageRepository = messageRepository; + this.channelRepository = channelRepository; + } + + @Override + public Message createMessage(String content, User writer, Channel channel) { + if (content.isEmpty()) { + throw new ServiceException(ErrorCode.EMPTY_CONTENT); + } + + existUser(writer); + existChannel(channel); + Message message = new Message(content, writer, channel); + messageRepository.save(message); + return message; + } + + @Override + public List getMessageByUser(User writer) { + existUser(writer); + return messageRepository.findByUser(writer); + } + + @Override + public List getMessageByChannel(Channel channel) { + existChannel(channel); + return messageRepository.findByChannel(channel); + } + + @Override + public Message updateMessageContent(Message message, String newContent) { + messageRepository.findById(message.getId()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + + message.update(newContent); + + messageRepository.save(message); + return message; + } + + @Override + public void deleteMessageByWriter(User writer, UUID uuid) { + existUser(writer); + Message removeMessage = messageRepository.findById(uuid) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + if (!removeMessage.getWriter().getPhone().equals(writer.getPhone())) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } + messageRepository.delete(removeMessage); + } + + @Override + public void deleteMessageByChannel(Channel channel) { + + } + + private void existUser(User user) { + userRepository.findByPhone(user.getPhone()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + + private void existChannel(Channel channel) { + channelRepository.findByName(channel.getName()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 68ff11166..4967dfe53 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,11 +1,68 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.ValidPass; +import com.sprint.mission.discodeit.util.ValidPhone; import lombok.RequiredArgsConstructor; +import java.util.List; +import java.util.Optional; -@RequiredArgsConstructor public class BasicUserService implements UserService { + private final UserRepository userRepository; + public BasicUserService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public User createUser(String name, String phone, String password) { + if (!ValidPass.isValidPassword(password)) { + throw new ServiceException(ErrorCode.INVALID_PASSWORD); + } + + if (!ValidPhone.isValidPhone(phone)) { + throw new ServiceException(ErrorCode.INVALID_WRITER); + } + + userRepository.findByPhone(phone).ifPresent(user -> { + throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); + + User user = new User(name, phone, password); + userRepository.save(user); + return user; + } + + @Override + public Optional getUserByPhone(String phone) { + return userRepository.findByPhone(phone); + } + + @Override + public List getAllUser() { + return userRepository.findAll(); + } + + @Override + public User updateUserPassword(User user, String newPass) { + existUser(user); + user.update(newPass); + userRepository.save(user); + return user; + } + + @Override + public void deleteUser(User removeUser) { + existUser(removeUser); + userRepository.delete(removeUser); + } + + private void existUser(User user) { + userRepository.findByPhone(user.getPhone()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index ae19746cc..51e29596b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -1,20 +1,15 @@ package com.sprint.mission.discodeit.service.file; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ChannelType; import com.sprint.mission.discodeit.util.FileIOUtil; -import lombok.Setter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 883bddf9e..517b4b9d1 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -1,21 +1,18 @@ package com.sprint.mission.discodeit.service.file; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.FileIOUtil; -import lombok.RequiredArgsConstructor; -import lombok.Setter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @@ -90,7 +87,7 @@ public Message updateMessageContent(Message updateMessage, String newContent) { } @Override - public void removeMessageByWriter(User writer, UUID uuid) { + public void deleteMessageByWriter(User writer, UUID uuid) { if (!messages.containsKey(uuid)) { throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 044ec882e..faf6d13cf 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -1,19 +1,15 @@ package com.sprint.mission.discodeit.service.file; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; -import lombok.Setter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 98f22f99c..057c35232 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -1,15 +1,10 @@ package com.sprint.mission.discodeit.service.jcf; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ChannelType; -import lombok.RequiredArgsConstructor; -import lombok.Setter; import java.util.*; diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index aed4ef0cc..b861f2ef6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -1,15 +1,13 @@ package com.sprint.mission.discodeit.service.jcf; -import com.sprint.mission.discodeit.entity.Channel; -import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; -import lombok.RequiredArgsConstructor; -import lombok.Setter; import java.util.*; import java.util.stream.Collectors; @@ -68,7 +66,7 @@ public Message updateMessageContent(Message findMessage, String newContent) { } @Override - public void removeMessageByWriter(User writer, UUID uuid) { // 작성자가 작성한 메시지 삭제하기 + public void deleteMessageByWriter(User writer, UUID uuid) { // 작성자가 작성한 메시지 삭제하기 if (!messageRepository.containsKey(uuid)) { throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index be5fba2ea..caf4af081 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -1,15 +1,11 @@ package com.sprint.mission.discodeit.service.jcf; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; -import lombok.RequiredArgsConstructor; -import lombok.Setter; import java.util.*; diff --git a/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java index 75a36bdf1..d9b173ea1 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java +++ b/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java @@ -2,4 +2,4 @@ public enum ChannelType { TEXT, VOICE -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index 0c87ec382..ae34c0ba5 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -36,7 +36,7 @@ public static void saveToFile(Map data, Path filePath) { } //.dat 파일을 읽기 쉬운 Json 파일로 변환하는 메서드 - public static void convertDatToJson(Path datFilePath, Path jsonFilePath) { + public static void convertDSerToJson(Path datFilePath, Path jsonFilePath) { Map data = loadFromFile(datFilePath); ObjectMapper objectMapper = new ObjectMapper(); From 2a2b24a9e693c57d6e6eeafc8b3f847735a68108 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 22 Jan 2025 11:21:55 +0900 Subject: [PATCH 032/115] Add repository test code --- build.gradle | 6 +- json/channels.json | 18 +-- json/messages.json | 136 ++---------------- json/users.json | 44 +----- result/channels.ser | Bin 758 -> 635 bytes result/messages.ser | Bin 1979 -> 1141 bytes result/users.ser | Bin 805 -> 469 bytes .../mission/discodeit/JavaApplication.java | 52 +++---- .../factory/FileRepositoryFactory.java | 40 ++++++ ...leFactory.java => FileServiceFactory.java} | 10 +- ...CFFactory.java => JCFFServiceFactory.java} | 10 +- .../factory/JCFRepositoryFactory.java | 43 ++++++ .../discodeit/factory/RepositoryFactory.java | 13 ++ .../{Factory.java => ServiceFactory.java} | 2 +- .../discodeit/service/ChannelService.java | 2 +- .../discodeit/service/MessageService.java | 2 +- .../discodeit/service/UserService.java | 4 +- .../service/basic/BasicChannelService.java | 2 +- .../service/basic/BasicMessageService.java | 2 +- .../service/basic/BasicUserService.java | 4 +- .../service/file/FileChannelService.java | 2 +- .../service/file/FileMessageService.java | 2 +- .../service/file/FileUserService.java | 4 +- .../service/jcf/JCFChannelService.java | 2 +- .../service/jcf/JCFMessageService.java | 2 +- .../discodeit/service/jcf/JCFUserService.java | 4 +- src/test/java/RepositoryTest.java | 74 ++++++++++ 27 files changed, 253 insertions(+), 227 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java rename src/main/java/com/sprint/mission/discodeit/factory/{FileFactory.java => FileServiceFactory.java} (82%) rename src/main/java/com/sprint/mission/discodeit/factory/{JCFFactory.java => JCFFServiceFactory.java} (82%) create mode 100644 src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java create mode 100644 src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java rename src/main/java/com/sprint/mission/discodeit/factory/{Factory.java => ServiceFactory.java} (90%) create mode 100644 src/test/java/RepositoryTest.java diff --git a/build.gradle b/build.gradle index e2408b5eb..7549ad67f 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,11 @@ repositories { } dependencies { - compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.36' + compileOnly 'org.projectlombok:lombok:1.18.28' + annotationProcessor 'org.projectlombok:lombok:1.18.28' + + testCompileOnly 'org.projectlombok:lombok:1.18.28' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3' testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' diff --git a/json/channels.json b/json/channels.json index 9f8ee56ce..7b4282c90 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,18 +1,10 @@ { - "f0f161db-8761-4ead-903e-aad4c4678f3d" : { - "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", - "createdAt" : 1737448411089, + "08ed6ec5-03c4-4228-a20d-446e423f2095" : { + "id" : "08ed6ec5-03c4-4228-a20d-446e423f2095", + "createdAt" : 1737512438623, "updatedAt" : null, - "name" : "코테 준비", - "description" : "코테 준비용 채널입니다.", + "name" : "코드잇 공지 채널", + "description" : "공지 채널입니다", "channelType" : "VOICE" - }, - "5f3b3809-eebb-49c5-8f9f-1d6ee558712b" : { - "id" : "5f3b3809-eebb-49c5-8f9f-1d6ee558712b", - "createdAt" : 1737448411097, - "updatedAt" : null, - "name" : "자바 공부합시다", - "description" : "자바 공부용 채널입니다.", - "channelType" : "TEXT" } } \ No newline at end of file diff --git a/json/messages.json b/json/messages.json index b89cdf429..fd476b0ea 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,133 +1,23 @@ { - "7559c20d-5a2b-47a3-a1fe-27e90760fe59" : { - "id" : "7559c20d-5a2b-47a3-a1fe-27e90760fe59", - "createdAt" : 1737448411105, - "updatedAt" : 1737448411120, - "content" : "메시지 내용 업데이트", - "writer" : { - "id" : "09a11f19-0e42-4509-94c7-64d6f5bdd5f4", - "createdAt" : 1737448411020, - "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, - "channel" : { - "id" : "e6bfb8c6-df59-4b24-9fa9-204b912b679a", - "createdAt" : 1737448411086, - "updatedAt" : 1737448411103, - "name" : "코드잇 디스코드", - "description" : "코드잇 디스코드 채널에 오신 것을 환영합니다.", - "channelType" : "VOICE" - } - }, - "1da40381-6362-478b-a017-3f7786dce855" : { - "id" : "1da40381-6362-478b-a017-3f7786dce855", - "createdAt" : 1737448411094, - "updatedAt" : null, - "content" : "열심히 하겠습니다!!", - "writer" : { - "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", - "createdAt" : 1737448411024, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, - "channel" : { - "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", - "createdAt" : 1737448411089, - "updatedAt" : null, - "name" : "코테 준비", - "description" : "코테 준비용 채널입니다.", - "channelType" : "VOICE" - } - }, - "caedf1c6-057c-4692-8d7b-7bd6448dfff0" : { - "id" : "caedf1c6-057c-4692-8d7b-7bd6448dfff0", - "createdAt" : 1737448411113, - "updatedAt" : null, - "content" : "네 만나서 반갑습니다!", - "writer" : { - "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", - "createdAt" : 1737448411024, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, - "channel" : { - "id" : "e6bfb8c6-df59-4b24-9fa9-204b912b679a", - "createdAt" : 1737448411086, - "updatedAt" : 1737448411103, - "name" : "코드잇 디스코드", - "description" : "코드잇 디스코드 채널에 오신 것을 환영합니다.", - "channelType" : "VOICE" - } - }, - "875e684a-8cfa-40ef-b5ee-e3e5f781c23d" : { - "id" : "875e684a-8cfa-40ef-b5ee-e3e5f781c23d", - "createdAt" : 1737448411091, - "updatedAt" : null, - "content" : "열심히 공부하는 코테 준비 채널입니다!", - "writer" : { - "id" : "db53c2b5-90dd-4f65-a607-3638f05f1d80", - "createdAt" : 1737448411026, - "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", - "password" : "Abcdefgh12312!!" - }, - "channel" : { - "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", - "createdAt" : 1737448411089, - "updatedAt" : null, - "name" : "코테 준비", - "description" : "코테 준비용 채널입니다.", - "channelType" : "VOICE" - } - }, - "ebe5151e-1a7d-4ab8-b469-ef2e5e2963f7" : { - "id" : "ebe5151e-1a7d-4ab8-b469-ef2e5e2963f7", - "createdAt" : 1737448411111, - "updatedAt" : null, - "content" : "테스트 확인 용 메시지입니다!", - "writer" : { - "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", - "createdAt" : 1737448411024, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, - "channel" : { - "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", - "createdAt" : 1737448411089, - "updatedAt" : null, - "name" : "코테 준비", - "description" : "코테 준비용 채널입니다.", - "channelType" : "VOICE" - } - }, - "3928e8a9-8697-4065-b078-9adcaf4ea925" : { - "id" : "3928e8a9-8697-4065-b078-9adcaf4ea925", - "createdAt" : 1737448411107, + "a7ef7951-e0f6-415a-a909-318727c1521f" : { + "id" : "a7ef7951-e0f6-415a-a909-318727c1521f", + "createdAt" : 1737512438625, "updatedAt" : null, - "content" : "저는 요즘 스프링에 대해 공부하고 있습니다^^", + "content" : "안녕하세요", "writer" : { - "id" : "09a11f19-0e42-4509-94c7-64d6f5bdd5f4", - "createdAt" : 1737448411020, + "id" : "791d3e94-7902-41cd-a66d-8e2021dd74b0", + "createdAt" : 1737512438619, "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" + "name" : "woody", + "phone" : "010-9218-1188", + "password" : "Abcdefgh12312!" }, "channel" : { - "id" : "f0f161db-8761-4ead-903e-aad4c4678f3d", - "createdAt" : 1737448411089, + "id" : "08ed6ec5-03c4-4228-a20d-446e423f2095", + "createdAt" : 1737512438623, "updatedAt" : null, - "name" : "코테 준비", - "description" : "코테 준비용 채널입니다.", + "name" : "코드잇 공지 채널", + "description" : "공지 채널입니다", "channelType" : "VOICE" } } diff --git a/json/users.json b/json/users.json index 5ccf784f4..ab3b9ef5f 100644 --- a/json/users.json +++ b/json/users.json @@ -1,42 +1,10 @@ { - "b99b8715-7d50-4e2f-acd6-7ab2e7d75ff4" : { - "id" : "b99b8715-7d50-4e2f-acd6-7ab2e7d75ff4", - "createdAt" : 1737448411096, + "791d3e94-7902-41cd-a66d-8e2021dd74b0" : { + "id" : "791d3e94-7902-41cd-a66d-8e2021dd74b0", + "createdAt" : 1737512438619, "updatedAt" : null, - "name" : "김자바", - "phone" : "010-8739-9343", - "password" : "Abcdefgh!" - }, - "09a11f19-0e42-4509-94c7-64d6f5bdd5f4" : { - "id" : "09a11f19-0e42-4509-94c7-64d6f5bdd5f4", - "createdAt" : 1737448411020, - "updatedAt" : null, - "name" : "이서윤", - "phone" : "010-2222-1111", - "password" : "Abcdefgh12312!!" - }, - "ea066c85-cb7f-43b2-b266-eca3d46bc4de" : { - "id" : "ea066c85-cb7f-43b2-b266-eca3d46bc4de", - "createdAt" : 1737448411024, - "updatedAt" : null, - "name" : "박지훈", - "phone" : "010-3333-1111", - "password" : "Abcdefgh12312!!" - }, - "db53c2b5-90dd-4f65-a607-3638f05f1d80" : { - "id" : "db53c2b5-90dd-4f65-a607-3638f05f1d80", - "createdAt" : 1737448411026, - "updatedAt" : null, - "name" : "이채은", - "phone" : "010-4444-1111", - "password" : "Abcdefgh12312!!" - }, - "b0d79561-1b2c-4cfb-9dc5-0affe9501154" : { - "id" : "b0d79561-1b2c-4cfb-9dc5-0affe9501154", - "createdAt" : 1737448411026, - "updatedAt" : null, - "name" : "정다은", - "phone" : "010-5555-1111", - "password" : "Abcdefgh12312!!" + "name" : "woody", + "phone" : "010-9218-1188", + "password" : "Abcdefgh12312!" } } \ No newline at end of file diff --git a/result/channels.ser b/result/channels.ser index 15c52c057787e9ac89da563e7efb9cc271a28efb..3da84c13fbf8095d516d8c15f403c827c3b30544 100644 GIT binary patch delta 121 zcmeyy`kQ4!03+kXKpTNYye@f8_6k!u-sT-;KH{V?ajv3RN`7u)W}cpNMq*xGY7Wx_ zhPLSRDEp09G8yf<&!3JjVGw(@dFz|y4GM2Iw!Chc@Md1?>+X)%-Af7?>KK?y7{uS~ So$`9}oHz5@6;RX_Q~&@Nt2rA0 delta 245 zcmey(@{M&u03*}HKpTMxcB`%&N$u w1LG8+g*QPK&YSRh!xROpSDUxK-qwK2M&S|$F{nz2!nadbzUiI=bWlMB0O3D(yZ`_I diff --git a/result/messages.ser b/result/messages.ser index 933f42a22b77e497aa1147b3c0b85d9c15d684b0..a8e9f8f527aaa58ce3d39eca9e0e7a77fcd2d76e 100644 GIT binary patch delta 333 zcmdnZ|CM7x03+kXKpTOToQCb{2ZQ97zpo5@@Xax5@&-mlv6TGW#LPTB-_+vb#Prm+ zi+4r#e&)-Vctwv5A~TtTaTbiZf>9Hu-Z>*NFE2HR=>bDqbb6Hi=I4yIjP>2;Psf)q zh`rjp_094Ig*O{pUbjqmGq3e^cgO4QCB=mdbqq|4cwO?G>=mYRyv;kxe8fqkghBkx z-YKsq&v`SiT>(X7K?wu@o2ebITc^IAI^#{tjyJQWfQ=AhU|^gAv?&o}9&MSE95Hlz#BJ+!tgqXT>mI{gB2kV^obKBXkDyj)gRsfykeBz?FxFei!=DH_*5eWa-bG|a-*4%FEQAj_g= zGrtF@kAaL9wQB*=n~~ZC?ESZqkpYf-dZe#&v{|6K398MJ@=B_fa(iF_8M^Rd!>>0( zW79bqhiNMC|9-jWJ19!Tp2hK}X-W(&EK+x%UL}C_He|2>)UJXpR%Em}nulD^@#~)? zl)K<)NnS;T>bk@`H^5}eWmP@nkJ7RZzGYg+-3v*Q8eSs%u5fZ?`0F2^t^<4hl27~4 zln;)9m=4rorYZlV{DMMRQE`bhIz}2TkS3)1HLu4d3Ro#b)=q zg8Vc!ck02-+ljgWZpr0`BY&n9lmv5ds5AhXmGBkA<;RolR0#-bhxK`eY} zDi|_m0DCpCUXQT?Xw};lR-H?vK*$0yl2(xUD6eVo_sr~S-AG(xZb`akEpgH1JA|fU zUAfx_2H^`OCIFjRAYkNdS|?hGTtWOh%khP5V);r6sqlHY^>`gWv2d9X^zK0zu7@ogousZ*5^|ZZ1`GWpdLD zV_|m(ijk4g&@_wB%Uf{(egFe>00nn%Z)ACN01iQ7V`OD!XJ|1pGchtDbN~%7F)%GT NGBG$UF)=teaClduBxnEt delta 446 zcmcc0yp(N103++fKpTNI*Qz!>zaIZ(=j?XT+5kWOiE|Z&Q}aqPODgq3i&Kl1omuK0 ztaP+x;>8Q~?f=f-C}gN(U@l?ce6_RT&AbV(H%tMt9g~t%Qq$5i6iXO*4Gax*EzFHA zbuEoej0=iE%9*AdPr3GW@6|7y3*{yGoLo7?8MHvE{U$u6N#q#rO#z<3)kS zzuqwQ&GLq~vpYZn!cYT^fdJXSW$b1aAL3;jZU-OQI^nK=D%8MwkRF(WCxJLpPzP^p zc{8^G*+df{KsIsiQLg_l0|Y}hT%VdKt>g0>ixa^H%7YACF!go!5;Ox%fq)%iVg&&D C?V+mx diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 01a0cf984..5750f20e3 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -3,15 +3,17 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.factory.Factory; -import com.sprint.mission.discodeit.factory.FileFactory; +import com.sprint.mission.discodeit.factory.*; +import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.basic.BasicChannelService; +import com.sprint.mission.discodeit.service.basic.BasicMessageService; +import com.sprint.mission.discodeit.service.basic.BasicUserService; import com.sprint.mission.discodeit.util.ChannelType; import com.sprint.mission.discodeit.util.FileIOUtil; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -21,7 +23,7 @@ public class JavaApplication { public static void main(String[] args) { /* Factory factory = JCFFactory.getInstance();*/ - Factory factory = FileFactory.getInstance(); + ServiceFactory factory = FileServiceFactory.getInstance(); UserService userService = factory.getUserService(); ChannelService channelService = factory.getChannelService(); MessageService messageService = factory.getMessageService(); @@ -34,27 +36,27 @@ public static void main(String[] args) { System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); } System.out.println("<회원 생성하기>"); - User user1 = userService.createUser("김민준", "010-1111-1111", "Abcdefgh12312!"); - User user2 = userService.createUser("이서윤", "010-2222-1111", "Abcdefgh12312!!"); - User user3 = userService.createUser("박지훈", "010-3333-1111", "Abcdefgh12312!!"); - User user4 = userService.createUser("이채은", "010-4444-1111", "Abcdefgh12312!!"); - User user5 = userService.createUser("정다은", "010-5555-1111", "Abcdefgh12312!!"); + User user1 = userService.create("김민준", "010-1111-1111", "Abcdefgh12312!"); + User user2 = userService.create("이서윤", "010-2222-1111", "Abcdefgh12312!!"); + User user3 = userService.create("박지훈", "010-3333-1111", "Abcdefgh12312!!"); + User user4 = userService.create("이채은", "010-4444-1111", "Abcdefgh12312!!"); + User user5 = userService.create("정다은", "010-5555-1111", "Abcdefgh12312!!"); System.out.println(" - 회원 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 동일한 전화번호로 회원 가입을 진행 : "); try { - User user1_1 = userService.createUser("홍지훈", "010-1111-1111", "Abcdefgh!"); + User user1_1 = userService.create("홍지훈", "010-1111-1111", "Abcdefgh!"); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 2. 올바르지 않은 전화번호 형식 : "); try { - User unCorrectPhone = userService.createUser("김철수", "010-12345-12345", "Abcdefgh!"); + User unCorrectPhone = userService.create("김철수", "010-12345-12345", "Abcdefgh!"); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 3. 올바르지 않은 비밀번호 형식 : "); try { - User unCorrectPass = userService.createUser("김영미", "010-1234-4321", "1234"); + User unCorrectPass = userService.create("김영미", "010-1234-4321", "1234"); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -79,12 +81,12 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<회원 정보 삭제하기>"); - userService.deleteUser(user1); + userService.delete(user1); System.out.println(userService.getAllUser()); System.out.print(" - 회원 삭제 시 저장되어 있지 않는 회원일 경우 문제가 발생 : "); try { User unRegisterUser = new User("김미영", "010-4343-3434", "Rasdffa1234!"); - userService.deleteUser(unRegisterUser); + userService.delete(unRegisterUser); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -94,9 +96,9 @@ public static void main(String[] args) { System.out.println("<채널 생성하기>"); Channel channel1 = channelService.create("코드잇 디스코드", "코드잇용 디스코드 채널입니다.", ChannelType.TEXT); Channel channel2 = channelService.create("코테 준비", "코테 준비용 채널입니다.", ChannelType.VOICE); - messageService.createMessage("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); - messageService.createMessage("열심히 하겠습니다!!", user3, channel2); - User channelCreator = userService.createUser("김자바", "010-8739-9343", "Abcdefgh!"); + messageService.create("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); + messageService.create("열심히 하겠습니다!!", user3, channel2); + User channelCreator = userService.create("김자바", "010-8739-9343", "Abcdefgh!"); Channel javaChannel = channelService.create("자바 공부합시다", "자바 공부용 채널입니다.", ChannelType.TEXT); System.out.println(channel1); System.out.println(channel2); @@ -124,23 +126,23 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 생성하기>"); - Message message2_1 = messageService.createMessage("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, channel1); - Message message2_2 = messageService.createMessage("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, channel2); - Message message3_1 = messageService.createMessage("테스트 확인 용 메시지입니다!", user3, channel2); + Message message2_1 = messageService.create("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, channel1); + Message message2_2 = messageService.create("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, channel2); + Message message3_1 = messageService.create("테스트 확인 용 메시지입니다!", user3, channel2); System.out.println(message2_1); - Message message3 = messageService.createMessage("네 만나서 반갑습니다!", user3, channel1); + Message message3 = messageService.create("네 만나서 반갑습니다!", user3, channel1); System.out.println(message3); System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); System.out.print(" - 1. 내용이 작성되지 않은 메시지 : "); try { - Message message4 = messageService.createMessage("", user4, channel1); + Message message4 = messageService.create("", user4, channel1); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.print(" - 2. 등록되지 않은 회원이 메시지를 보낼 때 : "); User unRegistUser1 = new User("미등록회원", "010-1919-9191", "Abcdefgh!"); try { - Message unregistMessage = messageService.createMessage("안녕하세요 만나서 반갑습니다", unRegistUser1, channel1); + Message unregistMessage = messageService.create("안녕하세요 만나서 반갑습니다", unRegistUser1, channel1); } catch (Exception e) { System.out.println(e.getMessage()); } @@ -172,12 +174,12 @@ public static void main(String[] args) { messageService.deleteMessageByWriter(user2, message2_1.getId()); System.out.println("전체 메시지 조회하기: " + messageService.getMessageByUser(user2)); System.out.println("채널 삭제하기 : "); - channelService.deleteChannel(channel1); + channelService.delete(channel1); System.out.println(channelService.getAllChannel()); System.out.println(); System.out.println("==============================================================================="); System.out.println(); - if (factory instanceof FileFactory) { + if (factory instanceof FileServiceFactory) { FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java new file mode 100644 index 000000000..34d6f9fc4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java @@ -0,0 +1,40 @@ +package com.sprint.mission.discodeit.factory; + +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; + +public class FileRepositoryFactory implements RepositoryFactory { + private static FileRepositoryFactory instance; + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + private final MessageRepository messageRepository; + + private FileRepositoryFactory() { + this.userRepository = new FileUserRepository(); + this.channelRepository = new FileChannelRepository(); + this.messageRepository = new FileMessageRepository(); + } + + public static FileRepositoryFactory getInstance() { + if (instance == null) { + return new FileRepositoryFactory(); + } + return instance; + } + + public UserRepository getUserRepository() { + return userRepository; + } + + public MessageRepository getMessageRepository() { + return messageRepository; + } + + public ChannelRepository getChannelRepository() { + return channelRepository; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/FileServiceFactory.java similarity index 82% rename from src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/FileServiceFactory.java index 78ea0c62a..2d7d8c6a4 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/FileServiceFactory.java @@ -7,21 +7,21 @@ import com.sprint.mission.discodeit.service.file.FileMessageService; import com.sprint.mission.discodeit.service.file.FileUserService; -public class FileFactory implements Factory{ - private static FileFactory instance; +public class FileServiceFactory implements ServiceFactory{ + private static FileServiceFactory instance; private final UserService userService; private final MessageService messageService; private final ChannelService channelService; - private FileFactory() { + private FileServiceFactory() { this.userService = new FileUserService(); this.channelService = new FileChannelService(); this.messageService = new FileMessageService(userService, channelService); } - public static FileFactory getInstance() { + public static FileServiceFactory getInstance() { if (instance == null) { - instance = new FileFactory(); + instance = new FileServiceFactory(); } return instance; } diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFFServiceFactory.java similarity index 82% rename from src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/JCFFServiceFactory.java index e42312129..1f34b8364 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFFServiceFactory.java @@ -9,21 +9,21 @@ import java.util.HashMap; -public class JCFFactory implements Factory{ - private static JCFFactory instance; +public class JCFFServiceFactory implements ServiceFactory{ + private static JCFFServiceFactory instance; private final JCFUserService userService; private final JCFMessageService messageService; private final JCFChannelService channelService; - private JCFFactory() { + private JCFFServiceFactory() { this.userService = new JCFUserService(); this.channelService = new JCFChannelService(); this.messageService = new JCFMessageService(userService, channelService); } - public static JCFFactory getInstance() { + public static JCFFServiceFactory getInstance() { if (instance == null) { - instance = new JCFFactory(); + instance = new JCFFServiceFactory(); } return instance; } diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java new file mode 100644 index 000000000..88709e99e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java @@ -0,0 +1,43 @@ +package com.sprint.mission.discodeit.factory; + +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.file.FileChannelRepository; +import com.sprint.mission.discodeit.repository.file.FileMessageRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; +import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; + +public class JCFRepositoryFactory implements RepositoryFactory { + private static JCFRepositoryFactory instance; + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + private final MessageRepository messageRepository; + + private JCFRepositoryFactory() { + this.userRepository = new JCFUserRepository(); + this.channelRepository = new JCFChannelRepository(); + this.messageRepository = new JCFMessageRepository(); + } + + public static JCFRepositoryFactory getInstance() { + if (instance == null) { + return new JCFRepositoryFactory(); + } + return instance; + } + + public UserRepository getUserRepository() { + return userRepository; + } + + public MessageRepository getMessageRepository() { + return messageRepository; + } + + public ChannelRepository getChannelRepository() { + return channelRepository; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java new file mode 100644 index 000000000..c5d1027ba --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.factory; + +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; + +public interface RepositoryFactory { + UserRepository getUserRepository(); + + MessageRepository getMessageRepository(); + + ChannelRepository getChannelRepository(); +} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/Factory.java b/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java similarity index 90% rename from src/main/java/com/sprint/mission/discodeit/factory/Factory.java rename to src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java index 9f082f6b7..8456e01e3 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/Factory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java @@ -4,7 +4,7 @@ import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; -public interface Factory { +public interface ServiceFactory { UserService getUserService(); MessageService getMessageService(); ChannelService getChannelService(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 01d0eb031..46b98aa9c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -17,5 +17,5 @@ public interface ChannelService { Channel updateDescription(Channel channel, String description); - void deleteChannel(Channel removeChannel); + void delete(Channel removeChannel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index d7558ad9e..8d4b0d5df 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -8,7 +8,7 @@ import java.util.UUID; public interface MessageService { - Message createMessage(String content, User writer, Channel channel); + Message create(String content, User writer, Channel channel); List getMessageByUser(User writer); diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index c59b973ce..4299f38b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -6,7 +6,7 @@ import java.util.Optional; public interface UserService { - User createUser(String name, String phone, String password); + User create(String name, String phone, String password); Optional getUserByPhone(String phone); @@ -14,5 +14,5 @@ public interface UserService { User updateUserPassword(User user, String newPass); - void deleteUser(User removeUser); + void delete(User removeUser); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index db924795a..28437c2f8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -53,7 +53,7 @@ public Channel updateDescription(Channel channel, String description) { } @Override - public void deleteChannel(Channel removeChannel) { + public void delete(Channel removeChannel) { existChannel(removeChannel); channelRepository.delete(removeChannel); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 6ae3c2bfd..294a92772 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -25,7 +25,7 @@ public BasicMessageService(MessageRepository messageRepository, UserRepository u } @Override - public Message createMessage(String content, User writer, Channel channel) { + public Message create(String content, User writer, Channel channel) { if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 4967dfe53..257a8524e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -20,7 +20,7 @@ public BasicUserService(UserRepository userRepository) { } @Override - public User createUser(String name, String phone, String password) { + public User create(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } @@ -56,7 +56,7 @@ public User updateUserPassword(User user, String newPass) { } @Override - public void deleteUser(User removeUser) { + public void delete(User removeUser) { existUser(removeUser); userRepository.delete(removeUser); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java index 51e29596b..708279b47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java @@ -79,7 +79,7 @@ public Channel updateDescription(Channel channel, String description) { @Override - public void deleteChannel(Channel channel) { + public void delete(Channel channel) { validateChannel(channel); channels.remove(channel.getId()); saveToFile(channels, filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 517b4b9d1..c8283616d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -37,7 +37,7 @@ public FileMessageService(UserService userService, ChannelService channelService } @Override - public Message createMessage(String content, User writer, Channel channel) { + public Message create(String content, User writer, Channel channel) { if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index faf6d13cf..d9e2497ca 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -31,7 +31,7 @@ public FileUserService() { } @Override - public User createUser(String name, String phone, String password) { + public User create(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } @@ -77,7 +77,7 @@ public User updateUserPassword(User updateUser, String newPass) { } @Override - public void deleteUser(User removeUser) { + public void delete(User removeUser) { if (!userExists(removeUser.getPhone())) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index 057c35232..fbea53de3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -60,7 +60,7 @@ public Channel updateDescription(Channel channel, String description) { } @Override - public void deleteChannel(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. + public void delete(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. validateChannel(channel); channelRepository.remove(channel.getId()); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index b861f2ef6..0b5dd9341 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -24,7 +24,7 @@ public JCFMessageService(UserService userService, ChannelService channelService) } @Override - public Message createMessage(String content, User writer, Channel channel) throws IllegalArgumentException { + public Message create(String content, User writer, Channel channel) throws IllegalArgumentException { if (content.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index caf4af081..97c007660 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -17,7 +17,7 @@ public JCFUserService() { } @Override - public User createUser(String name, String phone, String password) { + public User create(String name, String phone, String password) { if (!ValidPass.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } @@ -58,7 +58,7 @@ public User updateUserPassword(User updateUser, String newPass) { } @Override - public void deleteUser(User removeUser) { // 유저 정보 삭제 시 유저가 속해있던 채널에 해당 유저가 삭제되어야 한다. + public void delete(User removeUser) { // 유저 정보 삭제 시 유저가 속해있던 채널에 해당 유저가 삭제되어야 한다. if (!userExists(removeUser.getPhone())) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } diff --git a/src/test/java/RepositoryTest.java b/src/test/java/RepositoryTest.java new file mode 100644 index 000000000..ed05e9052 --- /dev/null +++ b/src/test/java/RepositoryTest.java @@ -0,0 +1,74 @@ +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.factory.FileRepositoryFactory; +import com.sprint.mission.discodeit.factory.FileServiceFactory; +import com.sprint.mission.discodeit.factory.JCFRepositoryFactory; +import com.sprint.mission.discodeit.factory.RepositoryFactory; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.basic.BasicChannelService; +import com.sprint.mission.discodeit.service.basic.BasicMessageService; +import com.sprint.mission.discodeit.service.basic.BasicUserService; +import com.sprint.mission.discodeit.util.ChannelType; +import com.sprint.mission.discodeit.util.FileIOUtil; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class RepositoryTest { + RepositoryFactory factory = FileRepositoryFactory.getInstance(); + UserService userService = new BasicUserService(factory.getUserRepository()); + ChannelService channelService = new BasicChannelService(factory.getChannelRepository()); + MessageService messageService = new BasicMessageService(factory.getMessageRepository(), factory.getUserRepository(), factory.getChannelRepository()); + + @BeforeEach + void before() { + try { + Files.deleteIfExists(Paths.get("./result/users.ser")); + Files.deleteIfExists(Paths.get("./result/messages.ser")); + Files.deleteIfExists(Paths.get("./result/channels.ser")); + } catch (IOException e) { + System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); + } + } + + @AfterEach + void after() { + if (factory instanceof FileRepositoryFactory) { + FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); + } + } + + @Test + @DisplayName("메시지 생성 확인") + void createMessage() { + User user = setupUser(userService); + Channel channel = setupChannel(channelService); + messageCreateTest(messageService, channel, user); + } + + + User setupUser(UserService userService) { + User user = userService.create("woody", "010-9218-1188", "Abcdefgh12312!"); + return user; + } + + Channel setupChannel(ChannelService channelService) { + Channel channel = channelService.create("코드잇 공지 채널", "공지 채널입니다", ChannelType.VOICE); + return channel; + } + + void messageCreateTest(MessageService messageService, Channel channel, User writer) { + Message message = messageService.create("안녕하세요", writer, channel); + System.out.println("메시지 생성 : " + message); + } +} From fc2cfecfaa51629d6e9ab87aae586ff7ac04d6b6 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 22 Jan 2025 11:38:00 +0900 Subject: [PATCH 033/115] Complete repository test code --- json/channels.json | 6 ++--- json/messages.json | 25 +------------------- json/users.json | 6 ++--- result/channels.ser | Bin 635 -> 635 bytes result/messages.ser | Bin 1141 -> 82 bytes result/users.ser | Bin 469 -> 469 bytes src/test/java/RepositoryTest.java | 37 ++++++++++++++++++++++++++++-- 7 files changed, 42 insertions(+), 32 deletions(-) diff --git a/json/channels.json b/json/channels.json index 7b4282c90..770de2dcc 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,7 +1,7 @@ { - "08ed6ec5-03c4-4228-a20d-446e423f2095" : { - "id" : "08ed6ec5-03c4-4228-a20d-446e423f2095", - "createdAt" : 1737512438623, + "6375db4a-3f21-4a50-98cf-da0bd032a6fc" : { + "id" : "6375db4a-3f21-4a50-98cf-da0bd032a6fc", + "createdAt" : 1737513449281, "updatedAt" : null, "name" : "코드잇 공지 채널", "description" : "공지 채널입니다", diff --git a/json/messages.json b/json/messages.json index fd476b0ea..6f31cf5a2 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,24 +1 @@ -{ - "a7ef7951-e0f6-415a-a909-318727c1521f" : { - "id" : "a7ef7951-e0f6-415a-a909-318727c1521f", - "createdAt" : 1737512438625, - "updatedAt" : null, - "content" : "안녕하세요", - "writer" : { - "id" : "791d3e94-7902-41cd-a66d-8e2021dd74b0", - "createdAt" : 1737512438619, - "updatedAt" : null, - "name" : "woody", - "phone" : "010-9218-1188", - "password" : "Abcdefgh12312!" - }, - "channel" : { - "id" : "08ed6ec5-03c4-4228-a20d-446e423f2095", - "createdAt" : 1737512438623, - "updatedAt" : null, - "name" : "코드잇 공지 채널", - "description" : "공지 채널입니다", - "channelType" : "VOICE" - } - } -} \ No newline at end of file +{ } \ No newline at end of file diff --git a/json/users.json b/json/users.json index ab3b9ef5f..ac07d5434 100644 --- a/json/users.json +++ b/json/users.json @@ -1,7 +1,7 @@ { - "791d3e94-7902-41cd-a66d-8e2021dd74b0" : { - "id" : "791d3e94-7902-41cd-a66d-8e2021dd74b0", - "createdAt" : 1737512438619, + "4d5426a4-464e-4cfb-aae1-6c2c0f171aec" : { + "id" : "4d5426a4-464e-4cfb-aae1-6c2c0f171aec", + "createdAt" : 1737513449278, "updatedAt" : null, "name" : "woody", "phone" : "010-9218-1188", diff --git a/result/channels.ser b/result/channels.ser index 3da84c13fbf8095d516d8c15f403c827c3b30544..e52259993394baaa091eee033770fde67c408a01 100644 GIT binary patch delta 35 tcmV+;0Nnrk1p5S#jS!g6+6&M!ru<`d+e$wnN>H(#p#cNmH$js@0y;Ej4{ZPd delta 35 rcmey(@|$HsufQT+mpmtXg{d5G^Nunfanjg0cOfJ5`P1=}9hs~E1e^{S diff --git a/result/messages.ser b/result/messages.ser index a8e9f8f527aaa58ce3d39eca9e0e7a77fcd2d76e..496eab0e4aaf72fb4a7a365fdfb2959c0977536c 100644 GIT binary patch delta 8 Pcmey$5i}uyiJ<}j4q^hT literal 1141 zcma)4O=uHA6n@>9CN*uXJ=9Y%#e+r3Zc{Inf;IiamQ>MN!SB4kO9yt@o%i1N-uJ$5xdeV< z!|sb{0*NWACBjfrX|m5kMO6!@u4 z2id!UJyi^>ejRLNWT5xOE#I#NeOeMg7=+p+MuZM)iEfROK?vz)3jC%+RxZ1!#XINx=1WrGpML*glMKADjJbZ1#47POdV;4ID`p730%7O{Or{q^{N2X zaR|sNG7Oxg5Q#Gksf;0c7*Yj8Dq~1J<@8QoX&Mw8ltN>iGm(8rjB( zVkO2B8a5=vO*brPO68vKQ{pS&WhqN3mtBHM2*jZ}ZEF>dg)*u>nU5K=IaZOx)g6@JCm&gk>6U>tTBNXOpo zU*t2^qz#cRm36JSp*?pQKaBvHKMv!%hYIIStmKO~?>LLI;Z22XzFkgXt~gyN z6&9SSXU^@s3&DuFoe;ie zrkmeVP2<0EZJKbbO! messages = messageService.getMessageByUser(user); + System.out.println("메시지 찾기: " + messages); + } + + @Test + @DisplayName("채널 이름으로 메시지 찾기") + void findMessageByChannel() { + User user = setupUser(userService); + Channel channel = setupChannel(channelService); + messageCreateTest(messageService, channel, user); + List messages = messageService.getMessageByChannel(channel); + System.out.println("메시지 찾기: " + messages); + } + @Test + @DisplayName("메시지 삭제하기") + void deleteMessage() { + User user = setupUser(userService); + Channel channel = setupChannel(channelService); + Message createMessage = messageCreateTest(messageService, channel, user); + messageService.deleteMessageByWriter(user, createMessage.getId()); + List messages = messageService.getMessageByChannel(channel); + System.out.println("메시지 찾기: " + messages); + } User setupUser(UserService userService) { User user = userService.create("woody", "010-9218-1188", "Abcdefgh12312!"); @@ -67,8 +98,10 @@ Channel setupChannel(ChannelService channelService) { return channel; } - void messageCreateTest(MessageService messageService, Channel channel, User writer) { + Message messageCreateTest(MessageService messageService, Channel channel, User writer) { Message message = messageService.create("안녕하세요", writer, channel); System.out.println("메시지 생성 : " + message); + return message; } + } From 427d233b6ad92f03480027a8c5566143c7240c58 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 22 Jan 2025 11:47:16 +0900 Subject: [PATCH 034/115] Refactor --- .../mission/discodeit/service/ChannelService.java | 1 + .../mission/discodeit/service/MessageService.java | 2 +- .../service/basic/BasicMessageService.java | 9 +++++---- .../service/file/FileMessageService.java | 15 ++++++++------- .../discodeit/service/file/FileUserService.java | 2 ++ 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 46b98aa9c..71b047a5c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; +import java.util.UUID; public interface ChannelService { Channel create(String name, String description, ChannelType channelType); diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 8d4b0d5df..f79b63397 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -18,5 +18,5 @@ public interface MessageService { void deleteMessageByWriter(User writer, UUID uuid); - void deleteMessageByChannel(Channel channel); + void deleteMessageByChannel(Channel channel, UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 294a92772..0df5cd21b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -65,14 +65,15 @@ public void deleteMessageByWriter(User writer, UUID uuid) { existUser(writer); Message removeMessage = messageRepository.findById(uuid) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - if (!removeMessage.getWriter().getPhone().equals(writer.getPhone())) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } messageRepository.delete(removeMessage); } @Override - public void deleteMessageByChannel(Channel channel) { + public void deleteMessageByChannel(Channel channel, UUID uuid) { + existChannel(channel); + Message removeMessage = messageRepository.findById(uuid) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + messageRepository.delete(removeMessage); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index c8283616d..9e8ef890f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -88,20 +88,21 @@ public Message updateMessageContent(Message updateMessage, String newContent) { @Override public void deleteMessageByWriter(User writer, UUID uuid) { + validateUser(writer); if (!messages.containsKey(uuid)) { throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } - Message findMessage = messages.get(uuid); - validateUser(writer); messages.remove(uuid); + FileIOUtil.saveToFile(messages, filePath); } @Override - public void deleteMessageByChannel(Channel channel) { - getMessageByChannel(channel).stream() - .map(Message::getId) - .forEach(messages::remove); - + public void deleteMessageByChannel(Channel channel, UUID id) { + validateChannel(channel); + if (!messages.containsKey(id)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + } + messages.remove(id); FileIOUtil.saveToFile(messages, filePath); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index d9e2497ca..4b3cde1ec 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.FileIOUtil; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; @@ -82,6 +83,7 @@ public void delete(User removeUser) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } users.remove(removeUser.getId()); + saveToFile(users, filePath); } private boolean userExists(String phone) { From 2ccdd066399ad04bd4c48da9702568d09203dc90 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 23 Jan 2025 13:04:32 +0900 Subject: [PATCH 035/115] Complete test code --- json/channels.json | 6 +++--- json/users.json | 6 +++--- result/channels.ser | Bin 635 -> 0 bytes result/messages.ser | Bin 82 -> 0 bytes result/users.ser | Bin 469 -> 0 bytes .../factory/JCFRepositoryFactory.java | 3 --- ...iceFactory.java => JCFServiceFactory.java} | 18 ++++++++---------- .../service/basic/BasicMessageService.java | 2 +- .../service/basic/BasicUserService.java | 2 +- .../service/jcf/JCFMessageService.java | 2 +- src/test/java/RepositoryTest.java | 3 +-- 11 files changed, 18 insertions(+), 24 deletions(-) delete mode 100644 result/channels.ser delete mode 100644 result/messages.ser delete mode 100644 result/users.ser rename src/main/java/com/sprint/mission/discodeit/factory/{JCFFServiceFactory.java => JCFServiceFactory.java} (69%) diff --git a/json/channels.json b/json/channels.json index 770de2dcc..3ac394b1a 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,7 +1,7 @@ { - "6375db4a-3f21-4a50-98cf-da0bd032a6fc" : { - "id" : "6375db4a-3f21-4a50-98cf-da0bd032a6fc", - "createdAt" : 1737513449281, + "29b7f628-3d50-40ae-8fe3-4789f0886a00" : { + "id" : "29b7f628-3d50-40ae-8fe3-4789f0886a00", + "createdAt" : 1737599247292, "updatedAt" : null, "name" : "코드잇 공지 채널", "description" : "공지 채널입니다", diff --git a/json/users.json b/json/users.json index ac07d5434..7a0500acc 100644 --- a/json/users.json +++ b/json/users.json @@ -1,7 +1,7 @@ { - "4d5426a4-464e-4cfb-aae1-6c2c0f171aec" : { - "id" : "4d5426a4-464e-4cfb-aae1-6c2c0f171aec", - "createdAt" : 1737513449278, + "3ffc9ea9-8c3c-4414-9ccd-d4f19153fe69" : { + "id" : "3ffc9ea9-8c3c-4414-9ccd-d4f19153fe69", + "createdAt" : 1737599247288, "updatedAt" : null, "name" : "woody", "phone" : "010-9218-1188", diff --git a/result/channels.ser b/result/channels.ser deleted file mode 100644 index e52259993394baaa091eee033770fde67c408a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmaKpJ!lj`6vtooyu`Rc&J?i{B9`I~*jQMcF(%}e^#fuov~k=S?nZWJ#+}(@(}WcH zf-MYqLIg=A+N2S&(?Vl- z$wS!OT`rU7bVqz0>eQS z2OV%wpM$J%bU?8WE(b6iCKPK*CbWh|U>%_d^EL_uZ=1ABs0tG%wP{Gh=n=uJHqBaz z!$|*WS-=j%#E)?t(?_rbL#9e9Nma!L1~a*oz=i)>E_ZaKRXcurMgg+FqqmKEQ#_5U zRF#w(>UVCoCa3xvDrKdg{QKso$LIDO81SJ!kE4_tR-;^FDY}uy4`{Ns^Yo0{-On9U zN}5%7^Sw(G8peLSd0V_%9xq<6^j0>D?bTks(aT?0Lp2Sji}&5$ljp_u`uIOOnf(E4 CNZvpI diff --git a/result/messages.ser b/result/messages.ser deleted file mode 100644 index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 fJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-fS45kZuA$C diff --git a/result/users.ser b/result/users.ser deleted file mode 100644 index 348a64be5356614e573afa5968c8bd0cb4df0388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmYjNF)su`6n^%sa~zI>M4}LhDA>C_g%b%*N1+AzAkyS*f(Vcykf^JogUL8fZmG zx&%qJM#~FS$s%-mtl0(p>eU_Z85n$DSs%SDtXf|o*O<*bLvlfVWq4Fd%6tP;X){cy zGBEQH^^KAw;xTEXYW(O_gEk8iwjf9moL34`R&-9dhK~?HX@BF(5sB$Jq6wQO&gP~ avSVf^&Frv(u8f(Pn9iEH3DeBwc<>F@d6rB7 diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java index 88709e99e..885e66319 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java @@ -3,9 +3,6 @@ import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFFServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/JCFServiceFactory.java similarity index 69% rename from src/main/java/com/sprint/mission/discodeit/factory/JCFFServiceFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/JCFServiceFactory.java index 1f34b8364..903910e3b 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFFServiceFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/JCFServiceFactory.java @@ -7,23 +7,21 @@ import com.sprint.mission.discodeit.service.jcf.JCFMessageService; import com.sprint.mission.discodeit.service.jcf.JCFUserService; -import java.util.HashMap; +public class JCFServiceFactory implements ServiceFactory{ + private static JCFServiceFactory instance; + private final UserService userService; + private final MessageService messageService; + private final ChannelService channelService; -public class JCFFServiceFactory implements ServiceFactory{ - private static JCFFServiceFactory instance; - private final JCFUserService userService; - private final JCFMessageService messageService; - private final JCFChannelService channelService; - - private JCFFServiceFactory() { + private JCFServiceFactory() { this.userService = new JCFUserService(); this.channelService = new JCFChannelService(); this.messageService = new JCFMessageService(userService, channelService); } - public static JCFFServiceFactory getInstance() { + public static JCFServiceFactory getInstance() { if (instance == null) { - instance = new JCFFServiceFactory(); + instance = new JCFServiceFactory(); } return instance; } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 0df5cd21b..a0d15b4b7 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -86,4 +86,4 @@ private void existChannel(Channel channel) { channelRepository.findByName(channel.getName()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 257a8524e..2387e664e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -7,7 +7,7 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.util.ValidPass; import com.sprint.mission.discodeit.util.ValidPhone; -import lombok.RequiredArgsConstructor; + import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index 0b5dd9341..c1aa753ae 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -77,7 +77,7 @@ public void deleteMessageByWriter(User writer, UUID uuid) { // 작성자가 작 @Override - public void deleteMessageByChannel(Channel channel) { + public void deleteMessageByChannel(Channel channel, UUID uuid) { getMessageByChannel(channel).stream() .map(Message::getId) .forEach(messageRepository::remove); diff --git a/src/test/java/RepositoryTest.java b/src/test/java/RepositoryTest.java index f8da55088..fc3a50c6c 100644 --- a/src/test/java/RepositoryTest.java +++ b/src/test/java/RepositoryTest.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.factory.FileRepositoryFactory; -import com.sprint.mission.discodeit.factory.FileServiceFactory; import com.sprint.mission.discodeit.factory.JCFRepositoryFactory; import com.sprint.mission.discodeit.factory.RepositoryFactory; import com.sprint.mission.discodeit.service.ChannelService; @@ -24,7 +23,7 @@ import java.util.List; public class RepositoryTest { - RepositoryFactory factory = FileRepositoryFactory.getInstance(); + RepositoryFactory factory = JCFRepositoryFactory.getInstance(); UserService userService = new BasicUserService(factory.getUserRepository()); ChannelService channelService = new BasicChannelService(factory.getChannelRepository()); MessageService messageService = new BasicMessageService(factory.getMessageRepository(), factory.getUserRepository(), factory.getChannelRepository()); From dac53b78d7d9c20b565650cf2cdae033709eec8e Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 23 Jan 2025 15:21:26 +0900 Subject: [PATCH 036/115] Update Validphone and password --- .../java/com/sprint/mission/discodeit/domain/User.java | 5 +++++ .../discodeit/service/basic/BasicUserService.java | 6 ++---- .../mission/discodeit/service/file/FileUserService.java | 3 --- .../mission/discodeit/service/jcf/JCFUserService.java | 2 -- .../com/sprint/mission/discodeit/util/ValidPass.java | 9 --------- .../com/sprint/mission/discodeit/util/ValidPhone.java | 8 -------- 6 files changed, 7 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/ValidPass.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index c645c195f..8a33e22e5 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -39,6 +39,11 @@ public static boolean isValidPassword(String password) { return password.matches(passwordRegex); } + public static boolean isValidPhone(String phoneNumber) { + String phoneRegex = "^010-\\d{4}-\\d{4}$"; + return phoneNumber.matches(phoneRegex); + } + @Override public boolean equals(Object object) { if (object == null || getClass() != object.getClass()) return false; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 2387e664e..f38a1b39a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -5,8 +5,6 @@ import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.ValidPass; -import com.sprint.mission.discodeit.util.ValidPhone; import java.util.List; @@ -21,11 +19,11 @@ public BasicUserService(UserRepository userRepository) { @Override public User create(String name, String phone, String password) { - if (!ValidPass.isValidPassword(password)) { + if (!User.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } - if (!ValidPhone.isValidPhone(phone)) { + if (!User.isValidPhone(phone)) { throw new ServiceException(ErrorCode.INVALID_WRITER); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 4b3cde1ec..532d18504 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -4,9 +4,6 @@ import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.FileIOUtil; -import com.sprint.mission.discodeit.util.ValidPass; -import com.sprint.mission.discodeit.util.ValidPhone; import java.io.IOException; import java.nio.file.Files; diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 97c007660..4b777112c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -4,8 +4,6 @@ import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.ValidPass; -import com.sprint.mission.discodeit.util.ValidPhone; import java.util.*; diff --git a/src/main/java/com/sprint/mission/discodeit/util/ValidPass.java b/src/main/java/com/sprint/mission/discodeit/util/ValidPass.java deleted file mode 100644 index f534a096e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/ValidPass.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sprint.mission.discodeit.util; - -public class ValidPass { - //8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 한다 - public static boolean isValidPassword(String password) { - String passwordRegex = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$"; - return password.matches(passwordRegex); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java b/src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java deleted file mode 100644 index 3c2f76d82..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/ValidPhone.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sprint.mission.discodeit.util; - -public class ValidPhone { - public static boolean isValidPhone(String phoneNumber) { - String phoneRegex = "^010-\\d{4}-\\d{4}$"; - return phoneNumber.matches(phoneRegex); - } -} From 21b28c982d68d15403c22f7bbb8f2553acb29795 Mon Sep 17 00:00:00 2001 From: junwoo Date: Sat, 25 Jan 2025 10:00:00 +0900 Subject: [PATCH 037/115] Refactor --- build.gradle | 6 +++++ json/channels.json | 6 ++--- json/messages.json | 25 +++++++++++++++++- json/users.json | 6 ++--- result/channels.ser | Bin 0 -> 635 bytes result/messages.ser | Bin 0 -> 1141 bytes result/users.ser | Bin 0 -> 469 bytes .../mission/discodeit/JavaApplication.java | 7 ++--- .../FileRepositoryFactory.java | 2 +- .../JCFRepositoryFactory.java | 2 +- .../{ => repository}/RepositoryFactory.java | 2 +- .../{ => service}/FileServiceFactory.java | 4 +-- .../{ => service}/JCFServiceFactory.java | 4 +-- .../factory/{ => service}/ServiceFactory.java | 2 +- .../service/file/FileUserService.java | 4 +-- .../service/jcf/JCFChannelService.java | 2 +- .../service/jcf/JCFMessageService.java | 4 +-- .../discodeit/service/jcf/JCFUserService.java | 4 +-- src/test/java/RepositoryTest.java | 8 +++--- 19 files changed, 57 insertions(+), 31 deletions(-) create mode 100644 result/channels.ser create mode 100644 result/messages.ser create mode 100644 result/users.ser rename src/main/java/com/sprint/mission/discodeit/factory/{ => repository}/FileRepositoryFactory.java (96%) rename src/main/java/com/sprint/mission/discodeit/factory/{ => repository}/JCFRepositoryFactory.java (95%) rename src/main/java/com/sprint/mission/discodeit/factory/{ => repository}/RepositoryFactory.java (86%) rename src/main/java/com/sprint/mission/discodeit/factory/{ => service}/FileServiceFactory.java (91%) rename src/main/java/com/sprint/mission/discodeit/factory/{ => service}/JCFServiceFactory.java (91%) rename src/main/java/com/sprint/mission/discodeit/factory/{ => service}/ServiceFactory.java (85%) diff --git a/build.gradle b/build.gradle index 7549ad67f..65021f013 100644 --- a/build.gradle +++ b/build.gradle @@ -21,6 +21,12 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter' } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + test { useJUnitPlatform() } \ No newline at end of file diff --git a/json/channels.json b/json/channels.json index 3ac394b1a..4bf0e4256 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,7 +1,7 @@ { - "29b7f628-3d50-40ae-8fe3-4789f0886a00" : { - "id" : "29b7f628-3d50-40ae-8fe3-4789f0886a00", - "createdAt" : 1737599247292, + "e8671ec5-5555-4c80-835c-642788d4be12" : { + "id" : "e8671ec5-5555-4c80-835c-642788d4be12", + "createdAt" : 1737766782118, "updatedAt" : null, "name" : "코드잇 공지 채널", "description" : "공지 채널입니다", diff --git a/json/messages.json b/json/messages.json index 6f31cf5a2..7764fad3a 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1 +1,24 @@ -{ } \ No newline at end of file +{ + "1d6cf41e-e4ed-42fb-84f4-4f80739b6182" : { + "id" : "1d6cf41e-e4ed-42fb-84f4-4f80739b6182", + "createdAt" : 1737766782119, + "updatedAt" : null, + "content" : "안녕하세요", + "writer" : { + "id" : "89f18c5c-e7bf-47b3-8399-bdda8f3ecc8f", + "createdAt" : 1737766782116, + "updatedAt" : null, + "name" : "woody", + "phone" : "010-9218-1188", + "password" : "Abcdefgh12312!" + }, + "channel" : { + "id" : "e8671ec5-5555-4c80-835c-642788d4be12", + "createdAt" : 1737766782118, + "updatedAt" : null, + "name" : "코드잇 공지 채널", + "description" : "공지 채널입니다", + "channelType" : "VOICE" + } + } +} \ No newline at end of file diff --git a/json/users.json b/json/users.json index 7a0500acc..4028b86f3 100644 --- a/json/users.json +++ b/json/users.json @@ -1,7 +1,7 @@ { - "3ffc9ea9-8c3c-4414-9ccd-d4f19153fe69" : { - "id" : "3ffc9ea9-8c3c-4414-9ccd-d4f19153fe69", - "createdAt" : 1737599247288, + "89f18c5c-e7bf-47b3-8399-bdda8f3ecc8f" : { + "id" : "89f18c5c-e7bf-47b3-8399-bdda8f3ecc8f", + "createdAt" : 1737766782116, "updatedAt" : null, "name" : "woody", "phone" : "010-9218-1188", diff --git a/result/channels.ser b/result/channels.ser new file mode 100644 index 0000000000000000000000000000000000000000..5d82238a8f6e94e60edd99a1d16c353102ee2a1c GIT binary patch literal 635 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05K!bFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#Im$E2utT-hh|B3FSp%sf5kjKsXW)EuS<3~kZrQT9v>Y(5O!$q>Pi%7WAq z27Mo(IrF|82=nw|E-yMFghqkhoaaS*Di*TscC6z9&CfkL(iSp?8N+Q-dlIQh}3Gv z77FcxT6ih);w2=A(juyxhk{OC^dJ=N>>&~gy7b=cx@wg8V1}9Zec$iH1Ja% zEn)9U_7pI%icPR!u=C8qRN>D_eMAyK=z?+$BSL#srB$V*3%t6S|BG4i^`2q!5Z$WL z)@#=?t-l%8@sO#D#IjX`in>aOY8s-fl8`B5m5Q>dBh?VQF(F97na3|L-~Uk&7N95q z#i1}V46IS`1sH~u#gK9sQXWIfVn}V-^d??u8WbCpLREk>ku+o|QZHpQC@fqWvN57q zZea`oX?9oQ&8_6(poJ+&JGXUb&!O;wZOn5NyfP*sTeT=tgsB}ELPYP!_UK%y#+zJC2&|RG9G#s0_5LY^>TmPUo!Q|!=UF@* zpKxYI(uuKj;tAmth1-4dk+ILOtG+6=AA-TaFogroVlw^Uku!6rZd)OnZ=aJIOOK>7 zsYxgP!kJFG5R91HX_n&^a-EOvxS*W%xh+1nSD!CiIrz#IdDEU8i23Z_ij-K0kf>?9 zYBAkBR@gNDE7!IOHz-dnE{~sD8o&GfUf-8DXXn}8qoyejQmAO@56Sqt681No@HZTy Uu(#e{?>pJxZ}j>7jg4094^+dDGXMYp literal 0 HcmV?d00001 diff --git a/result/users.ser b/result/users.ser new file mode 100644 index 0000000000000000000000000000000000000000..1a3beb136d58fe56fa287b08ac31817b2107bf00 GIT binary patch literal 469 zcmYjNJuC!46n^$Bcm8q|5`{uE8hiFMClZ|aJxe3kDU6+QJF>eoX6D>#G(sXIryxPC z)F}}WN(HTkLZVWrDD56OUh-b@zP$H+?|o3Q1=calQWO=C*zD zF$UTMG`I}m31llKrXismL8QZ69Pr^0h@zMO&eQc~s{m`a;r zLY0A;hp2DlB@qwf?K2I}9TytZS&*;=L5kq4QjoNwb5bty3n`2Fg+U86imQ0^b1FJB z#A|)z5e04kHs)0*9qq(9lCs1EUWE;)w?O9(^T}_MD02Lx7Xf;}t1d*cMn!h_b^pHH z{j5Pv4)itT7D*r=S+S}zG*|SNh}b?m>}))E+0_679@=?u@^yC_k;WA0CC2c&f|l%( djmdJsG1L8Kx=TTGpV`+tkTx^DrkTm`;2R)vnx+5% literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index 5750f20e3..b90dd7a4b 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -3,14 +3,11 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.factory.*; -import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.factory.service.FileServiceFactory; +import com.sprint.mission.discodeit.factory.service.ServiceFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.basic.BasicChannelService; -import com.sprint.mission.discodeit.service.basic.BasicMessageService; -import com.sprint.mission.discodeit.service.basic.BasicUserService; import com.sprint.mission.discodeit.util.ChannelType; import com.sprint.mission.discodeit.util.FileIOUtil; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java similarity index 96% rename from src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java index 34d6f9fc4..6f88fa9a0 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileRepositoryFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.factory; +package com.sprint.mission.discodeit.factory.repository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java similarity index 95% rename from src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java index 885e66319..ccef04297 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFRepositoryFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.factory; +package com.sprint.mission.discodeit.factory.repository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java similarity index 86% rename from src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java index c5d1027ba..01eeade4e 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/RepositoryFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.factory; +package com.sprint.mission.discodeit.factory.repository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/FileServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java similarity index 91% rename from src/main/java/com/sprint/mission/discodeit/factory/FileServiceFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java index 2d7d8c6a4..2ef08b4f5 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/FileServiceFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.factory; +package com.sprint.mission.discodeit.factory.service; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; @@ -7,7 +7,7 @@ import com.sprint.mission.discodeit.service.file.FileMessageService; import com.sprint.mission.discodeit.service.file.FileUserService; -public class FileServiceFactory implements ServiceFactory{ +public class FileServiceFactory implements ServiceFactory { private static FileServiceFactory instance; private final UserService userService; private final MessageService messageService; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/JCFServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java similarity index 91% rename from src/main/java/com/sprint/mission/discodeit/factory/JCFServiceFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java index 903910e3b..3a395f487 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/JCFServiceFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.factory; +package com.sprint.mission.discodeit.factory.service; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; @@ -7,7 +7,7 @@ import com.sprint.mission.discodeit.service.jcf.JCFMessageService; import com.sprint.mission.discodeit.service.jcf.JCFUserService; -public class JCFServiceFactory implements ServiceFactory{ +public class JCFServiceFactory implements ServiceFactory { private static JCFServiceFactory instance; private final UserService userService; private final MessageService messageService; diff --git a/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java similarity index 85% rename from src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java rename to src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java index 8456e01e3..292615af0 100644 --- a/src/main/java/com/sprint/mission/discodeit/factory/ServiceFactory.java +++ b/src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.factory; +package com.sprint.mission.discodeit.factory.service; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java index 532d18504..4c603e98c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java @@ -30,11 +30,11 @@ public FileUserService() { @Override public User create(String name, String phone, String password) { - if (!ValidPass.isValidPassword(password)) { + if (!User.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } - if (!ValidPhone.isValidPhone(phone)) { + if (!User.isValidPhone(phone)) { throw new ServiceException(ErrorCode.INVALID_WRITER); } if (users.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java index fbea53de3..d71dc3493 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java @@ -60,7 +60,7 @@ public Channel updateDescription(Channel channel, String description) { } @Override - public void delete(Channel channel) { // 채널이 사라지면 해당 채널에 포함된 메시지도 사라진다. + public void delete(Channel channel) { validateChannel(channel); channelRepository.remove(channel.getId()); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index c1aa753ae..f767d9908 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -83,12 +83,12 @@ public void deleteMessageByChannel(Channel channel, UUID uuid) { .forEach(messageRepository::remove); } - private void validateUser(User user) { + private void validateUser(User user) { // User가 repository에 저장되어 있는지 확인 User findUser = userService.getUserByPhone(user.getPhone()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); } - private void validateChannel(Channel channel) { + private void validateChannel(Channel channel) { // Channel이 repository에 저장되어 있는지 확인 Channel findChannel = channelService.getChannelByName(channel.getName()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java index 4b777112c..266080747 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java @@ -16,11 +16,11 @@ public JCFUserService() { @Override public User create(String name, String phone, String password) { - if (!ValidPass.isValidPassword(password)) { + if (!User.isValidPassword(password)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } - if (!ValidPhone.isValidPhone(phone)) { + if (!User.isValidPhone(phone)) { throw new ServiceException(ErrorCode.INVALID_WRITER); } diff --git a/src/test/java/RepositoryTest.java b/src/test/java/RepositoryTest.java index fc3a50c6c..ef841cd96 100644 --- a/src/test/java/RepositoryTest.java +++ b/src/test/java/RepositoryTest.java @@ -1,9 +1,9 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.factory.FileRepositoryFactory; -import com.sprint.mission.discodeit.factory.JCFRepositoryFactory; -import com.sprint.mission.discodeit.factory.RepositoryFactory; +import com.sprint.mission.discodeit.factory.repository.FileRepositoryFactory; +import com.sprint.mission.discodeit.factory.repository.JCFRepositoryFactory; +import com.sprint.mission.discodeit.factory.repository.RepositoryFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -23,7 +23,7 @@ import java.util.List; public class RepositoryTest { - RepositoryFactory factory = JCFRepositoryFactory.getInstance(); + RepositoryFactory factory = FileRepositoryFactory.getInstance(); UserService userService = new BasicUserService(factory.getUserRepository()); ChannelService channelService = new BasicChannelService(factory.getChannelRepository()); MessageService messageService = new BasicMessageService(factory.getMessageRepository(), factory.getUserRepository(), factory.getChannelRepository()); From f372c280627cabee1eba339f3cffc494ee74a456 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 4 Feb 2025 09:59:09 +0900 Subject: [PATCH 038/115] Update Basic Service, Repository --- json/channels.json | 6 +- json/messages.json | 14 ++-- json/users.json | 6 +- result/channels.ser | Bin 635 -> 635 bytes result/messages.ser | Bin 1141 -> 1141 bytes result/users.ser | Bin 469 -> 469 bytes .../mission/discodeit/JavaApplication.java | 15 ++-- .../mission/discodeit/domain/Channel.java | 13 ++++ .../discodeit/exception/ServiceException.java | 14 ++-- .../repository/MessageRepository.java | 4 -- .../file/FileMessageRepository.java | 14 ---- .../repository/jcf/JCFMessageRepository.java | 16 ----- .../discodeit/service/MessageService.java | 13 ++-- .../service/basic/BasicMessageService.java | 43 +++++++----- .../service/file/FileMessageService.java | 65 ++++++++---------- .../service/jcf/JCFMessageService.java | 38 +++++----- src/test/java/RepositoryTest.java | 8 +-- 17 files changed, 120 insertions(+), 149 deletions(-) diff --git a/json/channels.json b/json/channels.json index 4bf0e4256..abaef91f7 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,7 +1,7 @@ { - "e8671ec5-5555-4c80-835c-642788d4be12" : { - "id" : "e8671ec5-5555-4c80-835c-642788d4be12", - "createdAt" : 1737766782118, + "6b97f829-3282-4879-b803-42f2c8cdf280" : { + "id" : "6b97f829-3282-4879-b803-42f2c8cdf280", + "createdAt" : 1738630648275, "updatedAt" : null, "name" : "코드잇 공지 채널", "description" : "공지 채널입니다", diff --git a/json/messages.json b/json/messages.json index 7764fad3a..187fd1364 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,20 +1,20 @@ { - "1d6cf41e-e4ed-42fb-84f4-4f80739b6182" : { - "id" : "1d6cf41e-e4ed-42fb-84f4-4f80739b6182", - "createdAt" : 1737766782119, + "8eee100b-d71e-40a1-b95e-adce9d17766f" : { + "id" : "8eee100b-d71e-40a1-b95e-adce9d17766f", + "createdAt" : 1738630648276, "updatedAt" : null, "content" : "안녕하세요", "writer" : { - "id" : "89f18c5c-e7bf-47b3-8399-bdda8f3ecc8f", - "createdAt" : 1737766782116, + "id" : "0bc6e12b-c26a-4390-ba51-c3f133dc3dd8", + "createdAt" : 1738630648272, "updatedAt" : null, "name" : "woody", "phone" : "010-9218-1188", "password" : "Abcdefgh12312!" }, "channel" : { - "id" : "e8671ec5-5555-4c80-835c-642788d4be12", - "createdAt" : 1737766782118, + "id" : "6b97f829-3282-4879-b803-42f2c8cdf280", + "createdAt" : 1738630648275, "updatedAt" : null, "name" : "코드잇 공지 채널", "description" : "공지 채널입니다", diff --git a/json/users.json b/json/users.json index 4028b86f3..11d4afb69 100644 --- a/json/users.json +++ b/json/users.json @@ -1,7 +1,7 @@ { - "89f18c5c-e7bf-47b3-8399-bdda8f3ecc8f" : { - "id" : "89f18c5c-e7bf-47b3-8399-bdda8f3ecc8f", - "createdAt" : 1737766782116, + "0bc6e12b-c26a-4390-ba51-c3f133dc3dd8" : { + "id" : "0bc6e12b-c26a-4390-ba51-c3f133dc3dd8", + "createdAt" : 1738630648272, "updatedAt" : null, "name" : "woody", "phone" : "010-9218-1188", diff --git a/result/channels.ser b/result/channels.ser index 5d82238a8f6e94e60edd99a1d16c353102ee2a1c..7639adcec3fa7b24e5c821abfe65240c1c81b6dd 100644 GIT binary patch delta 48 zcmV-00MGyX1p5S#jS#p4Lh{JX@_=iX_$e}iNO_T+F9;jQ`w_hnu?Vr$X#oVzc2U!l GK>|8HUKRfU delta 48 zcmV-00MGyX1p5S#jSz!eWG9H!z7ptX9>rBvOn{M{F9-tQ0ESy|7j3lxz6 diff --git a/result/messages.ser b/result/messages.ser index c415ea1142654d50e05bb476c6c64ac758c9d3c5..f58594d0977d1004762f020d3e73948ab02b6ff7 100644 GIT binary patch delta 128 zcmey$@s(pjufWc@wddxFm*w}p6X3os=df_{21bpIN2M4!q>uj=+$*?|WAk%HTSk_1 zWr3F`YcR_T>|l2KbmHu%hV1D-G>w`(Dkq0CoAUu>uM{%WF)$Yt7cpo|T&Obn0CRy9 gQ1n7ENSJ9?;Ng$PcWiHPAA6{MD9d@mWG@zN0J-xu&Hw-a delta 128 zcmey$@s(pjuRzNe|Ayk(iA}OOU*w*=b^1Md1Ea>qqf(3r2#Np<`Q)P diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java index b90dd7a4b..f68318152 100644 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.factory.service.FileServiceFactory; +import com.sprint.mission.discodeit.factory.service.JCFServiceFactory; import com.sprint.mission.discodeit.factory.service.ServiceFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; @@ -19,8 +20,8 @@ public class JavaApplication { public static void main(String[] args) { -/* Factory factory = JCFFactory.getInstance();*/ - ServiceFactory factory = FileServiceFactory.getInstance(); +// Factory factory = JCFFactory.getInstance(); + ServiceFactory factory = JCFServiceFactory.getInstance(); UserService userService = factory.getUserService(); ChannelService channelService = factory.getChannelService(); MessageService messageService = factory.getMessageService(); @@ -149,14 +150,14 @@ public static void main(String[] args) { System.out.println(); System.out.println("<특정 채널에서 전체 메시지 조회하기>"); System.out.print("코드잇 채널 전체 메시지 조회"); - List allMessages = messageService.getMessageByChannel(channel1); + List allMessages = messageService.getMessageWithChannel(channel1); System.out.println(allMessages); System.out.println(); System.out.print("코테 준비 채널 전체 메시지 조회"); - List allMessages2 = messageService.getMessageByChannel(channel2); + List allMessages2 = messageService.getMessageWithChannel(channel2); System.out.println(allMessages2); System.out.println("<단일 메시지 조회하기>"); - List getMessage = messageService.getMessageByUser(user2); + Optional getMessage = messageService.getMessage(message2_2.getId()); System.out.println(getMessage); System.out.println(); System.out.println("==============================================================================="); @@ -168,8 +169,8 @@ public static void main(String[] args) { System.out.println("==============================================================================="); System.out.println(); System.out.println("<메시지 삭제하기>"); - messageService.deleteMessageByWriter(user2, message2_1.getId()); - System.out.println("전체 메시지 조회하기: " + messageService.getMessageByUser(user2)); + messageService.deleteMessage(message2_1.getId()); + System.out.println("전체 메시지 조회하기: " + messageService.getAllMessage()); System.out.println("채널 삭제하기 : "); channelService.delete(channel1); System.out.println(channelService.getAllChannel()); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index d1af4160a..dc5b8031f 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -8,6 +8,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.Objects; import java.util.UUID; @Getter @@ -28,6 +29,18 @@ public Channel(String name, String description, ChannelType channelType) { this.channelType = channelType; } + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Channel channel = (Channel) o; + return Objects.equals(name, channel.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } + public void changeType(ChannelType channelType) { this.channelType = channelType; this.updatedAt = System.currentTimeMillis(); diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java index 0bad6b40b..dcb892263 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java @@ -1,19 +1,15 @@ package com.sprint.mission.discodeit.exception; import com.sprint.mission.discodeit.error.ErrorCode; -import lombok.*; +import lombok.Getter; @Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ServiceException extends RuntimeException{ - private ErrorCode errorCode; - private String errorMessage; +public class ServiceException extends RuntimeException { + private final ErrorCode errorCode; public ServiceException(ErrorCode errorCode) { + super(errorCode.getDescription()); this.errorCode = errorCode; - this.errorMessage = errorCode.getDescription(); } } + diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 73ba14daf..00bd04dcf 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -13,10 +13,6 @@ public interface MessageRepository { Optional findById(UUID uuid); - List findByUser(User user); - - List findByChannel(Channel channel); - List findAll(); Message delete(Message message); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 1c047289d..44b4733f2 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -42,20 +42,6 @@ public Optional findById(UUID uuid) { return Optional.of(messageMap.get(uuid)); } - @Override - public List findByUser(User user) { - return messageMap.values().stream() - .filter(message -> message.getWriter().getPhone().equals(user.getPhone())) - .collect(Collectors.toList()); - } - - @Override - public List findByChannel(Channel channel) { - return messageMap.values().stream() - .filter(message -> message.getChannel().getName().equals(channel.getName())) - .collect(Collectors.toList()); - } - @Override public List findAll() { return messageMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 3a3eabf16..021bc1b86 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -1,8 +1,6 @@ package com.sprint.mission.discodeit.repository.jcf; -import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.MessageRepository; import java.util.*; @@ -28,20 +26,6 @@ public Optional findById(UUID uuid) { .findFirst(); } - @Override - public List findByUser(User user) { - return messageMap.values().stream() - .filter(message -> message.getWriter().getPhone().equals(user.getPhone())) - .collect(Collectors.toList()); - } - - @Override - public List findByChannel(Channel channel) { - return messageMap.values().stream() - .filter(message -> message.getChannel().getName().equals(channel.getName())) - .collect(Collectors.toList()); - } - @Override public List findAll() { return messageMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index f79b63397..ff14ece78 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -5,18 +5,21 @@ import com.sprint.mission.discodeit.domain.User; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface MessageService { Message create(String content, User writer, Channel channel); - List getMessageByUser(User writer); + Optional getMessage(UUID messageID); - List getMessageByChannel(Channel channel); + List getMessageWithWriter(User writer); - Message updateMessageContent(Message message, String newContent); + List getMessageWithChannel(Channel channel); + + List getAllMessage(); - void deleteMessageByWriter(User writer, UUID uuid); + Message updateMessageContent(Message message, String newContent); - void deleteMessageByChannel(Channel channel, UUID uuid); + void deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index a0d15b4b7..5116b7a05 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -11,7 +11,9 @@ import com.sprint.mission.discodeit.service.MessageService; import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; public class BasicMessageService implements MessageService { private final MessageRepository messageRepository; @@ -38,15 +40,31 @@ public Message create(String content, User writer, Channel channel) { } @Override - public List getMessageByUser(User writer) { + public Optional getMessage(UUID messageID) { + return messageRepository.findById(messageID); + } + + @Override + public List getMessageWithWriter(User writer) { existUser(writer); - return messageRepository.findByUser(writer); + List messageList = messageRepository.findAll(); + return messageList.stream() + .filter(message -> message.getWriter().equals(writer)) + .collect(Collectors.toList()); } @Override - public List getMessageByChannel(Channel channel) { + public List getMessageWithChannel(Channel channel) { existChannel(channel); - return messageRepository.findByChannel(channel); + List messageList = messageRepository.findAll(); + return messageList.stream() + .filter(message -> message.getChannel().equals(channel)) + .collect(Collectors.toList()); + } + + @Override + public List getAllMessage() { + return messageRepository.findAll(); } @Override @@ -61,20 +79,9 @@ public Message updateMessageContent(Message message, String newContent) { } @Override - public void deleteMessageByWriter(User writer, UUID uuid) { - existUser(writer); - Message removeMessage = messageRepository.findById(uuid) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - messageRepository.delete(removeMessage); - } - - @Override - public void deleteMessageByChannel(Channel channel, UUID uuid) { - existChannel(channel); - Message removeMessage = messageRepository.findById(uuid) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - messageRepository.delete(removeMessage); - + public void deleteMessage(UUID messageID) { + Optional deleteMessage = messageRepository.findById(messageID); + messageRepository.delete(deleteMessage.orElse(null)); } private void existUser(User user) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java index 9e8ef890f..05c4abee4 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java @@ -14,12 +14,13 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; +import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; public class FileMessageService implements MessageService { private final Path filePath = Path.of("./result/messages.ser"); - Map messages = FileIOUtil.loadFromFile(filePath); + Map messageRepository = FileIOUtil.loadFromFile(filePath); private final UserService userService; private final ChannelService channelService; @@ -46,64 +47,52 @@ public Message create(String content, User writer, Channel channel) { validateChannel(channel); Message message = new Message(content, writer, channel); - messages.put(message.getId(), message); - FileIOUtil.saveToFile(messages, filePath); + messageRepository.put(message.getId(), message); + FileIOUtil.saveToFile(messageRepository, filePath); return message; } @Override - public List getMessageByUser(User writer) { + public Optional getMessage(UUID messageID) { + return Optional.ofNullable(messageRepository.get(messageID)); + } + + @Override + public List getMessageWithWriter(User writer) { validateUser(writer); + return messageRepository.values().stream() + .filter(message -> message.getWriter().equals(writer)) + .collect(Collectors.toList()); + } - List list = new ArrayList<>(); - for (Message message : messages.values()) { - if (message.getWriter().getPhone().equals(writer.getPhone())) { - list.add(message); - } - } - return list; + @Override + public List getMessageWithChannel(Channel channel) { + validateChannel(channel); + return messageRepository.values().stream() + .filter(message -> message.getChannel().equals(channel)) + .collect(Collectors.toList()); } @Override - public List getMessageByChannel(Channel channel) { - List list = new ArrayList<>(); - for (Message message : messages.values()) { - if (message.getChannel().getName().equals(channel.getName())) { - list.add(message); - } - } - return list; + public List getAllMessage() { + return new ArrayList<>(messageRepository.values()); } + @Override public Message updateMessageContent(Message updateMessage, String newContent) { if (newContent.isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } updateMessage.update(newContent); - messages.put(updateMessage.getId(), updateMessage); - saveToFile(messages, filePath); + messageRepository.put(updateMessage.getId(), updateMessage); + saveToFile(messageRepository, filePath); return updateMessage; } @Override - public void deleteMessageByWriter(User writer, UUID uuid) { - validateUser(writer); - if (!messages.containsKey(uuid)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); - } - messages.remove(uuid); - FileIOUtil.saveToFile(messages, filePath); - } - - @Override - public void deleteMessageByChannel(Channel channel, UUID id) { - validateChannel(channel); - if (!messages.containsKey(id)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); - } - messages.remove(id); - FileIOUtil.saveToFile(messages, filePath); + public void deleteMessage(UUID messageID) { + messageRepository.remove(messageID); } private void validateUser(User user) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java index f767d9908..35332e3ad 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java @@ -38,23 +38,32 @@ public Message create(String content, User writer, Channel channel) throws Illeg return message; } - // 메시지를 보낸 회원이 메시지 조회하기 @Override - public List getMessageByUser(User writer) { + public Optional getMessage(UUID messageID) { + return Optional.ofNullable(messageRepository.get(messageID)); + } + + @Override + public List getMessageWithWriter(User writer) { validateUser(writer); return messageRepository.values().stream() - .filter(message -> message.getWriter().getPhone().equals(writer.getPhone())) + .filter(message -> message.getWriter().equals(writer)) .collect(Collectors.toList()); } @Override - public List getMessageByChannel(Channel channel) { - List messages = new ArrayList<>(); + public List getMessageWithChannel(Channel channel) { + validateChannel(channel); return messageRepository.values().stream() - .filter(message -> message.getChannel().getName().equals(channel.getName())) + .filter(message -> message.getChannel().equals(channel)) .collect(Collectors.toList()); } + @Override + public List getAllMessage() { + return new ArrayList<>(messageRepository.values()); + } + @Override public Message updateMessageContent(Message findMessage, String newContent) { @@ -66,21 +75,8 @@ public Message updateMessageContent(Message findMessage, String newContent) { } @Override - public void deleteMessageByWriter(User writer, UUID uuid) { // 작성자가 작성한 메시지 삭제하기 - if (!messageRepository.containsKey(uuid)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); - } - validateUser(writer); - Message findMessage = messageRepository.get(uuid); - messageRepository.remove(uuid); - } - - - @Override - public void deleteMessageByChannel(Channel channel, UUID uuid) { - getMessageByChannel(channel).stream() - .map(Message::getId) - .forEach(messageRepository::remove); + public void deleteMessage(UUID messageID) { + messageRepository.remove(messageID); } private void validateUser(User user) { // User가 repository에 저장되어 있는지 확인 diff --git a/src/test/java/RepositoryTest.java b/src/test/java/RepositoryTest.java index ef841cd96..ca1e9e1aa 100644 --- a/src/test/java/RepositoryTest.java +++ b/src/test/java/RepositoryTest.java @@ -62,7 +62,7 @@ void findMessageByUser() { User user = setupUser(userService); Channel channel = setupChannel(channelService); messageCreateTest(messageService, channel, user); - List messages = messageService.getMessageByUser(user); + List messages = messageService.getMessageWithWriter(user); System.out.println("메시지 찾기: " + messages); } @@ -72,7 +72,7 @@ void findMessageByChannel() { User user = setupUser(userService); Channel channel = setupChannel(channelService); messageCreateTest(messageService, channel, user); - List messages = messageService.getMessageByChannel(channel); + List messages = messageService.getMessageWithChannel(channel); System.out.println("메시지 찾기: " + messages); } @@ -82,8 +82,8 @@ void deleteMessage() { User user = setupUser(userService); Channel channel = setupChannel(channelService); Message createMessage = messageCreateTest(messageService, channel, user); - messageService.deleteMessageByWriter(user, createMessage.getId()); - List messages = messageService.getMessageByChannel(channel); + messageService.deleteMessage(createMessage.getId()); + List messages = messageService.getAllMessage(); System.out.println("메시지 찾기: " + messages); } From d4f0a8ed847ecd3109e873dd88becc075695afb7 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 4 Feb 2025 10:06:01 +0900 Subject: [PATCH 039/115] Start mission3 --- HELP.md | 22 +++++++++ build.gradle | 44 ++++++++++-------- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 44 ++++++++++++------ gradlew.bat | 37 ++++++++------- settings.gradle | 3 +- .../discodeit/DiscodeitApplication.java | 13 ++++++ src/main/resources/application.properties | 1 + .../discodeit/DiscodeitApplicationTests.java | 13 ++++++ 10 files changed, 129 insertions(+), 53 deletions(-) create mode 100644 HELP.md create mode 100644 src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java diff --git a/HELP.md b/HELP.md new file mode 100644 index 000000000..2bf68ada2 --- /dev/null +++ b/HELP.md @@ -0,0 +1,22 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Gradle documentation](https://docs.gradle.org) +* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.2/gradle-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.2/gradle-plugin/packaging-oci-image.html) +* [Spring Web](https://docs.spring.io/spring-boot/3.4.2/reference/web/servlet.html) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) + +### Additional Links +These additional references should also help you: + +* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle) + diff --git a/build.gradle b/build.gradle index 65021f013..b70fe880c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,32 +1,36 @@ plugins { - id 'java' - id 'checkstyle' + id 'java' + id 'org.springframework.boot' version '3.4.2' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.sprint.mission' -version = '1.0-SNAPSHOT' +version = '0.0.1-SNAPSHOT' -repositories { - mavenCentral() +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } -dependencies { - compileOnly 'org.projectlombok:lombok:1.18.28' - annotationProcessor 'org.projectlombok:lombok:1.18.28' +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} - testCompileOnly 'org.projectlombok:lombok:1.18.28' - testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3' - testImplementation platform('org.junit:junit-bom:5.10.0') - testImplementation 'org.junit.jupiter:junit-jupiter' +repositories { + mavenCentral() } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } -test { - useJUnitPlatform() -} \ No newline at end of file +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 60756 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 /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +134,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + 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 @@ -193,11 +201,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# 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" \ @@ -205,6 +217,12 @@ set -- \ 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. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f93..9b42019c7 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,10 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +27,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +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. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +59,11 @@ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +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! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +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 diff --git a/settings.gradle b/settings.gradle index b71004546..2437dfb29 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ -rootProject.name = '1-sprint-mission' - +rootProject.name = 'discodeit' diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java new file mode 100644 index 000000000..360245c48 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DiscodeitApplication { + + public static void main(String[] args) { + SpringApplication.run(DiscodeitApplication.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 000000000..545cf9f09 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=discodeit diff --git a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java new file mode 100644 index 000000000..3a987a214 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DiscodeitApplicationTests { + + @Test + void contextLoads() { + } + +} From 3c2898a7bf67a8b9004ada9d9c971e7dfe78840c Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 4 Feb 2025 15:39:20 +0900 Subject: [PATCH 040/115] Complete Basic requirement --- json/channels.json | 10 ++-- json/messages.json | 28 ++++----- json/users.json | 12 ++-- result/channels.ser | Bin 635 -> 645 bytes result/messages.ser | Bin 1141 -> 1184 bytes result/users.ser | Bin 469 -> 485 bytes .../discodeit/DiscodeitApplication.java | 55 +++++++++++++++++- .../mission/discodeit/domain/Channel.java | 2 +- .../mission/discodeit/domain/Message.java | 2 +- .../sprint/mission/discodeit/domain/User.java | 2 +- .../file/FileChannelRepository.java | 2 + .../file/FileMessageRepository.java | 2 + .../repository/file/FileUserRepository.java | 2 + .../service/basic/BasicChannelService.java | 8 +-- .../service/basic/BasicMessageService.java | 10 ++-- .../service/basic/BasicUserService.java | 8 +-- src/main/resources/application.properties | 1 - src/main/resources/application.yml | 3 + 18 files changed, 102 insertions(+), 45 deletions(-) delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml diff --git a/json/channels.json b/json/channels.json index abaef91f7..22d34830a 100644 --- a/json/channels.json +++ b/json/channels.json @@ -1,9 +1,9 @@ { - "6b97f829-3282-4879-b803-42f2c8cdf280" : { - "id" : "6b97f829-3282-4879-b803-42f2c8cdf280", - "createdAt" : 1738630648275, - "updatedAt" : null, - "name" : "코드잇 공지 채널", + "45d7295b-2f18-4c05-9f74-0b517fc7dbb9" : { + "id" : "45d7295b-2f18-4c05-9f74-0b517fc7dbb9", + "createdAt" : 1738649436775, + "updatedAt" : 1738649436775, + "name" : "자바 공지 채널", "description" : "공지 채널입니다", "channelType" : "VOICE" } diff --git a/json/messages.json b/json/messages.json index 187fd1364..065177740 100644 --- a/json/messages.json +++ b/json/messages.json @@ -1,22 +1,22 @@ { - "8eee100b-d71e-40a1-b95e-adce9d17766f" : { - "id" : "8eee100b-d71e-40a1-b95e-adce9d17766f", - "createdAt" : 1738630648276, - "updatedAt" : null, - "content" : "안녕하세요", + "a7100559-54b7-4404-a31e-75e6a27fe6d5" : { + "id" : "a7100559-54b7-4404-a31e-75e6a27fe6d5", + "createdAt" : 1738649436776, + "updatedAt" : 1738649436777, + "content" : "this is new content", "writer" : { - "id" : "0bc6e12b-c26a-4390-ba51-c3f133dc3dd8", - "createdAt" : 1738630648272, - "updatedAt" : null, - "name" : "woody", - "phone" : "010-9218-1188", + "id" : "09160e63-f313-45d7-af4c-b5ec79491c58", + "createdAt" : 1738649436774, + "updatedAt" : 1738649436774, + "name" : "student1", + "phone" : "010-1929-1188", "password" : "Abcdefgh12312!" }, "channel" : { - "id" : "6b97f829-3282-4879-b803-42f2c8cdf280", - "createdAt" : 1738630648275, - "updatedAt" : null, - "name" : "코드잇 공지 채널", + "id" : "45d7295b-2f18-4c05-9f74-0b517fc7dbb9", + "createdAt" : 1738649436775, + "updatedAt" : 1738649436775, + "name" : "자바 공지 채널", "description" : "공지 채널입니다", "channelType" : "VOICE" } diff --git a/json/users.json b/json/users.json index 11d4afb69..63e7030ea 100644 --- a/json/users.json +++ b/json/users.json @@ -1,10 +1,10 @@ { - "0bc6e12b-c26a-4390-ba51-c3f133dc3dd8" : { - "id" : "0bc6e12b-c26a-4390-ba51-c3f133dc3dd8", - "createdAt" : 1738630648272, - "updatedAt" : null, - "name" : "woody", - "phone" : "010-9218-1188", + "09160e63-f313-45d7-af4c-b5ec79491c58" : { + "id" : "09160e63-f313-45d7-af4c-b5ec79491c58", + "createdAt" : 1738649436774, + "updatedAt" : 1738649436774, + "name" : "student1", + "phone" : "010-1929-1188", "password" : "Abcdefgh12312!" } } \ No newline at end of file diff --git a/result/channels.ser b/result/channels.ser index 7639adcec3fa7b24e5c821abfe65240c1c81b6dd..8b3f3d719f12fcac75c94986939f735b4255c31d 100644 GIT binary patch delta 73 zcmey((#kraS73e#cVPYT+dEyaYewr!_^@uAyMU49{8Xm&$&O44Dk5*@O?bUwio&bS dTi+~iP{Ee7wo;1>yw=9 Vo`)dnv$gD}fFSI#gzJQmaCqV^Alv`| diff --git a/result/messages.ser b/result/messages.ser index f58594d0977d1004762f020d3e73948ab02b6ff7..38708adc6d069641ba162b1542cd4df12b6a0bf8 100644 GIT binary patch delta 261 zcmey$v4C?zufSrt(r1h6pIu!pz#18{-GycH21bpIN8_1T&QE1ZpRBy`<{g$#8JLJSOyQ$RXP7=%kQ zGK&>}C@-~KAvr&W=D`r~nv-M4-r%VK=7+>;dVb|*=3>?KJr71x34NDmK9Fvk$Qq$5i42_HpjTB25 Xcnu5C=g` zpBl2K|IjpQ@~A9f5P!3G%InE<-pp%Pc(r-!o8=7(Z#K5PZkbR}!odG#YRBu=sc)yw zc+;}u&8#WKg$#8JLJSOyQ-J1O0dbfMii;RDCN5N&e4DvI2`G92tcGb<;Ng$PcWiHP kAA6{MD9d?52?J|+ett^jw;hyI$Womxa;g{8Xm2LWVj9<`M>u;*!#o)VvbI w5(YlUq~w&;wDb%^BV$7&#S#Wy149E{LrWt|T|+|)i(-%tP6h_XDIo0?05*XgasU7T delta 80 zcmV-W0I&b$1JwhNjS#v~!|^lRJ=hDz;VZ&wLy)nZ1OYV8c2UrA0Db@ibN~f+Z*OFI mbN~)PVq;`wW@l(IGBYtUA#?x@FflMKIWjRgEio}TIB<9;2OH1; diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 360245c48..e618db539 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -1,13 +1,64 @@ package com.sprint.mission.discodeit; +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.factory.service.FileServiceFactory; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.ChannelType; +import com.sprint.mission.discodeit.util.FileIOUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; @SpringBootApplication public class DiscodeitApplication { + static User setupUser(UserService userService) { + User user = userService.create("student1", "010-1929-1188", "Abcdefgh12312!"); + return user; + } - public static void main(String[] args) { - SpringApplication.run(DiscodeitApplication.class, args); + static Channel setupChannel(ChannelService channelService) { + Channel channel = channelService.create("자바 공지 채널", "공지 채널입니다", ChannelType.VOICE); + return channel; + } + + static Message messageCreateTest(MessageService messageService, Channel channel, User writer) { + Message message = messageService.create("안녕하세요", writer, channel); + System.out.println("메시지 생성 : " + message); + return message; } + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); + UserService userService = context.getBean(UserService.class); + System.out.println("userService = " + userService); + ChannelService channelService = context.getBean(ChannelService.class); + System.out.println("channelService = " + channelService); + MessageService messageService = context.getBean(MessageService.class); + System.out.println("messageService = " + messageService); + + try { + Files.deleteIfExists(Paths.get("./result/users.ser")); + Files.deleteIfExists(Paths.get("./result/messages.ser")); + Files.deleteIfExists(Paths.get("./result/channels.ser")); + } catch (IOException e) { + System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); + } + + User user = setupUser(userService); + Channel channel = setupChannel(channelService); + Message message = messageCreateTest(messageService, channel, user); + messageService.updateMessageContent(message, "this is new content"); + + FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"),Paths.get("./json/users.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"),Paths.get("./json/messages.json")); + FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index dc5b8031f..a97b4f5f0 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -23,7 +23,7 @@ public class Channel implements Serializable { public Channel(String name, String description, ChannelType channelType) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); - this.updatedAt = null; + this.updatedAt = System.currentTimeMillis(); this.name = name; this.description = description; this.channelType = channelType; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index 869c88162..233473d2d 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -21,7 +21,7 @@ public class Message implements Serializable { public Message(String content, User writer, Channel channel) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); - this.updatedAt = null; + this.updatedAt = System.currentTimeMillis(); this.content = content; this.writer = writer; this.channel = channel; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index 8a33e22e5..f298f581b 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -22,7 +22,7 @@ public class User implements Serializable { public User(String name, String phone, String password) { this.id = UUID.randomUUID(); this.createdAt = System.currentTimeMillis(); - this.updatedAt = null; + this.updatedAt = System.currentTimeMillis(); this.name = name; this.phone = phone; this.password = password; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index d40b2e58b..7f69ae822 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.stereotype.Repository; import java.io.IOException; import java.nio.file.Files; @@ -12,6 +13,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Repository public class FileChannelRepository implements ChannelRepository { private final Path filePath = Path.of("./result/channels.ser"); private final Map channelMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 44b4733f2..1e063d86b 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.stereotype.Repository; import java.io.IOException; import java.nio.file.Files; @@ -14,6 +15,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Repository public class FileMessageRepository implements MessageRepository { private final Path filePath = Path.of("./result/messages.ser"); private final Map messageMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 222d78374..dbd9a3061 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.stereotype.Repository; import java.io.IOException; import java.nio.file.Files; @@ -12,6 +13,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Repository public class FileUserRepository implements UserRepository { private final Path filePath = Path.of("./result/users.ser"); private final Map userMap; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 28437c2f8..c680a80df 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -6,17 +6,17 @@ import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.util.ChannelType; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; +@Service +@RequiredArgsConstructor public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; - public BasicChannelService(ChannelRepository channelRepository) { - this.channelRepository = channelRepository; - } - @Override public Channel create(String name, String description, ChannelType channelType) { channelRepository.findByName(name).ifPresent(channel -> { diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 5116b7a05..d161e8bd3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -9,23 +9,21 @@ import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; +@Service +@RequiredArgsConstructor public class BasicMessageService implements MessageService { private final MessageRepository messageRepository; private final UserRepository userRepository; private final ChannelRepository channelRepository; - public BasicMessageService(MessageRepository messageRepository, UserRepository userRepository, ChannelRepository channelRepository) { - this.userRepository = userRepository; - this.messageRepository = messageRepository; - this.channelRepository = channelRepository; - } - @Override public Message create(String content, User writer, Channel channel) { if (content.isEmpty()) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index f38a1b39a..cf1b71215 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -5,18 +5,18 @@ import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; +@Service +@RequiredArgsConstructor public class BasicUserService implements UserService { private final UserRepository userRepository; - public BasicUserService(UserRepository userRepository) { - this.userRepository = userRepository; - } - @Override public User create(String name, String phone, String password) { if (!User.isValidPassword(password)) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 545cf9f09..000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=discodeit diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 000000000..8329de47c --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + application: + name: discodeit From a0417213c9a6479bac8e84c1236094ff29379ee5 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 4 Feb 2025 15:46:05 +0900 Subject: [PATCH 041/115] Update domain time field --- .../mission/discodeit/domain/Channel.java | 24 +++++++------------ .../mission/discodeit/domain/Message.java | 23 ++++++------------ .../sprint/mission/discodeit/domain/User.java | 23 ++++++------------ 3 files changed, 22 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index a97b4f5f0..8b7e206d3 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -14,16 +14,16 @@ @Getter public class Channel implements Serializable { private UUID id; - private Long createdAt; - private Long updatedAt; + private Instant createdAt; + private Instant updatedAt; private String name; private String description; private ChannelType channelType; public Channel(String name, String description, ChannelType channelType) { this.id = UUID.randomUUID(); - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); this.name = name; this.description = description; this.channelType = channelType; @@ -43,29 +43,21 @@ public int hashCode() { public void changeType(ChannelType channelType) { this.channelType = channelType; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } public void changeDescription(String description) { this.description = description; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } @Override public String toString() { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - - String createdAtFormatted = createdAt != null - ? LocalDateTime.ofInstant(Instant.ofEpochMilli(createdAt), ZoneId.systemDefault()).format(formatter) - : "N/A"; - String updatedAtFormatted = updatedAt != null - ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) - : "N/A"; return "Channel{" + "id=" + id + - ", createdAt=" + createdAtFormatted + - ", updatedAt=" + updatedAtFormatted + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + ", description=" + description + ", name='" + name + '\'' + ", type='" + channelType + '\'' + diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index 233473d2d..749858780 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -12,16 +12,16 @@ @Getter public class Message implements Serializable { private UUID id; - private Long createdAt; - private Long updatedAt; + private Instant createdAt; + private Instant updatedAt; private String content; private User writer; private Channel channel; public Message(String content, User writer, Channel channel) { this.id = UUID.randomUUID(); - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); this.content = content; this.writer = writer; this.channel = channel; @@ -29,27 +29,18 @@ public Message(String content, User writer, Channel channel) { public void update(String content) { this.content = content; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } @Override public String toString() { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - - String createdAtFormatted = createdAt != null - ? LocalDateTime.ofInstant(Instant.ofEpochMilli(createdAt), ZoneId.systemDefault()).format(formatter) - : "N/A"; - String updatedAtFormatted = updatedAt != null - ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) - : "N/A"; - String writerUserName = writer != null ? writer.getName() : "Unknown"; String useChannelName = channel != null ? channel.getName() : "Unknown"; return "Message{" + "id=" + id + - ", createdAt=" + createdAtFormatted + - ", updatedAt=" + updatedAtFormatted + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + ", content='" + content + '\'' + ", writer='" + writerUserName + '\'' + ", channel='" + useChannelName + '\'' + diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index f298f581b..0b8b6b934 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -13,16 +13,16 @@ @Getter public class User implements Serializable { private UUID id; - private Long createdAt; - private Long updatedAt; + private Instant createdAt; + private Instant updatedAt; private String name; private String phone; private String password; public User(String name, String phone, String password) { this.id = UUID.randomUUID(); - this.createdAt = System.currentTimeMillis(); - this.updatedAt = System.currentTimeMillis(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); this.name = name; this.phone = phone; this.password = password; @@ -30,7 +30,7 @@ public User(String name, String phone, String password) { public void update(String password) { this.password = password; - this.updatedAt = System.currentTimeMillis(); + this.updatedAt = Instant.now(); } //8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 한다 @@ -58,22 +58,13 @@ public int hashCode() { @Override public String toString() { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - - String createdAtFormatted = createdAt != null - ? LocalDateTime.ofInstant(Instant.ofEpochMilli(createdAt), ZoneId.systemDefault()).format(formatter) - : "N/A"; - String updatedAtFormatted = updatedAt != null - ? LocalDateTime.ofInstant(Instant.ofEpochMilli(updatedAt), ZoneId.systemDefault()).format(formatter) - : "N/A"; - return "User {\n" + " id=" + id + ",\n" + " name='" + name + "',\n" + " phone='" + phone + "',\n" + " password='" + password + "',\n" + - " createdAt=" + createdAtFormatted + ",\n" + - " updatedAt=" + updatedAtFormatted + "\n" + + " createdAt=" + createdAt + ",\n" + + " updatedAt=" + updatedAt + "\n" + "}"; } } From 145194d2c6fab00507a9847e0ff7a99f7fb2d602 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 4 Feb 2025 18:48:31 +0900 Subject: [PATCH 042/115] Complete Basic requirement --- json/channels.json | 10 -------- json/messages.json | 24 ------------------ json/users.json | 10 -------- result/channels.ser | Bin 645 -> 624 bytes result/messages.ser | Bin 1184 -> 1191 bytes result/users.ser | Bin 485 -> 464 bytes .../discodeit/DiscodeitApplication.java | 5 ---- .../discodeit/domain/BinaryContent.java | 15 +++++++++++ .../mission/discodeit/domain/ReadStatus.java | 19 ++++++++++++++ .../mission/discodeit/domain/UserStatus.java | 18 +++++++++++++ .../file/FileChannelRepository.java | 3 +++ .../file/FileMessageRepository.java | 3 +++ .../repository/file/FileUserRepository.java | 3 +++ .../repository/jcf/JCFChannelRepository.java | 2 ++ .../repository/jcf/JCFMessageRepository.java | 3 +++ .../repository/jcf/JCFUserRepository.java | 3 +++ .../service/basic/BasicChannelService.java | 1 + .../service/basic/BasicMessageService.java | 1 + .../service/basic/BasicUserService.java | 1 + 19 files changed, 72 insertions(+), 49 deletions(-) delete mode 100644 json/channels.json delete mode 100644 json/messages.json delete mode 100644 json/users.json create mode 100644 src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java create mode 100644 src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java create mode 100644 src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java diff --git a/json/channels.json b/json/channels.json deleted file mode 100644 index 22d34830a..000000000 --- a/json/channels.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "45d7295b-2f18-4c05-9f74-0b517fc7dbb9" : { - "id" : "45d7295b-2f18-4c05-9f74-0b517fc7dbb9", - "createdAt" : 1738649436775, - "updatedAt" : 1738649436775, - "name" : "자바 공지 채널", - "description" : "공지 채널입니다", - "channelType" : "VOICE" - } -} \ No newline at end of file diff --git a/json/messages.json b/json/messages.json deleted file mode 100644 index 065177740..000000000 --- a/json/messages.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "a7100559-54b7-4404-a31e-75e6a27fe6d5" : { - "id" : "a7100559-54b7-4404-a31e-75e6a27fe6d5", - "createdAt" : 1738649436776, - "updatedAt" : 1738649436777, - "content" : "this is new content", - "writer" : { - "id" : "09160e63-f313-45d7-af4c-b5ec79491c58", - "createdAt" : 1738649436774, - "updatedAt" : 1738649436774, - "name" : "student1", - "phone" : "010-1929-1188", - "password" : "Abcdefgh12312!" - }, - "channel" : { - "id" : "45d7295b-2f18-4c05-9f74-0b517fc7dbb9", - "createdAt" : 1738649436775, - "updatedAt" : 1738649436775, - "name" : "자바 공지 채널", - "description" : "공지 채널입니다", - "channelType" : "VOICE" - } - } -} \ No newline at end of file diff --git a/json/users.json b/json/users.json deleted file mode 100644 index 63e7030ea..000000000 --- a/json/users.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "09160e63-f313-45d7-af4c-b5ec79491c58" : { - "id" : "09160e63-f313-45d7-af4c-b5ec79491c58", - "createdAt" : 1738649436774, - "updatedAt" : 1738649436774, - "name" : "student1", - "phone" : "010-1929-1188", - "password" : "Abcdefgh12312!" - } -} \ No newline at end of file diff --git a/result/channels.ser b/result/channels.ser index 8b3f3d719f12fcac75c94986939f735b4255c31d..269d0af81cfe75b45d0f0dda6c237afea109a0f6 100644 GIT binary patch delta 128 zcmZo={lGGzSD?}4!b7+41%Ib~-yHs7y0_rOx%wP$biVqwnpu`jyb>rZ?30yPmZ)En znVYKbnO9trm{&5{l<}Z8FGyGqB&-*lS~NAbWtX&)$0i;IhKho6UM2=0NMHCUgg03~ Op<=QlleHkaUEVrp*gdqX$x>7o1u&HMV7! zw35dr9tMVrf^uFa1|UdZ_$Y)oSwEp-vIeufK%>cphi>5u{!aV8IsC(PZ^6mo%(CI= zDoYsn-%Raz-8%K{)ERGDcD$K2rMQrxjzI`nU4gwq1xSz?yHs%zgT};#Dm@|+69Yp<0Rsc$l=D-W(kF8>%L~je;SQ`netW0u zbX!X+7*#R@=_ms+lnoS#>cnpaX>$WX^11XYs(;xMBKWfm7P zXiQwF!V_AYT6Dox%$w`JDGi>Ai5?2=aU*u=xYP*G6M a%ftW#=?fo)@cO1YR7_sVXfB8@SOEY78Zqhs delta 161 zcmcb>{FHe@ufTert#2wlWgw;hyI!9-S4Z=LtC%;}eaYQS3~W9OoXJJ0i6yBi zjwK}w0zO%ZWr_MZiFxVzKKXg+6TfD7^MQo)Ktg&TA?xlZ6VCK2-)CZA^kQHwOUx-v uttes;Kq&Gn%}q)zYFjf^mV3&BZYBnXiUI}(#wq8gGNn!KU^M51aVh|W;5hvN diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index e618db539..c28cfbb69 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -55,10 +55,5 @@ public static void main(String[] args) { User user = setupUser(userService); Channel channel = setupChannel(channelService); Message message = messageCreateTest(messageService, channel, user); - messageService.updateMessageContent(message, "this is new content"); - - FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"),Paths.get("./json/users.json")); - FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"),Paths.get("./json/messages.json")); - FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java new file mode 100644 index 000000000..fd7a331b7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.Instant; +import java.util.UUID; + +@Getter +public class BinaryContent { + private UUID id; + private Instant createdAt; + private byte[] content; + private String contentType; +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java new file mode 100644 index 000000000..c89742348 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.domain; + +import lombok.Getter; + +import java.time.Instant; +import java.util.UUID; + +@Getter +public class ReadStatus { + private UUID id; + private Instant createdAt; + private Instant updateAt; + private UUID userId; + private UUID channelId; + + public void updateLastReadTime() { + this.updateAt = Instant.now(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java new file mode 100644 index 000000000..a861af74e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -0,0 +1,18 @@ +package com.sprint.mission.discodeit.domain; + +import lombok.Getter; + +import java.time.Instant; +import java.util.UUID; + +@Getter +public class UserStatus { + private UUID id; + private Instant createdAt; + private Instant updateAt; + private Instant lastLoginAt; + + public boolean isUserOnline() { + return lastLoginAt.isAfter(Instant.now().minusSeconds(5 * 60)); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 7f69ae822..9d8cc6c16 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,6 +2,8 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -14,6 +16,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @Repository +@Primary public class FileChannelRepository implements ChannelRepository { private final Path filePath = Path.of("./result/channels.ser"); private final Map channelMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 1e063d86b..e4e3bdcfe 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -4,6 +4,8 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -16,6 +18,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @Repository +@Primary public class FileMessageRepository implements MessageRepository { private final Path filePath = Path.of("./result/messages.ser"); private final Map messageMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index dbd9a3061..238f2155c 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -2,6 +2,8 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -14,6 +16,7 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @Repository +@Primary public class FileUserRepository implements UserRepository { private final Path filePath = Path.of("./result/users.ser"); private final Map userMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 7cad19b57..381fef85d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,10 +2,12 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.stereotype.Repository; import java.util.*; import java.util.stream.Collectors; +@Repository public class JCFChannelRepository implements ChannelRepository { private final Map channelMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 021bc1b86..f62fdade1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -2,10 +2,13 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.stereotype.Repository; + import java.util.*; import java.util.stream.Collectors; +@Repository public class JCFMessageRepository implements MessageRepository { private final Map messageMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index f916a4d55..5dbebb8b1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -2,10 +2,13 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; import java.util.*; import java.util.stream.Collectors; +@Repository public class JCFUserRepository implements UserRepository { private final Map userMap; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index c680a80df..706dc0f71 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -7,6 +7,7 @@ import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.util.ChannelType; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index d161e8bd3..f571d6f0d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -10,6 +10,7 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index cf1b71215..0b6431180 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -6,6 +6,7 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.UserService; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; From 6fbc041905f72df56b656278e2ca5a67f4a8d156 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 5 Feb 2025 13:45:58 +0900 Subject: [PATCH 043/115] Add domain repository interface --- .../mission/discodeit/DiscodeitApplication.java | 2 +- .../mission/discodeit/domain/BinaryContent.java | 11 +++++++++-- .../com/sprint/mission/discodeit/domain/Message.java | 1 + .../sprint/mission/discodeit/domain/ReadStatus.java | 2 ++ .../com/sprint/mission/discodeit/domain/User.java | 1 + .../sprint/mission/discodeit/domain/UserStatus.java | 8 +++++--- .../discodeit/repository/BinaryContentRepository.java | 4 ++++ .../discodeit/repository/ReadStatusRepository.java | 4 ++++ .../discodeit/repository/UserStatusRepository.java | 4 ++++ .../mission/discodeit/util/BinaryContentType.java | 5 +++++ 10 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index c28cfbb69..db30168ad 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -56,4 +56,4 @@ public static void main(String[] args) { Channel channel = setupChannel(channelService); Message message = messageCreateTest(messageService, channel, user); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index fd7a331b7..a1c9acf4e 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -1,7 +1,7 @@ package com.sprint.mission.discodeit.domain; +import com.sprint.mission.discodeit.util.BinaryContentType; import lombok.Getter; -import lombok.RequiredArgsConstructor; import java.time.Instant; import java.util.UUID; @@ -11,5 +11,12 @@ public class BinaryContent { private UUID id; private Instant createdAt; private byte[] content; - private String contentType; + private BinaryContentType contentType; + + public BinaryContent(byte[] content, BinaryContentType contentType) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.content = content; + this.contentType = contentType; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index 749858780..b9526de5c 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -17,6 +17,7 @@ public class Message implements Serializable { private String content; private User writer; private Channel channel; + private String attachmentId; public Message(String content, User writer, Channel channel) { this.id = UUID.randomUUID(); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java index c89742348..2b7375e4a 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -3,6 +3,7 @@ import lombok.Getter; import java.time.Instant; +import java.time.LocalDateTime; import java.util.UUID; @Getter @@ -12,6 +13,7 @@ public class ReadStatus { private Instant updateAt; private UUID userId; private UUID channelId; + private LocalDateTime lastReadAt; public void updateLastReadTime() { this.updateAt = Instant.now(); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index 0b8b6b934..45cd04e77 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -18,6 +18,7 @@ public class User implements Serializable { private String name; private String phone; private String password; + private UUID profileImageId; public User(String name, String phone, String password) { this.id = UUID.randomUUID(); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index a861af74e..bac286062 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -3,6 +3,7 @@ import lombok.Getter; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.UUID; @Getter @@ -10,9 +11,10 @@ public class UserStatus { private UUID id; private Instant createdAt; private Instant updateAt; - private Instant lastLoginAt; + private UUID userId; + private Instant lastActiveAt; - public boolean isUserOnline() { - return lastLoginAt.isAfter(Instant.now().minusSeconds(5 * 60)); + public boolean isOnline() { + return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java new file mode 100644 index 000000000..88eb73b69 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.repository; + +public interface BinaryContentRepository { +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java new file mode 100644 index 000000000..349a04918 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.repository; + +public interface ReadStatusRepository { +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java new file mode 100644 index 000000000..c20b793e9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.repository; + +public interface UserStatusRepository { +} diff --git a/src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java b/src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java new file mode 100644 index 000000000..63ec5c8e8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util; + +public enum BinaryContentType { + IMAGE, FILE +} \ No newline at end of file From f19bedc9415afe4c0d36394c66c4128119b5edc3 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 5 Feb 2025 16:15:59 +0900 Subject: [PATCH 044/115] Update code --- .../mission/discodeit/domain/Channel.java | 2 + .../mission/discodeit/domain/Message.java | 2 + .../mission/discodeit/domain/ReadStatus.java | 2 +- .../sprint/mission/discodeit/domain/User.java | 8 ++- .../mission/discodeit/domain/UserStatus.java | 17 +++++-- .../discodeit/dto/user/FindUserDto.java | 13 +++++ .../discodeit/dto/user/UserCreateRequest.java | 12 +++++ .../mission/discodeit/dto/user/UserDto.java | 10 ++++ .../mission/discodeit/error/ErrorCode.java | 3 +- .../repository/BinaryContentRepository.java | 6 +++ .../discodeit/repository/UserRepository.java | 5 ++ .../repository/UserStatusRepository.java | 7 +++ .../repository/file/FileUserRepository.java | 12 +++++ .../repository/jcf/JCFUserRepository.java | 12 +++++ .../discodeit/service/UserService.java | 6 ++- .../service/basic/BasicUserService.java | 49 ++++++++++++++----- .../mission/discodeit/util/OnlineStatus.java | 5 ++ 17 files changed, 151 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index 8b7e206d3..6b1ffc3f1 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.util.ChannelType; import lombok.Getter; +import lombok.Setter; import java.io.Serializable; import java.time.Instant; @@ -12,6 +13,7 @@ import java.util.UUID; @Getter +@Setter public class Channel implements Serializable { private UUID id; private Instant createdAt; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index b9526de5c..f106e3318 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.domain; import lombok.Getter; +import lombok.Setter; import java.io.Serializable; import java.time.Instant; @@ -10,6 +11,7 @@ import java.util.UUID; @Getter +@Setter public class Message implements Serializable { private UUID id; private Instant createdAt; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java index 2b7375e4a..7f19a9e60 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -7,7 +7,7 @@ import java.util.UUID; @Getter -public class ReadStatus { +public class ReadStatus { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 private UUID id; private Instant createdAt; private Instant updateAt; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index 45cd04e77..d3aad49bd 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.domain; import lombok.Getter; +import lombok.Setter; import java.io.Serializable; import java.time.Instant; @@ -8,9 +9,11 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Objects; +import java.util.Optional; import java.util.UUID; @Getter +@Setter public class User implements Serializable { private UUID id; private Instant createdAt; @@ -18,15 +21,16 @@ public class User implements Serializable { private String name; private String phone; private String password; - private UUID profileImageId; + private Optional profileImageId; - public User(String name, String phone, String password) { + public User(String name, String phone, String password, Optional profileImageId) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); this.name = name; this.phone = phone; this.password = password; + this.profileImageId = profileImageId; } public void update(String password) { diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index bac286062..f6b1630c9 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.domain; +import com.sprint.mission.discodeit.util.OnlineStatus; import lombok.Getter; import java.time.Instant; @@ -7,14 +8,24 @@ import java.util.UUID; @Getter -public class UserStatus { +public class UserStatus { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 + + private UUID id; private Instant createdAt; private Instant updateAt; private UUID userId; private Instant lastActiveAt; - public boolean isOnline() { - return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; + public UserStatus(UUID userId) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.updateAt = Instant.now(); + this.userId = userId; + this.lastActiveAt = Instant.now(); + } + + public OnlineStatus isOnline() { + return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5 ? OnlineStatus.ACTIVE : OnlineStatus.SLEEP; } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java new file mode 100644 index 000000000..7c4fe89ca --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto.user; + +import com.sprint.mission.discodeit.domain.UserStatus; + +import java.util.UUID; + +public record FindUserDto( + UUID id, + String userName, + String phone, + UserStatus userStatus +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java new file mode 100644 index 000000000..5d008812c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.user; + +import java.util.UUID; + +public record UserCreateRequest ( + String name, + String phone, + String password, + UUID profileImageId +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java new file mode 100644 index 000000000..11cbb7469 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.user; + +import java.util.UUID; + +public record UserDto( + UUID id, + String name, + String phone +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java index a2f7164e9..77ee2b783 100644 --- a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java @@ -12,7 +12,8 @@ public enum ErrorCode { CANNOT_FOUND_CHANNEL("해당 채널을 찾을 수가 없습니다."), CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"), - DUPLICATE_PHONE("이미 존재하는 아이디 입니다."), + DUPLICATE_NAME("이미 등록된 사용자 이름입니다."), + DUPLICATE_PHONE("이미 등록된 핸드폰 번호 입니다."), DUPLICATE_CHANNEL("이미 존재하는 채널 이름 입니다."), INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 88eb73b69..e6cfe013d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -1,4 +1,10 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.domain.BinaryContent; + +import java.util.Optional; +import java.util.UUID; + public interface BinaryContentRepository { + Optional findById(UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index f11aab11c..8eb03f210 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -4,12 +4,17 @@ import java.util.List; import java.util.Optional; +import java.util.UUID; public interface UserRepository { User save(User user); Optional findByPhone(String phone); + Optional findByName(String name); + + Optional findById(UUID userId); + List findAll(); User delete(User user); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index c20b793e9..184d128ab 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -1,4 +1,11 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.domain.UserStatus; + +import java.util.UUID; + public interface UserStatusRepository { + UserStatus save(UserStatus userStatus); + + UserStatus findByUserId(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 238f2155c..495d5e1fd 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -47,6 +47,18 @@ public Optional findByPhone(String phone) { .findFirst(); } + @Override + public Optional findByName(String name) { + return userMap.values().stream() + .filter(user -> user.getName().equals(name)) + .findFirst(); + } + + @Override + public Optional findById(UUID userId) { + return Optional.ofNullable(userMap.get(userId)); + } + @Override public List findAll() { return userMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 5dbebb8b1..51d3c5d1a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -29,6 +29,18 @@ public Optional findByPhone(String phone) { .findFirst(); } + @Override + public Optional findByName(String name) { + return userMap.values().stream() + .filter(user -> user.getName().equals(name)) + .findFirst(); + } + + @Override + public Optional findById(UUID userId) { + return Optional.ofNullable(userMap.get(userId)); + } + @Override public List findAll() { return userMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 4299f38b3..9ee1915a8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,14 +1,16 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.user.FindUserDto; +import com.sprint.mission.discodeit.dto.user.UserCreateRequest; import java.util.List; import java.util.Optional; public interface UserService { - User create(String name, String phone, String password); + User create(UserCreateRequest request); - Optional getUserByPhone(String phone); + FindUserDto getUserByPhone(String phone); List getAllUser(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 0b6431180..42ee812a3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,12 +1,18 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.user.FindUserDto; +import com.sprint.mission.discodeit.dto.user.UserCreateRequest; +import com.sprint.mission.discodeit.dto.user.UserDto; import com.sprint.mission.discodeit.error.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -17,28 +23,49 @@ @RequiredArgsConstructor public class BasicUserService implements UserService { private final UserRepository userRepository; + private final BinaryContentRepository binaryContentRepository; + private final UserStatusRepository userStatusRepository; @Override - public User create(String name, String phone, String password) { - if (!User.isValidPassword(password)) { + public UserDto create(UserCreateRequest userCreateRequest) { + if (!User.isValidPassword(userCreateRequest.password())) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } - if (!User.isValidPhone(phone)) { + if (!User.isValidPhone(userCreateRequest.phone())) { throw new ServiceException(ErrorCode.INVALID_WRITER); } - userRepository.findByPhone(phone).ifPresent(user -> { - throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); + userRepository.findByPhone(userCreateRequest.phone()).ifPresent(x -> { + throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); // 저는 이메일 대신 핸드폰 번호로 했습니다 - User user = new User(name, phone, password); - userRepository.save(user); - return user; + userRepository.findByName(userCreateRequest.name()).ifPresent(x -> { + throw new ServiceException(ErrorCode.DUPLICATE_NAME);}); // 유저의 이름이 같으면 안된다. + + BinaryContent profile = userCreateRequest.profileImageId() == null + ? binaryContentRepository.findById(userCreateRequest.profileImageId()) .orElseThrow()// UserCreateRequest에서 profileImageId가 null이 아니면 가져오기 + : null; + + User createdUser = new User( + userCreateRequest.name(), + userCreateRequest.phone(), + userCreateRequest.password(), + Optional.ofNullable(profile).map(BinaryContent::getId) + ); + + userRepository.save(createdUser); + + UserStatus userStatus = new UserStatus(createdUser.getId()); // UserStatus 생성 + userStatusRepository.save(userStatus); + + return new UserDto(createdUser.getId(), createdUser.getName(), createdUser.getPhone()); } @Override - public Optional getUserByPhone(String phone) { - return userRepository.findByPhone(phone); + public FindUserDto getUserByPhone(String phone) { + Optional findUser = userRepository.findByPhone(phone); + UserStatus userStatus = userStatusRepository.findByUserId(findUser.get().getId()); + return new FindUserDto(findUser.get().getId(), findUser.get().getName(), findUser.get().getPhone(), userStatus); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java b/src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java new file mode 100644 index 000000000..e3cbd4a75 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util; + +public enum OnlineStatus { + ACTIVE, SLEEP +} From e826288ec05edde0d258274199fddd41796e6a42 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 7 Feb 2025 11:15:48 +0900 Subject: [PATCH 045/115] Change code sprint3 --- .../discodeit/DiscodeitApplication.java | 4 +- .../mission/discodeit/JavaApplication.java | 186 ------------------ .../discodeit/domain/BinaryContent.java | 6 +- .../mission/discodeit/domain/Channel.java | 14 +- .../mission/discodeit/domain/ReadStatus.java | 11 ++ .../sprint/mission/discodeit/domain/User.java | 16 +- .../mission/discodeit/domain/UserStatus.java | 10 +- .../channel/PrivateChannelCreateRequest.java | 11 ++ .../dto/channel/PrivateChannelDto.java | 13 ++ .../channel/PublicChannelCreateRequest.java | 12 ++ .../discodeit/dto/login/LoginRequest.java | 7 + .../discodeit/dto/user/CreateUser.java | 33 ++++ .../discodeit/dto/user/UpdateUser.java | 33 ++++ .../discodeit/dto/user/UserCreateRequest.java | 12 -- .../user/{FindUserDto.java => UserDTO.java} | 2 +- .../mission/discodeit/dto/user/UserDto.java | 10 - .../{error => exception}/ErrorCode.java | 9 +- .../discodeit/exception/ServiceException.java | 1 - .../repository/FileRepositoryFactory.java | 40 ---- .../repository/JCFRepositoryFactory.java | 40 ---- .../factory/repository/RepositoryFactory.java | 13 -- .../factory/service/FileServiceFactory.java | 42 ---- .../factory/service/JCFServiceFactory.java | 42 ---- .../factory/service/ServiceFactory.java | 11 -- .../repository/BinaryContentRepository.java | 2 + .../repository/ReadStatusRepository.java | 3 + .../repository/UserStatusRepository.java | 5 +- .../discodeit/service/AuthService.java | 24 +++ .../discodeit/service/ChannelService.java | 9 +- .../discodeit/service/UserService.java | 14 +- .../service/basic/BasicChannelService.java | 31 ++- .../service/basic/BasicMessageService.java | 3 +- .../service/basic/BasicUserService.java | 80 ++++---- .../service/file/FileChannelService.java | 92 --------- .../service/file/FileMessageService.java | 107 ---------- .../service/file/FileUserService.java | 91 --------- .../service/jcf/JCFChannelService.java | 72 ------- .../service/jcf/JCFMessageService.java | 91 --------- .../discodeit/service/jcf/JCFUserService.java | 71 ------- .../mission/discodeit/util/ChannelType.java | 5 - .../mission/discodeit/util/FileIOUtil.java | 26 +-- .../mission/discodeit/util/OnlineStatus.java | 5 - .../util/{ => type}/BinaryContentType.java | 2 +- .../discodeit/util/type/ChannelFormat.java | 5 + .../discodeit/util/type/ChannelType.java | 5 + .../discodeit/util/type/OnlineStatusType.java | 5 + .../discodeit/util/type/ProfileUse.java | 5 + src/test/java/RepositoryTest.java | 106 ---------- 48 files changed, 306 insertions(+), 1131 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/JavaApplication.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java rename src/main/java/com/sprint/mission/discodeit/dto/user/{FindUserDto.java => UserDTO.java} (89%) delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java rename src/main/java/com/sprint/mission/discodeit/{error => exception}/ErrorCode.java (74%) delete mode 100644 src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/AuthService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/ChannelType.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java rename src/main/java/com/sprint/mission/discodeit/util/{ => type}/BinaryContentType.java (51%) create mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java create mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java delete mode 100644 src/test/java/RepositoryTest.java diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index db30168ad..121ce5191 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -3,12 +3,10 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.factory.service.FileServiceFactory; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.ChannelType; -import com.sprint.mission.discodeit.util.FileIOUtil; +import com.sprint.mission.discodeit.util.type.ChannelType; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; diff --git a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java b/src/main/java/com/sprint/mission/discodeit/JavaApplication.java deleted file mode 100644 index f68318152..000000000 --- a/src/main/java/com/sprint/mission/discodeit/JavaApplication.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.factory.service.FileServiceFactory; -import com.sprint.mission.discodeit.factory.service.JCFServiceFactory; -import com.sprint.mission.discodeit.factory.service.ServiceFactory; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.ChannelType; -import com.sprint.mission.discodeit.util.FileIOUtil; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.Optional; - -public class JavaApplication { - public static void main(String[] args) { -// Factory factory = JCFFactory.getInstance(); - ServiceFactory factory = JCFServiceFactory.getInstance(); - UserService userService = factory.getUserService(); - ChannelService channelService = factory.getChannelService(); - MessageService messageService = factory.getMessageService(); - - try { - Files.deleteIfExists(Paths.get("./result/users.ser")); - Files.deleteIfExists(Paths.get("./result/messages.ser")); - Files.deleteIfExists(Paths.get("./result/channels.ser")); - } catch (IOException e) { - System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); - } - System.out.println("<회원 생성하기>"); - User user1 = userService.create("김민준", "010-1111-1111", "Abcdefgh12312!"); - User user2 = userService.create("이서윤", "010-2222-1111", "Abcdefgh12312!!"); - User user3 = userService.create("박지훈", "010-3333-1111", "Abcdefgh12312!!"); - User user4 = userService.create("이채은", "010-4444-1111", "Abcdefgh12312!!"); - User user5 = userService.create("정다은", "010-5555-1111", "Abcdefgh12312!!"); - System.out.println(" - 회원 생성 시 발생할 수 있는 문제"); - System.out.print(" - 1. 동일한 전화번호로 회원 가입을 진행 : "); - try { - User user1_1 = userService.create("홍지훈", "010-1111-1111", "Abcdefgh!"); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.print(" - 2. 올바르지 않은 전화번호 형식 : "); - try { - User unCorrectPhone = userService.create("김철수", "010-12345-12345", "Abcdefgh!"); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.print(" - 3. 올바르지 않은 비밀번호 형식 : "); - try { - User unCorrectPass = userService.create("김영미", "010-1234-4321", "1234"); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.println("회원 생성 시 문제가 발생하면 저장되지 않음을 확인: " + userService.getAllUser()); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<회원 전체 조회하기>"); - List users = userService.getAllUser(); - System.out.println(users); - System.out.println(); - System.out.println("<단일 회원 조회하기>"); - Optional findUser1 = userService.getUserByPhone("010-1111-1111"); - System.out.println("findUser : " + findUser1); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<회원 비밀번호 업데이트 하기>"); - userService.updateUserPassword(user1, "Zdefdasdf!@"); - System.out.println("UpdatePassword : " + user1); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<회원 정보 삭제하기>"); - userService.delete(user1); - System.out.println(userService.getAllUser()); - System.out.print(" - 회원 삭제 시 저장되어 있지 않는 회원일 경우 문제가 발생 : "); - try { - User unRegisterUser = new User("김미영", "010-4343-3434", "Rasdffa1234!"); - userService.delete(unRegisterUser); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<채널 생성하기>"); - Channel channel1 = channelService.create("코드잇 디스코드", "코드잇용 디스코드 채널입니다.", ChannelType.TEXT); - Channel channel2 = channelService.create("코테 준비", "코테 준비용 채널입니다.", ChannelType.VOICE); - messageService.create("열심히 공부하는 코테 준비 채널입니다!", user4, channel2); - messageService.create("열심히 하겠습니다!!", user3, channel2); - User channelCreator = userService.create("김자바", "010-8739-9343", "Abcdefgh!"); - Channel javaChannel = channelService.create("자바 공부합시다", "자바 공부용 채널입니다.", ChannelType.TEXT); - System.out.println(channel1); - System.out.println(channel2); - System.out.println(" - 채널 생성 시 발생할 수 있는 문제"); - System.out.print(" - 기존 채널과 동일한 이름으로 채널을 개설하는 경우 : "); - try { - Channel sameChannel = channelService.create("코드잇 디스코드", "이 방도 코드잇 디스코드 방입니다.", ChannelType.VOICE); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.println("<채널 설명 변경하기>"); - channelService.updateDescription(channel1, "코드잇 디스코드 채널에 오신 것을 환영합니다."); - System.out.println(channel1); - System.out.println("<채널 타입 변경하기>"); - channelService.updateType(channel1, ChannelType.VOICE); - System.out.println(channel1); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<채널 단일 조회하기>"); - System.out.println("코드잇 디스코드 채널 찾기 : " + channelService.getChannelByName("코드잇 디스코드")); - System.out.println("<전체 채널 조회하기>"); - System.out.println(channelService.getAllChannel()); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<메시지 생성하기>"); - Message message2_1 = messageService.create("안녕하세요 지훈님 저는 이서윤이라고 합니다.", user2, channel1); - Message message2_2 = messageService.create("저는 요즘 스프링에 대해 공부하고 있습니다^^", user2, channel2); - Message message3_1 = messageService.create("테스트 확인 용 메시지입니다!", user3, channel2); - System.out.println(message2_1); - Message message3 = messageService.create("네 만나서 반갑습니다!", user3, channel1); - System.out.println(message3); - System.out.println(" - 메시지 생성 시 발생할 수 있는 문제"); - System.out.print(" - 1. 내용이 작성되지 않은 메시지 : "); - try { - Message message4 = messageService.create("", user4, channel1); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.print(" - 2. 등록되지 않은 회원이 메시지를 보낼 때 : "); - User unRegistUser1 = new User("미등록회원", "010-1919-9191", "Abcdefgh!"); - try { - Message unregistMessage = messageService.create("안녕하세요 만나서 반갑습니다", unRegistUser1, channel1); - } catch (Exception e) { - System.out.println(e.getMessage()); - } - System.out.println(); - System.out.println("user2 = " + user2); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<특정 채널에서 전체 메시지 조회하기>"); - System.out.print("코드잇 채널 전체 메시지 조회"); - List allMessages = messageService.getMessageWithChannel(channel1); - System.out.println(allMessages); - System.out.println(); - System.out.print("코테 준비 채널 전체 메시지 조회"); - List allMessages2 = messageService.getMessageWithChannel(channel2); - System.out.println(allMessages2); - System.out.println("<단일 메시지 조회하기>"); - Optional getMessage = messageService.getMessage(message2_2.getId()); - System.out.println(getMessage); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<메시지 내용 수정하기>"); - messageService.updateMessageContent(message2_1, "메시지 내용 업데이트"); - System.out.println(message2_1); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - System.out.println("<메시지 삭제하기>"); - messageService.deleteMessage(message2_1.getId()); - System.out.println("전체 메시지 조회하기: " + messageService.getAllMessage()); - System.out.println("채널 삭제하기 : "); - channelService.delete(channel1); - System.out.println(channelService.getAllChannel()); - System.out.println(); - System.out.println("==============================================================================="); - System.out.println(); - if (factory instanceof FileServiceFactory) { - FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); - FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); - FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index a1c9acf4e..9c8b0480d 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.BinaryContentType; +import com.sprint.mission.discodeit.util.type.BinaryContentType; import lombok.Getter; import java.time.Instant; @@ -19,4 +19,8 @@ public BinaryContent(byte[] content, BinaryContentType contentType) { this.content = content; this.contentType = contentType; } + + public void updateContent(byte[] newContent) { + this.content = newContent; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index 6b1ffc3f1..c82f74cff 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -1,14 +1,12 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.ChannelType; +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Getter; import lombok.Setter; import java.io.Serializable; import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.Objects; import java.util.UUID; @@ -20,14 +18,16 @@ public class Channel implements Serializable { private Instant updatedAt; private String name; private String description; + private ChannelFormat channelFormat; private ChannelType channelType; - public Channel(String name, String description, ChannelType channelType) { + public Channel(String name, String description, ChannelFormat channelFormat, ChannelType channelType) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); this.name = name; this.description = description; + this.channelFormat = channelFormat; this.channelType = channelType; } @@ -43,8 +43,8 @@ public int hashCode() { return Objects.hashCode(name); } - public void changeType(ChannelType channelType) { - this.channelType = channelType; + public void changeFormat(ChannelFormat channelFormat) { + this.channelFormat = channelFormat; this.updatedAt = Instant.now(); } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java index 7f19a9e60..94c9116ae 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -1,12 +1,14 @@ package com.sprint.mission.discodeit.domain; import lombok.Getter; +import lombok.Setter; import java.time.Instant; import java.time.LocalDateTime; import java.util.UUID; @Getter +@Setter public class ReadStatus { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 private UUID id; private Instant createdAt; @@ -15,6 +17,15 @@ public class ReadStatus { // 사용자가 채널 별 마지막 메시지를 읽 private UUID channelId; private LocalDateTime lastReadAt; + public ReadStatus(UUID userId, UUID channelId) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.updateAt = Instant.now(); + this.userId = userId; + this.channelId = channelId; + this.lastReadAt = null; + } + public void updateLastReadTime() { this.updateAt = Instant.now(); } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index d3aad49bd..292d6d78d 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -21,9 +21,10 @@ public class User implements Serializable { private String name; private String phone; private String password; - private Optional profileImageId; + private UUID profileImageId; + private UUID userStatusId; - public User(String name, String phone, String password, Optional profileImageId) { + public User(String name, String phone, String password, UUID profileImageId, UUID userStatusId) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); @@ -31,6 +32,7 @@ public User(String name, String phone, String password, Optional profileIm this.phone = phone; this.password = password; this.profileImageId = profileImageId; + this.userStatusId = userStatusId; } public void update(String password) { @@ -50,15 +52,15 @@ public static boolean isValidPhone(String phoneNumber) { } @Override - public boolean equals(Object object) { - if (object == null || getClass() != object.getClass()) return false; - User user = (User) object; - return Objects.equals(phone, user.phone); + public boolean equals(Object o) { // User 객체는 UUID, name, phone 3개의 필드가 동일하면 같은 유저라고 판단한다. + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(phone, user.phone); } @Override public int hashCode() { - return Objects.hashCode(phone); + return Objects.hash(id, name, phone); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index f6b1630c9..95e166bd7 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.OnlineStatus; +import com.sprint.mission.discodeit.util.type.OnlineStatusType; import lombok.Getter; import java.time.Instant; @@ -14,18 +14,16 @@ public class UserStatus { // 사용자 별 마지막으로 확인된 접속 시 private UUID id; private Instant createdAt; private Instant updateAt; - private UUID userId; private Instant lastActiveAt; - public UserStatus(UUID userId) { + public UserStatus() { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updateAt = Instant.now(); - this.userId = userId; this.lastActiveAt = Instant.now(); } - public OnlineStatus isOnline() { - return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5 ? OnlineStatus.ACTIVE : OnlineStatus.SLEEP; + public OnlineStatusType isOnline() { + return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5 ? OnlineStatusType.ACTIVE : OnlineStatusType.SLEEP; } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java new file mode 100644 index 000000000..be57e396e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.channel; + +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; + +import java.util.List; +import java.util.UUID; + +public record PrivateChannelCreateRequest(UUID channelId, ChannelFormat channelFormat, List users) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java new file mode 100644 index 000000000..0c2cf4522 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto.channel; + +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; + +import java.util.UUID; + +public record PrivateChannelDto( + UUID channelId, + ChannelType channelType, + ChannelFormat channelFormat +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java new file mode 100644 index 000000000..79340a472 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.channel; + +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; + +import java.util.List; + +public record PublicChannelCreateRequest( + String name, String description, ChannelFormat channelFormat, List users +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java new file mode 100644 index 000000000..43bbeedbd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.login; + +public record LoginRequest( + String userName, + String password +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java new file mode 100644 index 000000000..b097febdb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.dto.user; + +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.util.type.ProfileUse; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +import java.util.UUID; + +public class CreateUser { + @Getter + @Setter + @AllArgsConstructor + public static class Request { + @NonNull + private String name; + @NonNull + private String phone; + @NonNull + private String password; + private UUID profileId; + } + + @Getter + @Setter + @AllArgsConstructor + public static class Response { + private UUID userId; + private ProfileUse profileUse; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java new file mode 100644 index 000000000..f12479a1a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.dto.user; + +import com.sprint.mission.discodeit.util.type.ProfileUse; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +import java.util.UUID; + +public class UpdateUser { + @Getter + @Setter + @AllArgsConstructor + public static class Request { + @NonNull + private UUID userId; + + @NonNull + private UUID profileId; + + private byte[] content; + } + + + @Getter + @Setter + @AllArgsConstructor + public static class Response { + private UUID userId; + private ProfileUse profileUse; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java deleted file mode 100644 index 5d008812c..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserCreateRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import java.util.UUID; - -public record UserCreateRequest ( - String name, - String phone, - String password, - UUID profileImageId -) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java similarity index 89% rename from src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java rename to src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index 7c4fe89ca..b31b37705 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/FindUserDto.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -4,7 +4,7 @@ import java.util.UUID; -public record FindUserDto( +public record UserDTO( UUID id, String userName, String phone, diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java deleted file mode 100644 index 11cbb7469..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDto.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import java.util.UUID; - -public record UserDto( - UUID id, - String name, - String phone -) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java similarity index 74% rename from src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java rename to src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index 77ee2b783..ec50fbf6b 100644 --- a/src/main/java/com/sprint/mission/discodeit/error/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.error; +package com.sprint.mission.discodeit.exception; import lombok.AllArgsConstructor; import lombok.Getter; @@ -11,6 +11,8 @@ public enum ErrorCode { CANNOT_FOUND_MESSAGE("보낸 메시지가 없습니다"), CANNOT_FOUND_CHANNEL("해당 채널을 찾을 수가 없습니다."), CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"), + CANNOT_FOUND_PROFILE("해당하는 프로필 데이터를 찾을 수 없습니다"), + CANNOT_FOUND_USERSTATUS("해당하는 사용자의 상태 정보를 찾을 수 없습니다"), DUPLICATE_NAME("이미 등록된 사용자 이름입니다."), DUPLICATE_PHONE("이미 등록된 핸드폰 번호 입니다."), @@ -18,7 +20,10 @@ public enum ErrorCode { INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), INVALID_WRITER("작성자가 올바르지 않습니다"), - INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."); + INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), + + PASSWORD_MISMATCH("비밀번호가 일치하지 않습니다"); + private final String description; } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java index dcb892263..0e3b721b5 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.exception; -import com.sprint.mission.discodeit.error.ErrorCode; import lombok.Getter; @Getter diff --git a/src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java deleted file mode 100644 index 6f88fa9a0..000000000 --- a/src/main/java/com/sprint/mission/discodeit/factory/repository/FileRepositoryFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sprint.mission.discodeit.factory.repository; - -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.file.FileChannelRepository; -import com.sprint.mission.discodeit.repository.file.FileMessageRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; - -public class FileRepositoryFactory implements RepositoryFactory { - private static FileRepositoryFactory instance; - private final UserRepository userRepository; - private final ChannelRepository channelRepository; - private final MessageRepository messageRepository; - - private FileRepositoryFactory() { - this.userRepository = new FileUserRepository(); - this.channelRepository = new FileChannelRepository(); - this.messageRepository = new FileMessageRepository(); - } - - public static FileRepositoryFactory getInstance() { - if (instance == null) { - return new FileRepositoryFactory(); - } - return instance; - } - - public UserRepository getUserRepository() { - return userRepository; - } - - public MessageRepository getMessageRepository() { - return messageRepository; - } - - public ChannelRepository getChannelRepository() { - return channelRepository; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java deleted file mode 100644 index ccef04297..000000000 --- a/src/main/java/com/sprint/mission/discodeit/factory/repository/JCFRepositoryFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sprint.mission.discodeit.factory.repository; - -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFChannelRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFMessageRepository; -import com.sprint.mission.discodeit.repository.jcf.JCFUserRepository; - -public class JCFRepositoryFactory implements RepositoryFactory { - private static JCFRepositoryFactory instance; - private final UserRepository userRepository; - private final ChannelRepository channelRepository; - private final MessageRepository messageRepository; - - private JCFRepositoryFactory() { - this.userRepository = new JCFUserRepository(); - this.channelRepository = new JCFChannelRepository(); - this.messageRepository = new JCFMessageRepository(); - } - - public static JCFRepositoryFactory getInstance() { - if (instance == null) { - return new JCFRepositoryFactory(); - } - return instance; - } - - public UserRepository getUserRepository() { - return userRepository; - } - - public MessageRepository getMessageRepository() { - return messageRepository; - } - - public ChannelRepository getChannelRepository() { - return channelRepository; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java deleted file mode 100644 index 01eeade4e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/factory/repository/RepositoryFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit.factory.repository; - -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; - -public interface RepositoryFactory { - UserRepository getUserRepository(); - - MessageRepository getMessageRepository(); - - ChannelRepository getChannelRepository(); -} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java deleted file mode 100644 index 2ef08b4f5..000000000 --- a/src/main/java/com/sprint/mission/discodeit/factory/service/FileServiceFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.sprint.mission.discodeit.factory.service; - -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.file.FileChannelService; -import com.sprint.mission.discodeit.service.file.FileMessageService; -import com.sprint.mission.discodeit.service.file.FileUserService; - -public class FileServiceFactory implements ServiceFactory { - private static FileServiceFactory instance; - private final UserService userService; - private final MessageService messageService; - private final ChannelService channelService; - - private FileServiceFactory() { - this.userService = new FileUserService(); - this.channelService = new FileChannelService(); - this.messageService = new FileMessageService(userService, channelService); - } - - public static FileServiceFactory getInstance() { - if (instance == null) { - instance = new FileServiceFactory(); - } - return instance; - } - @Override - public UserService getUserService() { - return userService; - } - - @Override - public MessageService getMessageService() { - return messageService; - } - - @Override - public ChannelService getChannelService() { - return channelService; - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java deleted file mode 100644 index 3a395f487..000000000 --- a/src/main/java/com/sprint/mission/discodeit/factory/service/JCFServiceFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.sprint.mission.discodeit.factory.service; - -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.jcf.JCFChannelService; -import com.sprint.mission.discodeit.service.jcf.JCFMessageService; -import com.sprint.mission.discodeit.service.jcf.JCFUserService; - -public class JCFServiceFactory implements ServiceFactory { - private static JCFServiceFactory instance; - private final UserService userService; - private final MessageService messageService; - private final ChannelService channelService; - - private JCFServiceFactory() { - this.userService = new JCFUserService(); - this.channelService = new JCFChannelService(); - this.messageService = new JCFMessageService(userService, channelService); - } - - public static JCFServiceFactory getInstance() { - if (instance == null) { - instance = new JCFServiceFactory(); - } - return instance; - } - @Override - public UserService getUserService() { - return userService; - } - - @Override - public MessageService getMessageService() { - return messageService; - } - - @Override - public ChannelService getChannelService() { - return channelService; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java b/src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java deleted file mode 100644 index 292615af0..000000000 --- a/src/main/java/com/sprint/mission/discodeit/factory/service/ServiceFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sprint.mission.discodeit.factory.service; - -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -public interface ServiceFactory { - UserService getUserService(); - MessageService getMessageService(); - ChannelService getChannelService(); -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index e6cfe013d..1ffdaf209 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -7,4 +7,6 @@ public interface BinaryContentRepository { Optional findById(UUID uuid); + + void deleteById(UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 349a04918..0155e2066 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -1,4 +1,7 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.domain.ReadStatus; + public interface ReadStatusRepository { + ReadStatus save(ReadStatus readStatus); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index 184d128ab..34bc53f8a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -2,10 +2,13 @@ import com.sprint.mission.discodeit.domain.UserStatus; +import java.util.Optional; import java.util.UUID; public interface UserStatusRepository { UserStatus save(UserStatus userStatus); - UserStatus findByUserId(UUID userId); + Optional findById(UUID uuid); + + void deleteById(UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java new file mode 100644 index 000000000..7caca39f8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.login.LoginRequest; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AuthService { + private final UserRepository userRepository; + + public UserDto login(LoginRequest request) { + User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + + if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 + throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); + } + return new UserDto(findUser.getId(), findUser.getName(), findUser.getPhone()); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 71b047a5c..cc688d482 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,14 +1,17 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.util.ChannelType; +import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest; +import com.sprint.mission.discodeit.dto.channel.PrivateChannelDto; +import com.sprint.mission.discodeit.util.type.ChannelType; import java.util.List; import java.util.Optional; -import java.util.UUID; public interface ChannelService { - Channel create(String name, String description, ChannelType channelType); + Channel createPublicChannel(ChannelCreateRequest request); + + PrivateChannelDto createPrivateChannel(ChannelCreateRequest request); Optional getChannelByName(String name); diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 9ee1915a8..c41cc031e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,20 +1,22 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.user.CreateUser; import com.sprint.mission.discodeit.dto.user.FindUserDto; -import com.sprint.mission.discodeit.dto.user.UserCreateRequest; +import com.sprint.mission.discodeit.dto.user.UpdateUser; +import com.sprint.mission.discodeit.dto.user.UserDTO; import java.util.List; -import java.util.Optional; +import java.util.UUID; public interface UserService { - User create(UserCreateRequest request); + CreateUser.Response create(CreateUser.Request request); - FindUserDto getUserByPhone(String phone); + UserDTO find(UUID userId); - List getAllUser(); + List findAll(); - User updateUserPassword(User user, String newPass); + UpdateUser.Response update(UpdateUser.Request request); void delete(User removeUser); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 706dc0f71..d51cd7985 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,13 +1,19 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest; +import com.sprint.mission.discodeit.dto.channel.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.channel.PrivateChannelDto; +import com.sprint.mission.discodeit.dto.channel.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.util.ChannelType; +import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; @@ -17,16 +23,29 @@ @RequiredArgsConstructor public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; + private final ReadStatusRepository readStatusRepository; @Override - public Channel create(String name, String description, ChannelType channelType) { - channelRepository.findByName(name).ifPresent(channel -> { + public Channel createPublicChannel(PublicChannelCreateRequest request) { + channelRepository.findByName(request.name()).ifPresent(channel -> { throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL);}); - Channel channel = new Channel(name, description, channelType); + Channel channel = new Channel(request.name(), request.description(), request.channelFormat(), ChannelType.PUBLIC); channelRepository.save(channel); return channel; } + @Override + public PrivateChannelDto createPrivateChannel(PrivateChannelCreateRequest request) { + List users = request.users(); + for (User user : users) { + ReadStatus readStatus = new ReadStatus(user.getId(), request.channelId()); + readStatusRepository.save(readStatus); + } + + Channel channel = new Channel(null, null, request.channelFormat(), ChannelType.PRIVATE); + channelRepository.save(channel); + return new PrivateChannelDto(channel.getId(), channel.getChannelType(), channel.getChannelFormat()); + } @Override public Optional getChannelByName(String name) { return channelRepository.findByName(name); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index f571d6f0d..737ed7ff3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -3,14 +3,13 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 42ee812a3..372a5e7cb 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -3,21 +3,24 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.dto.user.FindUserDto; -import com.sprint.mission.discodeit.dto.user.UserCreateRequest; -import com.sprint.mission.discodeit.dto.user.UserDto; -import com.sprint.mission.discodeit.error.ErrorCode; +import com.sprint.mission.discodeit.dto.user.CreateUser; +import com.sprint.mission.discodeit.dto.user.UpdateUser; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.type.ProfileUse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -27,68 +30,71 @@ public class BasicUserService implements UserService { private final UserStatusRepository userStatusRepository; @Override - public UserDto create(UserCreateRequest userCreateRequest) { - if (!User.isValidPassword(userCreateRequest.password())) { + public CreateUser.Response create(CreateUser.Request request) { + if (!User.isValidPassword(request.getPassword())) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } - if (!User.isValidPhone(userCreateRequest.phone())) { + if (!User.isValidPhone(request.getPhone())) { throw new ServiceException(ErrorCode.INVALID_WRITER); } - userRepository.findByPhone(userCreateRequest.phone()).ifPresent(x -> { + userRepository.findByPhone(request.getPhone()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); // 저는 이메일 대신 핸드폰 번호로 했습니다 - userRepository.findByName(userCreateRequest.name()).ifPresent(x -> { + userRepository.findByName(request.getName()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_NAME);}); // 유저의 이름이 같으면 안된다. - BinaryContent profile = userCreateRequest.profileImageId() == null - ? binaryContentRepository.findById(userCreateRequest.profileImageId()) .orElseThrow()// UserCreateRequest에서 profileImageId가 null이 아니면 가져오기 - : null; - - User createdUser = new User( - userCreateRequest.name(), - userCreateRequest.phone(), - userCreateRequest.password(), - Optional.ofNullable(profile).map(BinaryContent::getId) - ); - - userRepository.save(createdUser); + if (request.getProfileId() != null) { + binaryContentRepository.findById(request.getProfileId()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + } - UserStatus userStatus = new UserStatus(createdUser.getId()); // UserStatus 생성 + UserStatus userStatus = new UserStatus(); // UserStatus 생성 userStatusRepository.save(userStatus); - return new UserDto(createdUser.getId(), createdUser.getName(), createdUser.getPhone()); + User createdUser = new User(request.getName(), request.getPhone(), request.getPassword(), request.getProfileId(), userStatus.getId()); + userRepository.save(createdUser); // User 레포지토리에 저장하기 + + return new CreateUser.Response(createdUser.getId(), createdUser.getProfileImageId() == null ? ProfileUse.NO : ProfileUse.YES); } @Override - public FindUserDto getUserByPhone(String phone) { - Optional findUser = userRepository.findByPhone(phone); - UserStatus userStatus = userStatusRepository.findByUserId(findUser.get().getId()); - return new FindUserDto(findUser.get().getId(), findUser.get().getName(), findUser.get().getPhone(), userStatus); + public UserDTO find(UUID userId) { + User findUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + UserStatus status = userStatusRepository.findById(findUser.getUserStatusId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + return new UserDTO(findUser.getId(), findUser.getName(), findUser.getPhone(), status); } @Override - public List getAllUser() { - return userRepository.findAll(); + public List findAll() { + return userRepository.findAll().stream() + .map(this::convertToUserDTO) + .collect(Collectors.toList()); } @Override - public User updateUserPassword(User user, String newPass) { - existUser(user); - user.update(newPass); - userRepository.save(user); - return user; + public UpdateUser.Response update(UpdateUser.Request request) { + User updateUser = userRepository.findById(request.getUserId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + + BinaryContent profile = binaryContentRepository.findById(request.getProfileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + updateUser.setProfileImageId(profile.getId()); + + return new UpdateUser.Response(updateUser.getId(), ProfileUse.YES); } @Override public void delete(User removeUser) { existUser(removeUser); userRepository.delete(removeUser); + userStatusRepository.deleteById(removeUser.getUserStatusId()); + binaryContentRepository.deleteById(removeUser.getProfileImageId()); } - private void existUser(User user) { - userRepository.findByPhone(user.getPhone()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + private UserDTO convertToUserDTO(User user) { + UserStatus status = userStatusRepository.findById(user.getUserStatusId()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + + return new UserDTO(user.getId(), user.getName(), user.getPhone(), status); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java deleted file mode 100644 index 708279b47..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileChannelService.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.util.ChannelType; -import com.sprint.mission.discodeit.util.FileIOUtil; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.FileIOUtil.*; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -public class FileChannelService implements ChannelService { - private final Path filePath = Path.of("./result/channels.ser"); - private final Map channels = loadFromFile(filePath); - - public FileChannelService() { - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - } - - @Override - public Channel create(String name, String description, ChannelType channelType) { - if (channels.values().stream() - .anyMatch(user -> user.getName().equals(name))) { - throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); - } - Channel createChannel = new Channel(name, description, channelType); - channels.put(createChannel.getId(), createChannel); - saveToFile(channels, filePath); - return createChannel; - } - - @Override - public Optional getChannelByName(String name) { - for (Channel channel : channels.values()) { - if (channel.getName().equals(name)) { - return Optional.of(channel); - } - } - return Optional.empty(); - } - - @Override - public List getAllChannel() { - return channels.values().stream() - .collect(Collectors.toList()); - } - - @Override - public Channel updateType(Channel channel, ChannelType channelType) { - validateChannel(channel); - channel.changeType(channelType); - channels.put(channel.getId(), channel); - FileIOUtil.saveToFile(channels, filePath); - return channel; - } - - @Override - public Channel updateDescription(Channel channel, String description) { - validateChannel(channel); - channel.changeDescription(description); - channels.put(channel.getId(), channel); - FileIOUtil.saveToFile(channels, filePath); - return channel; - } - - - @Override - public void delete(Channel channel) { - validateChannel(channel); - channels.remove(channel.getId()); - saveToFile(channels, filePath); - } - - private void validateChannel(Channel channel) { - Channel findChannel = getChannelByName(channel.getName()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java deleted file mode 100644 index 05c4abee4..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileMessageService.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.FileIOUtil; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -public class FileMessageService implements MessageService { - private final Path filePath = Path.of("./result/messages.ser"); - Map messageRepository = FileIOUtil.loadFromFile(filePath); - private final UserService userService; - private final ChannelService channelService; - - public FileMessageService(UserService userService, ChannelService channelService) { - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.userService = userService; - this.channelService = channelService; - } - - @Override - public Message create(String content, User writer, Channel channel) { - if (content.isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - validateUser(writer); - - validateChannel(channel); - - Message message = new Message(content, writer, channel); - messageRepository.put(message.getId(), message); - FileIOUtil.saveToFile(messageRepository, filePath); - return message; - } - - @Override - public Optional getMessage(UUID messageID) { - return Optional.ofNullable(messageRepository.get(messageID)); - } - - @Override - public List getMessageWithWriter(User writer) { - validateUser(writer); - return messageRepository.values().stream() - .filter(message -> message.getWriter().equals(writer)) - .collect(Collectors.toList()); - } - - @Override - public List getMessageWithChannel(Channel channel) { - validateChannel(channel); - return messageRepository.values().stream() - .filter(message -> message.getChannel().equals(channel)) - .collect(Collectors.toList()); - } - - @Override - public List getAllMessage() { - return new ArrayList<>(messageRepository.values()); - } - - - @Override - public Message updateMessageContent(Message updateMessage, String newContent) { - if (newContent.isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - updateMessage.update(newContent); - messageRepository.put(updateMessage.getId(), updateMessage); - saveToFile(messageRepository, filePath); - return updateMessage; - } - - @Override - public void deleteMessage(UUID messageID) { - messageRepository.remove(messageID); - } - - private void validateUser(User user) { - User findUser = userService.getUserByPhone(user.getPhone()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - } - - private void validateChannel(Channel channel) { - Channel findChannel = channelService.getChannelByName(channel.getName()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java b/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java deleted file mode 100644 index 4c603e98c..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/file/FileUserService.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.sprint.mission.discodeit.service.file; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.UserService; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.FileIOUtil.*; - -public class FileUserService implements UserService { - private final Path filePath = Path.of("./result/users.ser"); - private final Map users = loadFromFile(filePath); - - public FileUserService() { - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - } - - @Override - public User create(String name, String phone, String password) { - if (!User.isValidPassword(password)) { - throw new ServiceException(ErrorCode.INVALID_PASSWORD); - } - - if (!User.isValidPhone(phone)) { - throw new ServiceException(ErrorCode.INVALID_WRITER); - } - if (users.values().stream() - .anyMatch(user -> user.getPhone().equals(phone))) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - - User createUser = new User(name, phone, password); - users.put(createUser.getId(), createUser); - saveToFile(users, filePath); - return createUser; - } - - @Override - public Optional getUserByPhone(String phone) { - return users.values().stream() - .filter(user -> user.getPhone().equals(phone)) - .findFirst(); - } - - @Override - public List getAllUser() { - return users.values() - .stream() - .collect(Collectors.toList()); - } - - - @Override - public User updateUserPassword(User updateUser, String newPass) { - if (!userExists(updateUser.getPhone())) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - updateUser.update(newPass); - users.put(updateUser.getId(), updateUser); - saveToFile(users, filePath); - return updateUser; - } - - @Override - public void delete(User removeUser) { - if (!userExists(removeUser.getPhone())) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - users.remove(removeUser.getId()); - saveToFile(users, filePath); - } - - private boolean userExists(String phone) { - return users.values() - .stream() - .anyMatch(user -> user.getPhone().equals(phone)); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java deleted file mode 100644 index d71dc3493..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFChannelService.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.util.ChannelType; - - -import java.util.*; -import java.util.stream.Collectors; - -public class JCFChannelService implements ChannelService { - private final Map channelRepository; - - public JCFChannelService() { - this.channelRepository = new HashMap<>(); - } - - @Override - public Channel create(String name, String description, ChannelType channelType) throws IllegalArgumentException { - if (channelRepository.values().stream() - .anyMatch(user -> user.getName().equals(name))) { - throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL); - } - - Channel createChannel = new Channel(name, description, channelType); - channelRepository.put(createChannel.getId(), createChannel); - return createChannel; - } - - @Override - public Optional getChannelByName(String name) { - for (Channel channel : channelRepository.values()) { - if (channel.getName().equals(name)) { - return Optional.of(channel); - } - } - return Optional.empty(); - } - - @Override - public List getAllChannel() { - return channelRepository.values().stream() - .collect(Collectors.toList()); - } - - @Override - public Channel updateType(Channel channel, ChannelType channelType) { - validateChannel(channel); - channel.changeType(channelType); - return channel; - } - - @Override - public Channel updateDescription(Channel channel, String description) { - validateChannel(channel); - channel.changeDescription(description); - return channel; - } - - @Override - public void delete(Channel channel) { - validateChannel(channel); - channelRepository.remove(channel.getId()); - } - - private void validateChannel(Channel channel) { - Channel findChannel = getChannelByName(channel.getName()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java deleted file mode 100644 index 35332e3ad..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFMessageService.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.*; -import java.util.stream.Collectors; - -public class JCFMessageService implements MessageService { - private final Map messageRepository; - private final UserService userService; - private final ChannelService channelService; - - public JCFMessageService(UserService userService, ChannelService channelService) { - this.messageRepository = new HashMap<>(); - this.userService = userService; - this.channelService = channelService; - } - - @Override - public Message create(String content, User writer, Channel channel) throws IllegalArgumentException { - if (content.isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - - validateUser(writer); - - validateChannel(channel); - - Message message = new Message(content, writer, channel); - messageRepository.put(message.getId(), message); - return message; - } - - @Override - public Optional getMessage(UUID messageID) { - return Optional.ofNullable(messageRepository.get(messageID)); - } - - @Override - public List getMessageWithWriter(User writer) { - validateUser(writer); - return messageRepository.values().stream() - .filter(message -> message.getWriter().equals(writer)) - .collect(Collectors.toList()); - } - - @Override - public List getMessageWithChannel(Channel channel) { - validateChannel(channel); - return messageRepository.values().stream() - .filter(message -> message.getChannel().equals(channel)) - .collect(Collectors.toList()); - } - - @Override - public List getAllMessage() { - return new ArrayList<>(messageRepository.values()); - } - - - @Override - public Message updateMessageContent(Message findMessage, String newContent) { - if (newContent.isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - findMessage.update(newContent); - return findMessage; - } - - @Override - public void deleteMessage(UUID messageID) { - messageRepository.remove(messageID); - } - - private void validateUser(User user) { // User가 repository에 저장되어 있는지 확인 - User findUser = userService.getUserByPhone(user.getPhone()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - } - - private void validateChannel(Channel channel) { // Channel이 repository에 저장되어 있는지 확인 - Channel findChannel = channelService.getChannelByName(channel.getName()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java b/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java deleted file mode 100644 index 266080747..000000000 --- a/src/main/java/com/sprint/mission/discodeit/service/jcf/JCFUserService.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.sprint.mission.discodeit.service.jcf; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.error.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.UserService; - -import java.util.*; - -public class JCFUserService implements UserService { - private final Map userRepository; - - public JCFUserService() { - this.userRepository = new HashMap<>(); - } - - @Override - public User create(String name, String phone, String password) { - if (!User.isValidPassword(password)) { - throw new ServiceException(ErrorCode.INVALID_PASSWORD); - } - - if (!User.isValidPhone(phone)) { - throw new ServiceException(ErrorCode.INVALID_WRITER); - } - - if (userRepository.values().stream() - .anyMatch(user -> user.getPhone().equals(phone))) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - User user = new User(name, phone, password); - userRepository.put(user.getId(), user); - return user; - } - - @Override - public Optional getUserByPhone(String phone) { - return userRepository.values().stream() - .filter(user -> user.getPhone().equals(phone)) - .findFirst(); - } - - @Override - public List getAllUser() { - return new ArrayList<>(userRepository.values()); - } - - @Override - public User updateUserPassword(User updateUser, String newPass) { - if (!userExists(updateUser.getPhone())) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - User findUser = userRepository.get(updateUser.getId()); - findUser.update(newPass); - return findUser; - } - - @Override - public void delete(User removeUser) { // 유저 정보 삭제 시 유저가 속해있던 채널에 해당 유저가 삭제되어야 한다. - if (!userExists(removeUser.getPhone())) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - userRepository.remove(removeUser.getId()); - } - - private boolean userExists(String phone) { - return userRepository.values() - .stream() - .anyMatch(user -> user.getPhone().equals(phone)); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java deleted file mode 100644 index d9b173ea1..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/ChannelType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.util; - -public enum ChannelType { - TEXT, VOICE -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index ae34c0ba5..e9091720c 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -2,15 +2,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.EOFException; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.io.*; +import java.nio.file.*; +import java.util.*; public class FileIOUtil { @@ -38,7 +32,6 @@ public static void saveToFile(Map data, Path filePath) { //.dat 파일을 읽기 쉬운 Json 파일로 변환하는 메서드 public static void convertDSerToJson(Path datFilePath, Path jsonFilePath) { Map data = loadFromFile(datFilePath); - ObjectMapper objectMapper = new ObjectMapper(); try { objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFilePath.toFile(), data); @@ -46,4 +39,15 @@ public static void convertDSerToJson(Path datFilePath, Path jsonFilePath) { throw new RuntimeException("JSON 파일로 변환하는 도중 문제가 발생하였습니다.", e); } } -} \ No newline at end of file + + // 파일 초기화 메서드 + public static void initializeFiles() { + try { + Files.deleteIfExists(Paths.get("./result/users.ser")); + Files.deleteIfExists(Paths.get("./result/messages.ser")); + Files.deleteIfExists(Paths.get("./result/channels.ser")); + } catch (IOException e) { + System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java b/src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java deleted file mode 100644 index e3cbd4a75..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/OnlineStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.util; - -public enum OnlineStatus { - ACTIVE, SLEEP -} diff --git a/src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java b/src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java similarity index 51% rename from src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java rename to src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java index 63ec5c8e8..fb4664d45 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/BinaryContentType.java +++ b/src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.util; +package com.sprint.mission.discodeit.util.type; public enum BinaryContentType { IMAGE, FILE diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java new file mode 100644 index 000000000..8654ff183 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util.type; + +public enum ChannelFormat { + TEXT, VOICE +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java new file mode 100644 index 000000000..7d6a7790e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util.type; + +public enum ChannelType { + PUBLIC, PRIVATE +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java b/src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java new file mode 100644 index 000000000..df45fc083 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util.type; + +public enum OnlineStatusType { + ACTIVE, SLEEP +} diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java b/src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java new file mode 100644 index 000000000..101614be2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.util.type; + +public enum ProfileUse { + YES, NO +} diff --git a/src/test/java/RepositoryTest.java b/src/test/java/RepositoryTest.java deleted file mode 100644 index ca1e9e1aa..000000000 --- a/src/test/java/RepositoryTest.java +++ /dev/null @@ -1,106 +0,0 @@ -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.factory.repository.FileRepositoryFactory; -import com.sprint.mission.discodeit.factory.repository.JCFRepositoryFactory; -import com.sprint.mission.discodeit.factory.repository.RepositoryFactory; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.basic.BasicChannelService; -import com.sprint.mission.discodeit.service.basic.BasicMessageService; -import com.sprint.mission.discodeit.service.basic.BasicUserService; -import com.sprint.mission.discodeit.util.ChannelType; -import com.sprint.mission.discodeit.util.FileIOUtil; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; - -public class RepositoryTest { - RepositoryFactory factory = FileRepositoryFactory.getInstance(); - UserService userService = new BasicUserService(factory.getUserRepository()); - ChannelService channelService = new BasicChannelService(factory.getChannelRepository()); - MessageService messageService = new BasicMessageService(factory.getMessageRepository(), factory.getUserRepository(), factory.getChannelRepository()); - - @BeforeEach - void before() { - try { - Files.deleteIfExists(Paths.get("./result/users.ser")); - Files.deleteIfExists(Paths.get("./result/messages.ser")); - Files.deleteIfExists(Paths.get("./result/channels.ser")); - } catch (IOException e) { - System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); - } - } - - @AfterEach - void after() { - if (factory instanceof FileRepositoryFactory) { - FileIOUtil.convertDSerToJson(Paths.get("./result/users.ser"), Paths.get("./json/users.json")); - FileIOUtil.convertDSerToJson(Paths.get("./result/messages.ser"), Paths.get("./json/messages.json")); - FileIOUtil.convertDSerToJson(Paths.get("./result/channels.ser"), Paths.get("./json/channels.json")); - } - } - - @Test - @DisplayName("메시지 생성 확인") - void createMessage() { - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - messageCreateTest(messageService, channel, user); - } - - @Test - @DisplayName("작성자 이름으로 메시지 찾기") - void findMessageByUser() { - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - messageCreateTest(messageService, channel, user); - List messages = messageService.getMessageWithWriter(user); - System.out.println("메시지 찾기: " + messages); - } - - @Test - @DisplayName("채널 이름으로 메시지 찾기") - void findMessageByChannel() { - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - messageCreateTest(messageService, channel, user); - List messages = messageService.getMessageWithChannel(channel); - System.out.println("메시지 찾기: " + messages); - } - - @Test - @DisplayName("메시지 삭제하기") - void deleteMessage() { - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - Message createMessage = messageCreateTest(messageService, channel, user); - messageService.deleteMessage(createMessage.getId()); - List messages = messageService.getAllMessage(); - System.out.println("메시지 찾기: " + messages); - } - - User setupUser(UserService userService) { - User user = userService.create("woody", "010-9218-1188", "Abcdefgh12312!"); - return user; - } - - Channel setupChannel(ChannelService channelService) { - Channel channel = channelService.create("코드잇 공지 채널", "공지 채널입니다", ChannelType.VOICE); - return channel; - } - - Message messageCreateTest(MessageService messageService, Channel channel, User writer) { - Message message = messageService.create("안녕하세요", writer, channel); - System.out.println("메시지 생성 : " + message); - return message; - } - -} From d7bbea0362e5aa406663bdc886d56d6a4fa1f7d7 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 7 Feb 2025 13:14:02 +0900 Subject: [PATCH 046/115] Refactoring UserService --- .../discodeit/dto/user/UpdateUser.java | 3 +- .../mission/discodeit/dto/user/UserDTO.java | 34 ++++++++++--- .../dto/userstatus/CreateUserStatus.java | 15 ++++++ .../discodeit/repository/UserRepository.java | 2 +- .../repository/file/FileUserRepository.java | 5 +- .../repository/jcf/JCFUserRepository.java | 5 +- .../discodeit/service/AuthService.java | 5 +- .../discodeit/service/UserService.java | 12 ++--- .../service/basic/BasicUserService.java | 48 +++++++++++-------- 9 files changed, 83 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java index f12479a1a..8369ba252 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java @@ -16,8 +16,7 @@ public static class Request { @NonNull private UUID userId; - @NonNull - private UUID profileId; + private String password; private byte[] content; } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index b31b37705..e1d5e365a 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -1,13 +1,35 @@ package com.sprint.mission.discodeit.dto.user; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; +import lombok.*; +import java.time.Instant; import java.util.UUID; -public record UserDTO( - UUID id, - String userName, - String phone, - UserStatus userStatus -) { +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserDTO { + private UUID id; + private Instant createdAt; + private Instant updatedAt; + private String name; + private String phone; + private UUID profileImageId; + private UUID userStatusId; + + public static UserDTO fromDomain(User user) { + return UserDTO.builder() + .id(user.getId()) + .createdAt(user.getCreatedAt()) + .updatedAt(user.getUpdatedAt()) + .name(user.getName()) + .phone(user.getPhone()) + .profileImageId(user.getProfileImageId()) + .userStatusId(user.getUserStatusId()) + .build(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java new file mode 100644 index 000000000..cc7026e3c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.dto.userstatus; + +import com.sprint.mission.discodeit.util.type.BinaryContentType; + +import java.util.UUID; + +public class CreateUserStatus { + public static class Request { + private UUID userId; + + private byte[] content; + + private BinaryContentType binaryContentType; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 8eb03f210..15763ee5d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -17,5 +17,5 @@ public interface UserRepository { List findAll(); - User delete(User user); + void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 495d5e1fd..5bd2c2758 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -66,9 +66,8 @@ public List findAll() { } @Override - public User delete(User user) { - userMap.remove(user.getId()); + public void delete(UUID id) { + userMap.remove(id); saveToFile(userMap, filePath); - return user; } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 51d3c5d1a..9273c57fe 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -48,8 +48,7 @@ public List findAll() { } @Override - public User delete(User user) { - userMap.remove(user.getId()); - return user; + public void delete(UUID id) { + userMap.remove(id); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java index 7caca39f8..d8eadb400 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.dto.login.LoginRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; @@ -13,12 +14,12 @@ public class AuthService { private final UserRepository userRepository; - public UserDto login(LoginRequest request) { + public UserDTO login(LoginRequest request) { User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } - return new UserDto(findUser.getId(), findUser.getName(), findUser.getPhone()); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + return new UserDTO(findUser.getId(), findUser.getName(), findUser.getPhone()); // 비밀번호를 보여주지 않기 위해서 DTO 사용 } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index c41cc031e..20b6cf858 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,22 +1,18 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.dto.user.CreateUser; -import com.sprint.mission.discodeit.dto.user.FindUserDto; -import com.sprint.mission.discodeit.dto.user.UpdateUser; -import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.dto.user.*; import java.util.List; import java.util.UUID; public interface UserService { - CreateUser.Response create(CreateUser.Request request); + UserDTO create(CreateUser.Request request); UserDTO find(UUID userId); List findAll(); - UpdateUser.Response update(UpdateUser.Request request); + UserDTO update(UpdateUser.Request request); - void delete(User removeUser); + UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 372a5e7cb..8e81341a2 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -3,9 +3,7 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.dto.user.CreateUser; -import com.sprint.mission.discodeit.dto.user.UpdateUser; -import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.dto.user.*; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -30,7 +28,7 @@ public class BasicUserService implements UserService { private final UserStatusRepository userStatusRepository; @Override - public CreateUser.Response create(CreateUser.Request request) { + public UserDTO create(CreateUser.Request request) { if (!User.isValidPassword(request.getPassword())) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } @@ -56,45 +54,53 @@ public CreateUser.Response create(CreateUser.Request request) { User createdUser = new User(request.getName(), request.getPhone(), request.getPassword(), request.getProfileId(), userStatus.getId()); userRepository.save(createdUser); // User 레포지토리에 저장하기 - return new CreateUser.Response(createdUser.getId(), createdUser.getProfileImageId() == null ? ProfileUse.NO : ProfileUse.YES); + return UserDTO.fromDomain(createdUser); } @Override public UserDTO find(UUID userId) { User findUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); UserStatus status = userStatusRepository.findById(findUser.getUserStatusId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - return new UserDTO(findUser.getId(), findUser.getName(), findUser.getPhone(), status); + return UserDTO.fromDomain(findUser); } @Override public List findAll() { return userRepository.findAll().stream() - .map(this::convertToUserDTO) + .map(UserDTO::fromDomain) .collect(Collectors.toList()); } @Override - public UpdateUser.Response update(UpdateUser.Request request) { + public UserDTO update(UpdateUser.Request request) { User updateUser = userRepository.findById(request.getUserId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - BinaryContent profile = binaryContentRepository.findById(request.getProfileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - updateUser.setProfileImageId(profile.getId()); + updateUser.setPassword(request.getPassword()); // 비밀번호를 수정합니다. - return new UpdateUser.Response(updateUser.getId(), ProfileUse.YES); + if (request.getContent() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. + if (updateUser.getProfileImageId() == null) { + // 새로운 Profile 을 생성하고 저장합니다. + //binaryContentRepository 만들고 다시 작성할 것 !!! + } else { + Optional profile = binaryContentRepository.findById(updateUser.getProfileImageId()); + profile.get().updateContent(request.getContent()); + } + } + return UserDTO.fromDomain(updateUser); } @Override - public void delete(User removeUser) { - existUser(removeUser); - userRepository.delete(removeUser); - userStatusRepository.deleteById(removeUser.getUserStatusId()); - binaryContentRepository.deleteById(removeUser.getProfileImageId()); - } + public UserDTO delete(UUID id) { + User deleteUser = userRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + + if (deleteUser.getProfileImageId() != null) { // 만약 프로필이 등록되어 있다면 해당 프로필도 같이 삭제 + binaryContentRepository.deleteById(deleteUser.getProfileImageId()); + } + + userStatusRepository.deleteById(deleteUser.getUserStatusId()); // UserStatus 도 같이 삭제 - private UserDTO convertToUserDTO(User user) { - UserStatus status = userStatusRepository.findById(user.getUserStatusId()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + userRepository.delete(id); - return new UserDTO(user.getId(), user.getName(), user.getPhone(), status); + return UserDTO.fromDomain(deleteUser); } } From 95cc361b30642077bc6a0f1e5621af1013f63d5b Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 7 Feb 2025 14:17:52 +0900 Subject: [PATCH 047/115] Complete Channel create code --- .../mission/discodeit/domain/Channel.java | 11 +--- .../discodeit/dto/channel/ChannelDTO.java | 63 +++++++++++++++++++ .../discodeit/dto/channel/CreateChannel.java | 27 ++++++++ .../channel/PrivateChannelCreateRequest.java | 11 ---- .../dto/channel/PrivateChannelDto.java | 13 ---- .../channel/PublicChannelCreateRequest.java | 12 ---- .../discodeit/service/AuthService.java | 2 +- .../discodeit/service/ChannelService.java | 8 +-- .../service/basic/BasicChannelService.java | 34 ++++------ 9 files changed, 111 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index c82f74cff..065393dd6 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -32,20 +32,15 @@ public Channel(String name, String description, ChannelFormat channelFormat, Cha } @Override - public boolean equals(Object o) { + public boolean equals(Object o) { // 채널은 UUID와 채널이름이 동일하다면 동일 객체로 판단합니다. if (o == null || getClass() != o.getClass()) return false; Channel channel = (Channel) o; - return Objects.equals(name, channel.name); + return Objects.equals(id, channel.id) && Objects.equals(name, channel.name); } @Override public int hashCode() { - return Objects.hashCode(name); - } - - public void changeFormat(ChannelFormat channelFormat) { - this.channelFormat = channelFormat; - this.updatedAt = Instant.now(); + return Objects.hash(id, name); } public void changeDescription(String description) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java new file mode 100644 index 000000000..1dd1e5a05 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -0,0 +1,63 @@ +package com.sprint.mission.discodeit.dto.channel; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public class ChannelDTO { + @Getter + @Setter + @Builder + public static class PrivateChannel { + private UUID id; + private Instant createdAt; + private Instant updatedAt; + private ChannelFormat channelFormat; + private ChannelType channelType; + private List joinUsers; + + public static PrivateChannel fromDomain(Channel channel, List joinUsers) { + return PrivateChannel.builder() + .id(channel.getId()) + .createdAt(channel.getCreatedAt()) + .updatedAt(channel.getUpdatedAt()) + .channelFormat(channel.getChannelFormat()) + .channelType(ChannelType.PRIVATE) + .joinUsers(joinUsers) + .build(); + } + } + + @Getter + @Setter + @Builder + public static class PublicChannel { + private UUID id; + private Instant createdAt; + private Instant updatedAt; + private String name; + private String description; + private ChannelFormat channelFormat; + private ChannelType channelType; + + public static PublicChannel fromDomain(Channel channel) { + return PublicChannel.builder() + .id(channel.getId()) + .createdAt(channel.getCreatedAt()) + .updatedAt(channel.getUpdatedAt()) + .name(channel.getName()) + .description(channel.getDescription()) + .channelFormat(channel.getChannelFormat()) + .channelType(ChannelType.PUBLIC) + .build(); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java new file mode 100644 index 000000000..49a49a047 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -0,0 +1,27 @@ +package com.sprint.mission.discodeit.dto.channel; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; +import java.util.UUID; + +public class CreateChannel { + @Getter + @AllArgsConstructor + public static class PrivateRequest { + private List joinUser; + private ChannelFormat channelFormat; + } + + @Getter + @AllArgsConstructor + public static class PublicRequest { + private String name; + private String description; + ChannelFormat channelFormat; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java deleted file mode 100644 index be57e396e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelCreateRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sprint.mission.discodeit.dto.channel; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; - -import java.util.List; -import java.util.UUID; - -public record PrivateChannelCreateRequest(UUID channelId, ChannelFormat channelFormat, List users) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java deleted file mode 100644 index 0c2cf4522..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/PrivateChannelDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit.dto.channel; - -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; - -import java.util.UUID; - -public record PrivateChannelDto( - UUID channelId, - ChannelType channelType, - ChannelFormat channelFormat -) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java deleted file mode 100644 index 79340a472..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/PublicChannelCreateRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sprint.mission.discodeit.dto.channel; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; - -import java.util.List; - -public record PublicChannelCreateRequest( - String name, String description, ChannelFormat channelFormat, List users -) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java index d8eadb400..255f176b8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -20,6 +20,6 @@ public UserDTO login(LoginRequest request) { if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } - return new UserDTO(findUser.getId(), findUser.getName(), findUser.getPhone()); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + return UserDTO.fromDomain(findUser); // 비밀번호를 보여주지 않기 위해서 DTO 사용 } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index cc688d482..43107b463 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -2,6 +2,8 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.PrivateChannelDto; import com.sprint.mission.discodeit.util.type.ChannelType; @@ -9,16 +11,14 @@ import java.util.Optional; public interface ChannelService { - Channel createPublicChannel(ChannelCreateRequest request); + ChannelDTO.PublicChannel createPublicChannel(CreateChannel.PublicRequest request); - PrivateChannelDto createPrivateChannel(ChannelCreateRequest request); + ChannelDTO.PrivateChannel createPrivateChannel(CreateChannel.PrivateRequest request); Optional getChannelByName(String name); List getAllChannel(); - Channel updateType(Channel channel, ChannelType channelType); - Channel updateDescription(Channel channel, String description); void delete(Channel removeChannel); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index d51cd7985..126177e29 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -3,10 +3,8 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.ReadStatus; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest; -import com.sprint.mission.discodeit.dto.channel.PrivateChannelCreateRequest; -import com.sprint.mission.discodeit.dto.channel.PrivateChannelDto; -import com.sprint.mission.discodeit.dto.channel.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; @@ -26,26 +24,27 @@ public class BasicChannelService implements ChannelService { private final ReadStatusRepository readStatusRepository; @Override - public Channel createPublicChannel(PublicChannelCreateRequest request) { - channelRepository.findByName(request.name()).ifPresent(channel -> { + public ChannelDTO.PublicChannel createPublicChannel(CreateChannel.PublicRequest request) { + channelRepository.findByName(request.getName()).ifPresent(channel -> { throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL);}); - Channel channel = new Channel(request.name(), request.description(), request.channelFormat(), ChannelType.PUBLIC); + Channel channel = new Channel(request.getName(), request.getDescription(), request.getChannelFormat(), ChannelType.PUBLIC); channelRepository.save(channel); - return channel; + return ChannelDTO.PublicChannel.fromDomain(channel); } @Override - public PrivateChannelDto createPrivateChannel(PrivateChannelCreateRequest request) { - List users = request.users(); + public ChannelDTO.PrivateChannel createPrivateChannel(CreateChannel.PrivateRequest request) { + List users = request.getJoinUser(); + Channel channel = new Channel(null, null, request.getChannelFormat(), ChannelType.PRIVATE); + channelRepository.save(channel); for (User user : users) { - ReadStatus readStatus = new ReadStatus(user.getId(), request.channelId()); + ReadStatus readStatus = new ReadStatus(user.getId(), channel.getId()); readStatusRepository.save(readStatus); } - Channel channel = new Channel(null, null, request.channelFormat(), ChannelType.PRIVATE); - channelRepository.save(channel); - return new PrivateChannelDto(channel.getId(), channel.getChannelType(), channel.getChannelFormat()); + return ChannelDTO.PrivateChannel.fromDomain(channel, users); } + @Override public Optional getChannelByName(String name) { return channelRepository.findByName(name); @@ -56,13 +55,6 @@ public List getAllChannel() { return channelRepository.findAll(); } - @Override - public Channel updateType(Channel channel, ChannelType channelType) { - existChannel(channel); - channel.changeType(channelType); - channelRepository.save(channel); - return channel; - } @Override public Channel updateDescription(Channel channel, String description) { From 29bd7761eefd332cff4754b60228a57935389a65 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 7 Feb 2025 15:23:33 +0900 Subject: [PATCH 048/115] Make abstract channel class --- .../mission/discodeit/domain/Channel.java | 43 +---------- .../discodeit/domain/PrivateChannel.java | 22 ++++++ .../discodeit/domain/PublicChannel.java | 23 ++++++ .../{ChannelDTO.java => FindChannel.java} | 40 +++++------ .../discodeit/exception/ErrorCode.java | 3 +- .../repository/ChannelRepository.java | 3 + .../file/FileChannelRepository.java | 7 ++ .../repository/jcf/JCFChannelRepository.java | 7 ++ .../discodeit/service/AuthService.java | 2 +- .../discodeit/service/ChannelService.java | 18 ++--- .../service/basic/BasicChannelService.java | 71 +++++++++++++++---- 11 files changed, 153 insertions(+), 86 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java create mode 100644 src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java rename src/main/java/com/sprint/mission/discodeit/dto/channel/{ChannelDTO.java => FindChannel.java} (66%) diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index 065393dd6..f7c229ffd 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -12,53 +12,14 @@ @Getter @Setter -public class Channel implements Serializable { +public abstract class Channel implements Serializable { private UUID id; private Instant createdAt; private Instant updatedAt; - private String name; - private String description; - private ChannelFormat channelFormat; - private ChannelType channelType; - public Channel(String name, String description, ChannelFormat channelFormat, ChannelType channelType) { + public Channel() { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); - this.name = name; - this.description = description; - this.channelFormat = channelFormat; - this.channelType = channelType; } - - @Override - public boolean equals(Object o) { // 채널은 UUID와 채널이름이 동일하다면 동일 객체로 판단합니다. - if (o == null || getClass() != o.getClass()) return false; - Channel channel = (Channel) o; - return Objects.equals(id, channel.id) && Objects.equals(name, channel.name); - } - - @Override - public int hashCode() { - return Objects.hash(id, name); - } - - public void changeDescription(String description) { - this.description = description; - this.updatedAt = Instant.now(); - } - - @Override - public String toString() { - - return "Channel{" + - "id=" + id + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - ", description=" + description + - ", name='" + name + '\'' + - ", type='" + channelType + '\'' + - '}'; - } - } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java new file mode 100644 index 000000000..92016f38d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.domain; + +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; +import lombok.Getter; +import lombok.ToString; + +import java.util.List; + +@Getter +@ToString +public class PrivateChannel extends Channel { + private List joinMembers; + private ChannelFormat channelFormat; + private ChannelType channelType; + + public PrivateChannel(List joinMembers, ChannelFormat channelFormat) { + this.joinMembers = joinMembers; + this.channelFormat = channelFormat; + this.channelType = ChannelType.PRIVATE; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java new file mode 100644 index 000000000..9eabbc398 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java @@ -0,0 +1,23 @@ +package com.sprint.mission.discodeit.domain; + +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import com.sprint.mission.discodeit.util.type.ChannelType; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@ToString +public class PublicChannel extends Channel { + private String name; + private String description; + private ChannelFormat channelFormat; + private ChannelType channelType; + + public PublicChannel(String name, String description, ChannelFormat channelFormat) { + this.name = name; + this.description = description; + this.channelFormat = channelFormat; + this.channelType = ChannelType.PUBLIC; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/FindChannel.java similarity index 66% rename from src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java rename to src/main/java/com/sprint/mission/discodeit/dto/channel/FindChannel.java index 1dd1e5a05..24b05756f 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/FindChannel.java @@ -1,62 +1,60 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.domain.PrivateChannel; +import com.sprint.mission.discodeit.domain.PublicChannel; import com.sprint.mission.discodeit.util.type.ChannelFormat; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Builder; import lombok.Getter; -import lombok.Setter; import java.time.Instant; -import java.util.List; import java.util.UUID; -public class ChannelDTO { +public class FindChannel { @Getter - @Setter @Builder - public static class PrivateChannel { + public static class PublicResponse { private UUID id; private Instant createdAt; private Instant updatedAt; + private String name; + private String description; private ChannelFormat channelFormat; private ChannelType channelType; - private List joinUsers; + private Instant latestMessageTime; - public static PrivateChannel fromDomain(Channel channel, List joinUsers) { - return PrivateChannel.builder() + public static PublicResponse fromDomain(PublicChannel channel, Instant latestMessageTime) { + return FindChannel.PublicResponse.builder() .id(channel.getId()) .createdAt(channel.getCreatedAt()) .updatedAt(channel.getUpdatedAt()) + .name(channel.getName()) + .description(channel.getDescription()) .channelFormat(channel.getChannelFormat()) - .channelType(ChannelType.PRIVATE) - .joinUsers(joinUsers) + .channelType(ChannelType.PUBLIC) + .latestMessageTime(latestMessageTime) .build(); } } @Getter - @Setter @Builder - public static class PublicChannel { + public static class PrivateResponse { private UUID id; private Instant createdAt; private Instant updatedAt; - private String name; - private String description; private ChannelFormat channelFormat; private ChannelType channelType; + private Instant latestMessageTime; - public static PublicChannel fromDomain(Channel channel) { - return PublicChannel.builder() + public static PrivateResponse fromDomain(PrivateChannel channel, Instant latestMessageTime) { + return FindChannel.PrivateResponse.builder() .id(channel.getId()) .createdAt(channel.getCreatedAt()) .updatedAt(channel.getUpdatedAt()) - .name(channel.getName()) - .description(channel.getDescription()) .channelFormat(channel.getChannelFormat()) - .channelType(ChannelType.PUBLIC) + .channelType(ChannelType.PRIVATE) + .latestMessageTime(latestMessageTime) .build(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index ec50fbf6b..e31bb2ccc 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -22,7 +22,8 @@ public enum ErrorCode { INVALID_WRITER("작성자가 올바르지 않습니다"), INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), - PASSWORD_MISMATCH("비밀번호가 일치하지 않습니다"); + PASSWORD_MISMATCH("비밀번호가 일치하지 않습니다"), + CHANNEL_TYPE_MISMATCH("채널 타입이 일치하지 않습니다"); private final String description; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index e476f01f5..23aba3f74 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -4,12 +4,15 @@ import java.util.List; import java.util.Optional; +import java.util.UUID; public interface ChannelRepository { Channel save(Channel channel); Optional findByName(String channelName); + Optional findById(UUID channelId); + List findAll(); Channel delete(Channel channel); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 9d8cc6c16..0fb88a64f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -47,6 +47,13 @@ public Optional findByName(String channelName) { .findFirst(); } + @Override + public Optional findById(UUID channelId) { + return channelMap.values().stream() + .filter(channel -> channel.getId().equals(channelId)) + .findFirst(); + } + @Override public List findAll() { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 381fef85d..4310f7868 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -28,6 +28,13 @@ public Optional findByName(String channelName) { .findFirst(); } + @Override + public Optional findById(UUID channelId) { + return channelMap.values().stream() + .filter(channel -> channel.getId().equals(channelId)) + .findFirst(); + } + @Override public List findAll() { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java index 255f176b8..c15887825 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -14,7 +14,7 @@ public class AuthService { private final UserRepository userRepository; - public UserDTO login(LoginRequest request) { + public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 43107b463..c4f99360f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,23 +1,25 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.dto.channel.ChannelCreateRequest; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.PrivateChannelDto; -import com.sprint.mission.discodeit.util.type.ChannelType; +import com.sprint.mission.discodeit.dto.channel.FindChannel; import java.util.List; import java.util.Optional; +import java.util.UUID; public interface ChannelService { - ChannelDTO.PublicChannel createPublicChannel(CreateChannel.PublicRequest request); + Channel createPublicChannel(CreateChannel.PublicRequest request); - ChannelDTO.PrivateChannel createPrivateChannel(CreateChannel.PrivateRequest request); + Channel createPrivateChannel(CreateChannel.PrivateRequest request); - Optional getChannelByName(String name); + FindChannel.PublicResponse findPublicChannel(UUID channelId); - List getAllChannel(); + FindChannel.PrivateResponse findPrivateChannel(UUID channelId); + + List findAllPublic(); + + List findAllPrivate(); Channel updateDescription(Channel channel, String description); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 126177e29..1ebc6b070 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,58 +1,101 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.ReadStatus; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.domain.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; +import com.sprint.mission.discodeit.dto.channel.FindChannel; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.Instant; import java.util.List; import java.util.Optional; +import java.util.UUID; @Service @RequiredArgsConstructor public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; private final ReadStatusRepository readStatusRepository; + private final MessageRepository messageRepository; @Override - public ChannelDTO.PublicChannel createPublicChannel(CreateChannel.PublicRequest request) { + public Channel createPublicChannel(CreateChannel.PublicRequest request) { channelRepository.findByName(request.getName()).ifPresent(channel -> { throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL);}); - Channel channel = new Channel(request.getName(), request.getDescription(), request.getChannelFormat(), ChannelType.PUBLIC); + Channel channel = new PublicChannel(request.getName(), request.getDescription(), request.getChannelFormat()); channelRepository.save(channel); - return ChannelDTO.PublicChannel.fromDomain(channel); + return channel; } @Override - public ChannelDTO.PrivateChannel createPrivateChannel(CreateChannel.PrivateRequest request) { + public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { List users = request.getJoinUser(); - Channel channel = new Channel(null, null, request.getChannelFormat(), ChannelType.PRIVATE); + Channel channel = new PrivateChannel(users, request.getChannelFormat()); channelRepository.save(channel); for (User user : users) { ReadStatus readStatus = new ReadStatus(user.getId(), channel.getId()); readStatusRepository.save(readStatus); } - return ChannelDTO.PrivateChannel.fromDomain(channel, users); + return channel; } @Override - public Optional getChannelByName(String name) { - return channelRepository.findByName(name); + public FindChannel.PublicResponse findPublicChannel(UUID channelId) { + PublicChannel findChannel = (PublicChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + + // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. + Instant latestMessageTime = Instant.EPOCH; // 초기값 설정 + List messageList = messageRepository.findAll(); + + for (Message message : messageList) { + if (message.getChannel().equals(findChannel)) { + if (message.getCreatedAt().isAfter(latestMessageTime)) { + latestMessageTime = message.getCreatedAt(); + } + } + } + return FindChannel.PublicResponse.fromDomain(findChannel, latestMessageTime); + } + + @Override + public FindChannel.PrivateResponse findPrivateChannel(UUID channelId) { + PrivateChannel findChannel = (PrivateChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + if (findChannel.getChannelType().equals(ChannelType.PUBLIC)) { + throw new ServiceException(ErrorCode.CHANNEL_TYPE_MISMATCH); + } + + // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. + Instant latestMessageTime = Instant.EPOCH; // 초기값 설정 + List messageList = messageRepository.findAll(); + + for (Message message : messageList) { + if (message.getChannel().equals(findChannel)) { + if (message.getCreatedAt().isAfter(latestMessageTime)) { + latestMessageTime = message.getCreatedAt(); + } + } + } + + //Private 채널인 경우 참여한 User의 Id 정보를 포함합니다. + return FindChannel.PrivateResponse.fromDomain(findChannel, latestMessageTime); + } + + @Override + public List findAllPublic() { + } @Override - public List getAllChannel() { - return channelRepository.findAll(); + public List findAllPrivate() { + return List.of(); } From 80c03d8d6bbfe357d22009dfeb3857c98a462fa9 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Feb 2025 15:32:50 +0900 Subject: [PATCH 049/115] Update BasicChannelService --- .../mission/discodeit/domain/Channel.java | 5 +- .../discodeit/domain/PrivateChannel.java | 7 +- .../discodeit/domain/PublicChannel.java | 11 ++- .../discodeit/dto/channel/CreateChannel.java | 1 + .../dto/channel/UpdatePublicChannel.java | 22 ++++++ .../repository/ChannelRepository.java | 2 - .../file/FileChannelRepository.java | 7 -- .../repository/jcf/JCFChannelRepository.java | 7 -- .../discodeit/service/ChannelService.java | 7 +- .../service/basic/BasicChannelService.java | 76 ++++++++++++++----- .../service/basic/BasicUserService.java | 1 - 11 files changed, 103 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index f7c229ffd..547588df3 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.time.Instant; +import java.util.List; import java.util.Objects; import java.util.UUID; @@ -16,10 +17,12 @@ public abstract class Channel implements Serializable { private UUID id; private Instant createdAt; private Instant updatedAt; + private List joinMembers; - public Channel() { + public Channel(List joinMembers) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); + this.joinMembers = joinMembers; } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java index 92016f38d..311dabc5d 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java @@ -9,13 +9,12 @@ @Getter @ToString -public class PrivateChannel extends Channel { - private List joinMembers; +public class PrivateChannel extends Channel { // private ChannelFormat channelFormat; private ChannelType channelType; - public PrivateChannel(List joinMembers, ChannelFormat channelFormat) { - this.joinMembers = joinMembers; + public PrivateChannel(List joinMember, ChannelFormat channelFormat) { + super(joinMember); this.channelFormat = channelFormat; this.channelType = ChannelType.PRIVATE; } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java index 9eabbc398..cbd686d01 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java @@ -6,6 +6,8 @@ import lombok.Setter; import lombok.ToString; +import java.util.List; + @Getter @ToString public class PublicChannel extends Channel { @@ -14,10 +16,17 @@ public class PublicChannel extends Channel { private ChannelFormat channelFormat; private ChannelType channelType; - public PublicChannel(String name, String description, ChannelFormat channelFormat) { + public PublicChannel(String name, String description, ChannelFormat channelFormat, List joinMember) { + super(joinMember); this.name = name; this.description = description; this.channelFormat = channelFormat; this.channelType = ChannelType.PUBLIC; } + + public void update(String name, String description, User newUser) { + this.name = name; + this.description = description; + super.getJoinMembers().add(newUser); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index 49a49a047..8749da1c6 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -23,5 +23,6 @@ public static class PublicRequest { private String name; private String description; ChannelFormat channelFormat; + private List joinUser; } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java new file mode 100644 index 000000000..69e05fecc --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java @@ -0,0 +1,22 @@ +package com.sprint.mission.discodeit.dto.channel; + +import com.sprint.mission.discodeit.domain.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.UUID; + +public class UpdatePublicChannel { + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Request { + private UUID channelId; + private String name; + private String description; + private User newUser; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 23aba3f74..67114678c 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -9,8 +9,6 @@ public interface ChannelRepository { Channel save(Channel channel); - Optional findByName(String channelName); - Optional findById(UUID channelId); List findAll(); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 0fb88a64f..86e79604d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -40,13 +40,6 @@ public Channel save(Channel channel) { return channel; } - @Override - public Optional findByName(String channelName) { - return channelMap.values().stream() - .filter(channel -> channel.getName().equals(channelName)) - .findFirst(); - } - @Override public Optional findById(UUID channelId) { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 4310f7868..26422796e 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -21,13 +21,6 @@ public Channel save(Channel channel) { return channel; } - @Override - public Optional findByName(String channelName) { - return channelMap.values().stream() - .filter(channel -> channel.getName().equals(channelName)) - .findFirst(); - } - @Override public Optional findById(UUID channelId) { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index c4f99360f..e1dc16cdf 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -3,6 +3,7 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.FindChannel; +import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import java.util.List; import java.util.Optional; @@ -19,9 +20,9 @@ public interface ChannelService { List findAllPublic(); - List findAllPrivate(); + List findAllPrivate(UUID userId); - Channel updateDescription(Channel channel, String description); + Channel update(UpdatePublicChannel.Request request); - void delete(Channel removeChannel); + void delete(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 1ebc6b070..26353a2d5 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -3,11 +3,13 @@ import com.sprint.mission.discodeit.domain.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.FindChannel; +import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; @@ -17,6 +19,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -24,12 +27,19 @@ public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; private final ReadStatusRepository readStatusRepository; private final MessageRepository messageRepository; + private final UserRepository userRepository; @Override public Channel createPublicChannel(CreateChannel.PublicRequest request) { - channelRepository.findByName(request.getName()).ifPresent(channel -> { - throw new ServiceException(ErrorCode.DUPLICATE_CHANNEL);}); - Channel channel = new PublicChannel(request.getName(), request.getDescription(), request.getChannelFormat()); + // User가 UserRepository에 저장되어 있는지 확인 + for (User user : request.getJoinUser()) { + Optional userOptional = userRepository.findById(user.getId()); + if (userOptional.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } + } + + Channel channel = new PublicChannel(request.getName(), request.getDescription(), request.getChannelFormat(), request.getJoinUser()); channelRepository.save(channel); return channel; } @@ -37,8 +47,19 @@ public Channel createPublicChannel(CreateChannel.PublicRequest request) { @Override public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { List users = request.getJoinUser(); + + // User가 UserRepository에 저장되어 있는지 확인 + for (User user : users) { + Optional userOptional = userRepository.findById(user.getId()); + if (userOptional.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } + } + // Private 채널 생성 후 저장 Channel channel = new PrivateChannel(users, request.getChannelFormat()); channelRepository.save(channel); + + // User마다 ReadStatus 생성하기 for (User user : users) { ReadStatus readStatus = new ReadStatus(user.getId(), channel.getId()); readStatusRepository.save(readStatus); @@ -90,31 +111,52 @@ public FindChannel.PrivateResponse findPrivateChannel(UUID channelId) { @Override public List findAllPublic() { - + List allChannels = channelRepository.findAll(); + return allChannels.stream() + .filter(channel -> channel instanceof PublicChannel) // Public 채널만 필터링 + .collect(Collectors.toList()); } @Override - public List findAllPrivate() { - return List.of(); + public List findAllPrivate(UUID userId) { // 통일성을 위해 findAllByUserId보다는 findAllPrivate으로 하였습니다. + // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 + validUser(userId); + + // Private 채널 내에서 userId가 같은 회원을 joinMembers 리스트에 갖고 있는 채널만 선택한다. + List allChannels = channelRepository.findAll(); + return allChannels.stream() + .filter(channel -> channel instanceof PrivateChannel) + .filter(channel -> channel.getJoinMembers().stream() + .anyMatch(user -> user.getId().equals(userId))) + .collect(Collectors.toList()); } - @Override - public Channel updateDescription(Channel channel, String description) { - existChannel(channel); - channel.changeDescription(description); - channelRepository.save(channel); - return channel; + public Channel update(UpdatePublicChannel.Request request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 + validChannel(request.getChannelId()); + validUser(request.getNewUser().getId()); + + PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.getChannelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + updateChannel.update(request.getName(), request.getDescription(), request.getNewUser()); + + return updateChannel; } @Override - public void delete(Channel removeChannel) { - existChannel(removeChannel); - channelRepository.delete(removeChannel); + public void delete(UUID channelId) { + validChannel(channelId); + Optional removeChannel = channelRepository.findById(channelId); + channelRepository.delete(removeChannel.orElse(null)); } - private void existChannel(Channel channel) { - channelRepository.findByName(channel.getName()) + // 채널 검증 + private void validChannel(UUID channelId) { + channelRepository.findById(channelId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); } + + // 유저 검증 + private void validUser(UUID userId) { + userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 8e81341a2..d0c9e5c3e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -10,7 +10,6 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.type.ProfileUse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; From bfb3018f797a0aa953f3e5ca9f066c69c6255965 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Feb 2025 17:18:54 +0900 Subject: [PATCH 050/115] Update Domain Service --- .../discodeit/DiscodeitApplication.java | 66 +++++++------- .../mission/discodeit/domain/Message.java | 17 ++-- .../discodeit/dto/message/CreateMessage.java | 25 ++++++ .../discodeit/dto/message/UpdateMessage.java | 24 +++++ .../discodeit/exception/ErrorCode.java | 1 + .../repository/ReadStatusRepository.java | 7 ++ .../service/BinaryContentService.java | 21 +++++ .../discodeit/service/MessageService.java | 12 ++- .../discodeit/service/ReadStatusService.java | 19 ++++ .../discodeit/service/UserStatusService.java | 21 +++++ .../BasicAuthService.java} | 4 +- .../basic/BasicBinaryContentService.java | 35 ++++++++ .../service/basic/BasicChannelService.java | 26 +++++- .../service/basic/BasicMessageService.java | 87 +++++++++++-------- .../service/basic/BasicReadStatusService.java | 36 ++++++++ .../service/basic/BasicUserService.java | 4 +- .../service/basic/BasicUserStatusService.java | 40 +++++++++ 17 files changed, 357 insertions(+), 88 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java rename src/main/java/com/sprint/mission/discodeit/service/{AuthService.java => basic/BasicAuthService.java} (92%) create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 121ce5191..60278fb81 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -17,41 +17,41 @@ @SpringBootApplication public class DiscodeitApplication { - static User setupUser(UserService userService) { - User user = userService.create("student1", "010-1929-1188", "Abcdefgh12312!"); - return user; - } - - static Channel setupChannel(ChannelService channelService) { - Channel channel = channelService.create("자바 공지 채널", "공지 채널입니다", ChannelType.VOICE); - return channel; - } - - static Message messageCreateTest(MessageService messageService, Channel channel, User writer) { - Message message = messageService.create("안녕하세요", writer, channel); - System.out.println("메시지 생성 : " + message); - return message; - } +// static User setupUser(UserService userService) { +// User user = userService.create("student1", "010-1929-1188", "Abcdefgh12312!"); +// return user; +// } +// +// static Channel setupChannel(ChannelService channelService) { +// Channel channel = channelService.create("자바 공지 채널", "공지 채널입니다", ChannelType.VOICE); +// return channel; +// } +// +// static Message messageCreateTest(MessageService messageService, Channel channel, User writer) { +// Message message = messageService.create("안녕하세요", writer, channel); +// System.out.println("메시지 생성 : " + message); +// return message; +// } public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); - UserService userService = context.getBean(UserService.class); - System.out.println("userService = " + userService); - ChannelService channelService = context.getBean(ChannelService.class); - System.out.println("channelService = " + channelService); - MessageService messageService = context.getBean(MessageService.class); - System.out.println("messageService = " + messageService); - - try { - Files.deleteIfExists(Paths.get("./result/users.ser")); - Files.deleteIfExists(Paths.get("./result/messages.ser")); - Files.deleteIfExists(Paths.get("./result/channels.ser")); - } catch (IOException e) { - System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); - } - - User user = setupUser(userService); - Channel channel = setupChannel(channelService); - Message message = messageCreateTest(messageService, channel, user); +// UserService userService = context.getBean(UserService.class); +// System.out.println("userService = " + userService); +// ChannelService channelService = context.getBean(ChannelService.class); +// System.out.println("channelService = " + channelService); +// MessageService messageService = context.getBean(MessageService.class); +// System.out.println("messageService = " + messageService); +// +// try { +// Files.deleteIfExists(Paths.get("./result/users.ser")); +// Files.deleteIfExists(Paths.get("./result/messages.ser")); +// Files.deleteIfExists(Paths.get("./result/channels.ser")); +// } catch (IOException e) { +// System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); +// } +// +// User user = setupUser(userService); +// Channel channel = setupChannel(channelService); +// Message message = messageCreateTest(messageService, channel, user); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index f106e3318..71f89afcc 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -8,6 +8,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.UUID; @Getter @@ -17,21 +18,23 @@ public class Message implements Serializable { private Instant createdAt; private Instant updatedAt; private String content; - private User writer; - private Channel channel; - private String attachmentId; + private UUID writerID; + private UUID channelID; + private List attachmentsID; - public Message(String content, User writer, Channel channel) { + public Message(String content, UUID writerID, UUID channelID, List attachmentsID) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); this.content = content; - this.writer = writer; - this.channel = channel; + this.writerID = writerID; + this.channelID = channelID; + this.attachmentsID = attachmentsID; } - public void update(String content) { + public void update(String content, UUID newAttachment) { this.content = content; + this.attachmentsID.add(newAttachment); this.updatedAt = Instant.now(); } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java new file mode 100644 index 000000000..fce3ac435 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.dto.message; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class CreateMessage { + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class Request { + private List attachmentsID; + private String content; + private User writer; + private Channel channel; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java new file mode 100644 index 000000000..5d6e146e1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.dto.message; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; +import java.util.UUID; + +public class UpdateMessage { + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class Request { + private Message message; + private String newContent; + private UUID newAttachment; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index e31bb2ccc..01212ee8d 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -13,6 +13,7 @@ public enum ErrorCode { CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"), CANNOT_FOUND_PROFILE("해당하는 프로필 데이터를 찾을 수 없습니다"), CANNOT_FOUND_USERSTATUS("해당하는 사용자의 상태 정보를 찾을 수 없습니다"), + CANNOT_FOUND_ATTACHMENT("해당하는 첨부자료를 찾을 수 없습니다"), DUPLICATE_NAME("이미 등록된 사용자 이름입니다."), DUPLICATE_PHONE("이미 등록된 핸드폰 번호 입니다."), diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 0155e2066..27cb84aab 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -2,6 +2,13 @@ import com.sprint.mission.discodeit.domain.ReadStatus; +import java.util.List; +import java.util.UUID; + public interface ReadStatusRepository { ReadStatus save(ReadStatus readStatus); + + List findByChannelId(UUID channelID); + + void delete(ReadStatus readStatus); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java new file mode 100644 index 000000000..a69fc4fdc --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -0,0 +1,21 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.domain.BinaryContent; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface BinaryContentService { + BinaryContent create(); + + Optional find(UUID id); + + List findAllByIdInUser(UUID userId); + + List findAllByIdInMessage(UUID messageId); + + void delete(UUID id); + + +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index ff14ece78..275f89e52 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -3,23 +3,21 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.message.CreateMessage; +import com.sprint.mission.discodeit.dto.message.UpdateMessage; import java.util.List; import java.util.Optional; import java.util.UUID; public interface MessageService { - Message create(String content, User writer, Channel channel); + Message create(CreateMessage.Request request); - Optional getMessage(UUID messageID); - - List getMessageWithWriter(User writer); - - List getMessageWithChannel(Channel channel); + List findAllByChannelId(UUID channelID); List getAllMessage(); - Message updateMessageContent(Message message, String newContent); + Message updateMessageContent(UpdateMessage.Request request); void deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java new file mode 100644 index 000000000..e262be00a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.domain.ReadStatus; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ReadStatusService { + ReadStatus create(); + + Optional find(UUID id); + + List findAllByUserId(UUID userID); + + ReadStatus update(); + + void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java new file mode 100644 index 000000000..f85d94eb3 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -0,0 +1,21 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.domain.UserStatus; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface UserStatusService { + UserStatus create(); + + Optional find(UUID id); + + List findAll(); + + UserStatus update(); + + UserStatus updateByUserId(UUID userId); + + void delete(UUID id); +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java similarity index 92% rename from src/main/java/com/sprint/mission/discodeit/service/AuthService.java rename to src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index c15887825..e14b50add 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.service; +package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.dto.login.LoginRequest; @@ -11,7 +11,7 @@ @Service @RequiredArgsConstructor -public class AuthService { +public class BasicAuthService { private final UserRepository userRepository; public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java new file mode 100644 index 000000000..b6e03bcff --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -0,0 +1,35 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.service.BinaryContentService; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class BasicBinaryContentService implements BinaryContentService { + @Override + public BinaryContent create() { + return null; + } + + @Override + public Optional find(UUID id) { + return Optional.empty(); + } + + @Override + public List findAllByIdInUser(UUID userId) { + return List.of(); + } + + @Override + public List findAllByIdInMessage(UUID messageId) { + return List.of(); + } + + @Override + public void delete(UUID id) { + + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 26353a2d5..4a5d3f032 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -11,6 +11,7 @@ import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -24,6 +25,8 @@ @Service @RequiredArgsConstructor public class BasicChannelService implements ChannelService { + private final MessageService messageService; + private final ChannelRepository channelRepository; private final ReadStatusRepository readStatusRepository; private final MessageRepository messageRepository; @@ -77,7 +80,7 @@ public FindChannel.PublicResponse findPublicChannel(UUID channelId) { List messageList = messageRepository.findAll(); for (Message message : messageList) { - if (message.getChannel().equals(findChannel)) { + if (message.getChannelID().equals(findChannel.getId())) { if (message.getCreatedAt().isAfter(latestMessageTime)) { latestMessageTime = message.getCreatedAt(); } @@ -98,7 +101,7 @@ public FindChannel.PrivateResponse findPrivateChannel(UUID channelId) { List messageList = messageRepository.findAll(); for (Message message : messageList) { - if (message.getChannel().equals(findChannel)) { + if (message.getChannelID().equals(findChannel.getId())) { if (message.getCreatedAt().isAfter(latestMessageTime)) { latestMessageTime = message.getCreatedAt(); } @@ -139,14 +142,29 @@ public Channel update(UpdatePublicChannel.Request request) { // 채널에 새로 PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.getChannelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); updateChannel.update(request.getName(), request.getDescription(), request.getNewUser()); + channelRepository.save(updateChannel); return updateChannel; } @Override public void delete(UUID channelId) { validChannel(channelId); - Optional removeChannel = channelRepository.findById(channelId); - channelRepository.delete(removeChannel.orElse(null)); + + Channel removeChannel = channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + channelRepository.delete(removeChannel); + + // 채널에 포함된 메시지 삭제하기 + List messages = messageService.findAllByChannelId(channelId); + if (!messages.isEmpty()) { + messages.forEach(message -> messageRepository.delete(message)); + } + + // 채널에 포함된 ReadStatus 삭제하기 + List readStatuses = readStatusRepository.findByChannelId(channelId); + if (!readStatuses.isEmpty()) { + readStatuses.forEach(readStatus -> readStatusRepository.delete(readStatus)); + } } // 채널 검증 diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 737ed7ff3..0b986473a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,10 +1,14 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.message.CreateMessage; +import com.sprint.mission.discodeit.dto.message.UpdateMessage; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; @@ -23,41 +27,40 @@ public class BasicMessageService implements MessageService { private final MessageRepository messageRepository; private final UserRepository userRepository; private final ChannelRepository channelRepository; + private final BinaryContentRepository binaryContentRepository; @Override - public Message create(String content, User writer, Channel channel) { - if (content.isEmpty()) { + public Message create(CreateMessage.Request request) { + if (request.getContent().isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } - existUser(writer); - existChannel(channel); - Message message = new Message(content, writer, channel); + // 작성자와 채널에 대한 검증 + validUser(request.getWriter().getId()); + validChannel(request.getChannel().getId()); + + // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 + for (UUID attachmentID : request.getAttachmentsID()) { + Optional attachment = binaryContentRepository.findById(attachmentID); + if (attachment.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); + } + } + + Message message = new Message(request.getContent(), request.getWriter().getId(), request.getChannel().getId(), request.getAttachmentsID()); messageRepository.save(message); return message; } @Override - public Optional getMessage(UUID messageID) { - return messageRepository.findById(messageID); - } + public List findAllByChannelId(UUID channelID) { + validChannel(channelID); - @Override - public List getMessageWithWriter(User writer) { - existUser(writer); - List messageList = messageRepository.findAll(); - return messageList.stream() - .filter(message -> message.getWriter().equals(writer)) + List messages = messageRepository.findAll(); + return messages.stream() + .filter(message -> message.getChannelID().equals(channelID)) .collect(Collectors.toList()); - } - @Override - public List getMessageWithChannel(Channel channel) { - existChannel(channel); - List messageList = messageRepository.findAll(); - return messageList.stream() - .filter(message -> message.getChannel().equals(channel)) - .collect(Collectors.toList()); } @Override @@ -66,29 +69,45 @@ public List getAllMessage() { } @Override - public Message updateMessageContent(Message message, String newContent) { - messageRepository.findById(message.getId()) + public Message updateMessageContent(UpdateMessage.Request request) { + UUID messageId = request.getMessage().getId(); + validMessage(messageId); + + Message message = messageRepository.findById(messageId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - message.update(newContent); + message.update(request.getNewContent(), request.getNewAttachment()); - messageRepository.save(message); - return message; + return messageRepository.save(message); } + @Override public void deleteMessage(UUID messageID) { - Optional deleteMessage = messageRepository.findById(messageID); - messageRepository.delete(deleteMessage.orElse(null)); + Message deleteMessage = messageRepository.findById(messageID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + messageRepository.delete(deleteMessage); + List attachmentsID = deleteMessage.getAttachmentsID(); + if (attachmentsID != null && !attachmentsID.isEmpty()) { + attachmentsID.forEach(id -> { + binaryContentRepository.findById(id) + .ifPresent(binaryContent -> binaryContentRepository.deleteById(id)); + }); + } + } - private void existUser(User user) { - userRepository.findByPhone(user.getPhone()) + private void validUser(UUID userId) { + userRepository.findById(userId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); } - private void existChannel(Channel channel) { - channelRepository.findByName(channel.getName()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + private void validChannel(UUID channelId) { + channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL))); + } + + private void validMessage(UUID messageId) { + messageRepository.findById(messageId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java new file mode 100644 index 000000000..0a521f9f3 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -0,0 +1,36 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.service.ReadStatusService; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class BasicReadStatusService implements ReadStatusService { + + @Override + public ReadStatus create() { + return null; + } + + @Override + public Optional find(UUID id) { + return Optional.empty(); + } + + @Override + public List findAllByUserId(UUID userID) { + return List.of(); + } + + @Override + public ReadStatus update() { + return null; + } + + @Override + public void delete(UUID id) { + + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index d0c9e5c3e..b3b1e51ec 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -74,7 +74,7 @@ public List findAll() { public UserDTO update(UpdateUser.Request request) { User updateUser = userRepository.findById(request.getUserId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - updateUser.setPassword(request.getPassword()); // 비밀번호를 수정합니다. + updateUser.update(request.getPassword()); // 비밀번호를 수정합니다. if (request.getContent() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. if (updateUser.getProfileImageId() == null) { @@ -85,6 +85,8 @@ public UserDTO update(UpdateUser.Request request) { profile.get().updateContent(request.getContent()); } } + + userRepository.save(updateUser); return UserDTO.fromDomain(updateUser); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java new file mode 100644 index 000000000..33ea112c6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -0,0 +1,40 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.service.UserStatusService; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class BasicUserStatusService implements UserStatusService { + @Override + public UserStatus create() { + return null; + } + + @Override + public Optional find(UUID id) { + return Optional.empty(); + } + + @Override + public List findAll() { + return List.of(); + } + + @Override + public UserStatus update() { + return null; + } + + @Override + public UserStatus updateByUserId(UUID userId) { + return null; + } + + @Override + public void delete(UUID id) { + + } +} From 6bbaddfbdf289fa83786aaa302d6f79e8f4a5dfe Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Feb 2025 13:43:25 +0900 Subject: [PATCH 051/115] Update Basic Service code --- .../mission/discodeit/domain/ReadStatus.java | 9 +-- .../sprint/mission/discodeit/domain/User.java | 4 +- .../mission/discodeit/domain/UserStatus.java | 13 +++-- .../CreateBinaryContentRequest.java | 6 ++ .../{FindChannel.java => ChannelDTO.java} | 14 ++--- .../dto/channel/UpdatePublicChannel.java | 12 +--- .../discodeit/dto/message/CreateMessage.java | 25 --------- .../dto/message/CreateMessageRequest.java | 10 ++++ ...Message.java => UpdateMessageRequest.java} | 11 +--- .../readstatus/CreateReadStatusRequest.java | 8 +++ .../readstatus/UpdateReadStatusRequest.java | 7 +++ .../discodeit/dto/user/CreateUser.java | 33 ----------- .../discodeit/dto/user/CreateUserRequest.java | 5 ++ .../discodeit/dto/user/UpdateUser.java | 28 +--------- .../dto/userstatus/CreateUserStatus.java | 15 ----- .../userstatus/CreateUserStatusRequest.java | 7 +++ .../userstatus/UpdateUserStatusRequest.java | 7 +++ .../discodeit/exception/ErrorCode.java | 4 ++ .../repository/BinaryContentRepository.java | 6 ++ .../repository/ReadStatusRepository.java | 8 ++- .../repository/UserStatusRepository.java | 9 ++- .../service/BinaryContentService.java | 9 +-- .../discodeit/service/ChannelService.java | 9 ++- .../discodeit/service/MessageService.java | 11 ++-- .../discodeit/service/ReadStatusService.java | 7 ++- .../discodeit/service/UserService.java | 4 +- .../discodeit/service/UserStatusService.java | 8 ++- .../basic/BasicBinaryContentService.java | 34 +++++++---- .../service/basic/BasicChannelService.java | 32 +++++------ .../service/basic/BasicMessageService.java | 23 ++++---- .../service/basic/BasicReadStatusService.java | 56 +++++++++++++++++-- .../service/basic/BasicUserService.java | 38 +++++++------ .../service/basic/BasicUserStatusService.java | 52 ++++++++++++++--- 33 files changed, 288 insertions(+), 236 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java rename src/main/java/com/sprint/mission/discodeit/dto/channel/{FindChannel.java => ChannelDTO.java} (82%) delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java rename src/main/java/com/sprint/mission/discodeit/dto/message/{UpdateMessage.java => UpdateMessageRequest.java} (59%) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java index 94c9116ae..f2a22dd48 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -15,18 +15,19 @@ public class ReadStatus { // 사용자가 채널 별 마지막 메시지를 읽 private Instant updateAt; private UUID userId; private UUID channelId; - private LocalDateTime lastReadAt; + private Instant lastReadAt; - public ReadStatus(UUID userId, UUID channelId) { + public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updateAt = Instant.now(); this.userId = userId; this.channelId = channelId; - this.lastReadAt = null; + this.lastReadAt = lastReadAt; } - public void updateLastReadTime() { + public void updateLastReadTime(Instant lastReadAt) { this.updateAt = Instant.now(); + this.lastReadAt = lastReadAt; } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index 292d6d78d..3ba5ab439 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -22,9 +22,8 @@ public class User implements Serializable { private String phone; private String password; private UUID profileImageId; - private UUID userStatusId; - public User(String name, String phone, String password, UUID profileImageId, UUID userStatusId) { + public User(String name, String phone, String password, UUID profileImageId) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); @@ -32,7 +31,6 @@ public User(String name, String phone, String password, UUID profileImageId, UUI this.phone = phone; this.password = password; this.profileImageId = profileImageId; - this.userStatusId = userStatusId; } public void update(String password) { diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index 95e166bd7..3495433a9 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -9,21 +9,26 @@ @Getter public class UserStatus { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 - - private UUID id; private Instant createdAt; private Instant updateAt; private Instant lastActiveAt; + private UUID userId; - public UserStatus() { + public UserStatus(UUID userId, Instant lastActiveAt) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updateAt = Instant.now(); - this.lastActiveAt = Instant.now(); + this.lastActiveAt = lastActiveAt; + this.userId = userId; } public OnlineStatusType isOnline() { return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5 ? OnlineStatusType.ACTIVE : OnlineStatusType.SLEEP; } + + public void update(Instant lastActiveAt) { + this.updateAt = Instant.now(); + this.lastActiveAt = lastActiveAt; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java new file mode 100644 index 000000000..031c7e438 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java @@ -0,0 +1,6 @@ +package com.sprint.mission.discodeit.dto.binarycontent; + +import com.sprint.mission.discodeit.util.type.BinaryContentType; + +public record CreateBinaryContentRequest(byte[] content, BinaryContentType contentType) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/FindChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java similarity index 82% rename from src/main/java/com/sprint/mission/discodeit/dto/channel/FindChannel.java rename to src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java index 24b05756f..65b159339 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/FindChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -10,10 +10,10 @@ import java.time.Instant; import java.util.UUID; -public class FindChannel { +public class ChannelDTO { @Getter @Builder - public static class PublicResponse { + public static class PublicChannelDTO { private UUID id; private Instant createdAt; private Instant updatedAt; @@ -23,8 +23,8 @@ public static class PublicResponse { private ChannelType channelType; private Instant latestMessageTime; - public static PublicResponse fromDomain(PublicChannel channel, Instant latestMessageTime) { - return FindChannel.PublicResponse.builder() + public static PublicChannelDTO fromDomain(PublicChannel channel, Instant latestMessageTime) { + return ChannelDTO.PublicChannelDTO.builder() .id(channel.getId()) .createdAt(channel.getCreatedAt()) .updatedAt(channel.getUpdatedAt()) @@ -39,7 +39,7 @@ public static PublicResponse fromDomain(PublicChannel channel, Instant latestMes @Getter @Builder - public static class PrivateResponse { + public static class PrivateChannelDTO { private UUID id; private Instant createdAt; private Instant updatedAt; @@ -47,8 +47,8 @@ public static class PrivateResponse { private ChannelType channelType; private Instant latestMessageTime; - public static PrivateResponse fromDomain(PrivateChannel channel, Instant latestMessageTime) { - return FindChannel.PrivateResponse.builder() + public static PrivateChannelDTO fromDomain(PrivateChannel channel, Instant latestMessageTime) { + return ChannelDTO.PrivateChannelDTO.builder() .id(channel.getId()) .createdAt(channel.getCreatedAt()) .updatedAt(channel.getUpdatedAt()) diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java index 69e05fecc..a973337b9 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java @@ -8,15 +8,5 @@ import java.util.UUID; -public class UpdatePublicChannel { - @Getter - @Setter - @NoArgsConstructor - @AllArgsConstructor - public static class Request { - private UUID channelId; - private String name; - private String description; - private User newUser; - } +public record UpdatePublicChannel(UUID channelId, String name, String description, User newUser) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java deleted file mode 100644 index fce3ac435..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessage.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sprint.mission.discodeit.dto.message; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class CreateMessage { - @Getter - @Setter - @AllArgsConstructor - @NoArgsConstructor - public static class Request { - private List attachmentsID; - private String content; - private User writer; - private Channel channel; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java new file mode 100644 index 000000000..e55f04e21 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.message; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.User; + +import java.util.List; +import java.util.UUID; + +public record CreateMessageRequest(List attachmentsID, String content, User writer, Channel channel) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java similarity index 59% rename from src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java rename to src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java index 5d6e146e1..a79863503 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessage.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java @@ -11,14 +11,5 @@ import java.util.List; import java.util.UUID; -public class UpdateMessage { - @Getter - @Setter - @AllArgsConstructor - @NoArgsConstructor - public static class Request { - private Message message; - private String newContent; - private UUID newAttachment; - } +public record UpdateMessageRequest(Message message, String newContent, UUID newAttachment) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java new file mode 100644 index 000000000..c53014109 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.readstatus; + +import java.time.Instant; +import java.util.UUID; + +public record CreateReadStatusRequest(UUID userId, UUID channelId, Instant lastReadAt) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java new file mode 100644 index 000000000..5ee2a6f2e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.readstatus; + +import java.time.Instant; +import java.util.UUID; + +public record UpdateReadStatusRequest(UUID readStatusID, Instant lastReadAt) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java deleted file mode 100644 index b097febdb..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUser.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.util.type.ProfileUse; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NonNull; -import lombok.Setter; - -import java.util.UUID; - -public class CreateUser { - @Getter - @Setter - @AllArgsConstructor - public static class Request { - @NonNull - private String name; - @NonNull - private String phone; - @NonNull - private String password; - private UUID profileId; - } - - @Getter - @Setter - @AllArgsConstructor - public static class Response { - private UUID userId; - private ProfileUse profileUse; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java new file mode 100644 index 000000000..1583c1a84 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.dto.user; +import java.util.UUID; + +public record CreateUserRequest (String name, String phone, String password, UUID profileId) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java index 8369ba252..49b7aeeda 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java @@ -1,32 +1,6 @@ package com.sprint.mission.discodeit.dto.user; -import com.sprint.mission.discodeit.util.type.ProfileUse; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NonNull; -import lombok.Setter; - import java.util.UUID; -public class UpdateUser { - @Getter - @Setter - @AllArgsConstructor - public static class Request { - @NonNull - private UUID userId; - - private String password; - - private byte[] content; - } - - - @Getter - @Setter - @AllArgsConstructor - public static class Response { - private UUID userId; - private ProfileUse profileUse; - } +public record UpdateUser(UUID userId, String password, byte[] profile) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java deleted file mode 100644 index cc7026e3c..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatus.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sprint.mission.discodeit.dto.userstatus; - -import com.sprint.mission.discodeit.util.type.BinaryContentType; - -import java.util.UUID; - -public class CreateUserStatus { - public static class Request { - private UUID userId; - - private byte[] content; - - private BinaryContentType binaryContentType; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java new file mode 100644 index 000000000..78caac379 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.userstatus; + +import java.time.Instant; +import java.util.UUID; + +public record CreateUserStatusRequest(UUID userID, Instant lastActiveAt) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java new file mode 100644 index 000000000..48bf0ee1f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.userstatus; + +import java.time.Instant; +import java.util.UUID; + +public record UpdateUserStatusRequest(UUID id, Instant lastActiveAt) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index 01212ee8d..14b1b27c4 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -13,12 +13,16 @@ public enum ErrorCode { CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"), CANNOT_FOUND_PROFILE("해당하는 프로필 데이터를 찾을 수 없습니다"), CANNOT_FOUND_USERSTATUS("해당하는 사용자의 상태 정보를 찾을 수 없습니다"), + CANNOT_FOUND_READSTATUS("해당하는 Read Status 정보를 찾을 수 없습니다"), CANNOT_FOUND_ATTACHMENT("해당하는 첨부자료를 찾을 수 없습니다"), DUPLICATE_NAME("이미 등록된 사용자 이름입니다."), DUPLICATE_PHONE("이미 등록된 핸드폰 번호 입니다."), DUPLICATE_CHANNEL("이미 존재하는 채널 이름 입니다."), + ALREADY_EXIST_READSTATUS("이미 저장된 Read Status 입니다."), + ALREADY_EXIST_USERSTAUTS("이미 저장된 User Status 입니다."), + INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), INVALID_WRITER("작성자가 올바르지 않습니다"), INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 1ffdaf209..1f6584d76 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -1,12 +1,18 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; +import java.util.List; import java.util.Optional; import java.util.UUID; public interface BinaryContentRepository { + BinaryContent save(BinaryContent binaryContent); + Optional findById(UUID uuid); + List findAll(); + void deleteById(UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 27cb84aab..07c735398 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -1,14 +1,20 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.ReadStatus; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface ReadStatusRepository { ReadStatus save(ReadStatus readStatus); - List findByChannelId(UUID channelID); + Optional findById(UUID id); + + Optional findByChannelId(UUID channelID); + + List findAllByUserId(UUID userID); void delete(ReadStatus readStatus); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index 34bc53f8a..804537052 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -2,13 +2,18 @@ import com.sprint.mission.discodeit.domain.UserStatus; +import java.util.List; import java.util.Optional; import java.util.UUID; public interface UserStatusRepository { UserStatus save(UserStatus userStatus); - Optional findById(UUID uuid); + Optional findByUserId(UUID userID); - void deleteById(UUID uuid); + Optional findById(UUID id); + + List findAll(); + + void deleteById(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index a69fc4fdc..96c0abed3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,21 +1,18 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import java.util.List; import java.util.Optional; import java.util.UUID; public interface BinaryContentService { - BinaryContent create(); + BinaryContent create(CreateBinaryContentRequest request); Optional find(UUID id); - List findAllByIdInUser(UUID userId); - - List findAllByIdInMessage(UUID messageId); + List findAllByIdIn(List uuidList); void delete(UUID id); - - } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index e1dc16cdf..949a8320c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -2,11 +2,10 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.FindChannel; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface ChannelService { @@ -14,15 +13,15 @@ public interface ChannelService { Channel createPrivateChannel(CreateChannel.PrivateRequest request); - FindChannel.PublicResponse findPublicChannel(UUID channelId); + ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId); - FindChannel.PrivateResponse findPrivateChannel(UUID channelId); + ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId); List findAllPublic(); List findAllPrivate(UUID userId); - Channel update(UpdatePublicChannel.Request request); + Channel update(UpdatePublicChannel request); void delete(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 275f89e52..75634431b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,23 +1,20 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.dto.message.CreateMessage; -import com.sprint.mission.discodeit.dto.message.UpdateMessage; +import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; +import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface MessageService { - Message create(CreateMessage.Request request); + Message create(CreateMessageRequest request); List findAllByChannelId(UUID channelID); List getAllMessage(); - Message updateMessageContent(UpdateMessage.Request request); + Message updateMessageContent(UpdateMessageRequest request); void deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index e262be00a..4b1dd0a47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -1,19 +1,22 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; +import com.sprint.mission.discodeit.dto.readstatus.UpdateReadStatusRequest; import java.util.List; import java.util.Optional; import java.util.UUID; public interface ReadStatusService { - ReadStatus create(); + ReadStatus create(CreateReadStatusRequest request); Optional find(UUID id); List findAllByUserId(UUID userID); - ReadStatus update(); + ReadStatus update(UpdateReadStatusRequest request); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 20b6cf858..23e6f1925 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -6,13 +6,13 @@ import java.util.UUID; public interface UserService { - UserDTO create(CreateUser.Request request); + UserDTO create(CreateUserRequest request); UserDTO find(UUID userId); List findAll(); - UserDTO update(UpdateUser.Request request); + UserDTO update(UpdateUser request); UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index f85d94eb3..7a1f65c6b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -1,21 +1,23 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; +import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import java.util.List; import java.util.Optional; import java.util.UUID; public interface UserStatusService { - UserStatus create(); + UserStatus create(CreateUserStatusRequest request); Optional find(UUID id); List findAll(); - UserStatus update(); + UserStatus update(UpdateUserStatusRequest request); - UserStatus updateByUserId(UUID userId); + UserStatus updateByUserId(UUID userId, UpdateUserStatusRequest request); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index b6e03bcff..3f4323e59 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,35 +1,47 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.BinaryContentService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; +@Service +@RequiredArgsConstructor public class BasicBinaryContentService implements BinaryContentService { - @Override - public BinaryContent create() { - return null; - } + private final BinaryContentRepository binaryContentRepository; @Override - public Optional find(UUID id) { - return Optional.empty(); + public BinaryContent create(CreateBinaryContentRequest request) { + BinaryContent binaryContent = new BinaryContent(request.content(), request.contentType()); + binaryContentRepository.save(binaryContent); + + return binaryContent; } @Override - public List findAllByIdInUser(UUID userId) { - return List.of(); + public Optional find(UUID id) { + return binaryContentRepository.findById(id); } @Override - public List findAllByIdInMessage(UUID messageId) { - return List.of(); + public List findAllByIdIn(List uuidList) { + return binaryContentRepository.findAll().stream() + .filter(bi -> uuidList.contains(bi.getId())) + .collect(Collectors.toList()); } @Override public void delete(UUID id) { - + binaryContentRepository.deleteById(id); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 4a5d3f032..c8ea9dcf0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -2,7 +2,7 @@ import com.sprint.mission.discodeit.domain.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.FindChannel; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; @@ -64,7 +64,8 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { // User마다 ReadStatus 생성하기 for (User user : users) { - ReadStatus readStatus = new ReadStatus(user.getId(), channel.getId()); + Instant lastReadAt = Instant.now(); + ReadStatus readStatus = new ReadStatus(user.getId(), channel.getId(), lastReadAt); readStatusRepository.save(readStatus); } @@ -72,7 +73,7 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { } @Override - public FindChannel.PublicResponse findPublicChannel(UUID channelId) { + public ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId) { PublicChannel findChannel = (PublicChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. @@ -86,11 +87,11 @@ public FindChannel.PublicResponse findPublicChannel(UUID channelId) { } } } - return FindChannel.PublicResponse.fromDomain(findChannel, latestMessageTime); + return ChannelDTO.PublicChannelDTO.fromDomain(findChannel, latestMessageTime); } @Override - public FindChannel.PrivateResponse findPrivateChannel(UUID channelId) { + public ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId) { PrivateChannel findChannel = (PrivateChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); if (findChannel.getChannelType().equals(ChannelType.PUBLIC)) { throw new ServiceException(ErrorCode.CHANNEL_TYPE_MISMATCH); @@ -109,7 +110,7 @@ public FindChannel.PrivateResponse findPrivateChannel(UUID channelId) { } //Private 채널인 경우 참여한 User의 Id 정보를 포함합니다. - return FindChannel.PrivateResponse.fromDomain(findChannel, latestMessageTime); + return ChannelDTO.PrivateChannelDTO.fromDomain(findChannel, latestMessageTime); } @Override @@ -135,12 +136,12 @@ public List findAllPrivate(UUID userId) { // 통일성을 위해 findAl } @Override - public Channel update(UpdatePublicChannel.Request request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 - validChannel(request.getChannelId()); - validUser(request.getNewUser().getId()); + public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 + validChannel(request.channelId()); + validUser(request.newUser().getId()); - PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.getChannelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - updateChannel.update(request.getName(), request.getDescription(), request.getNewUser()); + PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + updateChannel.update(request.name(), request.description(), request.newUser()); channelRepository.save(updateChannel); return updateChannel; @@ -152,7 +153,6 @@ public void delete(UUID channelId) { Channel removeChannel = channelRepository.findById(channelId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - channelRepository.delete(removeChannel); // 채널에 포함된 메시지 삭제하기 List messages = messageService.findAllByChannelId(channelId); @@ -161,10 +161,10 @@ public void delete(UUID channelId) { } // 채널에 포함된 ReadStatus 삭제하기 - List readStatuses = readStatusRepository.findByChannelId(channelId); - if (!readStatuses.isEmpty()) { - readStatuses.forEach(readStatus -> readStatusRepository.delete(readStatus)); - } + ReadStatus readStatuses = readStatusRepository.findByChannelId(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + readStatusRepository.delete(readStatuses); + + channelRepository.delete(removeChannel); } // 채널 검증 diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 0b986473a..3762012ff 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -5,7 +5,9 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.dto.message.CreateMessage; +import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessage; +import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -30,24 +32,24 @@ public class BasicMessageService implements MessageService { private final BinaryContentRepository binaryContentRepository; @Override - public Message create(CreateMessage.Request request) { - if (request.getContent().isEmpty()) { + public Message create(CreateMessageRequest request) { + if (request.content().isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } // 작성자와 채널에 대한 검증 - validUser(request.getWriter().getId()); - validChannel(request.getChannel().getId()); + validUser(request.writer().getId()); + validChannel(request.channel().getId()); // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 - for (UUID attachmentID : request.getAttachmentsID()) { + for (UUID attachmentID : request.attachmentsID()) { Optional attachment = binaryContentRepository.findById(attachmentID); if (attachment.isEmpty()) { throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); } } - Message message = new Message(request.getContent(), request.getWriter().getId(), request.getChannel().getId(), request.getAttachmentsID()); + Message message = new Message(request.content(), request.writer().getId(), request.channel().getId(), request.attachmentsID()); messageRepository.save(message); return message; } @@ -69,14 +71,14 @@ public List getAllMessage() { } @Override - public Message updateMessageContent(UpdateMessage.Request request) { - UUID messageId = request.getMessage().getId(); + public Message updateMessageContent(UpdateMessageRequest request) { + UUID messageId = request.message().getId(); validMessage(messageId); Message message = messageRepository.findById(messageId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - message.update(request.getNewContent(), request.getNewAttachment()); + message.update(request.newContent(), request.newAttachment()); return messageRepository.save(message); } @@ -85,7 +87,7 @@ public Message updateMessageContent(UpdateMessage.Request request) { @Override public void deleteMessage(UUID messageID) { Message deleteMessage = messageRepository.findById(messageID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - messageRepository.delete(deleteMessage); + List attachmentsID = deleteMessage.getAttachmentsID(); if (attachmentsID != null && !attachmentsID.isEmpty()) { attachmentsID.forEach(id -> { @@ -94,6 +96,7 @@ public void deleteMessage(UUID messageID) { }); } + messageRepository.delete(deleteMessage); } private void validUser(UUID userId) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 0a521f9f3..1b752415c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -1,36 +1,80 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; +import com.sprint.mission.discodeit.dto.readstatus.UpdateReadStatusRequest; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ReadStatusService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicReadStatusService implements ReadStatusService { + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + private final ReadStatusRepository readStatusRepository; @Override - public ReadStatus create() { - return null; + public ReadStatus create(CreateReadStatusRequest request) { + // User와 Channel 검증하기 + validUser(request.userId()); + validChannel(request.channelId()); + + List readStatuses = readStatusRepository.findAllByUserId(request.userId()); + boolean exists = readStatuses.stream() + .anyMatch(readStatus -> readStatus.getChannelId().equals(request.channelId())); + if (exists) { + throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); + } + + Instant lastReadAt = Instant.now(); + ReadStatus readStatus = new ReadStatus(request.userId(), request.channelId(), lastReadAt); + readStatusRepository.save(readStatus); + return readStatus; } @Override public Optional find(UUID id) { - return Optional.empty(); + return readStatusRepository.findById(id); } @Override public List findAllByUserId(UUID userID) { - return List.of(); + validUser(userID); + return readStatusRepository.findAllByUserId(userID); } @Override - public ReadStatus update() { - return null; + public ReadStatus update(UpdateReadStatusRequest request) { + ReadStatus readStatus = readStatusRepository.findById(request.readStatusID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + readStatus.updateLastReadTime(readStatus.getLastReadAt()); + readStatusRepository.save(readStatus); + return readStatus; } @Override public void delete(UUID id) { + ReadStatus readStatus = readStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + readStatusRepository.delete(readStatus); + } + + private void validUser(UUID userId) { + userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + private void validChannel(UUID channelId) { + channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index b3b1e51ec..12d33cc5b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Service; +import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -27,39 +28,40 @@ public class BasicUserService implements UserService { private final UserStatusRepository userStatusRepository; @Override - public UserDTO create(CreateUser.Request request) { - if (!User.isValidPassword(request.getPassword())) { + public UserDTO create(CreateUserRequest request) { + if (!User.isValidPassword(request.password())) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } - if (!User.isValidPhone(request.getPhone())) { + if (!User.isValidPhone(request.phone())) { throw new ServiceException(ErrorCode.INVALID_WRITER); } - userRepository.findByPhone(request.getPhone()).ifPresent(x -> { + userRepository.findByPhone(request.phone()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); // 저는 이메일 대신 핸드폰 번호로 했습니다 - userRepository.findByName(request.getName()).ifPresent(x -> { + userRepository.findByName(request.name()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_NAME);}); // 유저의 이름이 같으면 안된다. - if (request.getProfileId() != null) { - binaryContentRepository.findById(request.getProfileId()) + if (request.profileId() != null) { + binaryContentRepository.findById(request.profileId()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); } - UserStatus userStatus = new UserStatus(); // UserStatus 생성 - userStatusRepository.save(userStatus); - - User createdUser = new User(request.getName(), request.getPhone(), request.getPassword(), request.getProfileId(), userStatus.getId()); + User createdUser = new User(request.name(), request.phone(), request.password(), request.profileId()); userRepository.save(createdUser); // User 레포지토리에 저장하기 + Instant lastActiveAt = Instant.now(); + UserStatus userStatus = new UserStatus(createdUser.getId(), lastActiveAt); // UserStatus 생성 + userStatusRepository.save(userStatus); + return UserDTO.fromDomain(createdUser); } @Override public UserDTO find(UUID userId) { User findUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - UserStatus status = userStatusRepository.findById(findUser.getUserStatusId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus status = userStatusRepository.findByUserId(findUser.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); return UserDTO.fromDomain(findUser); } @@ -71,18 +73,18 @@ public List findAll() { } @Override - public UserDTO update(UpdateUser.Request request) { - User updateUser = userRepository.findById(request.getUserId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + public UserDTO update(UpdateUser request) { + User updateUser = userRepository.findById(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - updateUser.update(request.getPassword()); // 비밀번호를 수정합니다. + updateUser.update(request.password()); // 비밀번호를 수정합니다. - if (request.getContent() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. + if (request.profile() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. if (updateUser.getProfileImageId() == null) { // 새로운 Profile 을 생성하고 저장합니다. //binaryContentRepository 만들고 다시 작성할 것 !!! } else { Optional profile = binaryContentRepository.findById(updateUser.getProfileImageId()); - profile.get().updateContent(request.getContent()); + profile.get().updateContent(request.profile()); } } @@ -98,7 +100,7 @@ public UserDTO delete(UUID id) { binaryContentRepository.deleteById(deleteUser.getProfileImageId()); } - userStatusRepository.deleteById(deleteUser.getUserStatusId()); // UserStatus 도 같이 삭제 + userStatusRepository.deleteByUserId(deleteUser.getId()); // UserStatus 도 같이 삭제 userRepository.delete(id); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index 33ea112c6..ec1877680 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -1,40 +1,76 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; +import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserStatusService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; import java.util.UUID; +@Service +@RequiredArgsConstructor public class BasicUserStatusService implements UserStatusService { + private final UserStatusRepository userStatusRepository; + private final UserRepository userRepository; + @Override - public UserStatus create() { - return null; + public UserStatus create(CreateUserStatusRequest request) { + validUser(request.userID()); + + userStatusRepository.findByUserId(request.userID()) + .ifPresent(userStatus -> { + throw new ServiceException(ErrorCode.ALREADY_EXIST_USERSTAUTS); + }); + + UserStatus userStatus = new UserStatus(request.userID(), request.lastActiveAt()); + userStatusRepository.save(userStatus); + return userStatus; } @Override public Optional find(UUID id) { - return Optional.empty(); + return userStatusRepository.findById(id); } @Override public List findAll() { - return List.of(); + return userStatusRepository.findAll(); } @Override - public UserStatus update() { - return null; + public UserStatus update(UpdateUserStatusRequest request) { + UserStatus findUserStatus = userStatusRepository.findById(request.id()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + + findUserStatus.update(request.lastActiveAt()); + userStatusRepository.save(findUserStatus); + return findUserStatus; } @Override - public UserStatus updateByUserId(UUID userId) { - return null; + public UserStatus updateByUserId(UUID userId, UpdateUserStatusRequest request) { + validUser(userId); + + UserStatus userStatus = userStatusRepository.findByUserId(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + userStatus.update(request.lastActiveAt()); + userStatusRepository.save(userStatus); + return userStatus; } @Override public void delete(UUID id) { + userStatusRepository.deleteById(id); + } + private void validUser(UUID userId) { + userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); } } From 22a3fd9bb174e16ec0d0821745da78567250f522 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Feb 2025 14:33:53 +0900 Subject: [PATCH 052/115] Complete JCFRepository --- .../jcf/JCFBinaryContentRepository.java | 39 +++++++++++++++ .../jcf/JCFReadStatusRepository.java | 49 +++++++++++++++++++ .../jcf/JCFUserStatusRepository.java | 48 ++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java new file mode 100644 index 000000000..7c5a0755d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -0,0 +1,39 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class JCFBinaryContentRepository implements BinaryContentRepository { + private final Map repository; + + public JCFBinaryContentRepository() { + this.repository = new HashMap<>(); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + repository.put(binaryContent.getId(), binaryContent); + return binaryContent; + } + + @Override + public Optional findById(UUID uuid) { + return repository.values().stream() + .filter(content -> content.getId().equals(uuid)) + .findFirst(); + } + + @Override + public List findAll() { + return repository.values().stream().toList(); + } + + @Override + public void deleteById(UUID uuid) { + repository.remove(uuid); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java new file mode 100644 index 000000000..52b288d41 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java @@ -0,0 +1,49 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.stereotype.Repository; + +import java.util.*; +import java.util.stream.Collectors; + +@Repository +public class JCFReadStatusRepository implements ReadStatusRepository { + private final Map repository; + + public JCFReadStatusRepository() { + this.repository = new HashMap<>(); + } + + @Override + public ReadStatus save(ReadStatus readStatus) { + repository.put(readStatus.getId(), readStatus); + return readStatus; + } + + @Override + public Optional findById(UUID id) { + return repository.values().stream() + .filter(readStatus -> readStatus.getId().equals(id)) + .findFirst(); + } + + @Override + public Optional findByChannelId(UUID channelID) { + return repository.values().stream() + .filter(readStatus -> readStatus.getChannelId().equals(channelID)) + .findFirst(); + } + + @Override + public List findAllByUserId(UUID userID) { + return repository.values().stream() + .filter(readStatus -> readStatus.getUserId().equals(userID)) + .collect(Collectors.toList()); + } + + @Override + public void delete(ReadStatus readStatus) { + repository.remove(readStatus.getId()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java new file mode 100644 index 000000000..a39dad8f5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -0,0 +1,48 @@ +package com.sprint.mission.discodeit.repository.jcf; + +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import org.springframework.stereotype.Repository; + +import java.util.*; + +@Repository +public class JCFUserStatusRepository implements UserStatusRepository { + private final Map repository; + + public JCFUserStatusRepository(FileUserRepository fileUserRepository) { + this.repository = new HashMap<>(); + } + + @Override + public UserStatus save(UserStatus userStatus) { + repository.put(userStatus.getId(), userStatus); + return userStatus; + } + + @Override + public Optional findByUserId(UUID userID) { + return repository.values().stream() + .filter(userStatus -> userStatus.getUserId().equals(userID)) + .findFirst(); + } + + @Override + public Optional findById(UUID id) { + return repository.values().stream() + .filter(userStatus -> userStatus.getId().equals(id)) + .findFirst(); + } + + @Override + public List findAll() { + return repository.values().stream() + .toList(); + } + + @Override + public void deleteById(UUID id) { + repository.remove(id); + } +} From 33dde599535a94d0cebfc6003132244fb4620da7 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Feb 2025 15:04:27 +0900 Subject: [PATCH 053/115] Complete file repository --- .../file/FileBinaryContentRepository.java | 59 ++++++++++++++++ .../file/FileReadStatusRepository.java | 67 +++++++++++++++++++ .../file/FileUserStatusRepository.java | 65 ++++++++++++++++++ .../service/basic/BasicMessageService.java | 6 +- 4 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java create mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java new file mode 100644 index 000000000..edf9aacdb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -0,0 +1,59 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.apache.coyote.http11.upgrade.UpgradeProcessorInternal; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Repository; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + +@Repository +@Primary +public class FileBinaryContentRepository implements BinaryContentRepository { + private final Path filePath = Path.of("./result/binarycontent.ser"); + private final Map repository; + + public FileBinaryContentRepository() { + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } + } + this.repository = loadFromFile(filePath); + } + + @Override + public BinaryContent save(BinaryContent binaryContent) { + repository.put(binaryContent.getId(), binaryContent); + saveToFile(repository, filePath); + return binaryContent; + } + + @Override + public Optional findById(UUID uuid) { + return repository.values().stream() + .filter(binaryContent -> binaryContent.getId().equals(uuid)) + .findFirst(); + } + + @Override + public List findAll() { + return repository.values().stream().toList(); + } + + @Override + public void deleteById(UUID uuid) { + repository.remove(uuid); + saveToFile(repository, filePath); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java new file mode 100644 index 000000000..f7ce655c7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -0,0 +1,67 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Repository; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + +@Repository +@Primary +public class FileReadStatusRepository implements ReadStatusRepository { + private final Path filePath = Path.of("./result/readstatus.ser"); + private final Map readStatusMap; + + public FileReadStatusRepository(Path filePath) { + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } + } + this.readStatusMap = loadFromFile(this.filePath); + } + + @Override + public ReadStatus save(ReadStatus readStatus) { + readStatusMap.put(readStatus.getId(), readStatus); + saveToFile(readStatusMap, filePath); + return readStatus; + } + + @Override + public Optional findById(UUID id) { + return readStatusMap.values().stream() + .filter(readStatus -> readStatus.getId().equals(id)) + .findFirst(); + } + + @Override + public Optional findByChannelId(UUID channelID) { + return readStatusMap.values().stream() + .filter(readStatus -> readStatus.getChannelId().equals(channelID)) + .findFirst(); + } + + @Override + public List findAllByUserId(UUID userID) { + return readStatusMap.values().stream() + .filter(readStatus -> readStatus.getUserId().equals(userID)) + .toList(); + } + + @Override + public void delete(ReadStatus readStatus) { + readStatusMap.remove(readStatus.getId()); + saveToFile(readStatusMap, filePath); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java new file mode 100644 index 000000000..59a05c340 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -0,0 +1,65 @@ +package com.sprint.mission.discodeit.repository.file; + +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Repository; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + +@Repository +@Primary +public class FileUserStatusRepository implements UserStatusRepository { + private final Path filePath = Path.of("./result/userstatus.ser"); + private final Map userStatusMap; + + public FileUserStatusRepository() { + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } + } + this.userStatusMap = loadFromFile(this.filePath); + } + + @Override + public UserStatus save(UserStatus userStatus) { + userStatusMap.put(userStatus.getId(), userStatus); + saveToFile(userStatusMap, filePath); + return userStatus; + } + + @Override + public Optional findByUserId(UUID userID) { + return userStatusMap.values().stream() + .filter(userStatus -> userStatus.getUserId().equals(userID)) + .findFirst(); + } + + @Override + public Optional findById(UUID id) { + return userStatusMap.values().stream() + .filter(userStatus -> userStatus.getId().equals(id)) + .findFirst(); + } + + @Override + public List findAll() { + return userStatusMap.values().stream().toList(); + } + + @Override + public void deleteById(UUID id) { + userStatusMap.remove(id); + saveToFile(userStatusMap, filePath); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 3762012ff..d4b98a339 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,12 +1,8 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.dto.message.CreateMessage; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; -import com.sprint.mission.discodeit.dto.message.UpdateMessage; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; @@ -106,7 +102,7 @@ private void validUser(UUID userId) { private void validChannel(UUID channelId) { channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL))); + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); } private void validMessage(UUID messageId) { From 49e29bfffa9342402766db5ec60deec114c92cab Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Feb 2025 15:06:09 +0900 Subject: [PATCH 054/115] Refactor repository code --- .../discodeit/repository/file/FileChannelRepository.java | 3 +-- .../discodeit/repository/file/FileMessageRepository.java | 3 +-- .../discodeit/repository/file/FileReadStatusRepository.java | 2 +- .../mission/discodeit/repository/file/FileUserRepository.java | 3 +-- .../mission/discodeit/repository/jcf/JCFChannelRepository.java | 3 +-- .../mission/discodeit/repository/jcf/JCFMessageRepository.java | 3 +-- .../mission/discodeit/repository/jcf/JCFUserRepository.java | 3 +-- 7 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 86e79604d..a74adc1df 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -49,8 +49,7 @@ public Optional findById(UUID channelId) { @Override public List findAll() { - return channelMap.values().stream() - .collect(Collectors.toList()); + return channelMap.values().stream().toList(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index e4e3bdcfe..f2dcec39a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -49,8 +49,7 @@ public Optional findById(UUID uuid) { @Override public List findAll() { - return messageMap.values().stream() - .collect(Collectors.toList()); + return messageMap.values().stream().toList(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java index f7ce655c7..c5083311d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -19,7 +19,7 @@ public class FileReadStatusRepository implements ReadStatusRepository { private final Path filePath = Path.of("./result/readstatus.ser"); private final Map readStatusMap; - public FileReadStatusRepository(Path filePath) { + public FileReadStatusRepository() { if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 5bd2c2758..fc627b60d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -61,8 +61,7 @@ public Optional findById(UUID userId) { @Override public List findAll() { - return userMap.values().stream() - .collect(Collectors.toList()); + return userMap.values().stream().toList(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 26422796e..4b53c797d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -30,8 +30,7 @@ public Optional findById(UUID channelId) { @Override public List findAll() { - return channelMap.values().stream() - .collect(Collectors.toList()); + return channelMap.values().stream().toList(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index f62fdade1..5fb154b17 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -31,8 +31,7 @@ public Optional findById(UUID uuid) { @Override public List findAll() { - return messageMap.values().stream() - .collect(Collectors.toList()); + return messageMap.values().stream().toList(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 9273c57fe..50f61ec8d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -43,8 +43,7 @@ public Optional findById(UUID userId) { @Override public List findAll() { - return userMap.values().stream() - .collect(Collectors.toList()); + return userMap.values().stream().toList(); } @Override From 2ae46bde91dbc742184d3a68c6619c366e90e06e Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Feb 2025 16:05:59 +0900 Subject: [PATCH 055/115] Complete main code --- build.gradle | 2 + json/users.json | 11 +++ result/binarycontent.ser | Bin 0 -> 82 bytes result/channels.ser | Bin 624 -> 989 bytes result/messages.ser | Bin 1191 -> 528 bytes result/readstatus.ser | Bin 0 -> 82 bytes result/users.ser | Bin 464 -> 488 bytes result/userstatus.ser | Bin 0 -> 2624 bytes .../discodeit/DiscodeitApplication.java | 75 ++++++++++-------- .../discodeit/domain/BinaryContent.java | 8 +- .../mission/discodeit/domain/Channel.java | 13 ++- .../mission/discodeit/domain/Message.java | 13 ++- .../discodeit/domain/PrivateChannel.java | 3 +- .../discodeit/domain/PublicChannel.java | 8 +- .../mission/discodeit/domain/ReadStatus.java | 6 +- .../sprint/mission/discodeit/domain/User.java | 6 +- .../mission/discodeit/domain/UserStatus.java | 8 +- .../discodeit/dto/channel/CreateChannel.java | 4 +- .../dto/channel/UpdatePublicChannel.java | 8 +- .../dto/message/CreateMessageRequest.java | 2 +- .../mission/discodeit/dto/user/UserDTO.java | 1 - .../repository/ChannelRepository.java | 2 + .../discodeit/repository/UserRepository.java | 2 + .../repository/UserStatusRepository.java | 2 + .../file/FileChannelRepository.java | 5 ++ .../repository/file/FileUserRepository.java | 5 ++ .../file/FileUserStatusRepository.java | 10 +++ .../repository/jcf/JCFChannelRepository.java | 5 ++ .../repository/jcf/JCFUserRepository.java | 5 ++ .../jcf/JCFUserStatusRepository.java | 10 +++ .../service/basic/BasicChannelService.java | 20 ++--- .../service/basic/BasicMessageService.java | 27 ++++--- .../mission/discodeit/util/FileIOUtil.java | 45 +++++++---- 33 files changed, 198 insertions(+), 108 deletions(-) create mode 100644 json/users.json create mode 100644 result/binarycontent.ser create mode 100644 result/readstatus.ser create mode 100644 result/userstatus.ser diff --git a/build.gradle b/build.gradle index b70fe880c..54127e66f 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,8 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.16.1' + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/json/users.json b/json/users.json new file mode 100644 index 000000000..ae6433809 --- /dev/null +++ b/json/users.json @@ -0,0 +1,11 @@ +{ + "ad0d6e75-631f-4088-949e-ae573cde9bb3" : { + "id" : "ad0d6e75-631f-4088-949e-ae573cde9bb3", + "createdAt" : 1739257528.242419000, + "updatedAt" : 1739257528.242419000, + "name" : "student1", + "phone" : "010-1292-1188", + "password" : "Abcdefgh1231!!2", + "profileImageId" : null + } +} \ No newline at end of file diff --git a/result/binarycontent.ser b/result/binarycontent.ser new file mode 100644 index 0000000000000000000000000000000000000000..c5975123e324fcbdfc5624e1442489e4e62468d6 GIT binary patch literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 eJQ+AkGKx}*GxBp%Dhli!7{H*M14s#gm=yqSWEX`1 literal 0 HcmV?d00001 diff --git a/result/channels.ser b/result/channels.ser index 269d0af81cfe75b45d0f0dda6c237afea109a0f6..a436dc77c4a3500abad6a5f32e4881d2e618dd2c 100644 GIT binary patch delta 528 zcmeysa+iHVugEeU{v3|;Pj+a==xIu8y0sJ+F&IuBr(0B0BAj9ISYs^2I*s(GH+eD&Ar*1 z*Yf6-Cd)f?RDgwf%XyhV4o!#IQCGxZlANEbS6on(nOCBhn^{~uaRZ+?*fNl}^-zLm z@)1TIPL>eYh!CJYqlpV;>oF99!Utpn2naDSfIT5n!oU^~>g40;T*9FJX5NI?8>T3{ z+A!z!hB-iv!t0KfS6kP-p1eTe?aUc(W;DK;*ZR7<<8}8E#S#WN4ApODEO|SnL*dQF Jme(y4DgbNj!@&Rm delta 264 zcmcc1{()seuSlcGg@;my3(*WDejyO)5>VlH72c{6Xq Y>kU&BP!tt|B>BpDnHYc|9cEMo07`gd#Q*>R diff --git a/result/messages.ser b/result/messages.ser index d02f2c8d09ec50c6e43111059cf157a501adc31a..e7602b645b5acc00f2dc34d7c9051e457fc30d74 100644 GIT binary patch delta 235 zcmZ3^Ie}$DufWo)whN1Wc3FrozT$l<)Zy5~x%xf~5WvX9!0yAqn^;nkn4FQDnpaZn z=~BWV;FFbDmZ)D^l9{9LlUZD1?Zd#CoROH9mzskv9UAKCGFgDpeX;_Js11h?14nsL zW=U$1r%NG29RpiMK|wKy!L*ErKZoP|lO38ddYaOjZY?DY{BNdqyl$QPcIu2bEj!-K znlkw=lbY44Z#($*A6-!a(!&ha$y3hD1afLRObTM&lzHpIZSKw9yp}hwG+ExEqXGbV CcT>p# literal 1191 zcma)5T}TvB6h4iuuIZLq*h55C5B=_pYY~csn)$Q3OQ5bk1>R@h0F-6s+*ojCYicDY0$2V`Q2R{^n&<=Z&22$FQObsgxr8Hq-k}#5rZ8kLnU*%~( zdsnb$7X#b74i<}rFTZ|Jv@)e-B>{vkC{JQUXs;T-q*BraWty?}XPeWn7J9x<^&Kw# zM4nw#x(_m}GqRzH#I#hMikeD@YUrY(64_9&N=3!ckgAJOObCkO9-;r#yC<_t0u)D} zL{1=G$4Lso2*Z#(45@%2tzk$WhSch%H}XnDr&y;Hsv?|;ltg-5>ZPoQI187`7Df~+ zEi7Tbmq1kwOJSW*q*In5s0xJ&FT^F4xC*>7Wh!3fO&Erf2o$F+m12v+=^eEgBiL%R z&7G=JVC0YPFQD*(4de?H$`njwOEoDohHo+D8GZic zkHBsnX}GZa4|&@hwjj8zx$ZRnbvz$5zN!H1KSRc?5!>{X=7qeVNx|2DCEVJ^lnS`B z$PE&Ev6Z`;SvqvA^LaUgFw+5nSH)+)^aW&T(56uRb@7Gsc%;Tz$mBB<&P+BxK9(P! zBbkuPza$CI$mw``-b9=P+`0C`e>-qY?a&$I!TN~sz5g}>Aa?N8l`pkr( z|JS|EJw|b}?d}Tmccj&yk4BE%Ju%lYJk}AT;3qVtuqzd!u(#!!tl;bMM5yjusO~6* VKy9ct7;30%2!=xS^;_fGzX9%`lFa}B diff --git a/result/readstatus.ser b/result/readstatus.ser new file mode 100644 index 0000000000000000000000000000000000000000..c5975123e324fcbdfc5624e1442489e4e62468d6 GIT binary patch literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 eJQ+AkGKx}*GxBp%Dhli!7{H*M14s#gm=yqSWEX`1 literal 0 HcmV?d00001 diff --git a/result/users.ser b/result/users.ser index 5c1c040da4923c751edd220e3f14c7a570a0c607..945e9d2803ca537492d3581c2fd7feafb56e4d60 100644 GIT binary patch delta 149 zcmcb>{DOHxufUXf>%wjB&ECA0H?K5V-l1dSTpex(2w-GlV4rxURD`dfC_gPTC)G1I zF+J5YrI4YHfo-xoqh-*lZ#(#kSuH9+BFrTW9K|K2DXDoSh9wOAj!DTWscGpMhDOGQ mii$=h47>)02D*kumPWdUh87kD#UMSL<-ANFtI}ZxRR91HbS#Mg delta 126 zcmaFCe1UmFufT?0{hz;`wHYwZy diff --git a/result/userstatus.ser b/result/userstatus.ser new file mode 100644 index 0000000000000000000000000000000000000000..a9531e4d91d90d3dd4572ed30242588b268fdee3 GIT binary patch literal 2624 zcmZwI2~ZPf6bJAn5)c6ekAhl7tsqDVh1zNg3M5>CfKWgvj;U*s!Xi1yE)bQEL*!3dn$MEv-^O5$jRg-TiiCy4lPmGx@)H-|u^S)(t~! zR0Y|mz!@+n9Yaz%p)i^p0V~;-J=Z!u+IV{k#0rL{r7B=aFf7ItDgk7LC99-pvLaQY zR{Hrv#K$pnD*n3&|IWe}n?AW%T$~`V`OuVCr812t3u1*qHmOn=#bS^o9)h7^khM(l z;h$Prs_PAE^4oMhZN@-NmN2{uUyCDF$T+A{g~&0E3_(#uA?HXCRIHFl5sV{I$Y4ay zi9@BT7!1bJQG5r)$BYHBg^-n4C517mBml#pSwdn{o){vNdJ5zy2Fo!YA;dx?7-R=Z z#PFWPe(~HU72jll7(+6o0azNeomg#Zx>AC#_Tj%pI<5*NMAbsA#J6foj!g)h7^$jc z!;Yr;OG3}tK#*FQY0DzEl~gk}lM8o_s)?p4DDgY>eCG`^H1DJp=9s6F>hthUfXF0|!v#eMi;>`$;ANBG6R!hQ8G#D>= zz5bgH6AfY|NLlAK>wo@Dn%5=uP~W`OD0BdDRrB-mq8@F1XUUULVNg&HBRpa>FKYp? zGYuw6@g^|U0Ej~xe|zD|dm%3(MGsF82gZU_!*19+vEOZLaAr8X{Fex3c+BXqwSFTx zu{#YWN{id*6BFsVP-^0QC($zRGue?v^_rt@MxhwM`g^hYdz=o(S2%FFZ%>9Kk}3VF z9_#Sgx!IM3z34DrGCOMmg9bnpWbnRO)zAV3-S0EB?BXFHJ-u+R?*0q+m7fVh16g(^UQ*IE0< zoOm!e*th$Zi#;D@gh!rouigO<5IzkiO0XRrrWydTuQu{gt|5A9bHY$xIV<5O8SxsHT?R%u3vYdO3*|mbe?Tql~TPx%2Arf9sgYnY+V#s7-&;a0K z`>)Qf%lud#+)=~x=;eI}(xx)*90yVLv)O+RuB*_6EoX+26@B}_YZ0cyc*%u2o0I2w z6f^)rqpa%M@?N7~!_RZMZWfpfQvLC1DQgD)jd^L8bIsQ=+>Q}`zR;<;!k?Tti3SrT zUy}z2kyg7>7uUg?%E2`D3|q6h%BThTd$-X1&CAmL6=B`>!?y1&vJwklYk3ctVg2+x sIe@{9K6y|l^wV?y(9_Q`p602P)WpTd>f?R;kDNbaD^C|Y`D@kx0mTY-%K!iX literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 60278fb81..898316905 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -3,9 +3,16 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.channel.CreateChannel; +import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; +import com.sprint.mission.discodeit.dto.user.CreateUserRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.FileIOUtil; +import com.sprint.mission.discodeit.util.type.ChannelFormat; import com.sprint.mission.discodeit.util.type.ChannelType; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -13,45 +20,47 @@ import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; +import java.util.UUID; @SpringBootApplication public class DiscodeitApplication { -// static User setupUser(UserService userService) { -// User user = userService.create("student1", "010-1929-1188", "Abcdefgh12312!"); -// return user; -// } -// -// static Channel setupChannel(ChannelService channelService) { -// Channel channel = channelService.create("자바 공지 채널", "공지 채널입니다", ChannelType.VOICE); -// return channel; -// } -// -// static Message messageCreateTest(MessageService messageService, Channel channel, User writer) { -// Message message = messageService.create("안녕하세요", writer, channel); -// System.out.println("메시지 생성 : " + message); -// return message; -// } + static UserDTO setupUser(UserService userService) { + CreateUserRequest createUserRequest = new CreateUserRequest("student1", "010-1292-1188", "Abcdefgh1231!!2", null); + UserDTO user = userService.create(createUserRequest); + return user; + } + + static Channel setupChannel(ChannelService channelService, List joinUsersID) { + CreateChannel.PublicRequest publicRequest = new CreateChannel.PublicRequest("자바 개발자 오픈 채널", "자바 개발자 누구든 환영입니다!", ChannelFormat.TEXT, joinUsersID); + Channel channel = channelService.createPublicChannel(publicRequest); + return channel; + } + + static Message messageCreateTest(MessageService messageService, UUID channelID, UUID writerID) { + CreateMessageRequest request = new CreateMessageRequest(null, "안녕하세요", writerID, channelID); + Message message = messageService.create(request); + System.out.println("메시지 생성 : " + message); + return message; + } public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); -// UserService userService = context.getBean(UserService.class); -// System.out.println("userService = " + userService); -// ChannelService channelService = context.getBean(ChannelService.class); -// System.out.println("channelService = " + channelService); -// MessageService messageService = context.getBean(MessageService.class); -// System.out.println("messageService = " + messageService); -// -// try { -// Files.deleteIfExists(Paths.get("./result/users.ser")); -// Files.deleteIfExists(Paths.get("./result/messages.ser")); -// Files.deleteIfExists(Paths.get("./result/channels.ser")); -// } catch (IOException e) { -// System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); -// } -// -// User user = setupUser(userService); -// Channel channel = setupChannel(channelService); -// Message message = messageCreateTest(messageService, channel, user); + UserService userService = context.getBean(UserService.class); + System.out.println("userService = " + userService); + ChannelService channelService = context.getBean(ChannelService.class); + System.out.println("channelService = " + channelService); + MessageService messageService = context.getBean(MessageService.class); + System.out.println("messageService = " + messageService); + + FileIOUtil.initializeFiles(); + + UserDTO user = setupUser(userService); + Channel channel = setupChannel(channelService, List.of(user.getId())); + messageCreateTest(messageService, user.getId(), channel.getId()); + + FileIOUtil.convertSerToJson(Path.of("./result/users.ser"), Path.of("./json/users.json"), User.class); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index 9c8b0480d..d2d489034 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -3,12 +3,16 @@ import com.sprint.mission.discodeit.util.type.BinaryContentType; import lombok.Getter; +import java.io.Serial; +import java.io.Serializable; import java.time.Instant; import java.util.UUID; @Getter -public class BinaryContent { - private UUID id; +public class BinaryContent implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; private Instant createdAt; private byte[] content; private BinaryContentType contentType; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index 547588df3..eab525d9e 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -1,25 +1,24 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Getter; import lombok.Setter; +import java.io.Serial; import java.io.Serializable; import java.time.Instant; import java.util.List; -import java.util.Objects; import java.util.UUID; @Getter -@Setter public abstract class Channel implements Serializable { - private UUID id; + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; private Instant createdAt; private Instant updatedAt; - private List joinMembers; + private List joinMembers; - public Channel(List joinMembers) { + public Channel(List joinMembers) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index 71f89afcc..a78a0fce3 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.Setter; +import java.io.Serial; import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; @@ -12,9 +13,10 @@ import java.util.UUID; @Getter -@Setter public class Message implements Serializable { - private UUID id; + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; private Instant createdAt; private Instant updatedAt; private String content; @@ -40,16 +42,13 @@ public void update(String content, UUID newAttachment) { @Override public String toString() { - String writerUserName = writer != null ? writer.getName() : "Unknown"; - String useChannelName = channel != null ? channel.getName() : "Unknown"; - return "Message{" + "id=" + id + ", createdAt=" + createdAt + ", updatedAt=" + updatedAt + ", content='" + content + '\'' + - ", writer='" + writerUserName + '\'' + - ", channel='" + useChannelName + '\'' + + ", writer='" + writerID + '\'' + + ", channel='" + channelID + '\'' + '}'; } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java index 311dabc5d..2dad5fff4 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java @@ -6,6 +6,7 @@ import lombok.ToString; import java.util.List; +import java.util.UUID; @Getter @ToString @@ -13,7 +14,7 @@ public class PrivateChannel extends Channel { // private ChannelFormat channelFormat; private ChannelType channelType; - public PrivateChannel(List joinMember, ChannelFormat channelFormat) { + public PrivateChannel(List joinMember, ChannelFormat channelFormat) { super(joinMember); this.channelFormat = channelFormat; this.channelType = ChannelType.PRIVATE; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java index cbd686d01..4b3b8e782 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java @@ -3,10 +3,10 @@ import com.sprint.mission.discodeit.util.type.ChannelFormat; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Getter; -import lombok.Setter; import lombok.ToString; import java.util.List; +import java.util.UUID; @Getter @ToString @@ -16,7 +16,7 @@ public class PublicChannel extends Channel { private ChannelFormat channelFormat; private ChannelType channelType; - public PublicChannel(String name, String description, ChannelFormat channelFormat, List joinMember) { + public PublicChannel(String name, String description, ChannelFormat channelFormat, List joinMember) { super(joinMember); this.name = name; this.description = description; @@ -24,9 +24,9 @@ public PublicChannel(String name, String description, ChannelFormat channelForma this.channelType = ChannelType.PUBLIC; } - public void update(String name, String description, User newUser) { + public void update(String name, String description, UUID newUserID) { this.name = name; this.description = description; - super.getJoinMembers().add(newUser); + super.getJoinMembers().add(newUserID); } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java index f2a22dd48..5e0d83835 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -3,13 +3,17 @@ import lombok.Getter; import lombok.Setter; +import java.io.Serial; +import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; import java.util.UUID; @Getter @Setter -public class ReadStatus { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 +public class ReadStatus implements Serializable { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 + @Serial + private static final long serialVersionUID = 1L; private UUID id; private Instant createdAt; private Instant updateAt; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index 3ba5ab439..9b4b167c5 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -3,6 +3,7 @@ import lombok.Getter; import lombok.Setter; +import java.io.Serial; import java.io.Serializable; import java.time.Instant; import java.time.LocalDateTime; @@ -13,9 +14,10 @@ import java.util.UUID; @Getter -@Setter public class User implements Serializable { - private UUID id; + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; private Instant createdAt; private Instant updatedAt; private String name; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index 3495433a9..5a0305a3c 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -3,13 +3,17 @@ import com.sprint.mission.discodeit.util.type.OnlineStatusType; import lombok.Getter; +import java.io.Serial; +import java.io.Serializable; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.UUID; @Getter -public class UserStatus { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 - private UUID id; +public class UserStatus implements Serializable {// 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; private Instant createdAt; private Instant updateAt; private Instant lastActiveAt; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index 8749da1c6..948343605 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -13,7 +13,7 @@ public class CreateChannel { @Getter @AllArgsConstructor public static class PrivateRequest { - private List joinUser; + private List joinUser; private ChannelFormat channelFormat; } @@ -23,6 +23,6 @@ public static class PublicRequest { private String name; private String description; ChannelFormat channelFormat; - private List joinUser; + private List joinUser; } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java index a973337b9..dc6fabac0 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java @@ -1,12 +1,6 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.domain.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - import java.util.UUID; -public record UpdatePublicChannel(UUID channelId, String name, String description, User newUser) { +public record UpdatePublicChannel(UUID channelId, String name, String description, UUID newUserID) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java index e55f04e21..45d615621 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java @@ -6,5 +6,5 @@ import java.util.List; import java.util.UUID; -public record CreateMessageRequest(List attachmentsID, String content, User writer, Channel channel) { +public record CreateMessageRequest(List attachmentsID, String content, UUID channelID, UUID writerID) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index e1d5e365a..4ebaa906e 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -29,7 +29,6 @@ public static UserDTO fromDomain(User user) { .name(user.getName()) .phone(user.getPhone()) .profileImageId(user.getProfileImageId()) - .userStatusId(user.getUserStatusId()) .build(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 67114678c..0418c76b9 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -9,6 +9,8 @@ public interface ChannelRepository { Channel save(Channel channel); + boolean channelExistById(UUID channelID); + Optional findById(UUID channelId); List findAll(); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 15763ee5d..0b175b317 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -9,6 +9,8 @@ public interface UserRepository { User save(User user); + boolean userExistById(UUID userID); + Optional findByPhone(String phone); Optional findByName(String name); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index 804537052..e57422050 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -16,4 +16,6 @@ public interface UserStatusRepository { List findAll(); void deleteById(UUID id); + + void deleteByUserId(UUID userID); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index a74adc1df..1368a2b18 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -40,6 +40,11 @@ public Channel save(Channel channel) { return channel; } + @Override + public boolean channelExistById(UUID channelID) { + return channelMap.containsKey(channelID); + } + @Override public Optional findById(UUID channelId) { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index fc627b60d..f1c143b99 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -40,6 +40,11 @@ public User save(User user) { return user; } + @Override + public boolean userExistById(UUID userID) { + return userMap.containsKey(userID); + } + @Override public Optional findByPhone(String phone) { return userMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java index 59a05c340..12b545666 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -62,4 +62,14 @@ public void deleteById(UUID id) { userStatusMap.remove(id); saveToFile(userStatusMap, filePath); } + + @Override + public void deleteByUserId(UUID userID) { + List keysToRemove = userStatusMap.entrySet().stream() + .filter(entry -> entry.getValue().getUserId().equals(userID)) + .map(Map.Entry::getKey) + .toList(); + + keysToRemove.forEach(userStatusMap::remove); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 4b53c797d..921fe87ca 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -21,6 +21,11 @@ public Channel save(Channel channel) { return channel; } + @Override + public boolean channelExistById(UUID channelID) { + return channelMap.containsKey(channelID); + } + @Override public Optional findById(UUID channelId) { return channelMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index 50f61ec8d..e3d27dffc 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -22,6 +22,11 @@ public User save(User user) { return user; } + @Override + public boolean userExistById(UUID userID) { + return userMap.containsKey(userID); + } + @Override public Optional findByPhone(String phone) { return userMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java index a39dad8f5..e47a36d56 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -45,4 +45,14 @@ public List findAll() { public void deleteById(UUID id) { repository.remove(id); } + + @Override + public void deleteByUserId(UUID userID) { + List keysToRemove = repository.entrySet().stream() + .filter(entry -> entry.getValue().getUserId().equals(userID)) + .map(Map.Entry::getKey) + .toList(); + + keysToRemove.forEach(repository::remove); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index c8ea9dcf0..f588e788b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -35,8 +35,8 @@ public class BasicChannelService implements ChannelService { @Override public Channel createPublicChannel(CreateChannel.PublicRequest request) { // User가 UserRepository에 저장되어 있는지 확인 - for (User user : request.getJoinUser()) { - Optional userOptional = userRepository.findById(user.getId()); + for (UUID userID : request.getJoinUser()) { + Optional userOptional = userRepository.findById(userID); if (userOptional.isEmpty()) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } @@ -49,11 +49,11 @@ public Channel createPublicChannel(CreateChannel.PublicRequest request) { @Override public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { - List users = request.getJoinUser(); + List users = request.getJoinUser(); // User가 UserRepository에 저장되어 있는지 확인 - for (User user : users) { - Optional userOptional = userRepository.findById(user.getId()); + for (UUID userID : users) { + Optional userOptional = userRepository.findById(userID); if (userOptional.isEmpty()) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } @@ -63,9 +63,9 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { channelRepository.save(channel); // User마다 ReadStatus 생성하기 - for (User user : users) { + for (UUID userID : users) { Instant lastReadAt = Instant.now(); - ReadStatus readStatus = new ReadStatus(user.getId(), channel.getId(), lastReadAt); + ReadStatus readStatus = new ReadStatus(userID, channel.getId(), lastReadAt); readStatusRepository.save(readStatus); } @@ -131,17 +131,17 @@ public List findAllPrivate(UUID userId) { // 통일성을 위해 findAl return allChannels.stream() .filter(channel -> channel instanceof PrivateChannel) .filter(channel -> channel.getJoinMembers().stream() - .anyMatch(user -> user.getId().equals(userId))) + .anyMatch(userID -> userID.equals(userId))) .collect(Collectors.toList()); } @Override public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 validChannel(request.channelId()); - validUser(request.newUser().getId()); + validUser(request.newUserID()); PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - updateChannel.update(request.name(), request.description(), request.newUser()); + updateChannel.update(request.name(), request.description(), request.newUserID()); channelRepository.save(updateChannel); return updateChannel; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index d4b98a339..e49d790bc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -34,18 +34,21 @@ public Message create(CreateMessageRequest request) { } // 작성자와 채널에 대한 검증 - validUser(request.writer().getId()); - validChannel(request.channel().getId()); + validUser(request.writerID()); + validChannel(request.channelID()); // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 - for (UUID attachmentID : request.attachmentsID()) { - Optional attachment = binaryContentRepository.findById(attachmentID); - if (attachment.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); + if (request.attachmentsID() != null) { + for (UUID attachmentID : request.attachmentsID()) { + Optional attachment = binaryContentRepository.findById(attachmentID); + if (attachment.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); + } } } - Message message = new Message(request.content(), request.writer().getId(), request.channel().getId(), request.attachmentsID()); + + Message message = new Message(request.content(), request.writerID(), request.channelID(), request.attachmentsID()); messageRepository.save(message); return message; } @@ -96,13 +99,15 @@ public void deleteMessage(UUID messageID) { } private void validUser(UUID userId) { - userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + if (!userRepository.userExistById(userId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } } private void validChannel(UUID channelId) { - channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + if (!channelRepository.channelExistById(channelId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + } } private void validMessage(UUID messageId) { diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index e9091720c..eaab0925f 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -1,12 +1,18 @@ package com.sprint.mission.discodeit.util; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.io.*; import java.nio.file.*; import java.util.*; public class FileIOUtil { + private static final ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.registerModule(new JavaTimeModule()); // Instant, UUID 변환 지원 + } public static Map loadFromFile(Path filePath) { if (!Files.exists(filePath)) { @@ -15,39 +21,44 @@ public static Map loadFromFile(Path filePath) { try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(filePath))) { return (Map) ois.readObject(); } catch (EOFException e) { - return new HashMap<>(); + return new HashMap<>(); // 파일이 비어 있을 경우 빈 맵 반환 } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("파일을 읽어오는 도중 문제가 발생하였습니다.", e); + throw new RuntimeException("❌ 파일을 읽는 도중 오류 발생 (" + filePath + "): " + e.getMessage(), e); } } public static void saveToFile(Map data, Path filePath) { - try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(filePath))) { - oos.writeObject(data); + try { + Files.createDirectories(filePath.getParent()); // 디렉토리 없으면 생성 + try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(filePath))) { + oos.writeObject(data); + } } catch (IOException e) { - throw new RuntimeException("파일 저장 도중 문제가 발생하였습니다.", e); + throw new RuntimeException("❌ 파일 저장 중 오류 발생 (" + filePath + "): " + e.getMessage(), e); } } - //.dat 파일을 읽기 쉬운 Json 파일로 변환하는 메서드 - public static void convertDSerToJson(Path datFilePath, Path jsonFilePath) { - Map data = loadFromFile(datFilePath); - ObjectMapper objectMapper = new ObjectMapper(); + // `.dat` 파일을 읽기 쉬운 JSON 파일로 변환 + public static void convertSerToJson(Path datFilePath, Path jsonFilePath, Class valueType) { + Map data = loadFromFile(datFilePath); try { objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFilePath.toFile(), data); } catch (IOException e) { - throw new RuntimeException("JSON 파일로 변환하는 도중 문제가 발생하였습니다.", e); + throw new RuntimeException("❌ JSON 변환 중 오류 발생 (" + jsonFilePath + "): " + e.getMessage(), e); } } - // 파일 초기화 메서드 + // 파일 초기화 및 새로 생성 public static void initializeFiles() { - try { - Files.deleteIfExists(Paths.get("./result/users.ser")); - Files.deleteIfExists(Paths.get("./result/messages.ser")); - Files.deleteIfExists(Paths.get("./result/channels.ser")); - } catch (IOException e) { - System.err.println("파일 초기화 중 오류 발생: " + e.getMessage()); + String[] fileNames = { "users.ser", "messages.ser", "channels.ser" }; + for (String fileName : fileNames) { + Path filePath = Paths.get("./result/" + fileName); + try { + Files.deleteIfExists(filePath); + Files.createFile(filePath); + } catch (IOException e) { + System.err.println("⚠️ 파일 초기화 중 오류 발생 (" + filePath + "): " + e.getMessage()); + } } } } From 810f013c53d687919065cd754192eff7eee37b31 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Feb 2025 16:08:51 +0900 Subject: [PATCH 056/115] Update code --- .../repository/file/FileBinaryContentRepository.java | 1 - .../discodeit/repository/file/FileChannelRepository.java | 2 -- .../discodeit/repository/file/FileMessageRepository.java | 4 ---- .../mission/discodeit/repository/file/FileUserRepository.java | 2 -- .../discodeit/repository/jcf/JCFChannelRepository.java | 1 - .../discodeit/repository/jcf/JCFMessageRepository.java | 1 - .../mission/discodeit/repository/jcf/JCFUserRepository.java | 2 -- 7 files changed, 13 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java index edf9aacdb..992687ce2 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.repository.BinaryContentRepository; -import org.apache.coyote.http11.upgrade.UpgradeProcessorInternal; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 1368a2b18..70590dd74 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -10,7 +9,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index f2dcec39a..c3a593fb7 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -1,10 +1,7 @@ package com.sprint.mission.discodeit.repository.file; -import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.MessageRepository; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -12,7 +9,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index f1c143b99..b982e3e36 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Repository; @@ -10,7 +9,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 921fe87ca..8f2a9d51d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Repository; import java.util.*; -import java.util.stream.Collectors; @Repository public class JCFChannelRepository implements ChannelRepository { diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 5fb154b17..d9daed3fd 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -6,7 +6,6 @@ import java.util.*; -import java.util.stream.Collectors; @Repository public class JCFMessageRepository implements MessageRepository { diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index e3d27dffc..d08607240 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -2,11 +2,9 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import java.util.*; -import java.util.stream.Collectors; @Repository public class JCFUserRepository implements UserRepository { From 742525f956fdee1680436b935c1c08d80b660a43 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 13 Feb 2025 20:39:01 +0900 Subject: [PATCH 057/115] Update Channel Service code --- build.gradle | 4 +- json/users.json | 8 +- result/channels.ser | Bin 989 -> 0 bytes result/messages.ser | Bin 528 -> 0 bytes result/readstatus.ser | Bin 82 -> 861 bytes result/users.ser | Bin 488 -> 0 bytes result/userstatus.ser | Bin 2624 -> 9642 bytes .../discodeit/DiscodeitApplication.java | 9 +- .../sprint/mission/discodeit/domain/User.java | 9 +- .../mission/discodeit/domain/UserStatus.java | 4 +- .../discodeit/dto/channel/CreateChannel.java | 2 - .../discodeit/dto/user/UpdateUser.java | 6 - .../discodeit/dto/user/UpdateUserRequest.java | 8 + .../mission/discodeit/dto/user/UserDTO.java | 2 + .../file/FileBinaryContentRepository.java | 10 +- .../file/FileChannelRepository.java | 10 +- .../file/FileMessageRepository.java | 10 +- .../file/FileReadStatusRepository.java | 10 +- .../repository/file/FileUserRepository.java | 10 +- .../file/FileUserStatusRepository.java | 13 +- .../jcf/JCFBinaryContentRepository.java | 2 + .../repository/jcf/JCFChannelRepository.java | 2 + .../repository/jcf/JCFMessageRepository.java | 2 + .../jcf/JCFReadStatusRepository.java | 2 + .../repository/jcf/JCFUserRepository.java | 2 + .../jcf/JCFUserStatusRepository.java | 2 + .../discodeit/service/UserService.java | 3 +- .../discodeit/service/UserStatusService.java | 2 + .../service/basic/BasicReadStatusService.java | 3 + .../service/basic/BasicUserService.java | 27 ++-- .../service/basic/BasicUserStatusService.java | 5 + src/main/resources/application.yml | 13 +- .../mission/discodeit/ChannelServiceTest.java | 71 +++++++++ .../discodeit/DiscodeitApplicationTests.java | 1 + .../mission/discodeit/UserServiceTest.java | 141 ++++++++++++++++++ 35 files changed, 336 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/UserServiceTest.java diff --git a/build.gradle b/build.gradle index 54127e66f..ea6ff2b9a 100644 --- a/build.gradle +++ b/build.gradle @@ -27,8 +27,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.16.1' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok:1.18.30' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } diff --git a/json/users.json b/json/users.json index ae6433809..7ee14859d 100644 --- a/json/users.json +++ b/json/users.json @@ -1,8 +1,8 @@ { - "ad0d6e75-631f-4088-949e-ae573cde9bb3" : { - "id" : "ad0d6e75-631f-4088-949e-ae573cde9bb3", - "createdAt" : 1739257528.242419000, - "updatedAt" : 1739257528.242419000, + "f20ad84c-e814-4524-a808-5e7d3067e54d" : { + "id" : "f20ad84c-e814-4524-a808-5e7d3067e54d", + "createdAt" : 1739260136.846987000, + "updatedAt" : 1739260136.846987000, "name" : "student1", "phone" : "010-1292-1188", "password" : "Abcdefgh1231!!2", diff --git a/result/channels.ser b/result/channels.ser index a436dc77c4a3500abad6a5f32e4881d2e618dd2c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 989 zcmb7?!D|yi6vkgSscmdh+bUiP8okBBE|uaz1#4qNQ&K3jp*<)#-5ruCyR+-g#H^P> zA%#Fe3RXz577sb^k8j@{zy2WvN(v5}HZoF3=eC=M2+zBiSc&c>n3viEnM^DuhE?0o-aCvjCx z^e0j!!5Y+UOJ$BrC|51Q7_q5p5T@G(CR{aa3lXYL7UoQ%C-aC>Yo*>jvEuE4r&fA1eU~3M$to1^MFqs%BI7Wb$T}C`dm=tRmE-R>0 z*u8tL^t%7_*z+iW=M-a#Y%90*b*Fpl`>ZFELahUrv`tf_&D?(c>U{sB-Vn5Z8nDn8YY!Dw1)Kr;lo2%I=i(UeRkzi%tI* zYqi|^_t%9#Tgkd(fwcs7%&5X951(*UOK>BR|89Bu;pE}A^7iiCd4Ih8t5rMHS_{5R zh)OdqkR)6wE(Hm=@@2p{l0YVu3$ntLq9HR$bd6b1^q@=;sUIawpmOU770;w{%oiPx zE4=T)q#scsSbQBep*39er9j<|aBI{XQxQ5%)LFt|cg85P;ISs$9ubfy%yET6DvZ9x zgBS1$CbUyK4Mtq^Q1YPE$vCpitq%!#nksX!cI=tB^!vPDeMYKt)kYU#X3*QXSnpl- zwg%n);LWBUNqIP4<3*Y*>#cV8=H?f_+5malDO+X&;qFy``p3b?+=v#2()M*|WVre6 T%hLyEZ@+ymi?)Bawvqn@kSejt diff --git a/result/readstatus.ser b/result/readstatus.ser index c5975123e324fcbdfc5624e1442489e4e62468d6..721a5daf0019ecb9e44f1f602e5b8794c70c6290 100644 GIT binary patch literal 861 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05J>DFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#I;>9x95%w~VB;Nzc1TqVvzK(q9c^KXGxPL;i$RV70!AhVHXjDgut%1kL_sAFLD z0R{lj)gWseOF$w(!#PR|Qh>VQe74f!)FMxa`ig>LkSeAw(NzKl?62m#@(Mrve%o~l z&_BH3umRbl7o1u&HMV7!w35dr9tMVrf^uFaklWMO&KH+0`D0K4GJ+Xw5GRV1rb7i5 zQJ@BhrSoqwHn7cKQm}0)x8cK29-$D?so_`pwrG}5Jss@4e|ov=U9cz%$O;Zj!=`z6 zfNkf)l$v@Ao9!SC5PK$l@5-;(a>2}Vo7;ci(~b=g(e@X`2P*!mEbnLfBr^MmYbIC} zm+k#qIKZ}xVA|gIrvQuJK^h?Ttf^d_7qHUYH?(O=o?EMP07P{AoW1qF<^l}7oGzlg u4;_s0+TO+X0&Ke!rtO`tCt$H1qyb{jayRz+>9agKx4v*XeRiscM+E?cHV$b3 delta 18 Xcmcc17Bs<)hoPK1acT4*C;6Y>etrpPx)tF1F$Q1HPFym{~a-|s&^{()~aJliFoNH9R22W!M+ zABgg+e}4XYvGuzG-YPuJC84V%L8)V?W2TwOWKK)9v>0CStp~AwKYoAp zt#b3VI0!xP)}fIzVz9^4cO1<+Oce4yE7j+t(~Y-(zn`Bp#UOdPd}y^^C9(*N(p+Fr zaAUX>0p%uatO?Ls}#j3A>ci157Ya6;q-3u9rB2z=88k5h!H zQOVg39jSePB1pjyrbm^Wh&1e>-JaT7O%Y>;QqzyH=eGDNlY;$ET1v|up0l_hDU0t~ z#x2M|(GiGi^GjtdHSfO1@dQ1lzijSb&djZyH2_LAYh7c(d=v+p}7z(%t!6l?fEF`bd+&3^~XZxEeBGTW&i*H diff --git a/result/userstatus.ser b/result/userstatus.ser index a9531e4d91d90d3dd4572ed30242588b268fdee3..b22320a868244b4c0d87e4bb1c064ca0ac052a0a 100644 GIT binary patch literal 9642 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 diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 898316905..85ada8b61 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -8,6 +8,9 @@ import com.sprint.mission.discodeit.dto.user.CreateUserRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.service.UserService; @@ -49,11 +52,11 @@ static Message messageCreateTest(MessageService messageService, UUID channelID, public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); UserService userService = context.getBean(UserService.class); - System.out.println("userService = " + userService); ChannelService channelService = context.getBean(ChannelService.class); - System.out.println("channelService = " + channelService); MessageService messageService = context.getBean(MessageService.class); - System.out.println("messageService = " + messageService); + System.out.println("UserRepository 의존성 주입 확인 : " + context.getBean(UserRepository.class)); + System.out.println("ChannelRepository 의존성 주입 확인 : " + context.getBean(ChannelRepository.class)); + System.out.println("MessageRepository 의존성 주입 확인 : " + context.getBean(MessageRepository.class)); FileIOUtil.initializeFiles(); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index 9b4b167c5..c8e60f532 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -6,14 +6,11 @@ import java.io.Serial; import java.io.Serializable; import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.Objects; -import java.util.Optional; import java.util.UUID; @Getter +@Setter public class User implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -24,8 +21,9 @@ public class User implements Serializable { private String phone; private String password; private UUID profileImageId; + private UUID userStatusId; - public User(String name, String phone, String password, UUID profileImageId) { + public User(String name, String phone, String password, UUID profileImageId, UUID userStatusId) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); @@ -33,6 +31,7 @@ public User(String name, String phone, String password, UUID profileImageId) { this.phone = phone; this.password = password; this.profileImageId = profileImageId; + this.userStatusId = userStatusId; } public void update(String password) { diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index 5a0305a3c..10618c481 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.util.type.OnlineStatusType; import lombok.Getter; +import lombok.ToString; import java.io.Serial; import java.io.Serializable; @@ -10,7 +11,8 @@ import java.util.UUID; @Getter -public class UserStatus implements Serializable {// 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 +@ToString +public class UserStatus implements Serializable { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 @Serial private static final long serialVersionUID = 1L; private final UUID id; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index 948343605..58ec5cced 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -1,7 +1,5 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.util.type.ChannelFormat; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java deleted file mode 100644 index 49b7aeeda..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUser.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import java.util.UUID; - -public record UpdateUser(UUID userId, String password, byte[] profile) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java new file mode 100644 index 000000000..0ecb71140 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.user; + +import com.sprint.mission.discodeit.util.type.BinaryContentType; + +import java.util.UUID; + +public record UpdateUserRequest(UUID userId, String password, byte[] profile) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index 4ebaa906e..d31ea6389 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -12,6 +12,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor +@ToString public class UserDTO { private UUID id; private Instant createdAt; @@ -29,6 +30,7 @@ public static UserDTO fromDomain(User user) { .name(user.getName()) .phone(user.getPhone()) .profileImageId(user.getProfileImageId()) + .userStatusId(user.getUserStatusId()) .build(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java index 992687ce2..c7180cae9 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -2,7 +2,10 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -13,13 +16,14 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Profile("file") @Repository -@Primary public class FileBinaryContentRepository implements BinaryContentRepository { - private final Path filePath = Path.of("./result/binarycontent.ser"); + private final Path filePath; private final Map repository; - public FileBinaryContentRepository() { + public FileBinaryContentRepository(@Value("${discodeit.repository.binarycontent-file-path}") Path filePath) { + this.filePath = filePath; if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index 70590dd74..b535a06e1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -2,7 +2,10 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -13,13 +16,14 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Profile("file") @Repository -@Primary public class FileChannelRepository implements ChannelRepository { - private final Path filePath = Path.of("./result/channels.ser"); + private final Path filePath; private final Map channelMap; - public FileChannelRepository() { + public FileChannelRepository(@Value("${discodeit.repository.channel-file-path}") Path filePath) { + this.filePath = filePath; if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index c3a593fb7..9c9965d31 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -2,7 +2,10 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -13,13 +16,14 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Profile("file") @Repository -@Primary public class FileMessageRepository implements MessageRepository { - private final Path filePath = Path.of("./result/messages.ser"); + private final Path filePath; private final Map messageMap; - public FileMessageRepository() { + public FileMessageRepository(@Value("${discodeit.repository.message-file-path}") Path filePath) { + this.filePath = filePath; if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java index c5083311d..2735f0faa 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -2,7 +2,10 @@ import com.sprint.mission.discodeit.domain.ReadStatus; import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -13,13 +16,14 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Profile("file") @Repository -@Primary public class FileReadStatusRepository implements ReadStatusRepository { - private final Path filePath = Path.of("./result/readstatus.ser"); + private final Path filePath; private final Map readStatusMap; - public FileReadStatusRepository() { + public FileReadStatusRepository(@Value("${discodeit.repository.read-status-file-path}") Path filePath) { + this.filePath = filePath; if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index b982e3e36..45c612ce9 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -2,7 +2,10 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -13,13 +16,14 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Profile("file") @Repository -@Primary public class FileUserRepository implements UserRepository { - private final Path filePath = Path.of("./result/users.ser"); + private final Path filePath; private final Map userMap; - public FileUserRepository() { + public FileUserRepository(@Value("${discodeit.repository.user-file-path}") Path filePath) { + this.filePath = filePath; if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java index 12b545666..e9066d862 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -2,7 +2,8 @@ import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.repository.UserStatusRepository; -import org.springframework.context.annotation.Primary; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.io.IOException; @@ -13,13 +14,16 @@ import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; +@Profile("file") @Repository -@Primary public class FileUserStatusRepository implements UserStatusRepository { - private final Path filePath = Path.of("./result/userstatus.ser"); + private final Path filePath; private final Map userStatusMap; - public FileUserStatusRepository() { + // 생성자에서 Path를 입력받도록 변경 + public FileUserStatusRepository(@Value("${discodeit.repository.user-status-file-path}") Path filePath) { + this.filePath = filePath; + if (!Files.exists(this.filePath)) { try { Files.createFile(this.filePath); @@ -28,6 +32,7 @@ public FileUserStatusRepository() { throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); } } + this.userStatusMap = loadFromFile(this.filePath); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java index 7c5a0755d..81ddffcab 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -2,10 +2,12 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; +@Profile("jcf") @Repository public class JCFBinaryContentRepository implements BinaryContentRepository { private final Map repository; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java index 8f2a9d51d..349c2096b 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java @@ -2,10 +2,12 @@ import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.repository.ChannelRepository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; +@Profile("jcf") @Repository public class JCFChannelRepository implements ChannelRepository { private final Map channelMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index d9daed3fd..5b15884e5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -2,11 +2,13 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.repository.MessageRepository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; +@Profile("jcf") @Repository public class JCFMessageRepository implements MessageRepository { private final Map messageMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java index 52b288d41..a103e6b09 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java @@ -2,11 +2,13 @@ import com.sprint.mission.discodeit.domain.ReadStatus; import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; import java.util.stream.Collectors; +@Profile("jcf") @Repository public class JCFReadStatusRepository implements ReadStatusRepository { private final Map repository; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index d08607240..e820098f6 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -2,10 +2,12 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; +@Profile("jcf") @Repository public class JCFUserRepository implements UserRepository { private final Map userMap; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java index e47a36d56..8f7d2bcfd 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -3,10 +3,12 @@ import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.repository.file.FileUserRepository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; +@Profile("jcf") @Repository public class JCFUserStatusRepository implements UserStatusRepository { private final Map repository; diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 23e6f1925..4d1d1fd0d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.dto.user.*; import java.util.List; @@ -12,7 +13,7 @@ public interface UserService { List findAll(); - UserDTO update(UpdateUser request); + User update(UpdateUserRequest request); UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index 7a1f65c6b..5c38f7299 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -13,6 +13,8 @@ public interface UserStatusService { Optional find(UUID id); + Optional findByUserId(UUID userID); + List findAll(); UserStatus update(UpdateUserStatusRequest request); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 1b752415c..db792d858 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -54,6 +54,9 @@ public List findAllByUserId(UUID userID) { return readStatusRepository.findAllByUserId(userID); } + /* + User가 채널에서 메시지를 읽은 시간을 업데이트 + */ @Override public ReadStatus update(UpdateReadStatusRequest request) { ReadStatus readStatus = readStatusRepository.findById(request.readStatusID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 12d33cc5b..945aa3ade 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -10,13 +10,13 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.type.BinaryContentType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.time.Instant; import java.util.List; -import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -34,7 +34,7 @@ public UserDTO create(CreateUserRequest request) { } if (!User.isValidPhone(request.phone())) { - throw new ServiceException(ErrorCode.INVALID_WRITER); + throw new ServiceException(ErrorCode.INVALID_PHONE); } userRepository.findByPhone(request.phone()).ifPresent(x -> { @@ -48,11 +48,13 @@ public UserDTO create(CreateUserRequest request) { .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); } - User createdUser = new User(request.name(), request.phone(), request.password(), request.profileId()); + User createdUser = new User(request.name(), request.phone(), request.password(), request.profileId(), null); userRepository.save(createdUser); // User 레포지토리에 저장하기 Instant lastActiveAt = Instant.now(); - UserStatus userStatus = new UserStatus(createdUser.getId(), lastActiveAt); // UserStatus 생성 + UserStatus userStatus = new UserStatus(createdUser.getId(), lastActiveAt);// UserStatus 생성 + createdUser.setUserStatusId(userStatus.getId()); + userStatusRepository.save(userStatus); return UserDTO.fromDomain(createdUser); @@ -73,7 +75,7 @@ public List findAll() { } @Override - public UserDTO update(UpdateUser request) { + public User update(UpdateUserRequest request) { User updateUser = userRepository.findById(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); updateUser.update(request.password()); // 비밀번호를 수정합니다. @@ -81,15 +83,17 @@ public UserDTO update(UpdateUser request) { if (request.profile() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. if (updateUser.getProfileImageId() == null) { // 새로운 Profile 을 생성하고 저장합니다. - //binaryContentRepository 만들고 다시 작성할 것 !!! - } else { - Optional profile = binaryContentRepository.findById(updateUser.getProfileImageId()); - profile.get().updateContent(request.profile()); + BinaryContent profile = new BinaryContent(request.profile(), BinaryContentType.IMAGE); + binaryContentRepository.save(profile); + updateUser.setProfileImageId(profile.getId()); + } else { // 이미 프로필이 존재한다면 + BinaryContent profile = binaryContentRepository.findById(updateUser.getProfileImageId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + profile.updateContent(request.profile()); + updateUser.setProfileImageId(profile.getId()); } } - userRepository.save(updateUser); - return UserDTO.fromDomain(updateUser); + return updateUser; } @Override @@ -99,7 +103,6 @@ public UserDTO delete(UUID id) { if (deleteUser.getProfileImageId() != null) { // 만약 프로필이 등록되어 있다면 해당 프로필도 같이 삭제 binaryContentRepository.deleteById(deleteUser.getProfileImageId()); } - userStatusRepository.deleteByUserId(deleteUser.getId()); // UserStatus 도 같이 삭제 userRepository.delete(id); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index ec1877680..d1b2c8d11 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -40,6 +40,11 @@ public Optional find(UUID id) { return userStatusRepository.findById(id); } + @Override + public Optional findByUserId(UUID userID) { + return userStatusRepository.findByUserId(userID); + } + @Override public List findAll() { return userStatusRepository.findAll(); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8329de47c..5ebae6725 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,12 @@ spring: - application: - name: discodeit + profiles: + active: file + +discodeit: + repository: + user-status-file-path: ./result/userstatus.ser + channel-file-path: ./result/channels.ser + binarycontent-file-path: ./result/binarycontent.ser + user-file-path: ./result/users.ser + read-status-file-path: ./result/readstatus.ser + message-file-path: ./result/messages.ser diff --git a/src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java b/src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java new file mode 100644 index 000000000..19ab60acb --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java @@ -0,0 +1,71 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.PublicChannel; +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.channel.CreateChannel; +import com.sprint.mission.discodeit.dto.user.CreateUserRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.service.ChannelService; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.util.FileIOUtil; +import com.sprint.mission.discodeit.util.type.ChannelFormat; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +@Slf4j +@SpringBootTest +public class ChannelServiceTest { + @Autowired + private ChannelService channelService; + + @Autowired + private UserService userService; + + private List joinUser; + + @BeforeEach + void before() { + FileIOUtil.initializeFiles(); + CreateUserRequest request1 = new CreateUserRequest("테스트유저1", "010-1111-1111", "Abcdefg1234!!", null); + CreateUserRequest request2 = new CreateUserRequest("테스트유저2", "010-2222-1111", "Abcdefg1234!!", null); + CreateUserRequest request3 = new CreateUserRequest("테스트유저3", "010-3333-1111", "Abcdefg1234!!", null); + CreateUserRequest request4 = new CreateUserRequest("테스트유저4", "010-4444-1111", "Abcdefg1234!!", null); + UserDTO testUser1DTO = userService.create(request1); + UserDTO testUser2DTO = userService.create(request2); + UserDTO testUser3DTO = userService.create(request3); + UserDTO testUser4DTO = userService.create(request4); + joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); + + } + + @AfterEach + void after() { + FileIOUtil.initializeFiles(); + } + + @DisplayName("Public 채널 테스트하기") + @Test + void createPublicChannel() { + CreateChannel.PublicRequest request = new CreateChannel.PublicRequest("백엔드 개발자 오픈 채널", "지식 공유를 위해 만든 채널입니다.", ChannelFormat.TEXT, joinUser); + PublicChannel publicChannel = (PublicChannel) channelService.createPublicChannel(request); + + Assertions.assertEquals(request.getName(), publicChannel.getName()); + } + + @DisplayName("Private 채널 테스트하기") + @Test + void createPrivateChannel() { + CreateChannel.PrivateRequest request = new CreateChannel.PrivateRequest(joinUser, ChannelFormat.TEXT); + Channel privateChannel = channelService.createPrivateChannel(request); + + Assertions.assertNotNull(privateChannel); + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java index 3a987a214..6190b2ee5 100644 --- a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java +++ b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java @@ -6,6 +6,7 @@ @SpringBootTest class DiscodeitApplicationTests { + @Test void contextLoads() { } diff --git a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java new file mode 100644 index 000000000..64b810894 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java @@ -0,0 +1,141 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.user.CreateUserRequest; +import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.UserStatusService; +import com.sprint.mission.discodeit.util.FileIOUtil; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Optional; + +@Slf4j +@SpringBootTest +public class UserServiceTest { + @Autowired + private UserService userService; + + @Autowired + private UserStatusService userStatusService; + + private UserDTO testUser; + + @BeforeEach + void before() { + FileIOUtil.initializeFiles(); + CreateUserRequest request = new CreateUserRequest("테스트유저", "010-1234-1234", "Abcdefghi1234!", null); + testUser = userService.create(request); + } + + @AfterEach + void after() { + FileIOUtil.initializeFiles(); + } + + @DisplayName("사용자 생성 테스트") + @Test + void createUser() { + CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); + UserDTO user = userService.create(request); + log.info(user.toString()); + Assertions.assertEquals("홍길동", user.getName()); + } + + @DisplayName("사용자 생성하면 UserStatus가 같이 생성되는지 테스트") + @Test + void validUserStatus() { + CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); + UserDTO user = userService.create(request); // 유저 생성과 동시에 UserStatus가 생성된다. + UserStatus findUserStatus = userStatusService.findByUserId(user.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + + log.info(user.toString()); + log.info(findUserStatus.toString()); + + Assertions.assertNotNull(findUserStatus); + } + + @DisplayName("사용자 생성 시 전화번호 형식을 지켜야 한다.") + @Test + void validPhone() { + CreateUserRequest request = new CreateUserRequest("홍길동", "010-1231233-9191", "Aldnweasdf1234!", null); + + ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { + userService.create(request); + }); + + Assertions.assertEquals(ErrorCode.INVALID_PHONE.getDescription(), exception.getMessage()); + } + + @DisplayName("사용자 생성 시 비밀번호 형식을 지켜야 한다.") + @Test + void validPassword() { + CreateUserRequest request = new CreateUserRequest("홍길동", "010-1234-9191", "1234", null); + + ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { + userService.create(request); + }); + + Assertions.assertEquals(ErrorCode.INVALID_PASSWORD.getDescription(), exception.getMessage()); + } + + + @DisplayName("동일한 사용자의 이름이 존재하면 안 된다") + @Test + void duplicateUserName() { + CreateUserRequest request1 = new CreateUserRequest("홍길동", "010-1234-9191", "Aldnweasdf1234!", null); + CreateUserRequest request2 = new CreateUserRequest("홍길동", "010-3211-1211", "Aldnweasdf1234!", null); + + userService.create(request1); + ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { + userService.create(request2); + }); + + Assertions.assertEquals(ErrorCode.DUPLICATE_NAME.getDescription(), exception.getMessage()); + } + + @DisplayName("동일한 핸드폰 번호가 존재하면 안 된다") + @Test + void duplicatePhone() { + CreateUserRequest request1 = new CreateUserRequest("홍길동", "010-1234-1234", "Aldnweasdf1234!", null); + CreateUserRequest request2 = new CreateUserRequest("김영희", "010-1234-1234", "Aldnweasdf1234!", null); + + userService.create(request1); + ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { + userService.create(request2); + }); + + Assertions.assertEquals(ErrorCode.DUPLICATE_PHONE.getDescription(), exception.getMessage()); + } + + @DisplayName("회원 id로 해당하는 회원 찾기") + @Test + void findUser() { + UserDTO findUser = userService.find(testUser.getId()); + + Assertions.assertEquals(findUser.getName(), testUser.getName()); + } + + @DisplayName("회원 정보 업데이트 하기") + @Test + void updateUser() { + UpdateUserRequest request = new UpdateUserRequest(testUser.getId(), "ChangePassword!!", null); + User updateUser = userService.update(request); + Assertions.assertEquals(updateUser.getPassword(), request.password()); + } + + @DisplayName("사용자를 삭제하면 User Status도 같이 삭제되어야 한다.") + @Test + void deleteUser() { + userService.delete(testUser.getId()); + Optional findUserStatus = userStatusService.findByUserId(testUser.getId()); + Assertions.assertEquals(findUserStatus, Optional.empty()); + } +} From b12436d540c98f003dda5b029a086478f5544571 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 14 Feb 2025 09:44:55 +0900 Subject: [PATCH 058/115] Update UserStatus code --- .../mission/discodeit/domain/UserStatus.java | 5 ++++ .../discodeit/dto/login/LoginRequest.java | 3 +++ .../dto/message/UpdateMessageRequest.java | 2 +- .../discodeit/exception/ErrorCode.java | 3 +++ .../discodeit/repository/UserRepository.java | 2 ++ .../file/FileMessageRepository.java | 2 -- .../repository/file/FileUserRepository.java | 10 ++++++-- .../repository/jcf/JCFUserRepository.java | 8 ++++++ .../discodeit/service/UserService.java | 2 ++ .../service/basic/BasicAuthService.java | 19 +++++++++++++- .../service/basic/BasicChannelService.java | 14 +++++++++++ .../service/basic/BasicMessageService.java | 25 ++++++++++++++++--- .../service/basic/BasicUserService.java | 22 ++++++++++++++++ 13 files changed, 108 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index 10618c481..f7785f2e9 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -2,6 +2,7 @@ import com.sprint.mission.discodeit.util.type.OnlineStatusType; import lombok.Getter; +import lombok.Setter; import lombok.ToString; import java.io.Serial; @@ -11,6 +12,7 @@ import java.util.UUID; @Getter +@Setter @ToString public class UserStatus implements Serializable { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 @Serial @@ -20,6 +22,7 @@ public class UserStatus implements Serializable { // 사용자 별 마지막으 private Instant updateAt; private Instant lastActiveAt; private UUID userId; + private OnlineStatusType onlineStatusType; public UserStatus(UUID userId, Instant lastActiveAt) { this.id = UUID.randomUUID(); @@ -27,6 +30,7 @@ public UserStatus(UUID userId, Instant lastActiveAt) { this.updateAt = Instant.now(); this.lastActiveAt = lastActiveAt; this.userId = userId; + this.onlineStatusType = isOnline(); } public OnlineStatusType isOnline() { @@ -36,5 +40,6 @@ public OnlineStatusType isOnline() { public void update(Instant lastActiveAt) { this.updateAt = Instant.now(); this.lastActiveAt = lastActiveAt; + this.onlineStatusType = isOnline(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java index 43bbeedbd..fd6422e03 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java @@ -1,6 +1,9 @@ package com.sprint.mission.discodeit.dto.login; +import java.util.UUID; + public record LoginRequest( + UUID userID, String userName, String password ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java index a79863503..a852d33c4 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java @@ -11,5 +11,5 @@ import java.util.List; import java.util.UUID; -public record UpdateMessageRequest(Message message, String newContent, UUID newAttachment) { +public record UpdateMessageRequest(UUID messageID, String newContent, UUID newAttachment, UUID writerID) { } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index 14b1b27c4..91ca2dffc 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -27,7 +27,10 @@ public enum ErrorCode { INVALID_WRITER("작성자가 올바르지 않습니다"), INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), + MESSAGE_EDIT_NOT_ALLOWED("메시지 수정은 작성자 본인만 가능합니다"), + PASSWORD_MISMATCH("비밀번호가 일치하지 않습니다"), + USERNAME_MISMATCH("이름이 일치하지 않습니다"), CHANNEL_TYPE_MISMATCH("채널 타입이 일치하지 않습니다"); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 0b175b317..b620fa4ca 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -19,5 +19,7 @@ public interface UserRepository { List findAll(); + List findAllById(List userIds); + void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 9c9965d31..24a19541d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -3,8 +3,6 @@ import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.repository.MessageRepository; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 45c612ce9..5def92752 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -3,8 +3,6 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.repository.UserRepository; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -71,6 +69,14 @@ public List findAll() { return userMap.values().stream().toList(); } + @Override + public List findAllById(List userIds) { + return userIds.stream() + .map(userMap::get) + .filter(Objects::nonNull) + .toList(); + } + @Override public void delete(UUID id) { userMap.remove(id); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index e820098f6..f1922c152 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -51,6 +51,14 @@ public List findAll() { return userMap.values().stream().toList(); } + @Override + public List findAllById(List userIds) { + return userIds.stream() + .map(userMap::get) + .filter(Objects::nonNull) + .toList(); + } + @Override public void delete(UUID id) { userMap.remove(id); diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 4d1d1fd0d..7210d4fc8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -11,6 +11,8 @@ public interface UserService { UserDTO find(UUID userId); + List getOnlineUsers(); + List findAll(); User update(UpdateUserRequest request); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index e14b50add..5e50c312f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -1,25 +1,42 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.login.LoginRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.Instant; + @Service @RequiredArgsConstructor public class BasicAuthService { private final UserRepository userRepository; + private final UserStatusService userStatusService; + public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 - User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + User findUser = userRepository.findById(request.userID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } + + if (!findUser.getName().equals(request.userName())) { + throw new ServiceException(ErrorCode.USERNAME_MISMATCH); + } + + // 로그인을 하면 UserStatus 업데이트하기 + UserStatus userStatus = userStatusService.findByUserId(request.userID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); + userStatusService.update(updateRequest); + return UserDTO.fromDomain(findUser); // 비밀번호를 보여주지 않기 위해서 DTO 사용 } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index f588e788b..8c8e8cd6b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; +import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; @@ -12,6 +13,7 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -31,6 +33,7 @@ public class BasicChannelService implements ChannelService { private final ReadStatusRepository readStatusRepository; private final MessageRepository messageRepository; private final UserRepository userRepository; + private final UserStatusService userStatusService; @Override public Channel createPublicChannel(CreateChannel.PublicRequest request) { @@ -126,6 +129,12 @@ public List findAllPrivate(UUID userId) { // 통일성을 위해 findAl // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 validUser(userId); + // User가 채널을 찾으면 UserStatus 업데이트하기 + UserStatus userStatus = userStatusService.findByUserId(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); + userStatusService.update(updateRequest); + + // Private 채널 내에서 userId가 같은 회원을 joinMembers 리스트에 갖고 있는 채널만 선택한다. List allChannels = channelRepository.findAll(); return allChannels.stream() @@ -140,6 +149,11 @@ public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유 validChannel(request.channelId()); validUser(request.newUserID()); + // User가 채널에 참여하면 UserStatus 업데이트하기 + UserStatus userStatus = userStatusService.findByUserId(request.newUserID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); + userStatusService.update(updateRequest); + PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); updateChannel.update(request.name(), request.description(), request.newUserID()); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index e49d790bc..72d4bd51a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -2,8 +2,10 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; +import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -11,9 +13,11 @@ import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -26,6 +30,7 @@ public class BasicMessageService implements MessageService { private final UserRepository userRepository; private final ChannelRepository channelRepository; private final BinaryContentRepository binaryContentRepository; + private final UserStatusService userStatusService; @Override public Message create(CreateMessageRequest request) { @@ -37,6 +42,11 @@ public Message create(CreateMessageRequest request) { validUser(request.writerID()); validChannel(request.channelID()); + // User가 메시지를 만들면 UserStatus 업데이트하기 + UserStatus userStatus = userStatusService.findByUserId(request.writerID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); + userStatusService.update(updateRequest); + // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 if (request.attachmentsID() != null) { for (UUID attachmentID : request.attachmentsID()) { @@ -71,12 +81,21 @@ public List getAllMessage() { @Override public Message updateMessageContent(UpdateMessageRequest request) { - UUID messageId = request.message().getId(); - validMessage(messageId); + validMessage(request.messageID()); + validUser(request.writerID()); - Message message = messageRepository.findById(messageId) + Message message = messageRepository.findById(request.messageID()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + if (!message.getWriterID().equals(request.writerID())) { + throw new ServiceException(ErrorCode.MESSAGE_EDIT_NOT_ALLOWED); + } + + // User가 메시지를 수정하면 UserStatus 업데이트하기 + UserStatus userStatus = userStatusService.findByUserId(request.writerID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); + userStatusService.update(updateRequest); + message.update(request.newContent(), request.newAttachment()); return messageRepository.save(message); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 945aa3ade..e9b24e74f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -4,13 +4,16 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.user.*; +import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.util.type.BinaryContentType; +import com.sprint.mission.discodeit.util.type.OnlineStatusType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,6 +29,7 @@ public class BasicUserService implements UserService { private final UserRepository userRepository; private final BinaryContentRepository binaryContentRepository; private final UserStatusRepository userStatusRepository; + private final UserStatusService userStatusService; @Override public UserDTO create(CreateUserRequest request) { @@ -67,6 +71,18 @@ public UserDTO find(UUID userId) { return UserDTO.fromDomain(findUser); } + @Override + public List getOnlineUsers() { + List onlineUserIds = userStatusRepository.findAll().stream() + .filter(userStatus -> userStatus.getOnlineStatusType().equals(OnlineStatusType.ACTIVE)) + .map(UserStatus::getUserId) + .toList(); + + return userRepository.findAllById(onlineUserIds).stream() + .map(UserDTO::fromDomain) + .toList(); + } + @Override public List findAll() { return userRepository.findAll().stream() @@ -92,6 +108,12 @@ public User update(UpdateUserRequest request) { updateUser.setProfileImageId(profile.getId()); } } + + // User가 회원 정보를 UserStatus 업데이트하기 + UserStatus userStatus = userStatusService.findByUserId(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); + userStatusService.update(updateRequest); + userRepository.save(updateUser); return updateUser; } From b22491b8fbee7444c0d7ef71f51f38f0af2caef1 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 14 Feb 2025 11:23:23 +0900 Subject: [PATCH 059/115] Update code --- json/users.json | 12 +--- json/userstatus.json | 18 +++++ result/readstatus.ser | Bin 861 -> 82 bytes result/userstatus.ser | Bin 9642 -> 1265 bytes .../mission/discodeit/dto/user/UserDTO.java | 1 - .../discodeit/service/UserService.java | 1 + .../service/basic/BasicMessageService.java | 1 + .../service/basic/BasicUserService.java | 1 + .../mission/discodeit/UserServiceTest.java | 13 ---- .../mission/discodeit/UserStatusTest.java | 67 ++++++++++++++++++ 10 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 json/userstatus.json create mode 100644 src/test/java/com/sprint/mission/discodeit/UserStatusTest.java diff --git a/json/users.json b/json/users.json index 7ee14859d..6f31cf5a2 100644 --- a/json/users.json +++ b/json/users.json @@ -1,11 +1 @@ -{ - "f20ad84c-e814-4524-a808-5e7d3067e54d" : { - "id" : "f20ad84c-e814-4524-a808-5e7d3067e54d", - "createdAt" : 1739260136.846987000, - "updatedAt" : 1739260136.846987000, - "name" : "student1", - "phone" : "010-1292-1188", - "password" : "Abcdefgh1231!!2", - "profileImageId" : null - } -} \ No newline at end of file +{ } \ No newline at end of file diff --git a/json/userstatus.json b/json/userstatus.json new file mode 100644 index 000000000..30accb60d --- /dev/null +++ b/json/userstatus.json @@ -0,0 +1,18 @@ +{ + "8a2aa151-7b46-4a7f-8109-087091e5ba4f" : { + "id" : "8a2aa151-7b46-4a7f-8109-087091e5ba4f", + "createdAt" : 1739497294.350500000, + "updateAt" : 1739497294.350500000, + "lastActiveAt" : 1739497294.350436000, + "userId" : "53a66b75-fd69-4b1a-9a00-764619bbb980", + "onlineStatusType" : "ACTIVE" + }, + "cbab1e4e-dbb1-454b-a95d-8da59b42ee62" : { + "id" : "cbab1e4e-dbb1-454b-a95d-8da59b42ee62", + "createdAt" : 1739497294.353037000, + "updateAt" : 1739497294.353037000, + "lastActiveAt" : 1739497294.353008000, + "userId" : "c77a7fde-2f03-4eb7-801e-103577678c98", + "onlineStatusType" : "ACTIVE" + } +} \ No newline at end of file diff --git a/result/readstatus.ser b/result/readstatus.ser index 721a5daf0019ecb9e44f1f602e5b8794c70c6290..c5975123e324fcbdfc5624e1442489e4e62468d6 100644 GIT binary patch delta 18 Xcmcc17Bs<)hoPKDFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#I;>9x95%w~VB;Nzc1TqVvzK(q9c^KXGxPL;i$RV70!AhVHXjDgut%1kL_sAFLD z0R{lj)gWseOF$w(!#PR|Qh>VQe74f!)FMxa`ig>LkSeAw(NzKl?62m#@(Mrve%o~l z&_BH3umRbl7o1u&HMV7!w35dr9tMVrf^uFaklWMO&KH+0`D0K4GJ+Xw5GRV1rb7i5 zQJ@BhrSoqwHn7cKQm}0)x8cK29-$D?so_`pwrG}5Jss@4e|ov=U9cz%$O;Zj!=`z6 zfNkf)l$v@Ao9!SC5PK$l@5-;(a>2}Vo7;ci(~b=g(e@X`2P*!mEbnLfBr^MmYbIC} zm+k#qIKZ}xVA|gIrvQuJK^h?Ttf^d_7qHUYH?(O=o?EMP07P{AoW1qF<^l}7oGzlg u4;_s0+TO+X0&Ke!rtO`tCt$H1qyb{jayRz+>9agKx4v*XeRiscM+E?cHV$b3 diff --git a/result/userstatus.ser b/result/userstatus.ser index b22320a868244b4c0d87e4bb1c064ca0ac052a0a..1d947a1ba4d4b6e08fe71bb59f09af89f3622bc8 100644 GIT binary patch literal 1265 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 new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + // 메시지 수정은 작성자만이 할 수 있다. if (!message.getWriterID().equals(request.writerID())) { throw new ServiceException(ErrorCode.MESSAGE_EDIT_NOT_ALLOWED); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index e9b24e74f..ae765e339 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -20,6 +20,7 @@ import java.time.Instant; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; diff --git a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java index 64b810894..5508df9aa 100644 --- a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java @@ -49,19 +49,6 @@ void createUser() { Assertions.assertEquals("홍길동", user.getName()); } - @DisplayName("사용자 생성하면 UserStatus가 같이 생성되는지 테스트") - @Test - void validUserStatus() { - CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); - UserDTO user = userService.create(request); // 유저 생성과 동시에 UserStatus가 생성된다. - UserStatus findUserStatus = userStatusService.findByUserId(user.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - - log.info(user.toString()); - log.info(findUserStatus.toString()); - - Assertions.assertNotNull(findUserStatus); - } - @DisplayName("사용자 생성 시 전화번호 형식을 지켜야 한다.") @Test void validPhone() { diff --git a/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java b/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java new file mode 100644 index 000000000..430cf6320 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java @@ -0,0 +1,67 @@ +package com.sprint.mission.discodeit; + +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.user.CreateUserRequest; +import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.UserStatusService; +import com.sprint.mission.discodeit.util.FileIOUtil; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.nio.file.Path; +import java.util.Optional; + +@Slf4j +@SpringBootTest +public class UserStatusTest { + @Autowired + private UserService userService; + + @Autowired + private UserStatusService userStatusService; + + private UserDTO testUser; + + @BeforeEach + void before() { + FileIOUtil.initializeFiles(); + CreateUserRequest request = new CreateUserRequest("테스트유저", "010-1234-1234", "Abcdefghi1234!", null); + } + + @AfterEach + void after() { + FileIOUtil.convertSerToJson(Path.of("./result/users.ser"), Path.of("./json/users.json"), User.class); + FileIOUtil.convertSerToJson(Path.of("./result/userstatus.ser"), Path.of("./json/userstatus.json"), UserStatus.class); + } + + @DisplayName("사용자 생성하면 UserStatus가 같이 생성되는지 테스트") + @Test + void validUserStatus() { + CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); + UserDTO user = userService.create(request); // 유저 생성과 동시에 UserStatus가 생성된다. + UserStatus findUserStatus = userStatusService.findByUserId(user.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + + log.info(user.toString()); + log.info(findUserStatus.toString()); + + Assertions.assertNotNull(findUserStatus); + } + + + @DisplayName("사용자 업데이트 후 UserStatus도 변경되는지 테스트") + @Test + void updateUserStatus() { + UserStatus beforeUserstatus = userStatusService.findByUserId(testUser.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UpdateUserRequest request = new UpdateUserRequest(testUser.getId(), "TestPassword1234!!", null); + User update = userService.update(request); + UserStatus afterUserStatus = userStatusService.findByUserId(testUser.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + Assertions.assertNotEquals(beforeUserstatus.getLastActiveAt(), afterUserStatus.getLastActiveAt()); + } +} From f71abd0ecd81b0f9f34f4551314cc7f7b1d88292 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 14 Feb 2025 13:03:30 +0900 Subject: [PATCH 060/115] . --- src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index eaab0925f..1c0fdd286 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -50,7 +50,7 @@ public static void convertSerToJson(Path datFilePath, Path jsonFilePath, Cla // 파일 초기화 및 새로 생성 public static void initializeFiles() { - String[] fileNames = { "users.ser", "messages.ser", "channels.ser" }; + String[] fileNames = { "users.ser", "messages.ser", "channels.ser", "binarycontent.ser", "userstatus.ser" }; for (String fileName : fileNames) { Path filePath = Paths.get("./result/" + fileName); try { From 530ea4c4d5c9ce5c204c7a6517fab7993218fe84 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 18 Feb 2025 13:00:51 +0900 Subject: [PATCH 061/115] Update test code --- build.gradle | 2 +- json/binarycontent.json | 1 + json/channels.json | 34 +++ json/readstatus.json | 226 ++++++++++++++++++ json/users.json | 43 +++- json/userstatus.json | 40 +++- result/binarycontent.ser | Bin 82 -> 0 bytes result/readstatus.ser | Bin 82 -> 3919 bytes result/userstatus.ser | Bin 1265 -> 0 bytes .../mission/discodeit/ChannelServiceTest.java | 78 +++++- .../mission/discodeit/UserServiceTest.java | 3 - .../mission/discodeit/UserStatusTest.java | 6 - 12 files changed, 400 insertions(+), 33 deletions(-) create mode 100644 json/binarycontent.json create mode 100644 json/channels.json create mode 100644 json/readstatus.json diff --git a/build.gradle b/build.gradle index ea6ff2b9a..6571c52b7 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.16.1' - compileOnly 'org.projectlombok:lombok:1.18.30' + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok:1.18.30' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' diff --git a/json/binarycontent.json b/json/binarycontent.json new file mode 100644 index 000000000..6f31cf5a2 --- /dev/null +++ b/json/binarycontent.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/json/channels.json b/json/channels.json new file mode 100644 index 000000000..9eec84db9 --- /dev/null +++ b/json/channels.json @@ -0,0 +1,34 @@ +{ + "a6d47dd2-b23c-4157-b965-165a810707a4" : { + "id" : "a6d47dd2-b23c-4157-b965-165a810707a4", + "createdAt" : 1739523025.057472000, + "updatedAt" : 1739523025.057472000, + "joinMembers" : [ "25c9fe38-de4a-48d6-80ca-d51ddee201e6", "8af8b386-9c5b-4aad-8b98-b54dccfd3a88" ], + "channelFormat" : "TEXT", + "channelType" : "PRIVATE" + }, + "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2" : { + "id" : "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2", + "createdAt" : 1739523025.041896000, + "updatedAt" : 1739523025.041897000, + "joinMembers" : [ "25c9fe38-de4a-48d6-80ca-d51ddee201e6", "16038eba-e395-4179-b84e-b15e5176bb70" ], + "channelFormat" : "TEXT", + "channelType" : "PRIVATE" + }, + "808ee585-d924-4942-b818-0f0fb9009172" : { + "id" : "808ee585-d924-4942-b818-0f0fb9009172", + "createdAt" : 1739523025.051266000, + "updatedAt" : 1739523025.051266000, + "joinMembers" : [ "16038eba-e395-4179-b84e-b15e5176bb70", "920454f2-f5c9-409a-bfc7-a0d75dadc697" ], + "channelFormat" : "TEXT", + "channelType" : "PRIVATE" + }, + "439655ab-aa4c-496a-9ccb-4b6ffb156c70" : { + "id" : "439655ab-aa4c-496a-9ccb-4b6ffb156c70", + "createdAt" : 1739523025.054514000, + "updatedAt" : 1739523025.054514000, + "joinMembers" : [ "920454f2-f5c9-409a-bfc7-a0d75dadc697", "8af8b386-9c5b-4aad-8b98-b54dccfd3a88" ], + "channelFormat" : "TEXT", + "channelType" : "PRIVATE" + } +} \ No newline at end of file diff --git a/json/readstatus.json b/json/readstatus.json new file mode 100644 index 000000000..73f1ca5e9 --- /dev/null +++ b/json/readstatus.json @@ -0,0 +1,226 @@ +{ + "5a787883-82ef-4a60-af22-1f3b5d000b68" : { + "id" : "5a787883-82ef-4a60-af22-1f3b5d000b68", + "createdAt" : 1739522820.430950000, + "updateAt" : 1739522820.430950000, + "userId" : "2ce0519c-fdbc-4915-8003-c61aae9d2a9e", + "channelId" : "a011080c-970b-4779-b360-18564bab3c18", + "lastReadAt" : 1739522820.430947000 + }, + "cb139a4d-8156-4ea3-bbd3-573f6c5c16de" : { + "id" : "cb139a4d-8156-4ea3-bbd3-573f6c5c16de", + "createdAt" : 1739522820.433360000, + "updateAt" : 1739522820.433360000, + "userId" : "cf470c9e-291b-455d-b070-910a7c4558c6", + "channelId" : "06eacbe5-90e6-43cd-a06a-40cea725edbf", + "lastReadAt" : 1739522820.433327000 + }, + "ff5b5779-78eb-4c74-8921-d31fd07d27b9" : { + "id" : "ff5b5779-78eb-4c74-8921-d31fd07d27b9", + "createdAt" : 1739523025.051612000, + "updateAt" : 1739523025.051613000, + "userId" : "16038eba-e395-4179-b84e-b15e5176bb70", + "channelId" : "808ee585-d924-4942-b818-0f0fb9009172", + "lastReadAt" : 1739523025.051595000 + }, + "418814f4-abfb-489f-8b81-efc65ae62fb7" : { + "id" : "418814f4-abfb-489f-8b81-efc65ae62fb7", + "createdAt" : 1739522820.425426000, + "updateAt" : 1739522820.425427000, + "userId" : "cf470c9e-291b-455d-b070-910a7c4558c6", + "channelId" : "0bf7c0c9-7331-4076-9061-535d9164833f", + "lastReadAt" : 1739522820.425378000 + }, + "9a0402dd-d18f-46f6-bdb3-d8b32d5ec831" : { + "id" : "9a0402dd-d18f-46f6-bdb3-d8b32d5ec831", + "createdAt" : 1739522467.047077000, + "updateAt" : 1739522467.047077000, + "userId" : "3ab84f3b-b964-4db3-b753-d260fefbcc94", + "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", + "lastReadAt" : 1739522467.047056000 + }, + "3aaf1816-bbab-4075-88ea-6f6621ea404e" : { + "id" : "3aaf1816-bbab-4075-88ea-6f6621ea404e", + "createdAt" : 1739523025.056255000, + "updateAt" : 1739523025.056255000, + "userId" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", + "channelId" : "439655ab-aa4c-496a-9ccb-4b6ffb156c70", + "lastReadAt" : 1739523025.056157000 + }, + "13318767-6db0-4ff8-92b5-b28a014cbffe" : { + "id" : "13318767-6db0-4ff8-92b5-b28a014cbffe", + "createdAt" : 1739521662.474076000, + "updateAt" : 1739521662.474076000, + "userId" : "19bbec7c-6fa0-42dd-b83f-a5ce2a011554", + "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", + "lastReadAt" : 1739521662.474052000 + }, + "2fc1cce9-a8ae-4354-9338-c2c2505f6461" : { + "id" : "2fc1cce9-a8ae-4354-9338-c2c2505f6461", + "createdAt" : 1739523025.057830000, + "updateAt" : 1739523025.057830000, + "userId" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", + "channelId" : "a6d47dd2-b23c-4157-b965-165a810707a4", + "lastReadAt" : 1739523025.057814000 + }, + "6a50c3d5-8034-48a3-b7bf-1a4670bda48f" : { + "id" : "6a50c3d5-8034-48a3-b7bf-1a4670bda48f", + "createdAt" : 1739522820.428922000, + "updateAt" : 1739522820.428922000, + "userId" : "15bbd349-93b6-449b-8110-10481f71b18e", + "channelId" : "9c74b565-453d-4dcb-8ef7-89b7b0b2b38c", + "lastReadAt" : 1739522820.428883000 + }, + "67dc242a-2170-49c1-a4d1-13a93668c44d" : { + "id" : "67dc242a-2170-49c1-a4d1-13a93668c44d", + "createdAt" : 1739523025.052784000, + "updateAt" : 1739523025.052784000, + "userId" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", + "channelId" : "808ee585-d924-4942-b818-0f0fb9009172", + "lastReadAt" : 1739523025.052765000 + }, + "d29fdf7f-e681-4362-9f1e-f3e38bdb60fe" : { + "id" : "d29fdf7f-e681-4362-9f1e-f3e38bdb60fe", + "createdAt" : 1739522467.046292000, + "updateAt" : 1739522467.046292000, + "userId" : "2b41ba68-ef5f-450c-9c11-6f4210929780", + "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", + "lastReadAt" : 1739522467.046251000 + }, + "c72490ab-84bf-446a-bbeb-0be9569c2264" : { + "id" : "c72490ab-84bf-446a-bbeb-0be9569c2264", + "createdAt" : 1739521581.413754000, + "updateAt" : 1739521581.413754000, + "userId" : "cc203d11-2d76-481e-99e8-1e54047e5ae8", + "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", + "lastReadAt" : 1739521581.413672000 + }, + "82f555f7-5659-4df9-b390-01fb371b4a76" : { + "id" : "82f555f7-5659-4df9-b390-01fb371b4a76", + "createdAt" : 1739522820.427187000, + "updateAt" : 1739522820.427188000, + "userId" : "15bbd349-93b6-449b-8110-10481f71b18e", + "channelId" : "0bf7c0c9-7331-4076-9061-535d9164833f", + "lastReadAt" : 1739522820.427164000 + }, + "317352bf-5179-4557-ac9b-390296f3bf2c" : { + "id" : "317352bf-5179-4557-ac9b-390296f3bf2c", + "createdAt" : 1739522820.434459000, + "updateAt" : 1739522820.434459000, + "userId" : "b5f44c73-aae9-4752-a518-e8da6ed1b664", + "channelId" : "06eacbe5-90e6-43cd-a06a-40cea725edbf", + "lastReadAt" : 1739522820.434432000 + }, + "1f98073a-7286-4e5b-a0c5-441c721ff390" : { + "id" : "1f98073a-7286-4e5b-a0c5-441c721ff390", + "createdAt" : 1739522820.429771000, + "updateAt" : 1739522820.429771000, + "userId" : "2ce0519c-fdbc-4915-8003-c61aae9d2a9e", + "channelId" : "9c74b565-453d-4dcb-8ef7-89b7b0b2b38c", + "lastReadAt" : 1739522820.429751000 + }, + "09a974bf-119f-4093-b820-c5b549875b22" : { + "id" : "09a974bf-119f-4093-b820-c5b549875b22", + "createdAt" : 1739521662.476633000, + "updateAt" : 1739521662.476633000, + "userId" : "6638f1b4-92c2-4666-b82e-f77af7230dd3", + "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", + "lastReadAt" : 1739521662.476611000 + }, + "d79ffea8-1c73-44ce-8235-1b6f95e5f31e" : { + "id" : "d79ffea8-1c73-44ce-8235-1b6f95e5f31e", + "createdAt" : 1739521581.412811000, + "updateAt" : 1739521581.412811000, + "userId" : "ed838bc5-35af-4a37-a46d-1205e65e2c69", + "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", + "lastReadAt" : 1739521581.412779000 + }, + "f287b530-8f88-41eb-9b1f-695828be3480" : { + "id" : "f287b530-8f88-41eb-9b1f-695828be3480", + "createdAt" : 1739521581.411408000, + "updateAt" : 1739521581.411408000, + "userId" : "ef786d73-0345-49c0-93c2-638457c5dd42", + "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", + "lastReadAt" : 1739521581.411330000 + }, + "9f67a420-3935-4f69-9104-432b2c100b0b" : { + "id" : "9f67a420-3935-4f69-9104-432b2c100b0b", + "createdAt" : 1739521581.412439000, + "updateAt" : 1739521581.412439000, + "userId" : "b4107df1-3525-4f8a-a4d0-5923a85e97a3", + "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", + "lastReadAt" : 1739521581.412306000 + }, + "bd86849f-1a54-42eb-9197-3e1cec3d787f" : { + "id" : "bd86849f-1a54-42eb-9197-3e1cec3d787f", + "createdAt" : 1739521662.472656000, + "updateAt" : 1739521662.472656000, + "userId" : "2d27f294-2b2c-425f-84f9-e8396d83cfb0", + "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", + "lastReadAt" : 1739521662.472651000 + }, + "52dd3949-ef69-4f73-8a4e-1a94ac09026f" : { + "id" : "52dd3949-ef69-4f73-8a4e-1a94ac09026f", + "createdAt" : 1739522467.042969000, + "updateAt" : 1739522467.042969000, + "userId" : "53a43047-7d6d-4e95-ae47-1d84fa582c7c", + "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", + "lastReadAt" : 1739522467.042939000 + }, + "055e4201-2822-4cc5-901c-317d8d22838f" : { + "id" : "055e4201-2822-4cc5-901c-317d8d22838f", + "createdAt" : 1739522820.432075000, + "updateAt" : 1739522820.432075000, + "userId" : "b5f44c73-aae9-4752-a518-e8da6ed1b664", + "channelId" : "a011080c-970b-4779-b360-18564bab3c18", + "lastReadAt" : 1739522820.432045000 + }, + "ad9a5847-f840-40f4-b227-6240f3c4c3bc" : { + "id" : "ad9a5847-f840-40f4-b227-6240f3c4c3bc", + "createdAt" : 1739521662.472040000, + "updateAt" : 1739521662.472041000, + "userId" : "b31d9b03-95c1-4aa4-adbc-c2cbaa0960b9", + "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", + "lastReadAt" : 1739521662.472010000 + }, + "78c14b89-75eb-4f62-8a82-333a16186cd7" : { + "id" : "78c14b89-75eb-4f62-8a82-333a16186cd7", + "createdAt" : 1739523025.054885000, + "updateAt" : 1739523025.054885000, + "userId" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", + "channelId" : "439655ab-aa4c-496a-9ccb-4b6ffb156c70", + "lastReadAt" : 1739523025.054881000 + }, + "9df46df3-d08b-4e41-887f-f0eccfd358fb" : { + "id" : "9df46df3-d08b-4e41-887f-f0eccfd358fb", + "createdAt" : 1739523025.058979000, + "updateAt" : 1739523025.058979000, + "userId" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", + "channelId" : "a6d47dd2-b23c-4157-b965-165a810707a4", + "lastReadAt" : 1739523025.058963000 + }, + "6516ab64-858e-4618-b969-781f9bfdd758" : { + "id" : "6516ab64-858e-4618-b969-781f9bfdd758", + "createdAt" : 1739522467.045483000, + "updateAt" : 1739522467.045483000, + "userId" : "4680ce8e-55ab-408b-b6a6-019965c0d93c", + "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", + "lastReadAt" : 1739522467.045476000 + }, + "71f1d690-bf16-456c-af67-92b62f582da8" : { + "id" : "71f1d690-bf16-456c-af67-92b62f582da8", + "createdAt" : 1739523025.044957000, + "updateAt" : 1739523025.044957000, + "userId" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", + "channelId" : "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2", + "lastReadAt" : 1739523025.044911000 + }, + "b56b6114-96c3-4497-90ca-d0c323d5a848" : { + "id" : "b56b6114-96c3-4497-90ca-d0c323d5a848", + "createdAt" : 1739523025.048757000, + "updateAt" : 1739523025.048757000, + "userId" : "16038eba-e395-4179-b84e-b15e5176bb70", + "channelId" : "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2", + "lastReadAt" : 1739523025.048723000 + } +} \ No newline at end of file diff --git a/json/users.json b/json/users.json index 6f31cf5a2..2d4597e90 100644 --- a/json/users.json +++ b/json/users.json @@ -1 +1,42 @@ -{ } \ No newline at end of file +{ + "16038eba-e395-4179-b84e-b15e5176bb70" : { + "id" : "16038eba-e395-4179-b84e-b15e5176bb70", + "createdAt" : 1739523025.035552000, + "updatedAt" : 1739523025.035553000, + "name" : "테스트유저2", + "phone" : "010-2222-1111", + "password" : "Abcdefg1234!!", + "profileImageId" : null, + "userStatusId" : "27a24815-9453-46a2-bc73-4b29c43dfa98" + }, + "8af8b386-9c5b-4aad-8b98-b54dccfd3a88" : { + "id" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", + "createdAt" : 1739523025.037423000, + "updatedAt" : 1739523025.037424000, + "name" : "테스트유저4", + "phone" : "010-4444-1111", + "password" : "Abcdefg1234!!", + "profileImageId" : null, + "userStatusId" : null + }, + "25c9fe38-de4a-48d6-80ca-d51ddee201e6" : { + "id" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", + "createdAt" : 1739523025.030502000, + "updatedAt" : 1739523025.030503000, + "name" : "테스트유저1", + "phone" : "010-1111-1111", + "password" : "Abcdefg1234!!", + "profileImageId" : null, + "userStatusId" : "79fd43ab-4520-4acb-a704-86c6dabdabe8" + }, + "920454f2-f5c9-409a-bfc7-a0d75dadc697" : { + "id" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", + "createdAt" : 1739523025.036256000, + "updatedAt" : 1739523025.036257000, + "name" : "테스트유저3", + "phone" : "010-3333-1111", + "password" : "Abcdefg1234!!", + "profileImageId" : null, + "userStatusId" : "c5284c01-df30-4d19-a856-3af835249c9d" + } +} \ No newline at end of file diff --git a/json/userstatus.json b/json/userstatus.json index 30accb60d..c9174f6d0 100644 --- a/json/userstatus.json +++ b/json/userstatus.json @@ -1,18 +1,34 @@ { - "8a2aa151-7b46-4a7f-8109-087091e5ba4f" : { - "id" : "8a2aa151-7b46-4a7f-8109-087091e5ba4f", - "createdAt" : 1739497294.350500000, - "updateAt" : 1739497294.350500000, - "lastActiveAt" : 1739497294.350436000, - "userId" : "53a66b75-fd69-4b1a-9a00-764619bbb980", + "4a21c5be-89cd-42f5-b924-549be7cc9a00" : { + "id" : "4a21c5be-89cd-42f5-b924-549be7cc9a00", + "createdAt" : 1739523025.038580000, + "updateAt" : 1739523025.038580000, + "lastActiveAt" : 1739523025.038534000, + "userId" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", "onlineStatusType" : "ACTIVE" }, - "cbab1e4e-dbb1-454b-a95d-8da59b42ee62" : { - "id" : "cbab1e4e-dbb1-454b-a95d-8da59b42ee62", - "createdAt" : 1739497294.353037000, - "updateAt" : 1739497294.353037000, - "lastActiveAt" : 1739497294.353008000, - "userId" : "c77a7fde-2f03-4eb7-801e-103577678c98", + "c5284c01-df30-4d19-a856-3af835249c9d" : { + "id" : "c5284c01-df30-4d19-a856-3af835249c9d", + "createdAt" : 1739523025.036702000, + "updateAt" : 1739523025.036702000, + "lastActiveAt" : 1739523025.036698000, + "userId" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", + "onlineStatusType" : "ACTIVE" + }, + "27a24815-9453-46a2-bc73-4b29c43dfa98" : { + "id" : "27a24815-9453-46a2-bc73-4b29c43dfa98", + "createdAt" : 1739523025.035871000, + "updateAt" : 1739523025.035871000, + "lastActiveAt" : 1739523025.035848000, + "userId" : "16038eba-e395-4179-b84e-b15e5176bb70", + "onlineStatusType" : "ACTIVE" + }, + "79fd43ab-4520-4acb-a704-86c6dabdabe8" : { + "id" : "79fd43ab-4520-4acb-a704-86c6dabdabe8", + "createdAt" : 1739523025.032042000, + "updateAt" : 1739523025.061759000, + "lastActiveAt" : 1739523025.061479000, + "userId" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", "onlineStatusType" : "ACTIVE" } } \ No newline at end of file diff --git a/result/binarycontent.ser b/result/binarycontent.ser index c5975123e324fcbdfc5624e1442489e4e62468d6..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 eJQ+AkGKx}*GxBp%Dhli!7{H*M14s#gm=yqSWEX`1 diff --git a/result/readstatus.ser b/result/readstatus.ser index c5975123e324fcbdfc5624e1442489e4e62468d6..7eccb67f66df1b9f8c01bb26a34449c93b66e731 100644 GIT binary patch literal 3919 zcmaKu3sh5A7KZaepkNC{X^!oHN2DX5_w3WAdy4}B@dGejSgrKPy`DB zL=dphN)<&O1wjxjuR^sj2%^PyMrYPIBEA+1I^ZxcbMHAp$jx2NTCi6BegFOKv-dgY z=F)SLo74{AU*N@$L8Njn$q$LNf8iigLhK=ztZq6${IS zd_*X4MG%r13?m}3(19yaAbbgeK0y%)_LB~g^nB3-+Ql>lqXl^Jk0oQ9oG%d z9HyEbj|SzywJoU>4SCJzl!K~Yb2R0&`2P?UnA9dSr{-LJQ0RI9mXn=2(HB1EaK$xq z#jEOBPWjSu)cl~xJVDwHqv_5Y3P*Mlz8soGMDk8h4nsE--Z`XG4r)+20mBMNzt(uS z(LUt#v};QG*eh?k;VYQ zSAuRu&(98=bZH6L+A8pCglgs!={}n$Y=4(Jx_MhQI}xaw*_8GBNM~0j$lOnbRA2Pv z#^adOVQTnZIwxWK`5~TH=6|m1h?$?esB|c zWw1rtvt((7+dZfjICXdL+#}#SbPYVNs&x+rs-~P)p?P?!zJBGo+bOpiwz=-sX4avL zmB+(#{V74n_64q-1p@@Dez~*y{y)iM>u=0E-RE(Bh3b`#RbH}dmAUadd+w+{;b@)f zoay6N>KhtQlp#$*&+UHwcqYw4eOnEN^%+5Eo0CpC&;Y@yCMF!K{XgWaY#ZSgG<%dn zwQ|_(!k^-P@{9f3x=l7RZWmB#*iH5U9x+T^|0TRtJPATJL|X+jKu*Wc6{C?geMR}S z;K|oF*d)aSx61#1cr4X@FHiw}9S(sWgYGY^!PhMWAk|ipj=}V!;5xr^nX>(+-7?4_I$EwNK)#foh|gJo~97FX_nZkm=CR z{oVi-Gy^`c~&iqSu2Vx0+I073;gm zkNQUd70}tb^fT9I06m5vbnq?#eZjCC!dk3*o4Cg!n1&aS4%2dW!6NJE-48Zm)e%J+j48TKI5k&1m_26+_`M2vo4tAUwjJ zUNR4tDj^7^;1)V<#p316QTeGP{G^@uD0CsaMvBxrq`jDSnfwk+}eSP8X%|Edv*GM!t9cRDmQzl zi2Vzps%AK*e9cVD)r)c?Z)E!RF47Hf2=v0}d;xde34+j{ujA=U4Di0DG;G+*p8Bb$ zy{070dxp(^wFo0GXWr51MaDnSNH z){&20%;^cE$}XSdiBAKTyhCiY5!l<=^C0}~RYVYqAIH&`8h8+vdHBV%naDcE@kBFejv%oekBx*!*UPF#D?gFMm~cn0qEbI*fg1 zc-?Z2(%J2s;7GQq_ZtA}+artijZ!nm0c$@`5aJf&%UNRB4hiaChI-cCsp2$!$zO4* g#{v7c{|*hoPK={9L`_f}+g46208a z;^NHwJiV06;^h34)XWmSl>FSp%sjo&;?$zxlEjkIVvu8ifRTxT&4+yc9fR1!bF3BuQbu1}l zsAFLDVGzjA%gM}3h1e5PS&&-7VCe&Noj$~M`cT*D!(FEjHn9Y#Qr{m$BCnF6wmt)c+vb6#*Lf*hgZ_pS`*7*2Ia< zj9^g~G;>ybRB+uQ0rsX4rj*NF2e1?$rj+Xr2B_^F|DLyeNO;H6H7~Jt`$ey9V6{v; zjNcn5+~zoZ?!AwD!YuDtuqYPWTTexRt&qU9qSY57g~fJ|E{Hw*_Dr8T@n=nyW5=`-(SKnmRAQR;Zxa4wTYZ!+_Ox zs4j>-vtRYK?O5?I`pMj joinUser; + private UserDTO testUser1DTO; + private UserDTO testUser2DTO; + private UserDTO testUser3DTO; + private UserDTO testUser4DTO; + @BeforeEach void before() { FileIOUtil.initializeFiles(); @@ -38,22 +41,27 @@ void before() { CreateUserRequest request2 = new CreateUserRequest("테스트유저2", "010-2222-1111", "Abcdefg1234!!", null); CreateUserRequest request3 = new CreateUserRequest("테스트유저3", "010-3333-1111", "Abcdefg1234!!", null); CreateUserRequest request4 = new CreateUserRequest("테스트유저4", "010-4444-1111", "Abcdefg1234!!", null); - UserDTO testUser1DTO = userService.create(request1); - UserDTO testUser2DTO = userService.create(request2); - UserDTO testUser3DTO = userService.create(request3); - UserDTO testUser4DTO = userService.create(request4); - joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); + testUser1DTO = userService.create(request1); + testUser2DTO = userService.create(request2); + testUser3DTO = userService.create(request3); + testUser4DTO = userService.create(request4); } @AfterEach void after() { + FileIOUtil.convertSerToJson(Path.of("./result/users.ser"), Path.of("./json/users.json"), User.class); + FileIOUtil.convertSerToJson(Path.of("./result/channels.ser"), Path.of("./json/channels.json"), Channel.class); + FileIOUtil.convertSerToJson(Path.of("./result/binarycontent.ser"), Path.of("./json/binarycontent.json"), Channel.class); + FileIOUtil.convertSerToJson(Path.of("./result/readstatus.ser"), Path.of("./json/readstatus.json"), Channel.class); + FileIOUtil.convertSerToJson(Path.of("./result/userstatus.ser"), Path.of("./json/userstatus.json"), Channel.class); FileIOUtil.initializeFiles(); } @DisplayName("Public 채널 테스트하기") @Test void createPublicChannel() { + joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); CreateChannel.PublicRequest request = new CreateChannel.PublicRequest("백엔드 개발자 오픈 채널", "지식 공유를 위해 만든 채널입니다.", ChannelFormat.TEXT, joinUser); PublicChannel publicChannel = (PublicChannel) channelService.createPublicChannel(request); @@ -63,9 +71,59 @@ void createPublicChannel() { @DisplayName("Private 채널 테스트하기") @Test void createPrivateChannel() { + joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); CreateChannel.PrivateRequest request = new CreateChannel.PrivateRequest(joinUser, ChannelFormat.TEXT); Channel privateChannel = channelService.createPrivateChannel(request); Assertions.assertNotNull(privateChannel); } + + @DisplayName("Public 채널 조회하기") + @Test + void findPublicChannel() { + // 채널 만들고 + joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); + CreateChannel.PublicRequest request = new CreateChannel.PublicRequest("프론트앤드 개발자 오픈 채널", "지식 공유를 위해 만든 채널입니다.", ChannelFormat.TEXT, joinUser); + PublicChannel publicChannel = (PublicChannel) channelService.createPublicChannel(request); + + ChannelDTO.PublicChannelDTO publicChannel1 = channelService.findPublicChannel(publicChannel.getId()); + + Assertions.assertEquals(publicChannel.getId(), publicChannel1.getId()); + } + + @DisplayName("Private 채널 만들고 조회하기") + @Test + void findPrivateChannel() { + //채널 만들기 + joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); + CreateChannel.PrivateRequest request = new CreateChannel.PrivateRequest(joinUser, ChannelFormat.TEXT); + Channel privateChannel = channelService.createPrivateChannel(request); + + ChannelDTO.PrivateChannelDTO privateChannel1 = channelService.findPrivateChannel(privateChannel.getId()); + + Assertions.assertEquals(privateChannel.getId(), privateChannel1.getId()); + } + + @DisplayName("특정 회원이 들어간 Private 채널 조회하기") + @Test + void findAllPrivate() { + List joinUser1 = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId())); + List joinUser2 = new ArrayList<>(Arrays.asList(testUser2DTO.getId(), testUser3DTO.getId())); + List joinUser3 = new ArrayList<>(Arrays.asList(testUser3DTO.getId(), testUser4DTO.getId())); + List joinUser4 = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser4DTO.getId())); + + CreateChannel.PrivateRequest request1 = new CreateChannel.PrivateRequest(joinUser1, ChannelFormat.TEXT); + CreateChannel.PrivateRequest request2 = new CreateChannel.PrivateRequest(joinUser2, ChannelFormat.TEXT); + CreateChannel.PrivateRequest request3 = new CreateChannel.PrivateRequest(joinUser3, ChannelFormat.TEXT); + CreateChannel.PrivateRequest request4 = new CreateChannel.PrivateRequest(joinUser4, ChannelFormat.TEXT); + + Channel privateChannel1 = channelService.createPrivateChannel(request1); + Channel privateChannel2 = channelService.createPrivateChannel(request2); + Channel privateChannel3 = channelService.createPrivateChannel(request3); + Channel privateChannel4 = channelService.createPrivateChannel(request4); + + List user1PrivateChannels = channelService.findAllPrivate(testUser1DTO.getId()); + Assertions.assertEquals(user1PrivateChannels.size(), 2); // testUser1DTO 회원이 들어가 있는 채널은 2개이다. + } + } diff --git a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java index 5508df9aa..08d2c4148 100644 --- a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java @@ -10,14 +10,12 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.util.FileIOUtil; -import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.Optional; -@Slf4j @SpringBootTest public class UserServiceTest { @Autowired @@ -45,7 +43,6 @@ void after() { void createUser() { CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); UserDTO user = userService.create(request); - log.info(user.toString()); Assertions.assertEquals("홍길동", user.getName()); } diff --git a/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java b/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java index 430cf6320..6bc6e8efa 100644 --- a/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java +++ b/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java @@ -10,15 +10,12 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.util.FileIOUtil; -import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.nio.file.Path; -import java.util.Optional; -@Slf4j @SpringBootTest public class UserStatusTest { @Autowired @@ -48,9 +45,6 @@ void validUserStatus() { UserDTO user = userService.create(request); // 유저 생성과 동시에 UserStatus가 생성된다. UserStatus findUserStatus = userStatusService.findByUserId(user.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - log.info(user.toString()); - log.info(findUserStatus.toString()); - Assertions.assertNotNull(findUserStatus); } From 748f4b352257370026d47b550d27e2dd0fb62b7a Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 18 Feb 2025 13:05:14 +0900 Subject: [PATCH 062/115] Initialize sprint mission 4 --- .../discodeit/DiscodeitApplication.java | 60 +------------------ 1 file changed, 1 insertion(+), 59 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 85ada8b61..b0d3b21a5 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -1,69 +1,11 @@ package com.sprint.mission.discodeit; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; -import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.FileIOUtil; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.UUID; @SpringBootApplication public class DiscodeitApplication { - static UserDTO setupUser(UserService userService) { - CreateUserRequest createUserRequest = new CreateUserRequest("student1", "010-1292-1188", "Abcdefgh1231!!2", null); - UserDTO user = userService.create(createUserRequest); - return user; - } - - static Channel setupChannel(ChannelService channelService, List joinUsersID) { - CreateChannel.PublicRequest publicRequest = new CreateChannel.PublicRequest("자바 개발자 오픈 채널", "자바 개발자 누구든 환영입니다!", ChannelFormat.TEXT, joinUsersID); - Channel channel = channelService.createPublicChannel(publicRequest); - return channel; - } - - static Message messageCreateTest(MessageService messageService, UUID channelID, UUID writerID) { - CreateMessageRequest request = new CreateMessageRequest(null, "안녕하세요", writerID, channelID); - Message message = messageService.create(request); - System.out.println("메시지 생성 : " + message); - return message; - } - public static void main(String[] args) { - ConfigurableApplicationContext context = SpringApplication.run(DiscodeitApplication.class, args); - UserService userService = context.getBean(UserService.class); - ChannelService channelService = context.getBean(ChannelService.class); - MessageService messageService = context.getBean(MessageService.class); - System.out.println("UserRepository 의존성 주입 확인 : " + context.getBean(UserRepository.class)); - System.out.println("ChannelRepository 의존성 주입 확인 : " + context.getBean(ChannelRepository.class)); - System.out.println("MessageRepository 의존성 주입 확인 : " + context.getBean(MessageRepository.class)); - - FileIOUtil.initializeFiles(); - - UserDTO user = setupUser(userService); - Channel channel = setupChannel(channelService, List.of(user.getId())); - messageCreateTest(messageService, user.getId(), channel.getId()); - - FileIOUtil.convertSerToJson(Path.of("./result/users.ser"), Path.of("./json/users.json"), User.class); + SpringApplication.run(DiscodeitApplication.class, args); } } \ No newline at end of file From f4d686a90d8c3324ef3a41c3e8aa434d6ecffe89 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 18 Feb 2025 14:48:59 +0900 Subject: [PATCH 063/115] Complete Auth, User, UserStatus Controller --- result/users.ser | Bin 0 -> 505 bytes result/userstatus.ser | Bin 0 -> 770 bytes .../discodeit/controller/AuthController.java | 28 +++++++++ .../discodeit/controller/UserController.java | 54 ++++++++++++++++++ .../controller/UserStatusController.java | 33 +++++++++++ .../discodeit/service/UserStatusService.java | 4 +- .../service/basic/BasicAuthService.java | 2 +- .../service/basic/BasicChannelService.java | 4 +- .../service/basic/BasicMessageService.java | 4 +- .../service/basic/BasicUserService.java | 2 +- .../service/basic/BasicUserStatusService.java | 14 +++-- 11 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/AuthController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/UserController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java diff --git a/result/users.ser b/result/users.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..95999c293015196e2716be8d41cdc4c7078d2603 100644 GIT binary patch literal 505 zcmY+Au}d656vm%>p5E!5Tq2|}D3~e|-1W|MDNKTjt7~<+GLYeBvNy83Gnx0!+bX2c zO0W}55lAZp1hFt7O~^kG8w>ve30kMkj3pc&kuJ1Vd`d__ZWlh0#>qcDdg5E;kPkCeOZJ;E;Z{wq(7YwpHq*HZmhW zm55ShK9|^5TuAb{N}0_377F7qYz=r&ilE#!f|1~_h+sT&I04C21Yw56GI|k#Cpkf_ zKXS1HM{3^(GnNX1hy6*yvN&jx-5%RnNi)QrGW-L4gy9H^x}!32(~N1O-pfRUDT_sT zEg7;PUCsL-PF9Sd(zUEjV${VOQLb&w>h+g7M!zY{-rKDokDsg@RRD6`t9mY2d_1)^ zGXZ~cXH+04|NZ{yYX9VN=L^Be8-Y}B%s-!=CaBKU=Vo0qJKv}`G&+6xp2^@zuJiw{ C5uG3a literal 0 HcmV?d00001 diff --git a/result/userstatus.ser b/result/userstatus.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0ccdd23e38c0791ea402e2b1c79e38533c52eacf 100644 GIT binary patch literal 770 zcmaKpO=uHA6vtmTX4}|Ak_x%_1>TCViy(+!XsU_bx>6yHH^Cu0BvbZd+<8gYODI^u zUOZXRgXl#;5CrKdc(5p5t(Q^+rF!b2iWl)Db!OK_Nx=s@ugb2HB z1!W@hsA>5EiH|32(3pdePev-dsd!~S>q^K{9a)=}@EUX=Z9_irUFOroXX-kq2*+$m zXC`#!A3C!~XU2*scbb!ZN2SG3i#rmoC$G0;2+L7sdc)kC4R#w z`z z&YRM3+}+Wqvwv>%@Y`2$%8~xjMsdMki#jTM7C|qaow6>Mw{N;z+~T;cZM2_1-M8{+ LUFiJKg>v*8LBRKe literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java new file mode 100644 index 000000000..897693077 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -0,0 +1,28 @@ +package com.sprint.mission.discodeit.controller; + +import com.sprint.mission.discodeit.dto.login.LoginRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.service.basic.BasicAuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/auth") +@RequiredArgsConstructor +public class AuthController { + private final BasicAuthService authService; + + @RequestMapping(value = "/login", method = RequestMethod.POST) + public ResponseEntity login(@RequestBody LoginRequest request) { + UserDTO login = authService.login(request); + return ResponseEntity.ok( + "User Id: " + login.getId() + + "User Name: " + login.getName() + + " 님의 로그인이 완료되었습니다." + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java new file mode 100644 index 000000000..5d6285f04 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -0,0 +1,54 @@ +package com.sprint.mission.discodeit.controller; + +import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.user.CreateUserRequest; +import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/user") +@RequiredArgsConstructor +public class UserController { + private final UserService userService; + + @RequestMapping(value = "/create", method = RequestMethod.POST) + public ResponseEntity createUser(@RequestBody CreateUserRequest request) { + UserDTO userDTO = userService.create(request); + return ResponseEntity.ok(userDTO); + } + + @RequestMapping(value = "/get", method = RequestMethod.GET) + public ResponseEntity getUser(@RequestParam("id") UUID userId) { + UserDTO userDTO = userService.find(userId); + return ResponseEntity.ok(userDTO); + } + + @RequestMapping(value = "/getAll", method = RequestMethod.GET) + public ResponseEntity> getAllUser() { + List all = userService.findAll(); + return ResponseEntity.ok(all); + } + + @RequestMapping(value = "/update", method = RequestMethod.PUT) + public ResponseEntity updateUser(@RequestBody UpdateUserRequest request) { + User update = userService.update(request); + return ResponseEntity.ok(update); + } + + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + public ResponseEntity deleteUser(@RequestParam("id") UUID id) { + UserDTO delete = userService.delete(id); + return ResponseEntity.ok( + "Delete user ID: " + delete.getId() + + " name: " + delete.getName() + + " delete complete!" + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java new file mode 100644 index 000000000..e93f754df --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.controller; + +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.service.UserStatusService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.UUID; + +@RestController +@RequestMapping("/status") +@RequiredArgsConstructor +public class UserStatusController { + private final UserStatusService userStatusService; + + @RequestMapping(value = "/get/userid", method = RequestMethod.GET) + public ResponseEntity getStatusByUserId(@RequestParam("id") UUID userId) { + UserStatus userStatus = userStatusService.findByUserId(userId); + return ResponseEntity.ok(userStatus); + } + + @RequestMapping(value = "/get", method = RequestMethod.GET) + public ResponseEntity getStatusById(@RequestParam("id") UUID id) { + UserStatus userStatus = userStatusService.find(id); + return ResponseEntity.ok(userStatus); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index 5c38f7299..8bc2466af 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -11,9 +11,9 @@ public interface UserStatusService { UserStatus create(CreateUserStatusRequest request); - Optional find(UUID id); + UserStatus find(UUID id); - Optional findByUserId(UUID userID); + UserStatus findByUserId(UUID userID); List findAll(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 5e50c312f..6dfcd4910 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -33,7 +33,7 @@ public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 } // 로그인을 하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.userID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus userStatus = userStatusService.findByUserId(request.userID()); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 8c8e8cd6b..8ee8b890a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -130,7 +130,7 @@ public List findAllPrivate(UUID userId) { // 통일성을 위해 findAl validUser(userId); // User가 채널을 찾으면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus userStatus = userStatusService.findByUserId(userId); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); @@ -150,7 +150,7 @@ public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유 validUser(request.newUserID()); // User가 채널에 참여하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.newUserID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus userStatus = userStatusService.findByUserId(request.newUserID()); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 398ceffb1..cb97b329d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -43,7 +43,7 @@ public Message create(CreateMessageRequest request) { validChannel(request.channelID()); // User가 메시지를 만들면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.writerID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus userStatus = userStatusService.findByUserId(request.writerID()); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); @@ -93,7 +93,7 @@ public Message updateMessageContent(UpdateMessageRequest request) { } // User가 메시지를 수정하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.writerID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus userStatus = userStatusService.findByUserId(request.writerID()); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index ae765e339..7097e581d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -111,7 +111,7 @@ public User update(UpdateUserRequest request) { } // User가 회원 정보를 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + UserStatus userStatus = userStatusService.findByUserId(request.userId()); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index d1b2c8d11..c5c4cabcf 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -36,13 +36,19 @@ public UserStatus create(CreateUserStatusRequest request) { } @Override - public Optional find(UUID id) { - return userStatusRepository.findById(id); + public UserStatus find(UUID id) { + UserStatus userStatus = userStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + // UserStatus를 조회하면 Online 상태 업데이트 하기 + userStatus.setOnlineStatusType(userStatus.isOnline()); + return userStatusRepository.save(userStatus); } @Override - public Optional findByUserId(UUID userID) { - return userStatusRepository.findByUserId(userID); + public UserStatus findByUserId(UUID userID) { + UserStatus userStatus = userStatusRepository.findByUserId(userID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + // UserStatus를 조회하면 Online 상태 업데이트 하기 + userStatus.setOnlineStatusType(userStatus.isOnline()); + return userStatusRepository.save(userStatus); } @Override From 0debf83c349f780e7fe053c1c531706048840b2a Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 18 Feb 2025 15:44:34 +0900 Subject: [PATCH 064/115] Complete Channel Controller --- result/channels.ser | Bin 0 -> 82 bytes result/readstatus.ser | Bin 3919 -> 4474 bytes result/users.ser | Bin 505 -> 787 bytes result/userstatus.ser | Bin 770 -> 1022 bytes .../controller/ChannelController.java | 73 ++++++++++++++++++ .../discodeit/dto/channel/CreateChannel.java | 7 ++ .../discodeit/service/ChannelService.java | 8 +- .../service/basic/BasicChannelService.java | 33 +++++--- .../discodeit/util/type/ChannelFormat.java | 3 + 9 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java diff --git a/result/channels.ser b/result/channels.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..496eab0e4aaf72fb4a7a365fdfb2959c0977536c 100644 GIT binary patch literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 fJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-fS45kZuA$C literal 0 HcmV?d00001 diff --git a/result/readstatus.ser b/result/readstatus.ser index 7eccb67f66df1b9f8c01bb26a34449c93b66e731..480782e448ec772b8edddd4758a508c0fd4f9dbc 100644 GIT binary patch delta 687 zcmX>v_e*I)0Heajz!Hx7Rm@96Cl;-$bDr_X<>_Cyd&Pwebqp+El4%;>jkE8JH0F3e zc-D36nVUXXl(U?di2(@Gw`gDIuk)6u0BK0Zl&UqnQGqF1=g$BUW!k}&*c+tFCHJm1 z{Li|3MUKZN@8_^)%$h97DLk2vGmbrKG1Qnrk&gB-GX}0DELN7O89t^e~5NfOw>5af@fPO}(eyakj={ribnh z5aH>+r%A~MBx^rRR4Q9#>(L7qWdX%&GnyU1V42^q0k-}SrqsOi2hgntX_zbkjdFB>(^b delta 117 zcmeyRbY5;k0He&tz!HwhA)Ka+$&}^4IQcnmE#vgbseCz%b0%K`k_#u>^Y<|>pL~wr Ue6o=N)B$xdExVH*P+gj zUN<44J&RjBqisC(j>7HA{z!j2OJozLe zUxcxtv7s)Az;FXZFGQGW!$cRBj%^X08w5)3Zs2f(h+-Me!0P@#vWB>pF delta 59 zcmbQt_LF%+03+kXKpTNRrZ;8lSIS;n@S>QlK-=4O<6J&Q9=R4xDTWIbg$#8J%#-&p OS#p8|SawttQ~&^fb`&cB diff --git a/result/userstatus.ser b/result/userstatus.ser index 0ccdd23e38c0791ea402e2b1c79e38533c52eacf..c041f7aa440362c7055e629087dcab3d04189fae 100644 GIT binary patch delta 397 zcmZo-`^P>ZfRSZlppC$k!{=Xoma`VM&pRexxz_F7#<_}&imLHO8(9r13K{Acn2SLq zXE`qu0}!Nd(YPVVVRc~gea4K*=a|Hdfn2U!hYGMFrVSHaSUR>vbZ!tRxx0bGtpFlA z*=q93y`lFWTv5HRyzITlugU#PqM53N(yJOJz%~e>*#MMUc~b!_#fK>c(giWMXK{;X zw2i0Uakj={ribnhP}_7ql^ooX^TOxZu0x$4y>3Em%doWh{{w8K1e%c=E{0FCJh0jZ zlzP200czV0uEgFTUAcFy;eXcMD{?#rv2B@c)?D^oOW!p-ytYeF%q<;cn}$pQLnrSC au#s|TwgII&oGw(pqN|w#<_}&JTe6goxC3^3K{Acm?y7g z7N7i(F>Uf`W+Sm;kPy@Sga7^IZ7#4`ef|4j$`MEI$rG4Fk$Gg<1FW8 zVgQ2lEpl(frsh4Ur~_%{DPdr9bPn+hbH!9NP3%Sm#D+emH)ZQr%3fRWqL{5f+uOAQ E0I@?pp#T5? diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java new file mode 100644 index 000000000..60ce3e8f4 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -0,0 +1,73 @@ +package com.sprint.mission.discodeit.controller; + +import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.dto.channel.CreateChannel; +import com.sprint.mission.discodeit.service.ChannelService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/channel") +@RequiredArgsConstructor +public class ChannelController { + private final ChannelService channelService; + + @RequestMapping(value = "/create/public", method = RequestMethod.POST) + public ResponseEntity createPublicChannel(@RequestBody CreateChannel.PublicRequest request) { + Channel publicChannel = channelService.createPublicChannel(request); + return ResponseEntity.ok(publicChannel); + } + + @RequestMapping(value = "/create/private", method = RequestMethod.POST) + public ResponseEntity createPrivateChannel(@RequestBody CreateChannel.PrivateRequest request) { + Channel privateChannel = channelService.createPrivateChannel(request); + return ResponseEntity.ok(privateChannel); + } + + @RequestMapping(value = "/get/public", method = RequestMethod.GET) + public ResponseEntity getPublicChannel(@RequestParam("id") UUID uuid) { + ChannelDTO.PublicChannelDTO publicChannel = channelService.findPublicChannel(uuid); + return ResponseEntity.ok(publicChannel); + } + + @RequestMapping(value = "/get/private", method = RequestMethod.GET) + public ResponseEntity getPrivateChannel(@RequestParam("id") UUID uuid) { + ChannelDTO.PrivateChannelDTO privateChannel = channelService.findPrivateChannel(uuid); + return ResponseEntity.ok(privateChannel); + } + + @RequestMapping(value = "getAll/private", method = RequestMethod.GET) + public ResponseEntity> getAllPrivateChannel(@RequestParam("id") UUID userId) { + List allPrivate = channelService.findAllPrivate(userId); + return ResponseEntity.ok(allPrivate); + } + + @RequestMapping(value = "getAll", method = RequestMethod.GET) + public ResponseEntity> getAllPrivateChannel() { + List allChannel = channelService.findAll(); + return ResponseEntity.ok(allChannel); + } + + @RequestMapping(value = "delete/private", method = RequestMethod.DELETE) + public ResponseEntity deletePrivateChannel(@RequestParam("id") UUID uuid) { + Channel removeChannel = channelService.deletePrivate(uuid); + return ResponseEntity.ok( + "Remove Private Channel ID: " + removeChannel.getId() + + " delete complete!" + ); + } + + @RequestMapping(value = "delete/public", method = RequestMethod.DELETE) + public ResponseEntity deletePublicChannel(@RequestParam("id") UUID uuid) { + Channel removeChannel = channelService.deletePublic(uuid); + return ResponseEntity.ok( + "Remove Public Channel ID: " + removeChannel.getId() + + " delete complete!" + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index 58ec5cced..012228618 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -1,8 +1,13 @@ package com.sprint.mission.discodeit.dto.channel; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.deser.std.UUIDDeserializer; +import com.fasterxml.jackson.databind.ser.std.UUIDSerializer; import com.sprint.mission.discodeit.util.type.ChannelFormat; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import java.util.List; import java.util.UUID; @@ -10,6 +15,7 @@ public class CreateChannel { @Getter @AllArgsConstructor + @NoArgsConstructor public static class PrivateRequest { private List joinUser; private ChannelFormat channelFormat; @@ -17,6 +23,7 @@ public static class PrivateRequest { @Getter @AllArgsConstructor + @NoArgsConstructor public static class PublicRequest { private String name; private String description; diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 949a8320c..0f7cf5908 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -17,11 +17,13 @@ public interface ChannelService { ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId); - List findAllPublic(); - List findAllPrivate(UUID userId); + List findAll(); + Channel update(UpdatePublicChannel request); - void delete(UUID channelId); + Channel deletePrivate(UUID channelId); + + Channel deletePublic(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 8ee8b890a..53e465b7f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -116,14 +116,6 @@ public ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId) { return ChannelDTO.PrivateChannelDTO.fromDomain(findChannel, latestMessageTime); } - @Override - public List findAllPublic() { - List allChannels = channelRepository.findAll(); - return allChannels.stream() - .filter(channel -> channel instanceof PublicChannel) // Public 채널만 필터링 - .collect(Collectors.toList()); - } - @Override public List findAllPrivate(UUID userId) { // 통일성을 위해 findAllByUserId보다는 findAllPrivate으로 하였습니다. // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 @@ -144,6 +136,11 @@ public List findAllPrivate(UUID userId) { // 통일성을 위해 findAl .collect(Collectors.toList()); } + @Override + public List findAll() { + return channelRepository.findAll(); + } + @Override public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 validChannel(request.channelId()); @@ -162,7 +159,7 @@ public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유 } @Override - public void delete(UUID channelId) { + public Channel deletePrivate(UUID channelId) { validChannel(channelId); Channel removeChannel = channelRepository.findById(channelId) @@ -179,6 +176,24 @@ public void delete(UUID channelId) { readStatusRepository.delete(readStatuses); channelRepository.delete(removeChannel); + return removeChannel; + } + + @Override + public Channel deletePublic(UUID channelId) { + validChannel(channelId); + + Channel removeChannel = channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + + // 채널에 포함된 메시지 삭제하기 + List messages = messageService.findAllByChannelId(channelId); + if (!messages.isEmpty()) { + messages.forEach(message -> messageRepository.delete(message)); + } + + channelRepository.delete(removeChannel); + return removeChannel; } // 채널 검증 diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java index 8654ff183..5edca055d 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java +++ b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java @@ -1,5 +1,8 @@ package com.sprint.mission.discodeit.util.type; +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.STRING) public enum ChannelFormat { TEXT, VOICE } \ No newline at end of file From b8b38dc772c4e3934145796065d389d68d3af964 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 20 Feb 2025 09:18:13 +0900 Subject: [PATCH 065/115] Add UserStatus controller --- build.gradle | 1 - result/channels.ser | Bin 82 -> 0 bytes result/readstatus.ser | Bin 4474 -> 0 bytes result/users.ser | Bin 787 -> 0 bytes result/userstatus.ser | Bin 1022 -> 0 bytes .../controller/BinaryContentController.java | 14 ++++++++ .../controller/MessageController.java | 13 +++++++ .../controller/ReadStatusController.java | 32 ++++++++++++++++++ .../controller/UserStatusController.java | 2 -- .../discodeit/domain/BinaryContent.java | 1 + .../mission/discodeit/domain/Message.java | 3 -- .../discodeit/service/ReadStatusService.java | 2 +- .../service/basic/BasicReadStatusService.java | 4 +-- 13 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/MessageController.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java diff --git a/build.gradle b/build.gradle index 6571c52b7..b5b5e321c 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,6 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.16.1' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok:1.18.30' diff --git a/result/channels.ser b/result/channels.ser index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 fJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-fS45kZuA$C diff --git a/result/readstatus.ser b/result/readstatus.ser index 480782e448ec772b8edddd4758a508c0fd4f9dbc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 4474 zcmaKv30PBC7RQs9pdhF?Dh+}HaYKP1wpK)~VGBvvL4<+}kwgd*5|amw3kU*=pb$hB z5rrAiBFIu%1VLG>sMVr~igiZYjw8ht6&-L8I`7>ZAbH75z7M`H|MSlM{m(sjc{%r* zq$87(W<>I0d5joT7{y@oWD%Y`iO%FlZC8v!yC@`tMVb;N=J8p)FjOq%ko3?9sX!JX zj^fKD>zE|`v+O%v>^~FxGsgy-HZfR00LP{I7-cYDlwymJ5H86eO2Ct${=#r4Au8jN z^hM(FZ*oZ$-E8$Hl72+6T%NSApBsve#RwCN7&3`e7>zPSLYYh`j%M(MvM@1UAVe8_ zv4|&(X7~wse1DXO#>g-S_=k*;CV7zb!XkLl(Sj%rA0-)j;HGTx3T<&ytMRZ@z(WOm zM-(N^gke-D64-L0WhgHi#hyTf{2iotl8y&90hntXX69sAt+!VJ+;uq2Dug$OMuV>O2?ea6H8B8|K?jb(#)9+)u!&ibx|9Qp4^;S z;F-9=>l9F_FjgGN?EHS=>y}9`Za!1=I{yq*HRioT3Bb-YEg}7UEq3q(IC!-rYswzi zppM&a1}B%8xNd^#L5ps)J8_E}{|pJ-DSzpK0##|Jfi``5BPmOoknt?#mjxUrBD0G! z^I#~j18Y-piiKE18g?-CFk5M-!Rv?3zOhXbBTB}_r#X&0p`G-^{*K^Y+Y64Vvp$p$ zvx`*iD0u#xviM2s^aopS$n2Q0L_1XDkUc)Yj;UrSxb=>P9V{Wi9wf|y^h-4lYiu@O zw=19`kGnEi|5l~fxpn6#O8(FvD(>!nf0;c*K#)%%of}fYV00}Zs09Q;0ykD zLq~^i9d&5%Ufsy|tbuCk3-LCK7fdgQDwR%H9;-bQcfLj*>X%29%e1a3Tpz zN*5(~D-GCLq8SQ$s_epq9c2Opr{~vs-WqX8O&hA&Ul_uzfa;OD^J!#{meHAZ2f{_w z-f#w#cACY1{ru&g*yaqfPPF@E?{sx$etX%d~`IiV3|LOMu{pb*DR*l4q|s zZhEyxT?RPY4IX}MP1v#FvZ?+A7M z`;Rx61yC)TH}Ew5@1di2i+UL_adZx#_!xJk^GZbg{kYEQScq>gJ4O4iB z{cPsFNeTR1`9$j20qqoDbupEi4Jgd=Cp$>@dxbzd_$FYgBk+klaeW9(hQ?8fg?16? zstHpetik+h9p^v@UGFT~GNXu@Jpo&;4#N+(h@Mga6Ke@2HV{f3OHgtcgS!UjPwn1j z|E~5(J8K(M_pLAy=R6yj*HbiFYASQ-1S;seKM`R=D;R~P!W(70@AzUaNF36j!vx4F z5&cD{ceAzdbyE7(6;)h#d?Lrqgh7^SL#VxkyHF<+MVzHn8vG&gR=IGe1sse_p~q0qHPS^MSuYa_n;F>xjb+ z$$j30Gp2S?p+(Q6P|%7*kT5U6y9Y_5-%R^SPcUUKK#`K6olPSqO5y<4%+ zI}NH?dEc16S}WgsX@7Fjob^sBtq1s0t~1fmda8q zn%i%d>4i4d%so!YY2%i_Qq%T*>0m^Q>XEm(AB=hFt#ZR!5lii&xbA{)rl+-pBKrt* z{AFh>feT@&d*8mg-5oT1;)7`5PP&&PP(fE$X^xomz5$e4rX^HsuLU-i0B;1OQ7AV% zKGG8;Fe>M#WUy!xumyw>v2{{UflaK^4Au1&6Jg2(@GMe)hI~xW`pX(tLT5%mIWrxq zRpCeKZG&t|cf5O`Xfbk)0;=)``CGAr&KRP^t3xh@6`ETl$xR6xoIq3W^rup~to)mqM?EvhI6 z^d@yW2yG|M{8$16A3BxH30cEoT$_|ALwPnd&MPhf__0Afvs5N Tk59UQeqBolCDyK*U?Tr7>*kBo diff --git a/result/users.ser b/result/users.ser index 1c28b713969336260d59cc4c9ee2f00f903c6c32..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 787 zcmZ{gPiPZC6vm&Mq)lR4qM{xOl?sA~X452Iq(WOMu^ZNlF(`=WkR6ke{nworvmO+M z6f7#VSfNFPf>)IwMQZU<3-u@-6%;)v^-l}xK@T3B-36&W~41#wO^{9B0 z;)aA-=RdPjNf~}R6Z$!AjHM-z3Xsq#;aFsq!wh)=wi?#opKH&@$<1S_?zOQKzaPGJ zhL(lb{<3Ar+;*6WvcWiKmMLqDmo1Gllr_sB%#=%&jkt(Y8%iTx@_OhZTpC2#DsM=JENNeqgxJ*eo!tfY%5(kr4CwF&2S%h5*RGPJ7@ zv8$FzTc1wbvCc7_Dh8=g#cyd7AT?VHK)kky3W=IvEh51hZ#B8L7_-A)na3y>sdM{u zW1(yB$fE>+Yu7s@Z?MYTzUsl=*$LM(3L(TkKe_T{a^maty9n{)lw&5FJJ8dE(9xIa zOJy_JOiJ9W&AtBEdJ|ujZuNf0#W{UN{kZUK{9EBwpx(IGP);3EoyI0GxlAsT@}3Pafk_}s&B@{LwZ|vNn@N1rjOGJ%L++XE)Q4Yw r?(SCZ^!z5d-bPZn|1Ck7e0t{w<4!HTSozW2zjMG`-gEIme$D*@AFlk+ diff --git a/result/userstatus.ser b/result/userstatus.ser index c041f7aa440362c7055e629087dcab3d04189fae..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmaKpZAcVB7{|vw?>z04J0lSci$XA{-HIT52|e@9TiGZ&uY!miZkM|~_RXC+UB8Hu zf(P{>ET|8CiiD!VLZXg>Ot6m@L};L8L>Q61eJCQZnO(c!P8!&O{r~5A{=aAD<|p7r zCJ3ZpFJ#kLR@ewc$wSa^m%N&quIhg70!$c`DLNFxFphPT2cqyBoxrC^5aFntXp=GO1RGR6_h%Uwre~MG*EVfx z(Pp;v-wLmgUTj=fS!9^9hFMicNY*u0lu=w4B^k4#u0mO3V@NWi7~(XdFk}@mz$1Xt zxG6y_i9w9PMu9?cSXL#D*ARvpZV~_^ix~JFiw@6GUZVRH0vU{BxmOC}9xwph0`Tja zB5RV9)75WC7&Hikj&ta^H99Uw$Jre*ImsQ)D_6>TzgNN48e;u%wrj3@^bqY zDKHzA%!{Xnvo+fycYOd@MqfEYr%X)No!)!Lz1yNiE=2dzoK-&;@HRfS228O3zgK9# zIfZ2NA!!6%l_c`-qbg8Kupuq2I+kM^7@F=$U=0)A>?c<*#zihQQuTNc1&5faId(6s0>-zjw+o~wEXqBxpXRi+P zC!2Zpsb>f=OC7C_I=1s0o|;sah4n+=dD|6)hf=A{#B qwC$NSKp) getStatus(@RequestParam("id") UUID uuid) { + ReadStatus readStatus = readStatusService.find(uuid); + return ResponseEntity.ok(readStatus); + } + + @RequestMapping(value = "/get/userid", method = RequestMethod.GET) + public ResponseEntity> getStatusesByUserId(@RequestParam("id") UUID userID) { + List allByUserId = readStatusService.findAllByUserId(userID); + return ResponseEntity.ok(allByUserId); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java index e93f754df..e883adfc5 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -1,8 +1,6 @@ package com.sprint.mission.discodeit.controller; import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index d2d489034..44d096108 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -15,6 +15,7 @@ public class BinaryContent implements Serializable { private final UUID id; private Instant createdAt; private byte[] content; + private String filePath; private BinaryContentType contentType; public BinaryContent(byte[] content, BinaryContentType contentType) { diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index a78a0fce3..ae175192f 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -6,9 +6,6 @@ import java.io.Serial; import java.io.Serializable; import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.List; import java.util.UUID; diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index 4b1dd0a47..96ca46620 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -12,7 +12,7 @@ public interface ReadStatusService { ReadStatus create(CreateReadStatusRequest request); - Optional find(UUID id); + ReadStatus find(UUID id); List findAllByUserId(UUID userID); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index db792d858..1f8ea815d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -44,8 +44,8 @@ public ReadStatus create(CreateReadStatusRequest request) { } @Override - public Optional find(UUID id) { - return readStatusRepository.findById(id); + public ReadStatus find(UUID id) { + return readStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); } @Override From 6d8dac101f9a6284f86b4ad13b1512e5c3e6a216 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 20 Feb 2025 11:10:43 +0900 Subject: [PATCH 066/115] Complete save binarycontent --- build.gradle | 1 + result/binarycontent.ser | Bin 0 -> 15321 bytes .../controller/BinaryContentController.java | 19 +++++++-- .../discodeit/domain/BinaryContent.java | 13 +++++- .../mission/discodeit/domain/Channel.java | 1 - .../mission/discodeit/domain/Message.java | 17 +------- .../mission/discodeit/domain/ReadStatus.java | 1 - .../sprint/mission/discodeit/domain/User.java | 37 +++++------------- .../CreateBinaryContentRequest.java | 6 --- .../dto/binarycontent/SaveFileRequest.java | 7 ++++ .../discodeit/dto/login/LoginRequest.java | 3 -- .../discodeit/dto/user/UpdateUserRequest.java | 2 +- .../repository/BinaryContentRepository.java | 1 - .../service/BinaryContentService.java | 6 ++- .../service/basic/BasicAuthService.java | 8 +--- .../basic/BasicBinaryContentService.java | 21 ++++++---- .../service/basic/BasicReadStatusService.java | 1 - .../service/basic/BasicUserService.java | 22 ++--------- .../service/basic/BasicUserStatusService.java | 1 - 19 files changed, 70 insertions(+), 97 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java diff --git a/build.gradle b/build.gradle index b5b5e321c..467c055c2 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok:1.18.30' diff --git a/result/binarycontent.ser b/result/binarycontent.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d5588b7bda454f997e068c82802ee4afa2217429 100644 GIT binary patch literal 15321 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 E0K7!n0{{R3 literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 7b440c199..8257fa6c7 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -1,14 +1,27 @@ package com.sprint.mission.discodeit.controller; +import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; import com.sprint.mission.discodeit.service.BinaryContentService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; @RestController -@RequestMapping("/binary") +@RequestMapping("/files") @RequiredArgsConstructor public class BinaryContentController { private final BinaryContentService binaryContentService; + @PostMapping("/upload") + public ResponseEntity uploadFile(@ModelAttribute SaveFileRequest request) { + try { + BinaryContent binaryContent = binaryContentService.saveFile(request); + return ResponseEntity.ok(binaryContent); + } catch (IOException e) { + throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); + } + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index 44d096108..e64b642d0 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -1,14 +1,18 @@ package com.sprint.mission.discodeit.domain; import com.sprint.mission.discodeit.util.type.BinaryContentType; +import lombok.Builder; +import lombok.Data; import lombok.Getter; +import lombok.Setter; +import org.springframework.stereotype.Service; import java.io.Serial; import java.io.Serializable; import java.time.Instant; import java.util.UUID; -@Getter +@Data public class BinaryContent implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -17,12 +21,17 @@ public class BinaryContent implements Serializable { private byte[] content; private String filePath; private BinaryContentType contentType; + private String originalFileName; + private String storedFileName; - public BinaryContent(byte[] content, BinaryContentType contentType) { + public BinaryContent(byte[] content, String filePath, BinaryContentType contentType, String originalFileName, String storedFileName) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.content = content; this.contentType = contentType; + this.originalFileName = originalFileName; + this.storedFileName = storedFileName; + this.filePath = filePath; } public void updateContent(byte[] newContent) { diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index eab525d9e..07c981376 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.domain; import lombok.Getter; -import lombok.Setter; import java.io.Serial; import java.io.Serializable; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index ae175192f..bcbc102b8 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.domain; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import java.io.Serial; import java.io.Serializable; @@ -9,7 +8,7 @@ import java.util.List; import java.util.UUID; -@Getter +@Data public class Message implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -36,16 +35,4 @@ public void update(String content, UUID newAttachment) { this.attachmentsID.add(newAttachment); this.updatedAt = Instant.now(); } - - @Override - public String toString() { - return "Message{" + - "id=" + id + - ", createdAt=" + createdAt + - ", updatedAt=" + updatedAt + - ", content='" + content + '\'' + - ", writer='" + writerID + '\'' + - ", channel='" + channelID + '\'' + - '}'; - } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java index 5e0d83835..07810a23f 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java @@ -6,7 +6,6 @@ import java.io.Serial; import java.io.Serializable; import java.time.Instant; -import java.time.LocalDateTime; import java.util.UUID; @Getter diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index c8e60f532..b64931555 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -1,7 +1,8 @@ package com.sprint.mission.discodeit.domain; -import lombok.Getter; -import lombok.Setter; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import lombok.Data; import java.io.Serial; import java.io.Serializable; @@ -9,16 +10,21 @@ import java.util.Objects; import java.util.UUID; -@Getter -@Setter +@Data public class User implements Serializable { @Serial private static final long serialVersionUID = 1L; private final UUID id; private Instant createdAt; private Instant updatedAt; + + @NotNull(message = "회원 이름은 필수 입력 값입니다") private String name; + + @Pattern(regexp = "^010-\\d{4}-\\d{4}$", message = "전화번호 형식에 맞춰 입력해주세요") private String phone; + + @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") private String password; private UUID profileImageId; private UUID userStatusId; @@ -39,17 +45,6 @@ public void update(String password) { this.updatedAt = Instant.now(); } - //8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 한다 - public static boolean isValidPassword(String password) { - String passwordRegex = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$"; - return password.matches(passwordRegex); - } - - public static boolean isValidPhone(String phoneNumber) { - String phoneRegex = "^010-\\d{4}-\\d{4}$"; - return phoneNumber.matches(phoneRegex); - } - @Override public boolean equals(Object o) { // User 객체는 UUID, name, phone 3개의 필드가 동일하면 같은 유저라고 판단한다. if (o == null || getClass() != o.getClass()) return false; @@ -61,16 +56,4 @@ public boolean equals(Object o) { // User 객체는 UUID, name, phone 3개의 public int hashCode() { return Objects.hash(id, name, phone); } - - @Override - public String toString() { - return "User {\n" + - " id=" + id + ",\n" + - " name='" + name + "',\n" + - " phone='" + phone + "',\n" + - " password='" + password + "',\n" + - " createdAt=" + createdAt + ",\n" + - " updatedAt=" + updatedAt + "\n" + - "}"; - } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java deleted file mode 100644 index 031c7e438..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sprint.mission.discodeit.dto.binarycontent; - -import com.sprint.mission.discodeit.util.type.BinaryContentType; - -public record CreateBinaryContentRequest(byte[] content, BinaryContentType contentType) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java new file mode 100644 index 000000000..e8da7a6cf --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.binarycontent; + +import com.sprint.mission.discodeit.util.type.BinaryContentType; +import org.springframework.web.multipart.MultipartFile; + +public record SaveFileRequest(BinaryContentType contentType, MultipartFile file) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java index fd6422e03..43bbeedbd 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java @@ -1,9 +1,6 @@ package com.sprint.mission.discodeit.dto.login; -import java.util.UUID; - public record LoginRequest( - UUID userID, String userName, String password ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java index 0ecb71140..f563d1171 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java @@ -4,5 +4,5 @@ import java.util.UUID; -public record UpdateUserRequest(UUID userId, String password, byte[] profile) { +public record UpdateUserRequest(UUID userId, String password, UUID fileId) { } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 1f6584d76..2acd41b1e 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index 96c0abed3..bd99b6156 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,14 +1,16 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; +import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.UUID; public interface BinaryContentService { - BinaryContent create(CreateBinaryContentRequest request); + BinaryContent saveFile(SaveFileRequest request) throws IOException; Optional find(UUID id); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 6dfcd4910..a2bede716 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -22,18 +22,14 @@ public class BasicAuthService { private final UserStatusService userStatusService; public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 - User findUser = userRepository.findById(request.userID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } - if (!findUser.getName().equals(request.userName())) { - throw new ServiceException(ErrorCode.USERNAME_MISMATCH); - } - // 로그인을 하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.userID()); + UserStatus userStatus = userStatusService.findByUserId(findUser.getId()); UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); userStatusService.update(updateRequest); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index 3f4323e59..a13ca3e4c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,15 +1,13 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; +import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; import com.sprint.mission.discodeit.repository.BinaryContentRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.BinaryContentService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; +import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -21,11 +19,18 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; @Override - public BinaryContent create(CreateBinaryContentRequest request) { - BinaryContent binaryContent = new BinaryContent(request.content(), request.contentType()); - binaryContentRepository.save(binaryContent); + public BinaryContent saveFile(SaveFileRequest request) throws IOException { + if (request.file().isEmpty()) { + throw new IllegalArgumentException("파일이 비어 있습니다."); + } - return binaryContent; + String originalFileName = request.file().getOriginalFilename(); + String storedFileName = UUID.randomUUID() + "_" + originalFileName; // 고유 저장 이름 + byte[] content = request.file().getBytes(); + + BinaryContent binaryContent = new BinaryContent(content, storedFileName, request.contentType(), originalFileName, storedFileName); + + return binaryContentRepository.save(binaryContent); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 1f8ea815d..699d1521e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -14,7 +14,6 @@ import java.time.Instant; import java.util.List; -import java.util.Optional; import java.util.UUID; @Service diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 7097e581d..85f9aa28e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -34,14 +34,6 @@ public class BasicUserService implements UserService { @Override public UserDTO create(CreateUserRequest request) { - if (!User.isValidPassword(request.password())) { - throw new ServiceException(ErrorCode.INVALID_PASSWORD); - } - - if (!User.isValidPhone(request.phone())) { - throw new ServiceException(ErrorCode.INVALID_PHONE); - } - userRepository.findByPhone(request.phone()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); // 저는 이메일 대신 핸드폰 번호로 했습니다 @@ -97,17 +89,9 @@ public User update(UpdateUserRequest request) { updateUser.update(request.password()); // 비밀번호를 수정합니다. - if (request.profile() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. - if (updateUser.getProfileImageId() == null) { - // 새로운 Profile 을 생성하고 저장합니다. - BinaryContent profile = new BinaryContent(request.profile(), BinaryContentType.IMAGE); - binaryContentRepository.save(profile); - updateUser.setProfileImageId(profile.getId()); - } else { // 이미 프로필이 존재한다면 - BinaryContent profile = binaryContentRepository.findById(updateUser.getProfileImageId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - profile.updateContent(request.profile()); - updateUser.setProfileImageId(profile.getId()); - } + if (request.fileId() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. + BinaryContent newBinaryContent = binaryContentRepository.findById(request.fileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + updateUser.setProfileImageId(newBinaryContent.getId()); } // User가 회원 정보를 UserStatus 업데이트하기 diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index c5c4cabcf..f24252e47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -12,7 +12,6 @@ import org.springframework.stereotype.Service; import java.util.List; -import java.util.Optional; import java.util.UUID; @Service From f95358652a293a4e998d913c561bb39f49907b39 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 20 Feb 2025 13:50:45 +0900 Subject: [PATCH 067/115] Refactor: mentoring --- .../com/sprint/mission/discodeit/domain/User.java | 9 +++++++-- .../discodeit/dto/user/UpdateUserRequest.java | 2 +- .../mission/discodeit/exception/ErrorCode.java | 1 + .../discodeit/repository/MessageRepository.java | 6 ++++-- .../repository/file/FileMessageRepository.java | 15 +++++++++++++++ .../repository/jcf/JCFMessageRepository.java | 15 +++++++++++++++ .../service/basic/BasicChannelService.java | 14 ++------------ .../service/basic/BasicMessageService.java | 6 +----- .../discodeit/service/basic/BasicUserService.java | 2 +- 9 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index b64931555..f96a6ed07 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -1,5 +1,7 @@ package com.sprint.mission.discodeit.domain; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import lombok.Data; @@ -40,8 +42,11 @@ public User(String name, String phone, String password, UUID profileImageId, UUI this.userStatusId = userStatusId; } - public void update(String password) { - this.password = password; + public void update(String oldPassword, String newPassword) { + if (!this.password.equals(oldPassword) || oldPassword.equals(newPassword)) { + throw new ServiceException(ErrorCode.INVALID_PASSWORD); + } + this.password = newPassword; this.updatedAt = Instant.now(); } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java index f563d1171..00c1636f0 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java @@ -4,5 +4,5 @@ import java.util.UUID; -public record UpdateUserRequest(UUID userId, String password, UUID fileId) { +public record UpdateUserRequest(UUID userId, String oldPassword ,String newPassword, UUID fileId) { } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index 91ca2dffc..b48054f4e 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -28,6 +28,7 @@ public enum ErrorCode { INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), MESSAGE_EDIT_NOT_ALLOWED("메시지 수정은 작성자 본인만 가능합니다"), + PASSWORD_EDIT_NOT_ALLOWED("이전 비밀번호와 일치하지 않습니다"), PASSWORD_MISMATCH("비밀번호가 일치하지 않습니다"), USERNAME_MISMATCH("이름이 일치하지 않습니다"), diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 00bd04dcf..53e13678a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,8 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; import java.util.List; import java.util.Optional; @@ -15,5 +13,9 @@ public interface MessageRepository { List findAll(); + List findByChannelId(UUID channelId); + + Optional findLatestByChannelId(UUID channelId); + Message delete(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java index 24a19541d..ccb804d21 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java @@ -10,6 +10,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; +import java.util.stream.Collectors; import static com.sprint.mission.discodeit.util.FileIOUtil.*; import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; @@ -45,6 +46,20 @@ public Optional findById(UUID uuid) { return Optional.of(messageMap.get(uuid)); } + @Override + public List findByChannelId(UUID channelId) { + return messageMap.values().stream() + .filter(message -> message.getChannelID().equals(channelId)) + .collect(Collectors.toList()); + } + + @Override + public Optional findLatestByChannelId(UUID channelId) { + return messageMap.values().stream() + .filter(message -> message.getChannelID().equals(channelId)) + .max(Comparator.comparing(Message::getCreatedAt)); + } + @Override public List findAll() { return messageMap.values().stream().toList(); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java index 5b15884e5..40ac94aca 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java @@ -7,6 +7,7 @@ import java.util.*; +import java.util.stream.Collectors; @Profile("jcf") @Repository @@ -35,6 +36,20 @@ public List findAll() { return messageMap.values().stream().toList(); } + @Override + public List findByChannelId(UUID channelId) { + return messageMap.values().stream() + .filter(message -> message.getChannelID().equals(channelId)) + .collect(Collectors.toList()); + } + + @Override + public Optional findLatestByChannelId(UUID channelId) { + return messageMap.values().stream() + .filter(message -> message.getChannelID().equals(channelId)) + .max(Comparator.comparing(Message::getCreatedAt)); + } + @Override public Message delete(Message message) { messageMap.remove(message.getId()); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 53e465b7f..c041915ab 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -79,18 +79,8 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { public ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId) { PublicChannel findChannel = (PublicChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. - Instant latestMessageTime = Instant.EPOCH; // 초기값 설정 - List messageList = messageRepository.findAll(); - - for (Message message : messageList) { - if (message.getChannelID().equals(findChannel.getId())) { - if (message.getCreatedAt().isAfter(latestMessageTime)) { - latestMessageTime = message.getCreatedAt(); - } - } - } - return ChannelDTO.PublicChannelDTO.fromDomain(findChannel, latestMessageTime); + Message lastestMessage = messageRepository.findLatestByChannelId(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + return ChannelDTO.PublicChannelDTO.fromDomain(findChannel, lastestMessage.getCreatedAt()); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index cb97b329d..91f46b104 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -67,11 +67,7 @@ public Message create(CreateMessageRequest request) { public List findAllByChannelId(UUID channelID) { validChannel(channelID); - List messages = messageRepository.findAll(); - return messages.stream() - .filter(message -> message.getChannelID().equals(channelID)) - .collect(Collectors.toList()); - + return messageRepository.findByChannelId(channelID); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 85f9aa28e..458f10bf9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -87,7 +87,7 @@ public List findAll() { public User update(UpdateUserRequest request) { User updateUser = userRepository.findById(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - updateUser.update(request.password()); // 비밀번호를 수정합니다. + updateUser.update(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. if (request.fileId() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. BinaryContent newBinaryContent = binaryContentRepository.findById(request.fileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); From fd2c0b05958bceeb8e06c04cef4a96f85672e3b8 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 20 Feb 2025 14:42:20 +0900 Subject: [PATCH 068/115] User aop userstatus update --- build.gradle | 1 + result/users.ser | Bin 0 -> 528 bytes result/userstatus.ser | Bin 0 -> 635 bytes .../discodeit/aspect/UpdateUserStatus.java | 11 +++++++ .../discodeit/aspect/UserStatusAspect.java | 26 ++++++++++++++++ .../discodeit/controller/AuthController.java | 11 ++++--- .../discodeit/controller/UserController.java | 4 +-- .../dto/message/CreateMessageRequest.java | 2 +- .../dto/message/UpdateMessageRequest.java | 2 +- .../discodeit/dto/user/UpdateUserRequest.java | 2 +- .../userstatus/UpdateUserStatusRequest.java | 7 ----- .../discodeit/service/MessageService.java | 4 +-- .../discodeit/service/UserService.java | 2 +- .../discodeit/service/UserStatusService.java | 6 +--- .../service/basic/BasicAuthService.java | 12 +++----- .../service/basic/BasicChannelService.java | 14 ++------- .../service/basic/BasicMessageService.java | 28 ++++++------------ .../service/basic/BasicUserService.java | 14 +++------ .../service/basic/BasicUserStatusService.java | 15 ++-------- 19 files changed, 74 insertions(+), 87 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java create mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java diff --git a/build.gradle b/build.gradle index 467c055c2..2c6d5b41e 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-aop' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok:1.18.30' diff --git a/result/users.ser b/result/users.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cc64be91a9bdcfd36b75e6965339777977be95a2 100644 GIT binary patch literal 528 zcmYL_&ubGw6vtmT#wKx7YK0tdd8&(g790kXnaWiFSXPkNI?x7S9 z6$DQTfHnLCjf?&LqV?m+hcD-@Qa$wi}uV}vxNh*!64fF z^t|%tnRpO-;Pt@I7%|xA=~a%V2S|5aC$ta6;sQg;8#hNYNRH8>`0Pk1T5+369MEP^s*i&FPmp#-Pvi(_4EVPoC+%^#Mv%G(ERi`tI{` zW97t3>5M7}^ZLMBtx7w{~QpVk=AJ~ZVjrV`c YY1e!4y<55Y?f9wArPt}hNpGY42OlY>f&c&j literal 0 HcmV?d00001 diff --git a/result/userstatus.ser b/result/userstatus.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d6e4bf8d370e78ced1428811d6cb285f8597d2d9 100644 GIT binary patch literal 635 zcmaKp!D|yi6vkgSBsMjX*g_FJ2!aPMGe;3Y8{39#*dmz5o9MVRBvW>0#+|p#3X+3Z z=v6^zJ@x28FCILIpyJ7ch}ZlNJ$rQ~s}YL$U}ZRb>Z$4HFRS-|R3PZUQlc5}uo!g~LLEn$up^!D!rWK`AC2*%+goleII%N-#Rh|L zRon}M%#`0nHC zQs*8N{!_*Jy*^KU+PnN_a#Tz*xboi?&Svf*$w^3W;bYlZ{uye*)R1hdJS|gY(je5@ h>)YX-&3`aF*)L|d!L#Q(58~$I@6+kVrLkDY;upQB%M<_r literal 0 HcmV?d00001 diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java b/src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java new file mode 100644 index 000000000..f3b9b9b43 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.aspect; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UpdateUserStatus { +} diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java b/src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java new file mode 100644 index 000000000..b3472cc99 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java @@ -0,0 +1,26 @@ +package com.sprint.mission.discodeit.aspect; + +import com.sprint.mission.discodeit.service.UserStatusService; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Aspect +@Component +@RequiredArgsConstructor +public class UserStatusAspect { + private final UserStatusService userStatusService; + + @Before("@annotation(UpdateUserStatus)") + public void updateUserStatus(JoinPoint joinPoint) { + Object[] args = joinPoint.getArgs(); + + if (args.length > 0 && args[0] instanceof UUID userId) { + userStatusService.updateByUserId(userId); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java index 897693077..e8efd7751 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -5,10 +5,9 @@ import com.sprint.mission.discodeit.service.basic.BasicAuthService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; @RestController @RequestMapping("/auth") @@ -17,8 +16,8 @@ public class AuthController { private final BasicAuthService authService; @RequestMapping(value = "/login", method = RequestMethod.POST) - public ResponseEntity login(@RequestBody LoginRequest request) { - UserDTO login = authService.login(request); + public ResponseEntity login(@RequestParam("id") UUID userId, @RequestBody LoginRequest request) { + UserDTO login = authService.login(userId, request); return ResponseEntity.ok( "User Id: " + login.getId() + "User Name: " + login.getName() + diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 5d6285f04..ec22d9e0b 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -37,8 +37,8 @@ public ResponseEntity> getAllUser() { } @RequestMapping(value = "/update", method = RequestMethod.PUT) - public ResponseEntity updateUser(@RequestBody UpdateUserRequest request) { - User update = userService.update(request); + public ResponseEntity updateUser(@RequestParam("id") UUID userId, @RequestBody UpdateUserRequest request) { + User update = userService.update(userId, request); return ResponseEntity.ok(update); } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java index 45d615621..5fd1c1bd7 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java @@ -6,5 +6,5 @@ import java.util.List; import java.util.UUID; -public record CreateMessageRequest(List attachmentsID, String content, UUID channelID, UUID writerID) { +public record CreateMessageRequest(List attachmentsID, String content, UUID channelID) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java index a852d33c4..119b06c7d 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java @@ -11,5 +11,5 @@ import java.util.List; import java.util.UUID; -public record UpdateMessageRequest(UUID messageID, String newContent, UUID newAttachment, UUID writerID) { +public record UpdateMessageRequest(UUID messageID, String newContent, UUID newAttachment) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java index 00c1636f0..0f443f6d3 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java @@ -4,5 +4,5 @@ import java.util.UUID; -public record UpdateUserRequest(UUID userId, String oldPassword ,String newPassword, UUID fileId) { +public record UpdateUserRequest(String oldPassword ,String newPassword, UUID fileId) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java deleted file mode 100644 index 48bf0ee1f..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UpdateUserStatusRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sprint.mission.discodeit.dto.userstatus; - -import java.time.Instant; -import java.util.UUID; - -public record UpdateUserStatusRequest(UUID id, Instant lastActiveAt) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 75634431b..e3a2fd6e6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -8,13 +8,13 @@ import java.util.UUID; public interface MessageService { - Message create(CreateMessageRequest request); + Message create(UUID writerID, CreateMessageRequest request); List findAllByChannelId(UUID channelID); List getAllMessage(); - Message updateMessageContent(UpdateMessageRequest request); + Message updateMessageContent(UUID writerID, UpdateMessageRequest request); void deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 23535ceb0..234ee2090 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -16,7 +16,7 @@ public interface UserService { List findAll(); - User update(UpdateUserRequest request); + User update(UUID userId, UpdateUserRequest request); UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index 8bc2466af..9330377bf 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -2,10 +2,8 @@ import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; -import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface UserStatusService { @@ -17,9 +15,7 @@ public interface UserStatusService { List findAll(); - UserStatus update(UpdateUserStatusRequest request); - - UserStatus updateByUserId(UUID userId, UpdateUserStatusRequest request); + UserStatus updateByUserId(UUID userId); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index a2bede716..558c1aa46 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -1,10 +1,9 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.login.LoginRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; @@ -13,6 +12,7 @@ import org.springframework.stereotype.Service; import java.time.Instant; +import java.util.UUID; @Service @RequiredArgsConstructor @@ -21,18 +21,14 @@ public class BasicAuthService { private final UserStatusService userStatusService; - public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 + @UpdateUserStatus + public UserDTO login(UUID userId, LoginRequest request) { // 요청으로 name과 password가 들어온 상황 User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } - // 로그인을 하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(findUser.getId()); - UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); - userStatusService.update(updateRequest); - return UserDTO.fromDomain(findUser); // 비밀번호를 보여주지 않기 위해서 DTO 사용 } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index c041915ab..ff4f602f8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,10 +1,10 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; -import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; @@ -106,17 +106,12 @@ public ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId) { return ChannelDTO.PrivateChannelDTO.fromDomain(findChannel, latestMessageTime); } + @UpdateUserStatus @Override public List findAllPrivate(UUID userId) { // 통일성을 위해 findAllByUserId보다는 findAllPrivate으로 하였습니다. // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 validUser(userId); - // User가 채널을 찾으면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(userId); - UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); - userStatusService.update(updateRequest); - - // Private 채널 내에서 userId가 같은 회원을 joinMembers 리스트에 갖고 있는 채널만 선택한다. List allChannels = channelRepository.findAll(); return allChannels.stream() @@ -136,11 +131,6 @@ public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유 validChannel(request.channelId()); validUser(request.newUserID()); - // User가 채널에 참여하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.newUserID()); - UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); - userStatusService.update(updateRequest); - PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); updateChannel.update(request.name(), request.description(), request.newUserID()); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 91f46b104..cbad380e6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,11 +1,11 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; -import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -21,7 +21,6 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -32,21 +31,17 @@ public class BasicMessageService implements MessageService { private final BinaryContentRepository binaryContentRepository; private final UserStatusService userStatusService; + @UpdateUserStatus @Override - public Message create(CreateMessageRequest request) { + public Message create(UUID writerID, CreateMessageRequest request) { if (request.content().isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } // 작성자와 채널에 대한 검증 - validUser(request.writerID()); + validUser(writerID); validChannel(request.channelID()); - // User가 메시지를 만들면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.writerID()); - UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); - userStatusService.update(updateRequest); - // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 if (request.attachmentsID() != null) { for (UUID attachmentID : request.attachmentsID()) { @@ -57,8 +52,7 @@ public Message create(CreateMessageRequest request) { } } - - Message message = new Message(request.content(), request.writerID(), request.channelID(), request.attachmentsID()); + Message message = new Message(request.content(), writerID, request.channelID(), request.attachmentsID()); messageRepository.save(message); return message; } @@ -75,24 +69,20 @@ public List getAllMessage() { return messageRepository.findAll(); } + @UpdateUserStatus @Override - public Message updateMessageContent(UpdateMessageRequest request) { + public Message updateMessageContent(UUID writerID, UpdateMessageRequest request) { validMessage(request.messageID()); - validUser(request.writerID()); + validUser(writerID); Message message = messageRepository.findById(request.messageID()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); // 메시지 수정은 작성자만이 할 수 있다. - if (!message.getWriterID().equals(request.writerID())) { + if (!message.getWriterID().equals(writerID)) { throw new ServiceException(ErrorCode.MESSAGE_EDIT_NOT_ALLOWED); } - // User가 메시지를 수정하면 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.writerID()); - UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); - userStatusService.update(updateRequest); - message.update(request.newContent(), request.newAttachment()); return messageRepository.save(message); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 458f10bf9..f37ce7df2 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,10 +1,10 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.user.*; -import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -12,7 +12,6 @@ import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; -import com.sprint.mission.discodeit.util.type.BinaryContentType; import com.sprint.mission.discodeit.util.type.OnlineStatusType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,7 +19,6 @@ import java.time.Instant; import java.util.List; -import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -83,9 +81,10 @@ public List findAll() { .collect(Collectors.toList()); } + @UpdateUserStatus @Override - public User update(UpdateUserRequest request) { - User updateUser = userRepository.findById(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + public User update(UUID userId, UpdateUserRequest request) { + User updateUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); updateUser.update(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. @@ -94,11 +93,6 @@ public User update(UpdateUserRequest request) { updateUser.setProfileImageId(newBinaryContent.getId()); } - // User가 회원 정보를 UserStatus 업데이트하기 - UserStatus userStatus = userStatusService.findByUserId(request.userId()); - UpdateUserStatusRequest updateRequest = new UpdateUserStatusRequest(userStatus.getId(), Instant.now()); - userStatusService.update(updateRequest); - userRepository.save(updateUser); return updateUser; } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index f24252e47..ca4525c47 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; -import com.sprint.mission.discodeit.dto.userstatus.UpdateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; @@ -11,6 +10,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.Instant; import java.util.List; import java.util.UUID; @@ -56,20 +56,11 @@ public List findAll() { } @Override - public UserStatus update(UpdateUserStatusRequest request) { - UserStatus findUserStatus = userStatusRepository.findById(request.id()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - - findUserStatus.update(request.lastActiveAt()); - userStatusRepository.save(findUserStatus); - return findUserStatus; - } - - @Override - public UserStatus updateByUserId(UUID userId, UpdateUserStatusRequest request) { + public UserStatus updateByUserId(UUID userId) { validUser(userId); UserStatus userStatus = userStatusRepository.findByUserId(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - userStatus.update(request.lastActiveAt()); + userStatus.update(Instant.now()); userStatusRepository.save(userStatus); return userStatus; } From bb5fd6b883f4dd6e0e06aac16f92212ea61cb348 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 20 Feb 2025 20:26:28 +0900 Subject: [PATCH 069/115] Refactor --- result/binarycontent.ser | Bin 15321 -> 15321 bytes result/channels.ser | Bin 0 -> 82 bytes result/messages.ser | Bin 0 -> 82 bytes result/readstatus.ser | Bin 0 -> 82 bytes result/users.ser | Bin 528 -> 667 bytes result/userstatus.ser | Bin 635 -> 887 bytes .../discodeit/aspect/ReadStatusAspect.java | 26 ++++ .../discodeit/aspect/UpdateReadStatus.java | 11 ++ .../controller/BinaryContentController.java | 11 +- .../controller/ChannelController.java | 18 +-- .../controller/MessageController.java | 46 ++++++- .../controller/ReadStatusController.java | 22 ++- .../discodeit/controller/UserController.java | 25 ++-- .../sprint/mission/discodeit/domain/User.java | 10 +- ...equest.java => UpdatePasswordRequest.java} | 2 +- .../dto/user/UpdateProfileRequest.java | 6 + .../discodeit/exception/ErrorCode.java | 1 + .../repository/BinaryContentRepository.java | 2 + .../repository/ReadStatusRepository.java | 6 +- .../file/FileBinaryContentRepository.java | 11 ++ .../file/FileReadStatusRepository.java | 27 +++- .../jcf/JCFBinaryContentRepository.java | 11 ++ .../jcf/JCFReadStatusRepository.java | 23 +++- .../service/BinaryContentService.java | 3 +- .../discodeit/service/MessageService.java | 2 +- .../discodeit/service/ReadStatusService.java | 2 +- .../discodeit/service/UserService.java | 4 +- .../basic/BasicBinaryContentService.java | 9 +- .../service/basic/BasicChannelService.java | 4 +- .../service/basic/BasicMessageService.java | 7 +- .../service/basic/BasicReadStatusService.java | 19 ++- .../service/basic/BasicUserService.java | 18 ++- .../mission/discodeit/util/FileIOUtil.java | 14 -- .../mission/discodeit/ChannelServiceTest.java | 129 ------------------ .../mission/discodeit/UserServiceTest.java | 125 ----------------- .../mission/discodeit/UserStatusTest.java | 61 --------- 36 files changed, 260 insertions(+), 395 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/ReadStatusAspect.java create mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java rename src/main/java/com/sprint/mission/discodeit/dto/user/{UpdateUserRequest.java => UpdatePasswordRequest.java} (61%) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java delete mode 100644 src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java delete mode 100644 src/test/java/com/sprint/mission/discodeit/UserServiceTest.java delete mode 100644 src/test/java/com/sprint/mission/discodeit/UserStatusTest.java diff --git a/result/binarycontent.ser b/result/binarycontent.ser index d5588b7bda454f997e068c82802ee4afa2217429..37af70e210578ebc91cb14d61b1287a35220fc27 100644 GIT binary patch delta 78 zcmV-U0I~nsciDH4jSzsY$t+BiqB^Nvb=EWNMX|A+?K&>^C^4_DNO*JrE;%-4Ic7FE kFfC&_Wiu@_Gd5-|VqrEnEo3uhH8MD2W?^M9IFq z`D$mwn+<#4bk8ke;0j4CE-^GRHc?b8Vc<0|G|&Zcbd3#-4U0j_nPyG4T2eTtr}F4K zX*v7n*=qIj=rWYx{t?_LxW?GX&`1}EiE|Cec delta 134 zcmbQuI)PV7dU1u2D!LWVj9<`M?Z zS34Wt&Te_rJ-38`$1k)3(J6KhrG%DB^1I#JYMu7M$sH`p0wy`jd6^i1Abs1z=~BnLJ1RiN2%$-RcN6-# zYzA104_&GrD0g-R)cTfs^ZU);*`I9r<->F2zbjO9U11RK)wvoR%n^-|{_|X-v0DEu ym&;dj1=tP=G&_J&J`+A*wflRGD&sZl1Vm5VD6c;koF)&S>l$DgsTXX)_Ef>}D IROgZk0A=kKivR!s diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/ReadStatusAspect.java b/src/main/java/com/sprint/mission/discodeit/aspect/ReadStatusAspect.java new file mode 100644 index 000000000..c97ce188c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/aspect/ReadStatusAspect.java @@ -0,0 +1,26 @@ +package com.sprint.mission.discodeit.aspect; + +import com.sprint.mission.discodeit.service.ReadStatusService; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@Aspect +@Component +@RequiredArgsConstructor +public class ReadStatusAspect { + private final ReadStatusService readStatusService; + + @Before("@annotation(UpdateReadStatus)") + public void updateReadStatus(JoinPoint joinPoint) { + Object[] args = joinPoint.getArgs(); + + if (args.length > 0 && args[0] instanceof UUID channelId) { + readStatusService.updateByChannelId(channelId); + } + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java b/src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java new file mode 100644 index 000000000..aaa65b1d7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.aspect; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UpdateReadStatus { +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 8257fa6c7..686660b61 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -8,14 +8,15 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; +import java.util.List; @RestController -@RequestMapping("/files") +@RequestMapping("/api/binaryContents") @RequiredArgsConstructor public class BinaryContentController { private final BinaryContentService binaryContentService; - @PostMapping("/upload") + @PostMapping public ResponseEntity uploadFile(@ModelAttribute SaveFileRequest request) { try { BinaryContent binaryContent = binaryContentService.saveFile(request); @@ -24,4 +25,10 @@ public ResponseEntity uploadFile(@ModelAttribute SaveFileRequest throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); } } + + @GetMapping + public ResponseEntity> getFiles() { + List binaryContents = binaryContentService.findAll(); + return ResponseEntity.ok(binaryContents); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 60ce3e8f4..d60025752 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -12,48 +12,48 @@ import java.util.UUID; @RestController -@RequestMapping("/channel") +@RequestMapping("/api") @RequiredArgsConstructor public class ChannelController { private final ChannelService channelService; - @RequestMapping(value = "/create/public", method = RequestMethod.POST) + @PostMapping( "/channels/public") public ResponseEntity createPublicChannel(@RequestBody CreateChannel.PublicRequest request) { Channel publicChannel = channelService.createPublicChannel(request); return ResponseEntity.ok(publicChannel); } - @RequestMapping(value = "/create/private", method = RequestMethod.POST) + @PostMapping("/channels/private") public ResponseEntity createPrivateChannel(@RequestBody CreateChannel.PrivateRequest request) { Channel privateChannel = channelService.createPrivateChannel(request); return ResponseEntity.ok(privateChannel); } - @RequestMapping(value = "/get/public", method = RequestMethod.GET) + @GetMapping("/channels/public") public ResponseEntity getPublicChannel(@RequestParam("id") UUID uuid) { ChannelDTO.PublicChannelDTO publicChannel = channelService.findPublicChannel(uuid); return ResponseEntity.ok(publicChannel); } - @RequestMapping(value = "/get/private", method = RequestMethod.GET) + @GetMapping("/channels/private") public ResponseEntity getPrivateChannel(@RequestParam("id") UUID uuid) { ChannelDTO.PrivateChannelDTO privateChannel = channelService.findPrivateChannel(uuid); return ResponseEntity.ok(privateChannel); } - @RequestMapping(value = "getAll/private", method = RequestMethod.GET) + @GetMapping("/channels") public ResponseEntity> getAllPrivateChannel(@RequestParam("id") UUID userId) { List allPrivate = channelService.findAllPrivate(userId); return ResponseEntity.ok(allPrivate); } - @RequestMapping(value = "getAll", method = RequestMethod.GET) + @GetMapping("/channels/all") public ResponseEntity> getAllPrivateChannel() { List allChannel = channelService.findAll(); return ResponseEntity.ok(allChannel); } - @RequestMapping(value = "delete/private", method = RequestMethod.DELETE) + @DeleteMapping("/channels/private") public ResponseEntity deletePrivateChannel(@RequestParam("id") UUID uuid) { Channel removeChannel = channelService.deletePrivate(uuid); return ResponseEntity.ok( @@ -62,7 +62,7 @@ public ResponseEntity deletePrivateChannel(@RequestParam("id") UUID uuid ); } - @RequestMapping(value = "delete/public", method = RequestMethod.DELETE) + @DeleteMapping("/channels/public") public ResponseEntity deletePublicChannel(@RequestParam("id") UUID uuid) { Channel removeChannel = channelService.deletePublic(uuid); return ResponseEntity.ok( diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index f088da5cc..1bec1fd73 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -1,13 +1,53 @@ package com.sprint.mission.discodeit.controller; +import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; +import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.service.MessageService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; @RestController -@RequestMapping("/messages") +@RequestMapping("/api/messages") @RequiredArgsConstructor public class MessageController { private final MessageService messageService; + + @PostMapping + public ResponseEntity createMessage(@RequestParam("id") UUID writerId, @RequestBody CreateMessageRequest request) { + Message message = messageService.create(writerId, request); + return ResponseEntity.ok(message); + } + + @GetMapping + public ResponseEntity> getAll() { + List messages = messageService.getAllMessage(); + return ResponseEntity.ok(messages); + } + + @GetMapping("/channel") + public ResponseEntity> getAllByChannelId(@RequestParam("id") UUID channelId) { + List messages = messageService.findAllByChannelId(channelId); + return ResponseEntity.ok(messages); + } + + @PutMapping // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 + public ResponseEntity update(@RequestParam("id") UUID userId, @RequestBody UpdateMessageRequest request) { + Message message = messageService.updateMessageContent(userId, request); + return ResponseEntity.ok(message); + } + + @DeleteMapping + public ResponseEntity delete(@RequestParam("id") UUID messageId) { + Message message = messageService.deleteMessage(messageId); + return ResponseEntity.ok( + "메시지 ID: " + message.getId() + + " 삭제가 완료되었습니다." + ); + + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index 6301eb920..3f6ed792d 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -1,32 +1,30 @@ package com.sprint.mission.discodeit.controller; import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.service.ReadStatusService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; @RestController -@RequestMapping("/readstatus") +@RequestMapping("/api/readStatuses") @RequiredArgsConstructor public class ReadStatusController { private final ReadStatusService readStatusService; - @RequestMapping(value = "/get", method = RequestMethod.GET) - public ResponseEntity getStatus(@RequestParam("id") UUID uuid) { - ReadStatus readStatus = readStatusService.find(uuid); - return ResponseEntity.ok(readStatus); - } - - @RequestMapping(value = "/get/userid", method = RequestMethod.GET) + @GetMapping public ResponseEntity> getStatusesByUserId(@RequestParam("id") UUID userID) { List allByUserId = readStatusService.findAllByUserId(userID); return ResponseEntity.ok(allByUserId); } + + @PostMapping + public ResponseEntity createReadStatus(@RequestBody CreateReadStatusRequest request) { + ReadStatus readStatus = readStatusService.create(request); + return ResponseEntity.ok(readStatus); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index ec22d9e0b..c53113f3e 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -2,7 +2,8 @@ import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; +import com.sprint.mission.discodeit.dto.user.UpdatePasswordRequest; +import com.sprint.mission.discodeit.dto.user.UpdateProfileRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.service.UserService; import lombok.RequiredArgsConstructor; @@ -13,36 +14,42 @@ import java.util.UUID; @RestController -@RequestMapping("/user") +@RequestMapping("/api") @RequiredArgsConstructor public class UserController { private final UserService userService; - @RequestMapping(value = "/create", method = RequestMethod.POST) + @PostMapping("/users") public ResponseEntity createUser(@RequestBody CreateUserRequest request) { UserDTO userDTO = userService.create(request); return ResponseEntity.ok(userDTO); } - @RequestMapping(value = "/get", method = RequestMethod.GET) + @GetMapping("/user") public ResponseEntity getUser(@RequestParam("id") UUID userId) { UserDTO userDTO = userService.find(userId); return ResponseEntity.ok(userDTO); } - @RequestMapping(value = "/getAll", method = RequestMethod.GET) + @GetMapping("/users") public ResponseEntity> getAllUser() { List all = userService.findAll(); return ResponseEntity.ok(all); } - @RequestMapping(value = "/update", method = RequestMethod.PUT) - public ResponseEntity updateUser(@RequestParam("id") UUID userId, @RequestBody UpdateUserRequest request) { - User update = userService.update(userId, request); + @PutMapping("/users/password") + public ResponseEntity updatePassword(@RequestParam("id") UUID userId, @RequestBody UpdatePasswordRequest request) { + User update = userService.updatePassword(userId, request); return ResponseEntity.ok(update); } - @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @PutMapping( "/users/profile") + public ResponseEntity updateProfile(@RequestParam("id") UUID userId, @RequestBody UpdateProfileRequest request) { + User update = userService.updateProfile(userId, request); + return ResponseEntity.ok(update); + } + + @DeleteMapping( "/users") public ResponseEntity deleteUser(@RequestParam("id") UUID id) { UserDTO delete = userService.delete(id); return ResponseEntity.ok( diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index f96a6ed07..b6a78a099 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -42,7 +42,7 @@ public User(String name, String phone, String password, UUID profileImageId, UUI this.userStatusId = userStatusId; } - public void update(String oldPassword, String newPassword) { + public void updatePassword(String oldPassword, String newPassword) { if (!this.password.equals(oldPassword) || oldPassword.equals(newPassword)) { throw new ServiceException(ErrorCode.INVALID_PASSWORD); } @@ -50,6 +50,14 @@ public void update(String oldPassword, String newPassword) { this.updatedAt = Instant.now(); } + public void updateProfile(UUID profileImageId, UUID newProfileImageId) { + if (!this.profileImageId.equals(profileImageId) || profileImageId.equals(newProfileImageId)) { + throw new ServiceException(ErrorCode.INVALID_PROFILE); + } + this.profileImageId = profileImageId; + this.updatedAt = Instant.now(); + } + @Override public boolean equals(Object o) { // User 객체는 UUID, name, phone 3개의 필드가 동일하면 같은 유저라고 판단한다. if (o == null || getClass() != o.getClass()) return false; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java similarity index 61% rename from src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java rename to src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java index 0f443f6d3..c00297020 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java @@ -4,5 +4,5 @@ import java.util.UUID; -public record UpdateUserRequest(String oldPassword ,String newPassword, UUID fileId) { +public record UpdatePasswordRequest(String oldPassword ,String newPassword) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java new file mode 100644 index 000000000..c31a579dc --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java @@ -0,0 +1,6 @@ +package com.sprint.mission.discodeit.dto.user; + +import java.util.UUID; + +public record UpdateProfileRequest(UUID profileId , UUID newProfileId) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index b48054f4e..e72bef992 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -26,6 +26,7 @@ public enum ErrorCode { INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), INVALID_WRITER("작성자가 올바르지 않습니다"), INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), + INVALID_PROFILE("기존 프로필과 동일한 프로필입니다"), MESSAGE_EDIT_NOT_ALLOWED("메시지 수정은 작성자 본인만 가능합니다"), PASSWORD_EDIT_NOT_ALLOWED("이전 비밀번호와 일치하지 않습니다"), diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 2acd41b1e..bbdf1d044 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -13,5 +13,7 @@ public interface BinaryContentRepository { List findAll(); + List findAllIdIn(List uuidList); + void deleteById(UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 07c735398..ed65b81e0 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -10,11 +10,15 @@ public interface ReadStatusRepository { ReadStatus save(ReadStatus readStatus); + List saveAll(List readStatuses); + Optional findById(UUID id); - Optional findByChannelId(UUID channelID); + List findAllByChannelId(UUID channelID); List findAllByUserId(UUID userID); void delete(ReadStatus readStatus); + + void deleteAll(List readStatuses); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java index c7180cae9..032de80eb 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -54,6 +54,17 @@ public List findAll() { return repository.values().stream().toList(); } + @Override + public List findAllIdIn(List uuidList) { + if (uuidList == null || uuidList.isEmpty()) { + return Collections.emptyList(); + } + return uuidList.stream() + .map(repository::get) // UUID에 해당하는 BinaryContent 찾기 + .filter(Objects::nonNull) // 존재하는 항목만 필터링 + .toList(); + } + @Override public void deleteById(UUID uuid) { repository.remove(uuid); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java index 2735f0faa..eb716daf4 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java @@ -3,8 +3,6 @@ import com.sprint.mission.discodeit.domain.ReadStatus; import com.sprint.mission.discodeit.repository.ReadStatusRepository; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -50,12 +48,33 @@ public Optional findById(UUID id) { } @Override - public Optional findByChannelId(UUID channelID) { + public List findAllByChannelId(UUID channelID) { return readStatusMap.values().stream() .filter(readStatus -> readStatus.getChannelId().equals(channelID)) - .findFirst(); + .toList(); + } + + @Override + public List saveAll(List readStatuses) { + // 각 ReadStatus를 readStatusMap에 추가 + readStatuses.forEach(readStatus -> readStatusMap.put(readStatus.getId(), readStatus)); + + // 파일에 모든 ReadStatus를 저장 + saveToFile(readStatusMap, filePath); + + return readStatuses; } + @Override + public void deleteAll(List readStatuses) { + // 각 ReadStatus를 삭제 + readStatuses.forEach(readStatus -> readStatusMap.remove(readStatus.getId())); + + // 변경된 내용을 파일에 반영 + saveToFile(readStatusMap, filePath); + } + + @Override public List findAllByUserId(UUID userID) { return readStatusMap.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java index 81ddffcab..4dd2956ae 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java @@ -34,6 +34,17 @@ public List findAll() { return repository.values().stream().toList(); } + @Override + public List findAllIdIn(List uuidList) { + if (uuidList == null || uuidList.isEmpty()) { + return Collections.emptyList(); + } + return uuidList.stream() + .map(repository::get) // UUID에 해당하는 BinaryContent 찾기 + .filter(Objects::nonNull) // 존재하는 항목만 필터링 + .toList(); + } + @Override public void deleteById(UUID uuid) { repository.remove(uuid); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java index a103e6b09..cca422bdd 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java @@ -8,6 +8,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; + @Profile("jcf") @Repository public class JCFReadStatusRepository implements ReadStatusRepository { @@ -23,6 +25,16 @@ public ReadStatus save(ReadStatus readStatus) { return readStatus; } + @Override + public List saveAll(List readStatuses) { + // 각 ReadStatus를 repository에 추가 + readStatuses.forEach(readStatus -> repository.put(readStatus.getId(), readStatus)); + + // 파일에 저장하는 부분은 이 클래스에서 처리하지 않음 + // 모든 ReadStatus를 repository에 추가한 후, 리스트 그대로 반환 + return readStatuses; + } + @Override public Optional findById(UUID id) { return repository.values().stream() @@ -31,10 +43,17 @@ public Optional findById(UUID id) { } @Override - public Optional findByChannelId(UUID channelID) { + public void deleteAll(List readStatuses) { + // 각 ReadStatus를 삭제 + readStatuses.forEach(readStatus -> repository.remove(readStatus.getId())); + } + + + @Override + public List findAllByChannelId(UUID channelID) { return repository.values().stream() .filter(readStatus -> readStatus.getChannelId().equals(channelID)) - .findFirst(); + .toList(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index bd99b6156..cb56cdca6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; -import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; @@ -16,5 +15,7 @@ public interface BinaryContentService { List findAllByIdIn(List uuidList); + List findAll(); + void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index e3a2fd6e6..35015e848 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -16,5 +16,5 @@ public interface MessageService { Message updateMessageContent(UUID writerID, UpdateMessageRequest request); - void deleteMessage(UUID messageID); + Message deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index 96ca46620..50c264df5 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -16,7 +16,7 @@ public interface ReadStatusService { List findAllByUserId(UUID userID); - ReadStatus update(UpdateReadStatusRequest request); + List updateByChannelId(UUID channelId); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 234ee2090..346a54643 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -16,7 +16,9 @@ public interface UserService { List findAll(); - User update(UUID userId, UpdateUserRequest request); + User updatePassword(UUID userId, UpdatePasswordRequest request); + + User updateProfile(UUID userId, UpdateProfileRequest request); UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index a13ca3e4c..05661606a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -40,9 +40,12 @@ public Optional find(UUID id) { @Override public List findAllByIdIn(List uuidList) { - return binaryContentRepository.findAll().stream() - .filter(bi -> uuidList.contains(bi.getId())) - .collect(Collectors.toList()); + return binaryContentRepository.findAllIdIn(uuidList); + } + + @Override + public List findAll() { + return binaryContentRepository.findAll(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index ff4f602f8..e3a9a7138 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -152,8 +152,8 @@ public Channel deletePrivate(UUID channelId) { } // 채널에 포함된 ReadStatus 삭제하기 - ReadStatus readStatuses = readStatusRepository.findByChannelId(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - readStatusRepository.delete(readStatuses); + List readStatuses = readStatusRepository.findAllByChannelId(channelId); + readStatusRepository.deleteAll(readStatuses); channelRepository.delete(removeChannel); return removeChannel; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index cbad380e6..7ebfa2f24 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.aspect.UpdateReadStatus; import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Message; @@ -57,6 +58,7 @@ public Message create(UUID writerID, CreateMessageRequest request) { return message; } + @UpdateReadStatus @Override public List findAllByChannelId(UUID channelID) { validChannel(channelID); @@ -90,7 +92,7 @@ public Message updateMessageContent(UUID writerID, UpdateMessageRequest request) @Override - public void deleteMessage(UUID messageID) { + public Message deleteMessage(UUID messageID) { Message deleteMessage = messageRepository.findById(messageID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); List attachmentsID = deleteMessage.getAttachmentsID(); @@ -101,7 +103,8 @@ public void deleteMessage(UUID messageID) { }); } - messageRepository.delete(deleteMessage); + Message delete = messageRepository.delete(deleteMessage); + return delete; } private void validUser(UUID userId) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 699d1521e..391b924dc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -57,13 +57,22 @@ public List findAllByUserId(UUID userID) { User가 채널에서 메시지를 읽은 시간을 업데이트 */ @Override - public ReadStatus update(UpdateReadStatusRequest request) { - ReadStatus readStatus = readStatusRepository.findById(request.readStatusID()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - readStatus.updateLastReadTime(readStatus.getLastReadAt()); - readStatusRepository.save(readStatus); - return readStatus; + public List updateByChannelId(UUID channelId) { + validChannel(channelId); + + // 채널에 해당하는 ReadStatus 목록을 가져옴 + List readStatuses = readStatusRepository.findAllByChannelId(channelId); + + // 모든 ReadStatus의 'lastReadTime'을 업데이트 + readStatuses.forEach(readStatus -> readStatus.updateLastReadTime(Instant.now())); + + // 모든 수정된 ReadStatus 저장 + readStatusRepository.saveAll(readStatuses); + + return readStatuses; } + @Override public void delete(UUID id) { ReadStatus readStatus = readStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index f37ce7df2..53cd99dca 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -83,20 +83,26 @@ public List findAll() { @UpdateUserStatus @Override - public User update(UUID userId, UpdateUserRequest request) { + public User updatePassword(UUID userId, UpdatePasswordRequest request) { User updateUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + updateUser.updatePassword(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. - updateUser.update(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. + userRepository.save(updateUser); + return updateUser; + } - if (request.fileId() != null) { // 만약 요청에 content가 있다면 프로필을 새로 교체합니다. - BinaryContent newBinaryContent = binaryContentRepository.findById(request.fileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - updateUser.setProfileImageId(newBinaryContent.getId()); - } + @UpdateUserStatus + @Override + public User updateProfile(UUID userId, UpdateProfileRequest request) { + User updateUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + BinaryContent profile = binaryContentRepository.findById(request.profileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + updateUser.updateProfile(request.profileId(), request.newProfileId()); userRepository.save(updateUser); return updateUser; } + @Override public UserDTO delete(UUID id) { User deleteUser = userRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java index 1c0fdd286..d241d5617 100644 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java @@ -47,18 +47,4 @@ public static void convertSerToJson(Path datFilePath, Path jsonFilePath, Cla throw new RuntimeException("❌ JSON 변환 중 오류 발생 (" + jsonFilePath + "): " + e.getMessage(), e); } } - - // 파일 초기화 및 새로 생성 - public static void initializeFiles() { - String[] fileNames = { "users.ser", "messages.ser", "channels.ser", "binarycontent.ser", "userstatus.ser" }; - for (String fileName : fileNames) { - Path filePath = Paths.get("./result/" + fileName); - try { - Files.deleteIfExists(filePath); - Files.createFile(filePath); - } catch (IOException e) { - System.err.println("⚠️ 파일 초기화 중 오류 발생 (" + filePath + "): " + e.getMessage()); - } - } - } } diff --git a/src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java b/src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java deleted file mode 100644 index 663bfa92d..000000000 --- a/src/test/java/com/sprint/mission/discodeit/ChannelServiceTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.domain.*; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; -import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.util.FileIOUtil; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -@SpringBootTest -public class ChannelServiceTest { - @Autowired - private ChannelService channelService; - - @Autowired - private UserService userService; - - private List joinUser; - - private UserDTO testUser1DTO; - private UserDTO testUser2DTO; - private UserDTO testUser3DTO; - private UserDTO testUser4DTO; - - @BeforeEach - void before() { - FileIOUtil.initializeFiles(); - CreateUserRequest request1 = new CreateUserRequest("테스트유저1", "010-1111-1111", "Abcdefg1234!!", null); - CreateUserRequest request2 = new CreateUserRequest("테스트유저2", "010-2222-1111", "Abcdefg1234!!", null); - CreateUserRequest request3 = new CreateUserRequest("테스트유저3", "010-3333-1111", "Abcdefg1234!!", null); - CreateUserRequest request4 = new CreateUserRequest("테스트유저4", "010-4444-1111", "Abcdefg1234!!", null); - testUser1DTO = userService.create(request1); - testUser2DTO = userService.create(request2); - testUser3DTO = userService.create(request3); - testUser4DTO = userService.create(request4); - - } - - @AfterEach - void after() { - FileIOUtil.convertSerToJson(Path.of("./result/users.ser"), Path.of("./json/users.json"), User.class); - FileIOUtil.convertSerToJson(Path.of("./result/channels.ser"), Path.of("./json/channels.json"), Channel.class); - FileIOUtil.convertSerToJson(Path.of("./result/binarycontent.ser"), Path.of("./json/binarycontent.json"), Channel.class); - FileIOUtil.convertSerToJson(Path.of("./result/readstatus.ser"), Path.of("./json/readstatus.json"), Channel.class); - FileIOUtil.convertSerToJson(Path.of("./result/userstatus.ser"), Path.of("./json/userstatus.json"), Channel.class); - FileIOUtil.initializeFiles(); - } - - @DisplayName("Public 채널 테스트하기") - @Test - void createPublicChannel() { - joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); - CreateChannel.PublicRequest request = new CreateChannel.PublicRequest("백엔드 개발자 오픈 채널", "지식 공유를 위해 만든 채널입니다.", ChannelFormat.TEXT, joinUser); - PublicChannel publicChannel = (PublicChannel) channelService.createPublicChannel(request); - - Assertions.assertEquals(request.getName(), publicChannel.getName()); - } - - @DisplayName("Private 채널 테스트하기") - @Test - void createPrivateChannel() { - joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); - CreateChannel.PrivateRequest request = new CreateChannel.PrivateRequest(joinUser, ChannelFormat.TEXT); - Channel privateChannel = channelService.createPrivateChannel(request); - - Assertions.assertNotNull(privateChannel); - } - - @DisplayName("Public 채널 조회하기") - @Test - void findPublicChannel() { - // 채널 만들고 - joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); - CreateChannel.PublicRequest request = new CreateChannel.PublicRequest("프론트앤드 개발자 오픈 채널", "지식 공유를 위해 만든 채널입니다.", ChannelFormat.TEXT, joinUser); - PublicChannel publicChannel = (PublicChannel) channelService.createPublicChannel(request); - - ChannelDTO.PublicChannelDTO publicChannel1 = channelService.findPublicChannel(publicChannel.getId()); - - Assertions.assertEquals(publicChannel.getId(), publicChannel1.getId()); - } - - @DisplayName("Private 채널 만들고 조회하기") - @Test - void findPrivateChannel() { - //채널 만들기 - joinUser = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId(), testUser3DTO.getId(), testUser4DTO.getId())); - CreateChannel.PrivateRequest request = new CreateChannel.PrivateRequest(joinUser, ChannelFormat.TEXT); - Channel privateChannel = channelService.createPrivateChannel(request); - - ChannelDTO.PrivateChannelDTO privateChannel1 = channelService.findPrivateChannel(privateChannel.getId()); - - Assertions.assertEquals(privateChannel.getId(), privateChannel1.getId()); - } - - @DisplayName("특정 회원이 들어간 Private 채널 조회하기") - @Test - void findAllPrivate() { - List joinUser1 = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser2DTO.getId())); - List joinUser2 = new ArrayList<>(Arrays.asList(testUser2DTO.getId(), testUser3DTO.getId())); - List joinUser3 = new ArrayList<>(Arrays.asList(testUser3DTO.getId(), testUser4DTO.getId())); - List joinUser4 = new ArrayList<>(Arrays.asList(testUser1DTO.getId(), testUser4DTO.getId())); - - CreateChannel.PrivateRequest request1 = new CreateChannel.PrivateRequest(joinUser1, ChannelFormat.TEXT); - CreateChannel.PrivateRequest request2 = new CreateChannel.PrivateRequest(joinUser2, ChannelFormat.TEXT); - CreateChannel.PrivateRequest request3 = new CreateChannel.PrivateRequest(joinUser3, ChannelFormat.TEXT); - CreateChannel.PrivateRequest request4 = new CreateChannel.PrivateRequest(joinUser4, ChannelFormat.TEXT); - - Channel privateChannel1 = channelService.createPrivateChannel(request1); - Channel privateChannel2 = channelService.createPrivateChannel(request2); - Channel privateChannel3 = channelService.createPrivateChannel(request3); - Channel privateChannel4 = channelService.createPrivateChannel(request4); - - List user1PrivateChannels = channelService.findAllPrivate(testUser1DTO.getId()); - Assertions.assertEquals(user1PrivateChannels.size(), 2); // testUser1DTO 회원이 들어가 있는 채널은 2개이다. - } - -} diff --git a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java deleted file mode 100644 index 08d2c4148..000000000 --- a/src/test/java/com/sprint/mission/discodeit/UserServiceTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.UserStatusService; -import com.sprint.mission.discodeit.util.FileIOUtil; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.Optional; - -@SpringBootTest -public class UserServiceTest { - @Autowired - private UserService userService; - - @Autowired - private UserStatusService userStatusService; - - private UserDTO testUser; - - @BeforeEach - void before() { - FileIOUtil.initializeFiles(); - CreateUserRequest request = new CreateUserRequest("테스트유저", "010-1234-1234", "Abcdefghi1234!", null); - testUser = userService.create(request); - } - - @AfterEach - void after() { - FileIOUtil.initializeFiles(); - } - - @DisplayName("사용자 생성 테스트") - @Test - void createUser() { - CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); - UserDTO user = userService.create(request); - Assertions.assertEquals("홍길동", user.getName()); - } - - @DisplayName("사용자 생성 시 전화번호 형식을 지켜야 한다.") - @Test - void validPhone() { - CreateUserRequest request = new CreateUserRequest("홍길동", "010-1231233-9191", "Aldnweasdf1234!", null); - - ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { - userService.create(request); - }); - - Assertions.assertEquals(ErrorCode.INVALID_PHONE.getDescription(), exception.getMessage()); - } - - @DisplayName("사용자 생성 시 비밀번호 형식을 지켜야 한다.") - @Test - void validPassword() { - CreateUserRequest request = new CreateUserRequest("홍길동", "010-1234-9191", "1234", null); - - ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { - userService.create(request); - }); - - Assertions.assertEquals(ErrorCode.INVALID_PASSWORD.getDescription(), exception.getMessage()); - } - - - @DisplayName("동일한 사용자의 이름이 존재하면 안 된다") - @Test - void duplicateUserName() { - CreateUserRequest request1 = new CreateUserRequest("홍길동", "010-1234-9191", "Aldnweasdf1234!", null); - CreateUserRequest request2 = new CreateUserRequest("홍길동", "010-3211-1211", "Aldnweasdf1234!", null); - - userService.create(request1); - ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { - userService.create(request2); - }); - - Assertions.assertEquals(ErrorCode.DUPLICATE_NAME.getDescription(), exception.getMessage()); - } - - @DisplayName("동일한 핸드폰 번호가 존재하면 안 된다") - @Test - void duplicatePhone() { - CreateUserRequest request1 = new CreateUserRequest("홍길동", "010-1234-1234", "Aldnweasdf1234!", null); - CreateUserRequest request2 = new CreateUserRequest("김영희", "010-1234-1234", "Aldnweasdf1234!", null); - - userService.create(request1); - ServiceException exception = Assertions.assertThrows(ServiceException.class, () -> { - userService.create(request2); - }); - - Assertions.assertEquals(ErrorCode.DUPLICATE_PHONE.getDescription(), exception.getMessage()); - } - - @DisplayName("회원 id로 해당하는 회원 찾기") - @Test - void findUser() { - UserDTO findUser = userService.find(testUser.getId()); - - Assertions.assertEquals(findUser.getName(), testUser.getName()); - } - - @DisplayName("회원 정보 업데이트 하기") - @Test - void updateUser() { - UpdateUserRequest request = new UpdateUserRequest(testUser.getId(), "ChangePassword!!", null); - User updateUser = userService.update(request); - Assertions.assertEquals(updateUser.getPassword(), request.password()); - } - - @DisplayName("사용자를 삭제하면 User Status도 같이 삭제되어야 한다.") - @Test - void deleteUser() { - userService.delete(testUser.getId()); - Optional findUserStatus = userStatusService.findByUserId(testUser.getId()); - Assertions.assertEquals(findUserStatus, Optional.empty()); - } -} diff --git a/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java b/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java deleted file mode 100644 index 6bc6e8efa..000000000 --- a/src/test/java/com/sprint/mission/discodeit/UserStatusTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.UserStatusService; -import com.sprint.mission.discodeit.util.FileIOUtil; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.nio.file.Path; - -@SpringBootTest -public class UserStatusTest { - @Autowired - private UserService userService; - - @Autowired - private UserStatusService userStatusService; - - private UserDTO testUser; - - @BeforeEach - void before() { - FileIOUtil.initializeFiles(); - CreateUserRequest request = new CreateUserRequest("테스트유저", "010-1234-1234", "Abcdefghi1234!", null); - } - - @AfterEach - void after() { - FileIOUtil.convertSerToJson(Path.of("./result/users.ser"), Path.of("./json/users.json"), User.class); - FileIOUtil.convertSerToJson(Path.of("./result/userstatus.ser"), Path.of("./json/userstatus.json"), UserStatus.class); - } - - @DisplayName("사용자 생성하면 UserStatus가 같이 생성되는지 테스트") - @Test - void validUserStatus() { - CreateUserRequest request = new CreateUserRequest("홍길동", "010-2189-9191", "Aldnweasdf1234!", null); - UserDTO user = userService.create(request); // 유저 생성과 동시에 UserStatus가 생성된다. - UserStatus findUserStatus = userStatusService.findByUserId(user.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - - Assertions.assertNotNull(findUserStatus); - } - - - @DisplayName("사용자 업데이트 후 UserStatus도 변경되는지 테스트") - @Test - void updateUserStatus() { - UserStatus beforeUserstatus = userStatusService.findByUserId(testUser.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - UpdateUserRequest request = new UpdateUserRequest(testUser.getId(), "TestPassword1234!!", null); - User update = userService.update(request); - UserStatus afterUserStatus = userStatusService.findByUserId(testUser.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - Assertions.assertNotEquals(beforeUserstatus.getLastActiveAt(), afterUserStatus.getLastActiveAt()); - } -} From 74a3c54e1524833234cd211f136369a49e76475a Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 21 Feb 2025 15:21:19 +0900 Subject: [PATCH 070/115] Complete requirements --- result/binarycontent.ser | Bin 15321 -> 124317 bytes result/channels.ser | Bin 82 -> 82 bytes result/messages.ser | Bin 82 -> 82 bytes result/readstatus.ser | Bin 82 -> 82 bytes result/users.ser | Bin 667 -> 1034 bytes result/userstatus.ser | Bin 887 -> 822 bytes .../controller/BinaryContentController.java | 23 +++- .../discodeit/controller/UserController.java | 7 +- .../controller/UserStatusController.java | 19 ++-- .../discodeit/domain/BinaryContent.java | 13 +-- .../sprint/mission/discodeit/domain/User.java | 25 ++--- .../mission/discodeit/domain/UserStatus.java | 10 +- .../dto/binarycontent/SaveFileRequest.java | 7 -- .../discodeit/dto/user/CreateUserRequest.java | 15 ++- .../dto/user/UpdatePasswordRequest.java | 4 - .../mission/discodeit/dto/user/UserDTO.java | 4 +- .../discodeit/exception/ErrorCode.java | 4 +- .../discodeit/repository/UserRepository.java | 2 +- .../repository/UserStatusRepository.java | 2 + .../file/FileBinaryContentRepository.java | 2 - .../repository/file/FileUserRepository.java | 4 +- .../file/FileUserStatusRepository.java | 8 ++ .../repository/jcf/JCFUserRepository.java | 4 +- .../jcf/JCFUserStatusRepository.java | 8 ++ .../service/BinaryContentService.java | 7 +- .../basic/BasicBinaryContentService.java | 21 ++-- .../service/basic/BasicUserService.java | 9 +- .../service/basic/BasicUserStatusService.java | 4 - .../util/type/BinaryContentType.java | 5 - src/main/resources/static/script.js | 105 ++++++++++++++++++ src/main/resources/static/styles.css | 80 +++++++++++++ src/main/resources/static/user-list.html | 18 +++ 32 files changed, 313 insertions(+), 97 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java create mode 100644 src/main/resources/static/script.js create mode 100644 src/main/resources/static/styles.css create mode 100644 src/main/resources/static/user-list.html diff --git a/result/binarycontent.ser b/result/binarycontent.ser index 37af70e210578ebc91cb14d61b1287a35220fc27..82871c43c2bd633ca1efca5d21f9a150815ca616 100644 GIT binary patch delta 110157 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

rA+@cJb(F7!NBIWMd$pd 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%0Dj^BnyzR ztXIkF^|>9-B1Pn`8yO~9=whOn-quG$=5~x{KzjV3U?#aGl{yfka+I8)uBpcNrm;nM< zOGrw#*8l%U-P<$BR`#~8Za?H=Pmm-e5JPvd(2SR5=zx_#msi&!OADl%f*7V6+0K~uI`t9 zxAm>i*YMev`HZYRy5p|%VXKXnMGgz1`;T`{-kDSigE~}wz4d^`B zw;Hsnb^kzJ5^MH8QrLHWB+aIFX;rl}OgC*dLibV(%gDg3>rvs9c3Kf=x}1&UGkVjy z_gyo$C2&YhJSPI$e3|-WMGi@RHQxM0f9~%X_`I3Qa5^O$dul>nie?-k*L~rco;lVWM}yA2T&kHxU}mOTnt_Efj*Wx9O3rsFgzd^`;rd`VHHq_bVe zuITEPbGrFW?V)RN>te%@A3wBAjrRpN!+L4NWfjwTs7fVu$GUAYFNts0Q@zS&d@gx1NC_p<4E(27ssPQ&84GTOhgrW7?!dQ1M za8{0EuzI2AI*ak^i50E~<9(f+r7IZymCNhLcR$;o`x~HP(1UHyQxYZTBxHYfOglPC zcpkjDlK^Pi>3~xWr$b7{;ha^X%CWq|@jC&y4#GVGUFR3j`L3XCX`O7T()PHB2e?x& z89eCJA~mx+LP3H{=MC4Ry+BKMtAXd?y00DP0XkTb2S*~~L7<)Mfy=HHS^m-u1P%!G z$MSPE-@Il+-vH>F`{8_R+oyl#V>F!O*zB8$hI^I_wM7dKq+owR{=>@ygB(_)=xN zjE)U_$672Fx0T~v_e2kvb?H%|`@OYt{^4BcTL68&orbNQ0JJ>~iO_!sI@Bm>3tCiT zBdW?-1u~KAK!$UrE!v552L>bMsTMrYLAYKG$I5fFUDmb>>GVRH5-&uT1Y-x%U0uVX z@i3^19v@EDXS?8PfY8#5dnsrRsHu-Gyr6fSz_(r+>FIiBZR)1&&nk$H|8W-i*Moi> zhUxunIGoBmaZV7yNr8U=d~RSgO43mofylZlm00HuA1jX45DU2p_hwnEMLY1n<@H<# z1~grPK8dI8x-Ht)JkwzeO%np?RHH8R5Za>cv%am`zNc9i`qsami+nx)Cb+a+^Zq=4 zNDoxVx-ZYq&;LJ^|1;_z|+SM0WU%xy&JbZb0d!SF{^x^ha#HVH}ra@S09Gln{<5*dar>HF$ z0tY_Xqwm6^YXX1mt%8$Mh&&WkV5Z!=9PUWx8J;u%_d3r4;iibuxjf%^0q===Vv{gyy*1@ zv3wNE)wde5mipuI{l94X;Fm9N4)jAg{X-mvdYXiyQKw~Shsii5G4vUJ5*HPsh#c;Q zfF>#q!DfE}z&Gj<#!aBFwWF8cC|#Sa$?+gv&i1W7i-)h48kri>?cS^BqpoO64Qecg zJCY1)uavfiDsGD2m~)@?3v_ykCy{ww&_iEzJ0Jr6-fiDg(~UO>`tg34WKs^zpzeo( zS1PtQHscVEs!^0ziYv$W8zD}dGMbdYVzl#L$(essB3#iyX@1EY=IYy=`Kw^P+U@oT z5%<|{-*(F?h{X}`i#EgWa-rw2gE9Gd1wk_dD@KxRyk3-K;fQ}lkhQ&&ez%mCq<73O zwMBQ`@#&*|OJ#%4&kt`-I(|D$AIc3?*UM%Sd0B2~xR@p_nuZlzP27E4%al>bidDG)5X#nB89_8_~B>|E~VB< zb=PVM=``h@zWScra--L6VT9!612DG&eR|!oI6i%k!tF-``ptPAzuz~_KMyusXVH*B z4~Gq$j!-uxidDlYpGkWiv!p^ak1LL!km!FV9;u&!8&t69RM0k(){b_(frGc(fw6|K zbBDcl@Zh=yd+4l*`o^MU#%9qhvZ$^s3VYk%UKjSUw^iB`f!?Sf(>6tgC)l97lpoT#k&czEp z5@M|dFw~;BLT;Rr7d_G59O9p+uKWJfIl5HQfc}*h{Z|dw9?D@*XFD!8b~2QaKwLN? z2oW}sZeYpqnOP!Y%k>=cpDhQt5xswmOxE6KNH*t0I;{ZO*##CHyl-DA3g1(Ii9A(! zke9d5^zo&3ul+r8BGOLBE);yjUh9)ANL|QxC|+0tHds;!Sr{qliytrg%f9XYz$*CE zSvvP^K>z;y{6@CxmWFGH2|rCulnfjDa7dz|OyoE|j7?=jC@O`;jxioPG%SmqL{{J7f zXO19od-waA)-QGQ^l664Xy)ihvWzB!cUc$`X}W^Oa6O5zW>A@EQGqlu z`ec!t=xb#G;=I=r(XCcA_UnH}`qRtP_oox#>^VNVWeDic%;;MJdeI$;wL^7R^{ds2 z2~BB*1oVSh6P}Ke3bxt7WY8QQ!^h?hK54hS5TPl_2wx}#nQlhyh=pEsvFBpUYlyn= zxvUx~{tTp>#xmL>jk9l3(%eoLlR#Mdjw%f|aytC)3miY3PCtGU&Et3)_Evk#yV;qo1pxzn8=D zemztV8oO|>W~RG*B|;mipdHR$c8TXj5;L+YA-N`Zhd4-~WvePkv?6GgXJd#4ldlScn& zBW~xgj0Vs|=o^1x^kV1<u^_Z5!Z~!D@5+8}2fl*u0Y2rsaD_HD)jYiL;iwbPZ;ZYj zjehQ{KZf0|lA6r3mKB+{ggBif-FYt==+G6N(I|hq*Ru8lSm`?g8cSbu5xP?0NK}Y4 z0qyY$7OoG&N}o|Hy++zH8d$>3HQ9(9KXX+M(#w^Q2D7&?fFsOf4X@=2-jvAMZ-CM- z#TI*`TZsmv|DJ%p8AkWVx*FE&wKkMhX3I(@nsQ)gmWGm{f^raPYm(j|2uUSSG7Ws; zCklTDZ~A`h3Us1335hg-mS*30AyYcji~lIMp%_RqJ*mey=w&E@@CRvJ;smG^#W)`9 zARTGxsXeR61oM7#r4=kGSALKDGjP5J8ZD3?emwsCb}K-?tA^o^Va1!g(qoyRK~#nk zM?z|2mBZ8ZnKDY~k+oAkx-mgvY~$tUbC-VxK_wcYaspX}lv-r$TJ2EZ7F`$@B_r)x zJz$MsH;sxOu*SLo*5z^H3Q(6c0v6-2$ndxO*XVt))zG3nSWn09j{bcpN5GphVfz|v zoBQGA%kB8+zQ0tvVK&2_92Eh*lwD=I`MlFY){-K)6GqATtKsux=87Z(=lF zH%xOql_UT@ccqbWCMjuSzkVRCDYSSQaE#q;geFLOutMN%t{O|~7_}#6uf;Y^B`fo* zy`#Tq4pUXh3I-1BZCdL)PEYQZPh}q^`pyFV=ZD8HpB`@nX!6j*tnQZ}bY0EX$x`%P zLUuXn>O{fYg>I-X9gdF=LMKVM$-sY`%cV)U133>_JDL$_=!aoSqq0OQ-G!lb9n5M3 zMFx}*FV((agOO!9PXd%ys7XckdNa<=7UTR$Hc~zt&2!rx4wL^lJ$YOA8t9SHpFh74 z(l-Khe;lg&p`NW*_f@~%)pF*GvjnA;mf{Z9&NCMsxb!`sPZMS6z;ko6q)dPA&-1zO zxcL>MGXi?E$z6|k-{u_7F`Nd&hNZgn76-?-%JO9{`~2~!~YNH>#uyS`s3>TaGb4GQr8ta`j?K;%Z@TODK2{FL)B@= z4S6XKkVcP?t7`fZUbU7xB+`G_omd3`x(ORY+7Ws@OP!OK?rg!MWK0?Ak|TJgb<5x} zRWnO%W;a(%$6(n0Qgp8rj$>DViSi53WH+OLM#GEn-a29`g3KZ)|sT;<*!~sJr(N;QMfqu9Jps`@3`dbhE%v7STQS3isS-oEB8vkbjq!p%B zWHLwe77PLCCKuVXFN~?r0^e3ltR|5Vc^GX)Et-b7tjwms-aj@U7SD@+jiq#CWyAL4 zW!BItl_!Z~CasCPPEiiiV z_*Y-AyM9PkwNTYM;YB6Fl~rZD(D4(gDI9Y5#%_WbwyuvSkrzW*sOg5C`lcESM z(4{>oa#D^fpg-LLqaP@H*C6!!I+0b99M4}bCiLo^c03vil|*4~P6qG%EO-rZg7UNv z-#oW#ieoI|&U4D)IFcm}Q7(mcDDFXkcsTLq-8+H)j?(_-J`Y>^FQa@TMIPI^Mf$`R zKPEnB*TW%Zxu?&631>VJ&W?rIV4)ViL{WcN&j zR!5xqVT|G;h9D;$Xw7*r@D(AA{mXfUJa^PPIBFt@gxrfc!cM zqAg(^P2yoG9SNgSGS-B1IJ&-+g(Le-q?y4y0wQ{sW67U?;C5ey<4QT$-Q5t-|7Gs# zy4ysSpaCKAp~#oufb9iqH{byTBU`Wu*7_*o>i_?!+to8jILUq1$~jS_bMoL)sk*wS zr~Brv7>Y&?;!n#e#Ig>T)@BbvOX*dzvy!4L^?7?QSvcgN!D0mcs&01 z^kQyS6q8Ql2gI#3X% zbfAD%bRO@k8U(b%CA=h0$>7rr&=F(= z(^lAjUerVpJGwxADOI0EBvDyQ5(N%#iqsd~MnW%d)jS^n{qS!9dU3dW97Np9x>#ZP zN4yNXP6VPZOBm^{W=7A9Ic~Y(m=GDE>ymaT-Qd+7zOR9{O>{aErOi}SW(uH5t?v`l z<|gs;$ewL>hN-RhFkzlYI_ zzW*eby?m0=5+Wv%URIdn6QV#l) zJJ61;0Hq1+G*dUFwl_Da!quBtya~=Di`A1VR41x~bjoKGS%LF$?HDW^xgxZKPyCX9 zuCTjfpr78Z4fK!aezj@`*$%~L(UfHqF6WjgmrGIE!M?(gpc=koh`@1B;y{gqfQEyn z-_f&e;uBwXB`fWiE}0QZ`f@W6TN7Q++lucAc@Sw#S0(46d~}xo4E01Sw3e{_*zHvF z$9QHNB_qApku%c*&6mS@IE0eurH+MvS~{Mt9Sj#;FIVLtW#7g{C5z&FEkd58UC#|e z3cW@XW3;4jxx#_#WTt4)AMG*3HZL%CI2zh^iptWKEStE`DIBs!6V|53sd(BgHY1sT zCNJYwau%Pc*a9bp2YAnTNO=xz8-~xSfVtqf%M3MZzzAM zD#d6*+EmNd-xeaven}AXX(Wsw4LB3nDb&~K^HRM@FWjZRBcFmJ0-L{68fSG)));}d zR4n{M#lpMSE8nvJ@i3I1+UDzj&|0z)Z6W9Ls_taB?;6xIf-vN)gw$g8WA8H14yKoN z-NtbRuyVB_6klIbs2sRv98fqK6Zg5pr)D4$*&* zFzS;?NUzuLrz3HHz0T(jaL&g}h2=||XfAXpMngHS4)oV{_*9gy{jgepbwZXhAR<>U&V@VPF+*u#bJMwcH5lo2cL-fG!(c#08Dpo^ZcR#SQo_6<%2(USPOJM-Jb*Nc z)0@S2;FEb%Mtc+AapCr8taElCQ1yuW9HT5>ACJ+f8)xD0_3AQKjke_>eq@ zO$u%BQ7yfzkXEbf(-6}$1=;DqH&gVPZwYHcJI&N_OShJnz*jxuoD=k`zA%By37MD9ka_YOJfGSltdGuV*%f0V4t@O@o=!kGzsv78(2PK zA^HeXAf0l5;^J=!>GYSxFq$~Nsd}R>$}*CBtSerQy!+yxna|2_oN=CJE04#!hr8>w z8=PJVXfarWEM!IrsAH*_il%SnPzoY+S=P0%#1G*$jkVtdS(e5jt`{2B1!qS+ zu{zHvsV2+Ogq5iXO;EeGJty>_(ONo4EPNJdCNu-RRa?u_`mNs5CldV(^{67MY#s59 zZ!|EH(|`p@BG)#jZUaag6XEzJ6#jKQU6;{+uWj4(4OzRA9);YT}|fDNVY8Px;%Br4f^+(bOri@*nXtaagTGE>}={L$qc$t9h*V6 z^*kR{6P;<33KaQu@FVEM1l#ae_+P3cd&#|?NYa!$Kt+Q>)!#k1Lbx2{* z&D^SNCeoocbejrj*I}R?_kuLZNdS>f)DL?P+`3|Kb#@U#xGdp`|4fNyj zbi8}Md%Pad`=KC0%i+`KGA{Rjfh<92Qx!rbIxqNJF6^33ygF33b?`r%jWh>D+Wp%5KtiS7XK|9y5Jk4rUy$Z`0fV5qGuS ziDFIg$lC)#q6mr_Am}IxT-1rjvIqxQ5%}%Glo9#{KIgValJ3Oa)$zku1AF{#DOX_bQK9$n@HMDat}Z|mS>yI zdNemN=|wjPTqcT`f!Z`XIDkam&ubJ% zQy!fi&jj>*kPRn~1Nu{cTlwDw8@%p)A`h#RRFSvmdXfzOwDCf@ARsn1X`8U8-N)s!orl?Mx%~Ywp!dO>{#FyDdZh1*{BvLB zJXI(G%~d2!tDt?u{?TRc4qNKamZ51rF$bv+$IuN^Rw_b8+pg)V+;-#UEF|H<3t;_b z&~3Ev>sRo92EojtV!`U81E${4_s#A!3@z1822>33GWbSjaF%`=Jom*@sCVxVA~4@@ z2Gr?ar_(9h!Mrzo++p}01<`k|f=FMjE9K?;&wcF$UloAn?jH@g0k_sc_O|H?Hm}ml zsOJIbj&7Mk9WH$h{VZx_ik#!)Q2O?f7si;WaHaKsIZkATlPE;fc)7FtiWSICdrjgR zJ)gHgumfRs^U%wl#NB=%uF}0Wn!VnA&91%sKAlhJbe>TL9zKpb>cIbgQ)^GDdR10L z6+z%x`!C>Z5moT|X39w{tEnF~Yd^u*oY&fS_N?|SBr)PTPFZhERvkW{hJ-Yp zZW7{u5afj$ML;Lqq>(hqU)S}KzQiTG7uq{1G#jx{%Y<@UoQV&nFSCrfLrk5T2gmdC z4d-xzBFE``*`?EPg4@}L0d1|mr}@gu>w2v|>nI?s6$f7mIo8ij%yZm)trS_g|}&cM}bi3@YQB?8x8{4bV_dMD-GC~!SqRR zzO{qiP`;1q=jVo|1#O*S9^BE!{3+XB&Zo;|K27J7^pC#X{}5>7y&k@y6#X73?3t-m zg-r&k=yu&2CdXVt@N(bmnjPE3IJo5*NW2Zt(QFE7`fm??$C|^j(c5p9b?!8xgNZtS z=77e9ON@|qW3_RwK+9k~4n-m-aC4!`vF}Qy$hx)++&TGXFYJ&9q?xG2nvC7xns9zu zin4ndY_=aHI(~)OE?lO|$3?XAFlN72o4O9F&(E)~uiwAflEVLC=QT=79TUsf-Ym0= z@{xK*7Gon}u`RLoLV3qvJ&nggb4^IRLsq4a50QdHa6ET3SVTka=P!58>$5B3>@pE8^| z`_GM!`jD&_kWK}u zx}6|e7Y@mZj^jgKpm)<`)yKnso!}1J@*I(O3kphAOIbteM5AUS>YA;?@z z$AWVT!~#%l*LCgDPB?OPvX# zm=wms#73|tT}eioY-Hnrrf2Sg^P(QKTR)>bV@Ut$C-;vl)Q!2i7{Rr#azkU*pPr8Y zKgQdS%W-$ic2Ih0Z}%{uD_?zkDp#wO(t>LL^;uxiD`nqkispfTP2CFuRsg1ke?B|g zkUYS12P4T8eMo6^_6oBx9c<)8G>I!D&8Xr9T(QI)<#6lNTx2i66_+ZUFqXB;K=Tr- zgs8uxXUMo`gmjvwVHk4PKEX)OCiimhUl>pDwrPKm9#7}LU$>Xb`S@!)oDV~KVX%8x zJ$mndudE7vGnTP`r>teaH>?UmxQK4>~Hk+O)@ ziRmOcm!}g~P(@<^WrOxY*n^OT`z#OL$8B3by=RO)61Q=cpYis!WAtYeDZve;OL0CY z4p=T*#2aYaKk;Yg;nOUj@6GWtf`6?<+m3uwks&oRn zKtYMyW-Q-tEBy{qK%!(z>d{===&&uL(d`mRyNGCWVVV|BQd=k*V!~c*upgbW8Fb+` zNW+45lw6yU+;N$7+tEVl>pz@cQ754^kV9D#Y6|8sO_wR~#s@xi!x_2Y-1BDX>3Ae& zzMyPJdEp^{-A(XC!{q~kt|O}+tM#f#YELh6N99IcGjm9@u8a{jmsdFN44j8%lb#@? zi8n}vAa@j?H3AxK(h1vTIq**Ysx~nPw=2bshNs=zL}8(P^E&Q^R{!|*xQ($KY!mzW zaM(aSSzaIE?dh_OYl2_-7De#kNJyVgXG#jsbQJD?h&P6GK8EwhQOC;D!5pfSuf1ZQ zYb2gkCCp(ZjPn&~FtcMfKsS!1qVAxvEhKZep4O5)!P+l;K-+0r^;L}cvep&CK;>>> z^Zp3@VlI+G6|D$~o5`T<@#kVZ=2bo$%m2A4h^QM_@9|#Vz6H~AoCn$K&(m=*-2&({ zLYhKcVemV)hzX7xbpo2c5^;RDe8Yt#5VHg&h_6T?2hL-&u4LF2wD}V>p!G^Pc zOc7>u@=eB2RJ4a>nTqKHA4a6IMJ7k0q>0?g7*=JR6o-C)AlA%Gr@YMo&LYPPHd_1H z@6S)z1BWVqo4&1AW!u)pbkmePz}x`r4)5K1J|~s9-v4+W(EpAn#2lj!Hyw>(+QvZV zao86rpy{8qAvZW;`F2(o z7cjS|BFoeR&izbb*~Uq_=oi4Mq*7BX=Rp5C`%9{@p1-{YuWxUwS+O%-S4~sYx3)}( zo@<Yyl0KQ&y%=?c;lXl5ly^Hd7gLPX`=S1Ku0cX2{L z0r9Z!&UIBxFxOw~V?j|%%A%aUHsz`-lX!zClx)Xg%Zh{1Zab13&HB8ZF9qo3^MF2$ z^Ftc^it=C9`}g-TGP4ism<23gncD$Ba)*PjooF_}X)O`LG3H(2aXc@A)nW5T)NfZm?l?UF!Vu9maS z6C-+Z^3ze8{<4D0C#=x)}sv|GI`XFs19(Lt659~9J+6CH&v$!Oz$lmd(vCL z@yolvu$$^(g~344Jxy0_S0#dUT!b#FeQcT6!(3{d%R-eJ=ccutSbzEc8A6|gZ;Aeex(FEnwF#= z+;G?x8ruaSJ2GEWGy|;wv_@5E0*^gb9*K_WPzbuu!Rb{JcZ9u_o1*LnHgP4}uhi`0 zMEEu(FEkdI0rU-mqq{;q-#Vh`xcS=Nh@#i$*UfS}e|;X%xs^>m3Sy2UB!_XF1jked z^gaFNdZ>ke(my)HO><}Zzj9l4P+{+jjVv7gq;MW}LFmFAo3(^h|C~Lo9-WgoKKUP3c0oX=>G*WejbMG91N}08E}eZc434WS#~6*?Ee_}LloLZ! z$Qyp$T>6jL7evZ)1T?G-g)c@z?xNmEe1?XDhl^u|NaHRm=2yujRJs5#-WJ5Y5 z&TrQ%04A|fV$?R?V#5`sh1=C;x!$7X|7kZYlS!He?^aHd!*ouQ^r9F7;?dxfCcr$oUYt%CCY!XYR(kdTLSvLSuVG9Ca#|s(Ihvb zl(Irdjx@E7r%cbv@~C~^=I_Xjpuzry^pNO(d1n$QykngbNX2!=9Msxc7cPaIu!J_G zT+TqVzDuHBV7x^A?ol;R^W*$?Rh5L8l4aiFm7u*T#OWpmz&I7bAhOvziGg!>BjRq_ zb5m2!es0(E<$TKlO=t5gyl)UZcTbx_u@Ma zcvuHrJHZ)s50cU#<)my;hDN$VCm~VDSG%39(bKWopD7D}W<(o#ZlxC7uguejbviP0 z-~!g@Cz53mhcOtNb1fQ8(6%2yY@lm@#x9kCDww4ElXZlVNYtDrHC6Jx}5KXwTN_VS}-dMW2<_4|NWmx-=}LYeYS8uD|r> zL0QX+B6>bY6Z&kwoI1}u3=fCXOOASmf0~Rg2Q1Ltz2w+F$_xDaQMZ@f4qRc%uqqBk zbR2LBZo<*cbfWwy^PG`?q$Z(2O*x7xTt6+i2BClRHmW90qEre=q3W%#_z=_#-CMg= z@!e2eP%is$uGz+3<6NU+SJa)rOg{wY2903*)#?)s)tk-RYPo)9M88~8%k_^VBfr4u z%ESQp2-Xz5@dOM_IGfn!Z};2A9k95`ZH@fU^@9uwglqjWYK(Y)mJX$)h$w~WPr+VL zR81XvS)ZN2`&1W9mG)QZp?+|Adnk_TI#OBn-%%D=-&*1gQW~9(==Gd{o^Q76&3-?B z`%Ov9?0Nms>9?K1D%u~%huHThbY0&{$F{=oJV?QI&E3upC`SS0a%*LCCT>ceNa{LE z(+ndKl(cxBZUtk1py?N&P0;>7RFpK(jY_gY{1IZVPAl~QwZ6mpFU*{=@KcWG1s9@q zslRQ@^48tHn9zs2r(ac{a(J|G=ey2M9GNmUFu*K{c2>)L%WbD$VK-x5b} z)}L?7{r`)*{^mqsAbK*5cjEnlKN}q=)*>wl8mPvh(jJ4~|3lrr4br<$VE89Q2WOs{ zW#8^*-!52xtX9+2;(oPvd;OI^#I+fddsH2(s%kIw#c1;*ZjV3X_Ht2#^V@6&n%(8D zgz(32=#f<6>6o78Q!>=Se6`rz5onq2 zKmHt*)mp1V%<7C;SPSyVe69*O97ZqE`{V4}vqM}%n$1cm5% z1{4K<7Nxmzr1Xj%-JlhDiiEy5b6!O6bb%LdX@eN-`PO@Su8kj<{e&D=gc2lb0tnh5fqy;1sm=9+QwctItN$3(>^7sVIZgrom7g`AMjyb37q#p!OebB&P|kG~yf?u^-gsT%g;vYiGQNFY;1qJGxE#u!xD0cgvsZkW2* zjDumYEdrbznvcAB;oULAa+FHtP{mRjBgas5p#@%^N}1<+e^ip!={}WNj75oQE@`Nv zrhA2{)JK`R8Lexjq}KF!C2>iERiljJVU@Mo@~mzzjnUd=qiQC4w*CBU-KX7ucWd{~ zYgns-2NCVhb4%~QmZ)ImtjVRq1+L!K)w!XcE2`q@RLr;MJU^ZGPp5kU{THc2lPDfT z0jmH201jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjfbN~ryZDD6+FK}*W zb8!HE01bBy0ssI20B5)lWexL3oCtVy04y*uWH~ZnIb)ulVQjJ delta 333 zcmbPxn*C<^gaAgyiGel(4eL(o_)J-3wKBH!n(-UgjT7g_TUq%e=jZAd7ZhdYmFVYY z78hsc=jo?p7ANPYq-K`rmzHGa=$BL$r0P3m<|P(YI_Kw=q~?``07WMAG3tqyFbMf% zC6*=X=OpH(>j#$rjY+qj?8vCk$T7K)QB;bfqM)>hfhpQ)&1dl+Y#bpEm>3u;3K$qH zWhXCSlwF+BWyw-k#9%RTp{y^+Dm{=@dKgwQK!FfYa}fg{$U;4kg?g@erMbwG1tkou zp1zLmu9Mevss(KOu3@--okv9pgPx^Xnq``qg@JCeWva2RiLqIlZc?I|xo(PanyHaR gQd(lFp+$UBX;qb8RzYfdAwwMla|r_{ihyth0R3xhYybcN diff --git a/result/channels.ser b/result/channels.ser index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..c5975123e324fcbdfc5624e1442489e4e62468d6 100644 GIT binary patch delta 17 WcmWFvn&8I6P|m@?z#ss`3>5$!$O4W4 delta 17 WcmWFvn&8I6Q_jJ_z#ss`3>5$#SOS^= diff --git a/result/messages.ser b/result/messages.ser index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..c5975123e324fcbdfc5624e1442489e4e62468d6 100644 GIT binary patch delta 17 WcmWFvn&8I6P|m@?z#ss`3>5$!$O4W4 delta 17 WcmWFvn&8I6Q_jJ_z#ss`3>5$#SOS^= diff --git a/result/readstatus.ser b/result/readstatus.ser index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..c5975123e324fcbdfc5624e1442489e4e62468d6 100644 GIT binary patch delta 17 WcmWFvn&8I6P|m@?z#ss`3>5$!$O4W4 delta 17 WcmWFvn&8I6Q_jJ_z#ss`3>5$#SOS^= diff --git a/result/users.ser b/result/users.ser index 4f1cc18f47b55e95824b0809044e3b03f1139e9d..e630d30b8559d34a95a1ca5e487259e6193513d9 100644 GIT binary patch literal 1034 zcmZ|NT}Tu`00;1K?@m3_%gfNZDAGu)hdoMDDlzTCJUc}=#gYow+wpE~zuKAeRtX_9 zQ_8*-OY>lsyQA>XfnAvY4FCPju=l?J15$vw zhN)#}FXni8K9*JjFd4Dd@MyxNI zyyMBECuOGpWo2ddgCkwK@14RqD+Q=R5X(abVJGK4z+qGfRteI-nJV`=g-URB8xT0N- zRXY#K^&%s{Q=kDvIzY6{Amo!2HZ(WMid4<<&@M1;Xb+@O1mcz1AVk|{aDZ4ZK|3*n zy(qLvl>s?$T;TFFB<+Ms`|+mX4JieWVgXQPUmT?!(f!Pnp4b?-sA90%CrNBwuE^9v zg(f$pb?Y!N1Y!(gN+H5Kcco_}CnIf%Y9D-@TyFa~cYS_Lf6`*B52VH=z2*;UaPPgt zKle0SbCl7C?@&jZts$5W`y+1Vo%nWps`JLnq9?^~1F0T_7qNzxd=CM}DNtR?Gh?75 z;WD_39yT+xB)WWYq_^d_Id?v+Grl1;b1w+t+Kx{2UYi=2=`&@ext`m$260U#v)u!K zvM!AJ@5~&l$jev(Hx_l(A`^kB%3EK*RA<3JucgcIZcR_xASi8}`|QyrE!fV7@l2$3 z(~%Ibv3YbTHDUciU1VR?6>stOAg`rXsTj<;{ATTJS5Nm$Ve1OKp4~r&UJ+h=4J7|N zTngNRL1ZvrhS;ArXBpb~VsrM6OOx4O581+rr1|OH5b;cbv120T)31Kj;-?-Iit1n7 C4N?aH delta 352 zcmeC;n9VvNfRSlppp8IFz4`s-@9a;u{PN*B^53;$;#@OEj)`|wCd)C(8kH~z`D7)Q zCF4=YMFW?k1U*Yb;F%SeCF!OJDpX*qAZMP2Jxk^F0P-|0JfSJO-`Ur zO))G2-D;3%lmpc2T^|`|ImUfkc6G*-{k~iMPC=}0YTLV6O<3|pCEKE;38j9TIIP~s zzU0LLpw0Dl48mwu^8w{7exO?o5(VmjSke-3fA)s|=G}WgF255K%rc0}pv z-=!5&ADPy9<>9b;j+ySB2(YImiwhl50$f^%|H9)1=vIS7Ul%~F?kFpY+Gy8*Qsn;3 LIkWG0byffX3mBvK delta 540 zcmdnS_ML4)03-9nKpTNsXFZsMPD;qT*{w+LczIr#hEFMC+&6J(Ln!D#`D5Z>x3M2Pb#1FbkSN52s5V@9qG5M+i;o zyPMF@Wi!B1d|0H;u7FzKQg430`8)fQEx&wtj{J9pimt0D4C1{ySA&B&qA}8co=Y@V x>!0Ov`AV(;+aZBw2T;mq!UwF@gLKJGfLgRyHL~jF>~}8=-)uhne6#oI3IJLHvnv1q diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 686660b61..226a90050 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -1,14 +1,16 @@ package com.sprint.mission.discodeit.controller; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; import com.sprint.mission.discodeit.service.BinaryContentService; import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; +import java.util.UUID; @RestController @RequestMapping("/api/binaryContents") @@ -17,18 +19,33 @@ public class BinaryContentController { private final BinaryContentService binaryContentService; @PostMapping - public ResponseEntity uploadFile(@ModelAttribute SaveFileRequest request) { + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { try { - BinaryContent binaryContent = binaryContentService.saveFile(request); + BinaryContent binaryContent = binaryContentService.saveFile(file); return ResponseEntity.ok(binaryContent); } catch (IOException e) { throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); } } + @GetMapping("/view/{id}") + public ResponseEntity viewFile(@PathVariable("id") UUID id) { + BinaryContent binaryContent = binaryContentService.find(id); + + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 + .body(binaryContent.getContent()); // 파일 데이터 반환 + } + @GetMapping public ResponseEntity> getFiles() { List binaryContents = binaryContentService.findAll(); return ResponseEntity.ok(binaryContents); } + + @GetMapping("/find") + public ResponseEntity findFile(@RequestParam("id") UUID id) { + BinaryContent binaryContent = binaryContentService.find(id); + return ResponseEntity.ok(binaryContent); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index c53113f3e..06083c2ac 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -6,6 +6,7 @@ import com.sprint.mission.discodeit.dto.user.UpdateProfileRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.service.UserService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -20,7 +21,7 @@ public class UserController { private final UserService userService; @PostMapping("/users") - public ResponseEntity createUser(@RequestBody CreateUserRequest request) { + public ResponseEntity createUser(@Valid @RequestBody CreateUserRequest request) { UserDTO userDTO = userService.create(request); return ResponseEntity.ok(userDTO); } @@ -31,8 +32,8 @@ public ResponseEntity getUser(@RequestParam("id") UUID userId) { return ResponseEntity.ok(userDTO); } - @GetMapping("/users") - public ResponseEntity> getAllUser() { + @GetMapping("/user/findAll") + public ResponseEntity> findAllUsers() { List all = userService.findAll(); return ResponseEntity.ok(all); } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java index e883adfc5..bb6028c6f 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -2,30 +2,35 @@ import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.service.UserStatusService; +import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import java.util.List; import java.util.UUID; @RestController -@RequestMapping("/status") +@RequestMapping("/api/userStatuses") @RequiredArgsConstructor public class UserStatusController { private final UserStatusService userStatusService; - @RequestMapping(value = "/get/userid", method = RequestMethod.GET) + @GetMapping("/user") public ResponseEntity getStatusByUserId(@RequestParam("id") UUID userId) { UserStatus userStatus = userStatusService.findByUserId(userId); return ResponseEntity.ok(userStatus); } - @RequestMapping(value = "/get", method = RequestMethod.GET) + @GetMapping public ResponseEntity getStatusById(@RequestParam("id") UUID id) { UserStatus userStatus = userStatusService.find(id); return ResponseEntity.ok(userStatus); } + + @GetMapping("/all") + public ResponseEntity> getAll() { + List all = userStatusService.findAll(); + return ResponseEntity.ok(all); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index e64b642d0..d5c858813 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -1,11 +1,6 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.type.BinaryContentType; -import lombok.Builder; import lombok.Data; -import lombok.Getter; -import lombok.Setter; -import org.springframework.stereotype.Service; import java.io.Serial; import java.io.Serializable; @@ -20,11 +15,11 @@ public class BinaryContent implements Serializable { private Instant createdAt; private byte[] content; private String filePath; - private BinaryContentType contentType; + private String contentType; private String originalFileName; private String storedFileName; - public BinaryContent(byte[] content, String filePath, BinaryContentType contentType, String originalFileName, String storedFileName) { + public BinaryContent(byte[] content, String filePath, String contentType, String originalFileName, String storedFileName) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.content = content; @@ -33,8 +28,4 @@ public BinaryContent(byte[] content, String filePath, BinaryContentType contentT this.storedFileName = storedFileName; this.filePath = filePath; } - - public void updateContent(byte[] newContent) { - this.content = newContent; - } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/domain/User.java index b6a78a099..a6fc409cd 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/User.java @@ -2,8 +2,6 @@ import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; import lombok.Data; import java.io.Serial; @@ -19,24 +17,19 @@ public class User implements Serializable { private final UUID id; private Instant createdAt; private Instant updatedAt; - - @NotNull(message = "회원 이름은 필수 입력 값입니다") private String name; - - @Pattern(regexp = "^010-\\d{4}-\\d{4}$", message = "전화번호 형식에 맞춰 입력해주세요") - private String phone; - - @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") + private String email; private String password; private UUID profileImageId; private UUID userStatusId; + private boolean online; - public User(String name, String phone, String password, UUID profileImageId, UUID userStatusId) { + public User(String name, String email, String password, UUID profileImageId, UUID userStatusId) { this.id = UUID.randomUUID(); this.createdAt = Instant.now(); this.updatedAt = Instant.now(); this.name = name; - this.phone = phone; + this.email = email; this.password = password; this.profileImageId = profileImageId; this.userStatusId = userStatusId; @@ -44,7 +37,7 @@ public User(String name, String phone, String password, UUID profileImageId, UUI public void updatePassword(String oldPassword, String newPassword) { if (!this.password.equals(oldPassword) || oldPassword.equals(newPassword)) { - throw new ServiceException(ErrorCode.INVALID_PASSWORD); + throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } this.password = newPassword; this.updatedAt = Instant.now(); @@ -54,7 +47,7 @@ public void updateProfile(UUID profileImageId, UUID newProfileImageId) { if (!this.profileImageId.equals(profileImageId) || profileImageId.equals(newProfileImageId)) { throw new ServiceException(ErrorCode.INVALID_PROFILE); } - this.profileImageId = profileImageId; + this.profileImageId = newProfileImageId; this.updatedAt = Instant.now(); } @@ -62,11 +55,11 @@ public void updateProfile(UUID profileImageId, UUID newProfileImageId) { public boolean equals(Object o) { // User 객체는 UUID, name, phone 3개의 필드가 동일하면 같은 유저라고 판단한다. if (o == null || getClass() != o.getClass()) return false; User user = (User) o; - return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(phone, user.phone); + return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(email, user.email); } @Override public int hashCode() { - return Objects.hash(id, name, phone); + return Objects.hash(id, name, email); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java index f7785f2e9..7ca1b06a9 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java @@ -22,7 +22,7 @@ public class UserStatus implements Serializable { // 사용자 별 마지막으 private Instant updateAt; private Instant lastActiveAt; private UUID userId; - private OnlineStatusType onlineStatusType; + private boolean online; public UserStatus(UUID userId, Instant lastActiveAt) { this.id = UUID.randomUUID(); @@ -30,16 +30,16 @@ public UserStatus(UUID userId, Instant lastActiveAt) { this.updateAt = Instant.now(); this.lastActiveAt = lastActiveAt; this.userId = userId; - this.onlineStatusType = isOnline(); + this.online = isOnline(); } - public OnlineStatusType isOnline() { - return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5 ? OnlineStatusType.ACTIVE : OnlineStatusType.SLEEP; + public boolean isOnline() { + return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; } public void update(Instant lastActiveAt) { this.updateAt = Instant.now(); this.lastActiveAt = lastActiveAt; - this.onlineStatusType = isOnline(); + this.online = isOnline(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java deleted file mode 100644 index e8da7a6cf..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/SaveFileRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sprint.mission.discodeit.dto.binarycontent; - -import com.sprint.mission.discodeit.util.type.BinaryContentType; -import org.springframework.web.multipart.MultipartFile; - -public record SaveFileRequest(BinaryContentType contentType, MultipartFile file) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java index 1583c1a84..b67e1c555 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java @@ -1,5 +1,18 @@ package com.sprint.mission.discodeit.dto.user; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; + import java.util.UUID; -public record CreateUserRequest (String name, String phone, String password, UUID profileId) { +public record CreateUserRequest ( + @NotNull + String name, + @NotBlank(message = "이메일은 필수 입력값입니다.") + @Email + String email, + @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") + String password, + UUID profileId) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java index c00297020..0b1dc24a5 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java @@ -1,8 +1,4 @@ package com.sprint.mission.discodeit.dto.user; -import com.sprint.mission.discodeit.util.type.BinaryContentType; - -import java.util.UUID; - public record UpdatePasswordRequest(String oldPassword ,String newPassword) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index f8e554557..f03f57b84 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -17,7 +17,7 @@ public class UserDTO { private Instant createdAt; private Instant updatedAt; private String name; - private String phone; + private String email; private UUID profileImageId; private UUID userStatusId; @@ -27,7 +27,7 @@ public static UserDTO fromDomain(User user) { .createdAt(user.getCreatedAt()) .updatedAt(user.getUpdatedAt()) .name(user.getName()) - .phone(user.getPhone()) + .email(user.getEmail()) .profileImageId(user.getProfileImageId()) .userStatusId(user.getUserStatusId()) .build(); diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index e72bef992..ba619efaa 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -17,15 +17,13 @@ public enum ErrorCode { CANNOT_FOUND_ATTACHMENT("해당하는 첨부자료를 찾을 수 없습니다"), DUPLICATE_NAME("이미 등록된 사용자 이름입니다."), - DUPLICATE_PHONE("이미 등록된 핸드폰 번호 입니다."), + DUPLICATE_EMAIL("이미 등록된 이메일 입니다."), DUPLICATE_CHANNEL("이미 존재하는 채널 이름 입니다."), ALREADY_EXIST_READSTATUS("이미 저장된 Read Status 입니다."), ALREADY_EXIST_USERSTAUTS("이미 저장된 User Status 입니다."), - INVALID_PASSWORD("올바르지 않은 비밀번호 형식 입니다. 비밀번호는 8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다."), INVALID_WRITER("작성자가 올바르지 않습니다"), - INVALID_PHONE("올바르지 않은 핸드폰 번호 형식 입니다."), INVALID_PROFILE("기존 프로필과 동일한 프로필입니다"), MESSAGE_EDIT_NOT_ALLOWED("메시지 수정은 작성자 본인만 가능합니다"), diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index b620fa4ca..b3d1f499f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -11,7 +11,7 @@ public interface UserRepository { boolean userExistById(UUID userID); - Optional findByPhone(String phone); + Optional findByEmail(String email); Optional findByName(String name); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index e57422050..d2691c4b0 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -13,6 +13,8 @@ public interface UserStatusRepository { Optional findById(UUID id); + List findByIsOnlineTrue(); + List findAll(); void deleteById(UUID id); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java index 032de80eb..aa77a1b0f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java @@ -3,8 +3,6 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java index 5def92752..863460e6a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java @@ -46,9 +46,9 @@ public boolean userExistById(UUID userID) { } @Override - public Optional findByPhone(String phone) { + public Optional findByEmail(String email) { return userMap.values().stream() - .filter(user -> user.getPhone().equals(phone)) + .filter(user -> user.getEmail().equals(email)) .findFirst(); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java index e9066d862..08035f247 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java @@ -36,6 +36,14 @@ public FileUserStatusRepository(@Value("${discodeit.repository.user-status-file- this.userStatusMap = loadFromFile(this.filePath); } + @Override + public List findByIsOnlineTrue() { + return userStatusMap.values().stream() + .filter(UserStatus::isOnline) // isOnline()이 true인 값만 필터링 + .toList(); + } + + @Override public UserStatus save(UserStatus userStatus) { userStatusMap.put(userStatus.getId(), userStatus); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java index f1922c152..1f2094f6d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java @@ -28,9 +28,9 @@ public boolean userExistById(UUID userID) { } @Override - public Optional findByPhone(String phone) { + public Optional findByEmail(String email) { return userMap.values().stream() - .filter(user -> user.getPhone().equals(phone)) + .filter(user -> user.getEmail().equals(email)) .findFirst(); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java index 8f7d2bcfd..174467041 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java @@ -30,6 +30,14 @@ public Optional findByUserId(UUID userID) { .findFirst(); } + @Override + public List findByIsOnlineTrue() { + return repository.values().stream() + .filter(UserStatus::isOnline) // isOnline()이 true인 값만 필터링 + .toList(); + } + + @Override public Optional findById(UUID id) { return repository.values().stream() diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index cb56cdca6..68331a61f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,17 +1,16 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface BinaryContentService { - BinaryContent saveFile(SaveFileRequest request) throws IOException; + BinaryContent saveFile(MultipartFile file) throws IOException; - Optional find(UUID id); + BinaryContent find(UUID id); List findAllByIdIn(List uuidList); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index 05661606a..c5b8c60be 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,17 +1,17 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.dto.binarycontent.SaveFileRequest; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; -import java.util.Optional; import java.util.UUID; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -19,23 +19,24 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; @Override - public BinaryContent saveFile(SaveFileRequest request) throws IOException { - if (request.file().isEmpty()) { + public BinaryContent saveFile(MultipartFile file) throws IOException { + if (file.isEmpty()) { throw new IllegalArgumentException("파일이 비어 있습니다."); } - String originalFileName = request.file().getOriginalFilename(); + String originalFileName = file.getOriginalFilename(); String storedFileName = UUID.randomUUID() + "_" + originalFileName; // 고유 저장 이름 - byte[] content = request.file().getBytes(); + byte[] content = file.getBytes(); + String contentType = file.getContentType(); - BinaryContent binaryContent = new BinaryContent(content, storedFileName, request.contentType(), originalFileName, storedFileName); + BinaryContent binaryContent = new BinaryContent(content, storedFileName, contentType, originalFileName, storedFileName); return binaryContentRepository.save(binaryContent); } @Override - public Optional find(UUID id) { - return binaryContentRepository.findById(id); + public BinaryContent find(UUID id) { + return binaryContentRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 53cd99dca..4f7909c4a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -32,8 +32,8 @@ public class BasicUserService implements UserService { @Override public UserDTO create(CreateUserRequest request) { - userRepository.findByPhone(request.phone()).ifPresent(x -> { - throw new ServiceException(ErrorCode.DUPLICATE_PHONE);}); // 저는 이메일 대신 핸드폰 번호로 했습니다 + userRepository.findByEmail(request.email()).ifPresent(x -> { + throw new ServiceException(ErrorCode.DUPLICATE_EMAIL);}); userRepository.findByName(request.name()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_NAME);}); // 유저의 이름이 같으면 안된다. @@ -43,7 +43,7 @@ public UserDTO create(CreateUserRequest request) { .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); } - User createdUser = new User(request.name(), request.phone(), request.password(), request.profileId(), null); + User createdUser = new User(request.name(), request.email(), request.password(), request.profileId(), null); userRepository.save(createdUser); // User 레포지토리에 저장하기 Instant lastActiveAt = Instant.now(); @@ -64,8 +64,7 @@ public UserDTO find(UUID userId) { @Override public List getOnlineUsers() { - List onlineUserIds = userStatusRepository.findAll().stream() - .filter(userStatus -> userStatus.getOnlineStatusType().equals(OnlineStatusType.ACTIVE)) + List onlineUserIds = userStatusRepository.findByIsOnlineTrue().stream() .map(UserStatus::getUserId) .toList(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index ca4525c47..ba4c8ad01 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -37,16 +37,12 @@ public UserStatus create(CreateUserStatusRequest request) { @Override public UserStatus find(UUID id) { UserStatus userStatus = userStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - // UserStatus를 조회하면 Online 상태 업데이트 하기 - userStatus.setOnlineStatusType(userStatus.isOnline()); return userStatusRepository.save(userStatus); } @Override public UserStatus findByUserId(UUID userID) { UserStatus userStatus = userStatusRepository.findByUserId(userID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - // UserStatus를 조회하면 Online 상태 업데이트 하기 - userStatus.setOnlineStatusType(userStatus.isOnline()); return userStatusRepository.save(userStatus); } diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java b/src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java deleted file mode 100644 index fb4664d45..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/type/BinaryContentType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.util.type; - -public enum BinaryContentType { - IMAGE, FILE -} \ No newline at end of file diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js new file mode 100644 index 000000000..aac822d38 --- /dev/null +++ b/src/main/resources/static/script.js @@ -0,0 +1,105 @@ +// API endpoints +const API_BASE_URL = '/api'; +const ENDPOINTS = { + USERS: `${API_BASE_URL}/user/findAll`, + USER_STATUS: `${API_BASE_URL}/userStatuses/all`, + BINARY_CONTENT: `${API_BASE_URL}/binaryContents` +}; + +// Initialize the application +document.addEventListener('DOMContentLoaded', () => { + fetchAndRenderUsers(); +}); + +async function fetchAndRenderUsers() { + try { + // 사용자 데이터 가져오기 + const usersResponse = await fetch(ENDPOINTS.USERS); + if (!usersResponse.ok) { + throw new Error(`Failed to fetch users: ${usersResponse.status}`); + } + const users = await usersResponse.json(); + console.log("Users fetched:", users); + + // 사용자 상태 데이터 가져오기 + const userStatusesResponse = await fetch(ENDPOINTS.USER_STATUS); + if (!userStatusesResponse.ok) { + throw new Error(`Failed to fetch userStatuses: ${userStatusesResponse.status}`); + } + const userStatuses = await userStatusesResponse.json(); + console.log("User statuses fetched:", userStatuses); + + // 프로필 데이터 가져오기 + const profileResponse = await fetch(ENDPOINTS.BINARY_CONTENT); + if (!profileResponse.ok) { + throw new Error(`Failed to fetch profiles: ${profileResponse.status}`); + } + const profiles = await profileResponse.json(); + console.log("Profiles fetched:", profiles); + + // 사용자 목록 렌더링 + renderUserList(users, userStatuses, profiles); + } catch (error) { + console.error('Error fetching users or user statuses:', error); + } +} + +// 사용자 목록 렌더링 +async function renderUserList(users, userStatuses, profiles) { + const userListElement = document.getElementById('userList'); + if (!userListElement) { + console.error("Error: userList element not found"); + return; + } + + userListElement.innerHTML = ''; // 기존 내용 삭제 + + // 사용자 상태 맵 생성 (ID를 문자열로 변환) + const userStatusMap = new Map(); + userStatuses.forEach(status => { + userStatusMap.set(String(status.id), status); + }); + console.log("User Status Map:", userStatusMap); + + // 프로필 맵 생성 (id → URL 매핑) + const profileMap = new Map(); + profiles.forEach(profile => { + profileMap.set(profile.id, `/api/binaryContents/view/${profile.id}`); + }); + console.log("Profile Map:", profileMap); + + // 사용자 목록 렌더링 + for (const user of users) { + console.log(`User ${user.name} userStatusId:`, user.userStatusId); + console.log("User Status Map has userStatusId:", userStatusMap.has(String(user.userStatusId))); + + // 사용자 상태 가져오기 + const userStatus = userStatusMap.get(String(user.userStatusId)); + console.log(`User ${user.name} status:`, userStatus); + console.log(`User ${user.name} online value:`, userStatus ? userStatus.online : "N/A"); + + const isOnline = userStatus ? userStatus.online : false; // 기본값: 오프라인 + + // 프로필 이미지 URL 가져오기 + console.log(`User ${user.name} profileId:`, user.profileImageId); + console.log("Profile Map has profileId:", profileMap.has(user.profileImageId)); + + const profileUrl = profileMap.get(user.profileImageId) || '/default-avatar.png'; + console.log(`Final profileUrl for ${user.name}:`, profileUrl); + + const userElement = document.createElement('div'); + userElement.className = 'user-item'; + userElement.innerHTML = ` + ${user.name} +

+
+ ${isOnline ? '온라인' : '오프라인'} +
+ `; + + userListElement.appendChild(userElement); + } +} diff --git a/src/main/resources/static/styles.css b/src/main/resources/static/styles.css new file mode 100644 index 000000000..b45f4e704 --- /dev/null +++ b/src/main/resources/static/styles.css @@ -0,0 +1,80 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + background-color: #f5f5f5; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +h1 { + text-align: center; + margin-bottom: 30px; + color: #333; +} + +.user-list { + background-color: white; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.user-item { + display: flex; + align-items: center; + padding: 20px; + border-bottom: 1px solid #eee; +} + +.user-item:last-child { + border-bottom: none; +} + +.user-avatar { + width: 60px; + height: 60px; + border-radius: 50%; + margin-right: 20px; + object-fit: cover; +} + +.user-info { + flex-grow: 1; +} + +.user-name { + font-size: 18px; + font-weight: bold; + color: #333; + margin-bottom: 5px; +} + +.user-email { + font-size: 14px; + color: #666; +} + +.status-badge { + padding: 6px 12px; + border-radius: 20px; + font-size: 14px; + font-weight: bold; +} + +.online { + background-color: #4CAF50; + color: white; +} + +.offline { + background-color: #9e9e9e; + color: white; +} \ No newline at end of file diff --git a/src/main/resources/static/user-list.html b/src/main/resources/static/user-list.html new file mode 100644 index 000000000..f3acfdb59 --- /dev/null +++ b/src/main/resources/static/user-list.html @@ -0,0 +1,18 @@ + + + + + + 사용자 목록 + + + +
+

사용자 목록

+
+ +
+
+ + + \ No newline at end of file From 5be8b3f876d10c59160e959c4e583b89cca1913d Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 24 Feb 2025 09:28:59 +0900 Subject: [PATCH 071/115] Complete Mission 4 --- result/userstatus.ser | Bin 822 -> 822 bytes .../discodeit/controller/UserController.java | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/result/userstatus.ser b/result/userstatus.ser index fb5ff24c0a1b89d660c8ae19489fce3fcafc33b1..ec37ef38bad38b594e83221abf8e5e05debe6bf4 100644 GIT binary patch delta 109 zcmdnSwvBDWWJcMYo*tT dQ4W)}n6At2kQU;<@OS~b3XtgQg2{5s5&+j4A5s7S diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 06083c2ac..40fee14ae 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -32,19 +32,19 @@ public ResponseEntity getUser(@RequestParam("id") UUID userId) { return ResponseEntity.ok(userDTO); } - @GetMapping("/user/findAll") + @GetMapping("/users") public ResponseEntity> findAllUsers() { List all = userService.findAll(); return ResponseEntity.ok(all); } - @PutMapping("/users/password") + @PutMapping("/user/password") public ResponseEntity updatePassword(@RequestParam("id") UUID userId, @RequestBody UpdatePasswordRequest request) { User update = userService.updatePassword(userId, request); return ResponseEntity.ok(update); } - @PutMapping( "/users/profile") + @PutMapping( "/user/profile") public ResponseEntity updateProfile(@RequestParam("id") UUID userId, @RequestBody UpdateProfileRequest request) { User update = userService.updateProfile(userId, request); return ResponseEntity.ok(update); From 52a3a9afa12b601a88c56407991147de1ad7c47a Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 24 Feb 2025 09:41:52 +0900 Subject: [PATCH 072/115] Complete Swagger API Document --- build.gradle | 40 ++++++++++--------- .../discodeit/config/SwaggerConfig.java | 27 +++++++++++++ src/main/resources/application.yml | 4 ++ 3 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java diff --git a/build.gradle b/build.gradle index 2c6d5b41e..fbc65f2db 100644 --- a/build.gradle +++ b/build.gradle @@ -1,39 +1,41 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.4.2' - id 'io.spring.dependency-management' version '1.1.7' + id 'java' + id 'org.springframework.boot' version '3.4.2' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.sprint.mission' version = '0.0.1-SNAPSHOT' java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } configurations { - compileOnly { - extendsFrom annotationProcessor - } + compileOnly { + extendsFrom annotationProcessor + } } repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-aop' - - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok:1.18.30' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-aop' + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok:1.18.30' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java b/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java new file mode 100644 index 000000000..e4b541911 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java @@ -0,0 +1,27 @@ +package com.sprint.mission.discodeit.config; + +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.OpenAPI; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("디스코드 프로젝트 API") + .description("디스코드와 비슷한 서비스를 제공하는 백엔드 API입니다") + .version("1.0") + .contact(new Contact() + .name("개발팀") + .email("junnukim1007@gmail.com")) + .license(new License() + .name("Apache 2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0"))); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5ebae6725..59985fa69 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -10,3 +10,7 @@ discodeit: user-file-path: ./result/users.ser read-status-file-path: ./result/readstatus.ser message-file-path: ./result/messages.ser + +springdoc: + swagger-ui: + path: /api-docs \ No newline at end of file From 459da41f80b95b1f464cc0d560e1eaae596f7be0 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 24 Feb 2025 15:05:52 +0900 Subject: [PATCH 073/115] Add static file --- result/binarycontent.ser | Bin 124317 -> 89354 bytes result/channels.ser | Bin 82 -> 1009 bytes result/messages.ser | Bin 82 -> 82 bytes result/users.ser | Bin 1034 -> 1037 bytes result/userstatus.ser | Bin 822 -> 822 bytes .../discodeit/controller/AuthController.java | 24 +- .../controller/BinaryContentController.java | 66 +- .../controller/ChannelController.java | 94 +- .../controller/MessageController.java | 67 +- .../controller/ReadStatusController.java | 19 +- .../discodeit/controller/UserController.java | 81 +- .../controller/UserStatusController.java | 26 +- .../dto/channel/UpdatePublicChannel.java | 3 +- .../dto/message/UpdateMessageRequest.java | 3 +- .../discodeit/service/ChannelService.java | 20 +- .../discodeit/service/MessageService.java | 11 +- .../service/basic/BasicChannelService.java | 293 +++--- .../service/basic/BasicMessageService.java | 156 +-- .../static/fe_1.0.0/assets/index-CRrRqFH4.js | 956 ++++++++++++++++++ .../static/fe_1.0.0/assets/index-kQJbKSsj.css | 1 + .../resources/static/fe_1.0.0/favicon.ico | Bin 0 -> 1588 bytes src/main/resources/static/fe_1.0.0/index.html | 26 + 22 files changed, 1414 insertions(+), 432 deletions(-) create mode 100644 src/main/resources/static/fe_1.0.0/assets/index-CRrRqFH4.js create mode 100644 src/main/resources/static/fe_1.0.0/assets/index-kQJbKSsj.css create mode 100644 src/main/resources/static/fe_1.0.0/favicon.ico create mode 100644 src/main/resources/static/fe_1.0.0/index.html diff --git a/result/binarycontent.ser b/result/binarycontent.ser index 82871c43c2bd633ca1efca5d21f9a150815ca616..56a281ee8f9043d05e1dcf75fb7960e658eb6485 100644 GIT binary patch delta 121 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.)56BGZ!0w!P@ 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 R2XbY2E^uyVaR7b*BzU1t2+{xm diff --git a/result/channels.ser b/result/channels.ser index c5975123e324fcbdfc5624e1442489e4e62468d6..5fe7e3cf6ce251f04c195dd0dc3ebbfbd6bd9d54 100644 GIT binary patch literal 1009 zcmb7DO-NKx6h8B2Y?^e!lz!-krrH&}hat6Skv};&GKMe;Z3?gRZZlWjU+><@XM`k9 zBH2PnNn?zNa@9f$4a^8>Q3NfDBnS-J`eq;(74Eus-lVySJn$~ubME(@^WE>hCj}^@ zHtgy~SCO1yM3b8lO}8SeEcj*d^`6cTevqQDLo<;YMM-AbF$l4=jcMA{RL4472O=tZ zw)3@;e?CsObAzm-BX(|K!vAYrzo|$dwLpc25oHOIY9NfZK)G(N?;Pv#T5fc8uJ8Nd zPX}+keI8xrTs28km#JkFgULFfl$eIB5}GtsOqi^iIwFSLmg&++vN4Se18c#_<>UR| zvNaL};t)=H$*5`Th%q=7=X{FCrn%0353)EQzsFFW!GW{rSfOM}YhsQoZp;>TMhK3U;UeGzrJjITsenok6ME7ZVHnmg=s1+4)u9z4}W(rEL?nYst-@TJ_r(U|lL+Ro{X$ai}U&WBaxM7vwRcD&t%=~i1QnwBx+Rv delta 18 Xcmey!9yGy?hoPK5$#SOS^= delta 17 WcmWFvn&8I6P|m@?z#ss`3>5$!$O4W4 diff --git a/result/users.ser b/result/users.ser index e630d30b8559d34a95a1ca5e487259e6193513d9..7b405b875245d5fb88e19bda780a639f0483e118 100644 GIT binary patch delta 29 lcmeC;=;hdOmyv}xFSUH~Jw`qD-4~3^cG*g77H0a+2mqcH3VHwl delta 26 icmeC>=;GLLmywZc@F_8ol2VoicKHj6QRX9NIs8VINW diff --git a/result/userstatus.ser b/result/userstatus.ser index ec37ef38bad38b594e83221abf8e5e05debe6bf4..cca25e5e02fc60736741197e57ebaf3214fcd222 100644 GIT binary patch delta 42 tcmdnSwvBDWWJcND7bf$THEgITE@Y@<;3(&1VgQ14uxQJS%^Mio7y(cj4 login(@RequestParam("id") UUID userId, @RequestBody LoginRequest request) { - UserDTO login = authService.login(userId, request); - return ResponseEntity.ok( - "User Id: " + login.getId() + - "User Name: " + login.getName() + - " 님의 로그인이 완료되었습니다." - ); - } + private final BasicAuthService authService; + + @PostMapping("/login") + public ResponseEntity login(@RequestParam("id") UUID userId, + @RequestBody LoginRequest request) { + UserDTO login = authService.login(userId, request); + return ResponseEntity.ok( + "User Id: " + login.getId() + + "User Name: " + login.getName() + + " 님의 로그인이 완료되었습니다." + ); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 226a90050..d0e2fa5f5 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -16,36 +16,44 @@ @RequestMapping("/api/binaryContents") @RequiredArgsConstructor public class BinaryContentController { - private final BinaryContentService binaryContentService; - - @PostMapping - public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { - try { - BinaryContent binaryContent = binaryContentService.saveFile(file); - return ResponseEntity.ok(binaryContent); - } catch (IOException e) { - throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); - } - } - - @GetMapping("/view/{id}") - public ResponseEntity viewFile(@PathVariable("id") UUID id) { - BinaryContent binaryContent = binaryContentService.find(id); - return ResponseEntity.ok() - .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 - .body(binaryContent.getContent()); // 파일 데이터 반환 - } - - @GetMapping - public ResponseEntity> getFiles() { - List binaryContents = binaryContentService.findAll(); - return ResponseEntity.ok(binaryContents); - } + private final BinaryContentService binaryContentService; - @GetMapping("/find") - public ResponseEntity findFile(@RequestParam("id") UUID id) { - BinaryContent binaryContent = binaryContentService.find(id); - return ResponseEntity.ok(binaryContent); + @PostMapping + public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { + try { + BinaryContent binaryContent = binaryContentService.saveFile(file); + return ResponseEntity.ok(binaryContent); + } catch (IOException e) { + throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); } + } + + @GetMapping("/view/{id}") + public ResponseEntity viewFile(@PathVariable("id") UUID id) { + BinaryContent binaryContent = binaryContentService.find(id); + + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 + .body(binaryContent.getContent()); // 파일 데이터 반환 + } + + @GetMapping("/{binaryContentIds}") + public ResponseEntity> getFiles( + @PathVariable List binaryContentIds) { + List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); + return ResponseEntity.ok(binaryContents); + } + + @GetMapping + public ResponseEntity> getFiles() { + List binaryContents = binaryContentService.findAll(); + return ResponseEntity.ok(binaryContents); + } + + @GetMapping("/{binaryContentId}") + public ResponseEntity findFile(@PathVariable UUID binaryContentId) { + BinaryContent binaryContent = binaryContentService.find(binaryContentId); + return ResponseEntity.ok(binaryContent); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index d60025752..365e6888a 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -1,8 +1,10 @@ package com.sprint.mission.discodeit.controller; import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.PublicChannel; import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.CreateChannel; +import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.service.ChannelService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -12,62 +14,56 @@ import java.util.UUID; @RestController -@RequestMapping("/api") +@RequestMapping("/api/channels") @RequiredArgsConstructor public class ChannelController { - private final ChannelService channelService; - @PostMapping( "/channels/public") - public ResponseEntity createPublicChannel(@RequestBody CreateChannel.PublicRequest request) { - Channel publicChannel = channelService.createPublicChannel(request); - return ResponseEntity.ok(publicChannel); - } + private final ChannelService channelService; - @PostMapping("/channels/private") - public ResponseEntity createPrivateChannel(@RequestBody CreateChannel.PrivateRequest request) { - Channel privateChannel = channelService.createPrivateChannel(request); - return ResponseEntity.ok(privateChannel); - } + @PostMapping("/public") + public ResponseEntity createPublicChannel( + @RequestBody CreateChannel.PublicRequest request) { + Channel publicChannel = channelService.createPublicChannel(request); + return ResponseEntity.ok(publicChannel); + } - @GetMapping("/channels/public") - public ResponseEntity getPublicChannel(@RequestParam("id") UUID uuid) { - ChannelDTO.PublicChannelDTO publicChannel = channelService.findPublicChannel(uuid); - return ResponseEntity.ok(publicChannel); - } + @PostMapping("/private") + public ResponseEntity createPrivateChannel( + @RequestBody CreateChannel.PrivateRequest request) { + Channel privateChannel = channelService.createPrivateChannel(request); + return ResponseEntity.ok(privateChannel); + } - @GetMapping("/channels/private") - public ResponseEntity getPrivateChannel(@RequestParam("id") UUID uuid) { - ChannelDTO.PrivateChannelDTO privateChannel = channelService.findPrivateChannel(uuid); - return ResponseEntity.ok(privateChannel); - } + @GetMapping + public ResponseEntity> getAllChannels() { + List allChannel = channelService.findAll(); + return ResponseEntity.ok(allChannel); + } - @GetMapping("/channels") - public ResponseEntity> getAllPrivateChannel(@RequestParam("id") UUID userId) { - List allPrivate = channelService.findAllPrivate(userId); - return ResponseEntity.ok(allPrivate); - } + // 채널 정보 수정은 Public channel 만 가능합니다. + @PatchMapping("/{channelId}") + public ResponseEntity updateChannel( + @PathVariable UUID channelId, + UpdatePublicChannel request) { + PublicChannel update = channelService.update(channelId, request); + return ResponseEntity.ok(update); + } - @GetMapping("/channels/all") - public ResponseEntity> getAllPrivateChannel() { - List allChannel = channelService.findAll(); - return ResponseEntity.ok(allChannel); - } + @DeleteMapping("/private") + public ResponseEntity deletePrivateChannel(@RequestParam("id") UUID uuid) { + Channel removeChannel = channelService.deletePrivate(uuid); + return ResponseEntity.ok( + "Remove Private Channel ID: " + removeChannel.getId() + + " delete complete!" + ); + } - @DeleteMapping("/channels/private") - public ResponseEntity deletePrivateChannel(@RequestParam("id") UUID uuid) { - Channel removeChannel = channelService.deletePrivate(uuid); - return ResponseEntity.ok( - "Remove Private Channel ID: " + removeChannel.getId() + - " delete complete!" - ); - } - - @DeleteMapping("/channels/public") - public ResponseEntity deletePublicChannel(@RequestParam("id") UUID uuid) { - Channel removeChannel = channelService.deletePublic(uuid); - return ResponseEntity.ok( - "Remove Public Channel ID: " + removeChannel.getId() + - " delete complete!" - ); - } + @DeleteMapping("/public") + public ResponseEntity deletePublicChannel(@RequestParam("id") UUID uuid) { + Channel removeChannel = channelService.deletePublic(uuid); + return ResponseEntity.ok( + "Remove Public Channel ID: " + removeChannel.getId() + + " delete complete!" + ); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index 1bec1fd73..8040bcb31 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -15,39 +15,36 @@ @RequestMapping("/api/messages") @RequiredArgsConstructor public class MessageController { - private final MessageService messageService; - - @PostMapping - public ResponseEntity createMessage(@RequestParam("id") UUID writerId, @RequestBody CreateMessageRequest request) { - Message message = messageService.create(writerId, request); - return ResponseEntity.ok(message); - } - - @GetMapping - public ResponseEntity> getAll() { - List messages = messageService.getAllMessage(); - return ResponseEntity.ok(messages); - } - - @GetMapping("/channel") - public ResponseEntity> getAllByChannelId(@RequestParam("id") UUID channelId) { - List messages = messageService.findAllByChannelId(channelId); - return ResponseEntity.ok(messages); - } - - @PutMapping // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 - public ResponseEntity update(@RequestParam("id") UUID userId, @RequestBody UpdateMessageRequest request) { - Message message = messageService.updateMessageContent(userId, request); - return ResponseEntity.ok(message); - } - - @DeleteMapping - public ResponseEntity delete(@RequestParam("id") UUID messageId) { - Message message = messageService.deleteMessage(messageId); - return ResponseEntity.ok( - "메시지 ID: " + message.getId() + - " 삭제가 완료되었습니다." - ); - - } + + private final MessageService messageService; + + @PostMapping + public ResponseEntity createMessage(@RequestParam("id") UUID writerId, + @RequestBody CreateMessageRequest request) { + Message message = messageService.create(writerId, request); + return ResponseEntity.ok(message); + } + + @GetMapping + public ResponseEntity> getAllByChannelId( + @RequestParam("channelId") UUID channelId) { + List messages = messageService.findAllByChannelId(channelId); + return ResponseEntity.ok(messages); + } + + @PatchMapping("/{messageId}") // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 + public ResponseEntity update(@PathVariable UUID messageId, + @RequestBody UpdateMessageRequest request) { + Message message = messageService.updateMessageContent(messageId, request); + return ResponseEntity.ok(message); + } + + @DeleteMapping + public ResponseEntity delete(@RequestParam("messageId") UUID messageId) { + Message message = messageService.deleteMessage(messageId); + return ResponseEntity.ok( + "메시지 ID: " + message.getId() + + " 삭제가 완료되었습니다." + ); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index 3f6ed792d..220d44afd 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.controller; import com.sprint.mission.discodeit.domain.ReadStatus; -import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.service.ReadStatusService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -10,21 +9,17 @@ import java.util.List; import java.util.UUID; +// ReadStatus가 생성되었는지 확인하기 위한 API @RestController @RequestMapping("/api/readStatuses") @RequiredArgsConstructor public class ReadStatusController { - private final ReadStatusService readStatusService; - @GetMapping - public ResponseEntity> getStatusesByUserId(@RequestParam("id") UUID userID) { - List allByUserId = readStatusService.findAllByUserId(userID); - return ResponseEntity.ok(allByUserId); - } + private final ReadStatusService readStatusService; - @PostMapping - public ResponseEntity createReadStatus(@RequestBody CreateReadStatusRequest request) { - ReadStatus readStatus = readStatusService.create(request); - return ResponseEntity.ok(readStatus); - } + @GetMapping + public ResponseEntity> getStatusesByUserId(@RequestParam("id") UUID userID) { + List allByUserId = readStatusService.findAllByUserId(userID); + return ResponseEntity.ok(allByUserId); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 40fee14ae..c1b981764 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -15,48 +15,45 @@ import java.util.UUID; @RestController -@RequestMapping("/api") +@RequestMapping("/api/users") @RequiredArgsConstructor public class UserController { - private final UserService userService; - - @PostMapping("/users") - public ResponseEntity createUser(@Valid @RequestBody CreateUserRequest request) { - UserDTO userDTO = userService.create(request); - return ResponseEntity.ok(userDTO); - } - - @GetMapping("/user") - public ResponseEntity getUser(@RequestParam("id") UUID userId) { - UserDTO userDTO = userService.find(userId); - return ResponseEntity.ok(userDTO); - } - - @GetMapping("/users") - public ResponseEntity> findAllUsers() { - List all = userService.findAll(); - return ResponseEntity.ok(all); - } - - @PutMapping("/user/password") - public ResponseEntity updatePassword(@RequestParam("id") UUID userId, @RequestBody UpdatePasswordRequest request) { - User update = userService.updatePassword(userId, request); - return ResponseEntity.ok(update); - } - - @PutMapping( "/user/profile") - public ResponseEntity updateProfile(@RequestParam("id") UUID userId, @RequestBody UpdateProfileRequest request) { - User update = userService.updateProfile(userId, request); - return ResponseEntity.ok(update); - } - - @DeleteMapping( "/users") - public ResponseEntity deleteUser(@RequestParam("id") UUID id) { - UserDTO delete = userService.delete(id); - return ResponseEntity.ok( - "Delete user ID: " + delete.getId() + - " name: " + delete.getName() + - " delete complete!" - ); - } + + private final UserService userService; + + @PostMapping + public ResponseEntity createUser(@Valid @RequestBody CreateUserRequest request) { + UserDTO userDTO = userService.create(request); + return ResponseEntity.ok(userDTO); + } + + @GetMapping + public ResponseEntity> findAllUsers() { + List all = userService.findAll(); + return ResponseEntity.ok(all); + } + + @PatchMapping("/{userId}/password") + public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, + @RequestBody UpdatePasswordRequest request) { + User update = userService.updatePassword(userId, request); + return ResponseEntity.ok(update); + } + + @PatchMapping("/{userId}/profile") + public ResponseEntity updateProfile(@RequestParam("userId") UUID userId, + @RequestBody UpdateProfileRequest request) { + User update = userService.updateProfile(userId, request); + return ResponseEntity.ok(update); + } + + @DeleteMapping + public ResponseEntity deleteUser(@RequestParam("id") UUID id) { + UserDTO delete = userService.delete(id); + return ResponseEntity.ok( + "Delete user ID: " + delete.getId() + + " name: " + delete.getName() + + " delete complete!" + ); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java index bb6028c6f..d1807017a 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -2,35 +2,23 @@ import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.service.UserStatusService; -import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.UUID; +// UserStatus가 제대로 생성되었는지 확인하는 API @RestController @RequestMapping("/api/userStatuses") @RequiredArgsConstructor public class UserStatusController { - private final UserStatusService userStatusService; - @GetMapping("/user") - public ResponseEntity getStatusByUserId(@RequestParam("id") UUID userId) { - UserStatus userStatus = userStatusService.findByUserId(userId); - return ResponseEntity.ok(userStatus); - } + private final UserStatusService userStatusService; - @GetMapping - public ResponseEntity getStatusById(@RequestParam("id") UUID id) { - UserStatus userStatus = userStatusService.find(id); - return ResponseEntity.ok(userStatus); - } - - @GetMapping("/all") - public ResponseEntity> getAll() { - List all = userStatusService.findAll(); - return ResponseEntity.ok(all); - } + @GetMapping("/all") + public ResponseEntity> getAll() { + List all = userStatusService.findAll(); + return ResponseEntity.ok(all); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java index dc6fabac0..80b40d75a 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java @@ -2,5 +2,6 @@ import java.util.UUID; -public record UpdatePublicChannel(UUID channelId, String name, String description, UUID newUserID) { +public record UpdatePublicChannel(String name, String description, UUID newUserID) { + } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java index 119b06c7d..f5b96f2ee 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java @@ -11,5 +11,6 @@ import java.util.List; import java.util.UUID; -public record UpdateMessageRequest(UUID messageID, String newContent, UUID newAttachment) { +public record UpdateMessageRequest(UUID writerId, String newContent, UUID newAttachment) { + } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 0f7cf5908..17aba001e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.domain.PublicChannel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; @@ -9,21 +10,22 @@ import java.util.UUID; public interface ChannelService { - Channel createPublicChannel(CreateChannel.PublicRequest request); - Channel createPrivateChannel(CreateChannel.PrivateRequest request); + Channel createPublicChannel(CreateChannel.PublicRequest request); - ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId); + Channel createPrivateChannel(CreateChannel.PrivateRequest request); - ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId); + ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId); - List findAllPrivate(UUID userId); + ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId); - List findAll(); + List findAllPrivate(UUID userId); - Channel update(UpdatePublicChannel request); + List findAll(); - Channel deletePrivate(UUID channelId); + PublicChannel update(UUID channelId, UpdatePublicChannel request); - Channel deletePublic(UUID channelId); + Channel deletePrivate(UUID channelId); + + Channel deletePublic(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 35015e848..091a82def 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -8,13 +8,14 @@ import java.util.UUID; public interface MessageService { - Message create(UUID writerID, CreateMessageRequest request); - List findAllByChannelId(UUID channelID); + Message create(UUID writerID, CreateMessageRequest request); - List getAllMessage(); + List findAllByChannelId(UUID channelID); - Message updateMessageContent(UUID writerID, UpdateMessageRequest request); + List getAllMessage(); - Message deleteMessage(UUID messageID); + Message updateMessageContent(UUID messageId, UpdateMessageRequest request); + + Message deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index e3a9a7138..3cf7ef7ac 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -26,164 +26,173 @@ @Service @RequiredArgsConstructor -public class BasicChannelService implements ChannelService { - private final MessageService messageService; - - private final ChannelRepository channelRepository; - private final ReadStatusRepository readStatusRepository; - private final MessageRepository messageRepository; - private final UserRepository userRepository; - private final UserStatusService userStatusService; - - @Override - public Channel createPublicChannel(CreateChannel.PublicRequest request) { - // User가 UserRepository에 저장되어 있는지 확인 - for (UUID userID : request.getJoinUser()) { - Optional userOptional = userRepository.findById(userID); - if (userOptional.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - } - - Channel channel = new PublicChannel(request.getName(), request.getDescription(), request.getChannelFormat(), request.getJoinUser()); - channelRepository.save(channel); - return channel; +public class BasicChannelService implements ChannelService { + + private final MessageService messageService; + + private final ChannelRepository channelRepository; + private final ReadStatusRepository readStatusRepository; + private final MessageRepository messageRepository; + private final UserRepository userRepository; + private final UserStatusService userStatusService; + + @Override + public Channel createPublicChannel(CreateChannel.PublicRequest request) { + // User가 UserRepository에 저장되어 있는지 확인 + for (UUID userID : request.getJoinUser()) { + Optional userOptional = userRepository.findById(userID); + if (userOptional.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } } - @Override - public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { - List users = request.getJoinUser(); - - // User가 UserRepository에 저장되어 있는지 확인 - for (UUID userID : users) { - Optional userOptional = userRepository.findById(userID); - if (userOptional.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - } - // Private 채널 생성 후 저장 - Channel channel = new PrivateChannel(users, request.getChannelFormat()); - channelRepository.save(channel); - - // User마다 ReadStatus 생성하기 - for (UUID userID : users) { - Instant lastReadAt = Instant.now(); - ReadStatus readStatus = new ReadStatus(userID, channel.getId(), lastReadAt); - readStatusRepository.save(readStatus); - } - - return channel; + Channel channel = new PublicChannel(request.getName(), request.getDescription(), + request.getChannelFormat(), request.getJoinUser()); + channelRepository.save(channel); + return channel; + } + + @Override + public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { + List users = request.getJoinUser(); + + // User가 UserRepository에 저장되어 있는지 확인 + for (UUID userID : users) { + Optional userOptional = userRepository.findById(userID); + if (userOptional.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } } - - @Override - public ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId) { - PublicChannel findChannel = (PublicChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - Message lastestMessage = messageRepository.findLatestByChannelId(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - return ChannelDTO.PublicChannelDTO.fromDomain(findChannel, lastestMessage.getCreatedAt()); + // Private 채널 생성 후 저장 + Channel channel = new PrivateChannel(users, request.getChannelFormat()); + channelRepository.save(channel); + + // User마다 ReadStatus 생성하기 + for (UUID userID : users) { + Instant lastReadAt = Instant.now(); + ReadStatus readStatus = new ReadStatus(userID, channel.getId(), lastReadAt); + readStatusRepository.save(readStatus); } - @Override - public ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId) { - PrivateChannel findChannel = (PrivateChannel) channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - if (findChannel.getChannelType().equals(ChannelType.PUBLIC)) { - throw new ServiceException(ErrorCode.CHANNEL_TYPE_MISMATCH); - } - - // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. - Instant latestMessageTime = Instant.EPOCH; // 초기값 설정 - List messageList = messageRepository.findAll(); - - for (Message message : messageList) { - if (message.getChannelID().equals(findChannel.getId())) { - if (message.getCreatedAt().isAfter(latestMessageTime)) { - latestMessageTime = message.getCreatedAt(); - } - } - } - - //Private 채널인 경우 참여한 User의 Id 정보를 포함합니다. - return ChannelDTO.PrivateChannelDTO.fromDomain(findChannel, latestMessageTime); + return channel; + } + + @Override + public ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId) { + PublicChannel findChannel = (PublicChannel) channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + + Message lastestMessage = messageRepository.findLatestByChannelId(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + return ChannelDTO.PublicChannelDTO.fromDomain(findChannel, lastestMessage.getCreatedAt()); + } + + @Override + public ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId) { + PrivateChannel findChannel = (PrivateChannel) channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + if (findChannel.getChannelType().equals(ChannelType.PUBLIC)) { + throw new ServiceException(ErrorCode.CHANNEL_TYPE_MISMATCH); } - @UpdateUserStatus - @Override - public List findAllPrivate(UUID userId) { // 통일성을 위해 findAllByUserId보다는 findAllPrivate으로 하였습니다. - // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 - validUser(userId); - - // Private 채널 내에서 userId가 같은 회원을 joinMembers 리스트에 갖고 있는 채널만 선택한다. - List allChannels = channelRepository.findAll(); - return allChannels.stream() - .filter(channel -> channel instanceof PrivateChannel) - .filter(channel -> channel.getJoinMembers().stream() - .anyMatch(userID -> userID.equals(userId))) - .collect(Collectors.toList()); - } + // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. + Instant latestMessageTime = Instant.EPOCH; // 초기값 설정 + List messageList = messageRepository.findAll(); - @Override - public List findAll() { - return channelRepository.findAll(); - } - - @Override - public Channel update(UpdatePublicChannel request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 - validChannel(request.channelId()); - validUser(request.newUserID()); - - PublicChannel updateChannel = (PublicChannel) channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - updateChannel.update(request.name(), request.description(), request.newUserID()); - - channelRepository.save(updateChannel); - return updateChannel; - } - - @Override - public Channel deletePrivate(UUID channelId) { - validChannel(channelId); - - Channel removeChannel = channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - // 채널에 포함된 메시지 삭제하기 - List messages = messageService.findAllByChannelId(channelId); - if (!messages.isEmpty()) { - messages.forEach(message -> messageRepository.delete(message)); + for (Message message : messageList) { + if (message.getChannelID().equals(findChannel.getId())) { + if (message.getCreatedAt().isAfter(latestMessageTime)) { + latestMessageTime = message.getCreatedAt(); } + } + } - // 채널에 포함된 ReadStatus 삭제하기 - List readStatuses = readStatusRepository.findAllByChannelId(channelId); - readStatusRepository.deleteAll(readStatuses); - - channelRepository.delete(removeChannel); - return removeChannel; + //Private 채널인 경우 참여한 User의 Id 정보를 포함합니다. + return ChannelDTO.PrivateChannelDTO.fromDomain(findChannel, latestMessageTime); + } + + @UpdateUserStatus + @Override + public List findAllPrivate( + UUID userId) { // 통일성을 위해 findAllByUserId보다는 findAllPrivate으로 하였습니다. + // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 + validUser(userId); + + // Private 채널 내에서 userId가 같은 회원을 joinMembers 리스트에 갖고 있는 채널만 선택한다. + List allChannels = channelRepository.findAll(); + return allChannels.stream() + .filter(channel -> channel instanceof PrivateChannel) + .filter(channel -> channel.getJoinMembers().stream() + .anyMatch(userID -> userID.equals(userId))) + .collect(Collectors.toList()); + } + + @Override + public List findAll() { + return channelRepository.findAll(); + } + + @Override + public PublicChannel update(UUID channelId, + UpdatePublicChannel request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 + validChannel(channelId); + validUser(request.newUserID()); + + PublicChannel updateChannel = (PublicChannel) channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + updateChannel.update(request.name(), request.description(), request.newUserID()); + + channelRepository.save(updateChannel); + return updateChannel; + } + + @Override + public Channel deletePrivate(UUID channelId) { + validChannel(channelId); + + Channel removeChannel = channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + + // 채널에 포함된 메시지 삭제하기 + List messages = messageService.findAllByChannelId(channelId); + if (!messages.isEmpty()) { + messages.forEach(message -> messageRepository.delete(message)); } - @Override - public Channel deletePublic(UUID channelId) { - validChannel(channelId); + // 채널에 포함된 ReadStatus 삭제하기 + List readStatuses = readStatusRepository.findAllByChannelId(channelId); + readStatusRepository.deleteAll(readStatuses); - Channel removeChannel = channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + channelRepository.delete(removeChannel); + return removeChannel; + } - // 채널에 포함된 메시지 삭제하기 - List messages = messageService.findAllByChannelId(channelId); - if (!messages.isEmpty()) { - messages.forEach(message -> messageRepository.delete(message)); - } + @Override + public Channel deletePublic(UUID channelId) { + validChannel(channelId); - channelRepository.delete(removeChannel); - return removeChannel; - } + Channel removeChannel = channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - // 채널 검증 - private void validChannel(UUID channelId) { - channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + // 채널에 포함된 메시지 삭제하기 + List messages = messageService.findAllByChannelId(channelId); + if (!messages.isEmpty()) { + messages.forEach(message -> messageRepository.delete(message)); } - // 유저 검증 - private void validUser(UUID userId) { - userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - } + channelRepository.delete(removeChannel); + return removeChannel; + } + + // 채널 검증 + private void validChannel(UUID channelId) { + channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } + + // 유저 검증 + private void validUser(UUID userId) { + userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 7ebfa2f24..3a90e11dc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -26,101 +26,103 @@ @Service @RequiredArgsConstructor public class BasicMessageService implements MessageService { - private final MessageRepository messageRepository; - private final UserRepository userRepository; - private final ChannelRepository channelRepository; - private final BinaryContentRepository binaryContentRepository; - private final UserStatusService userStatusService; - - @UpdateUserStatus - @Override - public Message create(UUID writerID, CreateMessageRequest request) { - if (request.content().isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } - // 작성자와 채널에 대한 검증 - validUser(writerID); - validChannel(request.channelID()); - - // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 - if (request.attachmentsID() != null) { - for (UUID attachmentID : request.attachmentsID()) { - Optional attachment = binaryContentRepository.findById(attachmentID); - if (attachment.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); - } - } - } + private final MessageRepository messageRepository; + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + private final BinaryContentRepository binaryContentRepository; - Message message = new Message(request.content(), writerID, request.channelID(), request.attachmentsID()); - messageRepository.save(message); - return message; + @UpdateUserStatus + @Override + public Message create(UUID writerID, CreateMessageRequest request) { + if (request.content().isEmpty()) { + throw new ServiceException(ErrorCode.EMPTY_CONTENT); } - @UpdateReadStatus - @Override - public List findAllByChannelId(UUID channelID) { - validChannel(channelID); + // 작성자와 채널에 대한 검증 + validUser(writerID); + validChannel(request.channelID()); - return messageRepository.findByChannelId(channelID); + // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 + if (request.attachmentsID() != null) { + for (UUID attachmentID : request.attachmentsID()) { + Optional attachment = binaryContentRepository.findById(attachmentID); + if (attachment.isEmpty()) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); + } + } } - @Override - public List getAllMessage() { - return messageRepository.findAll(); + Message message = new Message(request.content(), writerID, request.channelID(), + request.attachmentsID()); + messageRepository.save(message); + return message; + } + + @UpdateReadStatus + @Override + public List findAllByChannelId(UUID channelID) { + validChannel(channelID); + + return messageRepository.findByChannelId(channelID); + } + + @Override + public List getAllMessage() { + return messageRepository.findAll(); + } + + @UpdateUserStatus + @Override + public Message updateMessageContent(UUID messageId, UpdateMessageRequest request) { + validMessage(messageId); + validUser(request.writerId()); + + Message message = messageRepository.findById(messageId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + + // 메시지 수정은 작성자만이 할 수 있다. + if (!message.getWriterID().equals(request.writerId())) { + throw new ServiceException(ErrorCode.MESSAGE_EDIT_NOT_ALLOWED); } - @UpdateUserStatus - @Override - public Message updateMessageContent(UUID writerID, UpdateMessageRequest request) { - validMessage(request.messageID()); - validUser(writerID); + message.update(request.newContent(), request.newAttachment()); - Message message = messageRepository.findById(request.messageID()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + return messageRepository.save(message); + } - // 메시지 수정은 작성자만이 할 수 있다. - if (!message.getWriterID().equals(writerID)) { - throw new ServiceException(ErrorCode.MESSAGE_EDIT_NOT_ALLOWED); - } - message.update(request.newContent(), request.newAttachment()); + @Override + public Message deleteMessage(UUID messageID) { + Message deleteMessage = messageRepository.findById(messageID) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - return messageRepository.save(message); + List attachmentsID = deleteMessage.getAttachmentsID(); + if (attachmentsID != null && !attachmentsID.isEmpty()) { + attachmentsID.forEach(id -> { + binaryContentRepository.findById(id) + .ifPresent(binaryContent -> binaryContentRepository.deleteById(id)); + }); } + Message delete = messageRepository.delete(deleteMessage); + return delete; + } - @Override - public Message deleteMessage(UUID messageID) { - Message deleteMessage = messageRepository.findById(messageID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - - List attachmentsID = deleteMessage.getAttachmentsID(); - if (attachmentsID != null && !attachmentsID.isEmpty()) { - attachmentsID.forEach(id -> { - binaryContentRepository.findById(id) - .ifPresent(binaryContent -> binaryContentRepository.deleteById(id)); - }); - } - - Message delete = messageRepository.delete(deleteMessage); - return delete; - } - - private void validUser(UUID userId) { - if (!userRepository.userExistById(userId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } + private void validUser(UUID userId) { + if (!userRepository.userExistById(userId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } + } - private void validChannel(UUID channelId) { - if (!channelRepository.channelExistById(channelId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); - } + private void validChannel(UUID channelId) { + if (!channelRepository.channelExistById(channelId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); } + } - private void validMessage(UUID messageId) { - messageRepository.findById(messageId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - } + private void validMessage(UUID messageId) { + messageRepository.findById(messageId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + } } \ No newline at end of file diff --git a/src/main/resources/static/fe_1.0.0/assets/index-CRrRqFH4.js b/src/main/resources/static/fe_1.0.0/assets/index-CRrRqFH4.js new file mode 100644 index 000000000..ffeaa39b4 --- /dev/null +++ b/src/main/resources/static/fe_1.0.0/assets/index-CRrRqFH4.js @@ -0,0 +1,956 @@ +(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))u(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const p of d.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&u(p)}).observe(document,{childList:!0,subtree:!0});function s(c){const d={};return c.integrity&&(d.integrity=c.integrity),c.referrerPolicy&&(d.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?d.credentials="include":c.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function u(c){if(c.ep)return;c.ep=!0;const d=s(c);fetch(c.href,d)}})();function Qm(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var lu={exports:{}},ho={},uu={exports:{}},fe={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Wf;function qm(){if(Wf)return fe;Wf=1;var r=Symbol.for("react.element"),i=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),d=Symbol.for("react.provider"),p=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),E=Symbol.for("react.lazy"),j=Symbol.iterator;function O(S){return S===null||typeof S!="object"?null:(S=j&&S[j]||S["@@iterator"],typeof S=="function"?S:null)}var P={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},I=Object.assign,R={};function L(S,D,oe){this.props=S,this.context=D,this.refs=R,this.updater=oe||P}L.prototype.isReactComponent={},L.prototype.setState=function(S,D){if(typeof S!="object"&&typeof S!="function"&&S!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,S,D,"setState")},L.prototype.forceUpdate=function(S){this.updater.enqueueForceUpdate(this,S,"forceUpdate")};function V(){}V.prototype=L.prototype;function F(S,D,oe){this.props=S,this.context=D,this.refs=R,this.updater=oe||P}var W=F.prototype=new V;W.constructor=F,I(W,L.prototype),W.isPureReactComponent=!0;var K=Array.isArray,$=Object.prototype.hasOwnProperty,T={current:null},H={key:!0,ref:!0,__self:!0,__source:!0};function se(S,D,oe){var le,de={},ce=null,ve=null;if(D!=null)for(le in D.ref!==void 0&&(ve=D.ref),D.key!==void 0&&(ce=""+D.key),D)$.call(D,le)&&!H.hasOwnProperty(le)&&(de[le]=D[le]);var pe=arguments.length-2;if(pe===1)de.children=oe;else if(1>>1,D=Q[S];if(0>>1;Sc(de,q))cec(ve,de)?(Q[S]=ve,Q[ce]=q,S=ce):(Q[S]=de,Q[le]=q,S=le);else if(cec(ve,q))Q[S]=ve,Q[ce]=q,S=ce;else break e}}return ee}function c(Q,ee){var q=Q.sortIndex-ee.sortIndex;return q!==0?q:Q.id-ee.id}if(typeof performance=="object"&&typeof performance.now=="function"){var d=performance;r.unstable_now=function(){return d.now()}}else{var p=Date,m=p.now();r.unstable_now=function(){return p.now()-m}}var v=[],x=[],E=1,j=null,O=3,P=!1,I=!1,R=!1,L=typeof setTimeout=="function"?setTimeout:null,V=typeof clearTimeout=="function"?clearTimeout:null,F=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function W(Q){for(var ee=s(x);ee!==null;){if(ee.callback===null)u(x);else if(ee.startTime<=Q)u(x),ee.sortIndex=ee.expirationTime,i(v,ee);else break;ee=s(x)}}function K(Q){if(R=!1,W(Q),!I)if(s(v)!==null)I=!0,We($);else{var ee=s(x);ee!==null&&Se(K,ee.startTime-Q)}}function $(Q,ee){I=!1,R&&(R=!1,V(se),se=-1),P=!0;var q=O;try{for(W(ee),j=s(v);j!==null&&(!(j.expirationTime>ee)||Q&&!qt());){var S=j.callback;if(typeof S=="function"){j.callback=null,O=j.priorityLevel;var D=S(j.expirationTime<=ee);ee=r.unstable_now(),typeof D=="function"?j.callback=D:j===s(v)&&u(v),W(ee)}else u(v);j=s(v)}if(j!==null)var oe=!0;else{var le=s(x);le!==null&&Se(K,le.startTime-ee),oe=!1}return oe}finally{j=null,O=q,P=!1}}var T=!1,H=null,se=-1,Ve=5,At=-1;function qt(){return!(r.unstable_now()-AtQ||125S?(Q.sortIndex=q,i(x,Q),s(v)===null&&Q===s(x)&&(R?(V(se),se=-1):R=!0,Se(K,q-S))):(Q.sortIndex=D,i(v,Q),I||P||(I=!0,We($))),Q},r.unstable_shouldYield=qt,r.unstable_wrapCallback=function(Q){var ee=O;return function(){var q=O;O=ee;try{return Q.apply(this,arguments)}finally{O=q}}}}(fu)),fu}var Yf;function Km(){return Yf||(Yf=1,cu.exports=Ym()),cu.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Kf;function Xm(){if(Kf)return st;Kf=1;var r=Bu(),i=Km();function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),v=Object.prototype.hasOwnProperty,x=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,E={},j={};function O(e){return v.call(j,e)?!0:v.call(E,e)?!1:x.test(e)?j[e]=!0:(E[e]=!0,!1)}function P(e,t,n,o){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function I(e,t,n,o){if(t===null||typeof t>"u"||P(e,t,n,o))return!0;if(o)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function R(e,t,n,o,l,a,f){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=f}var L={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){L[e]=new R(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];L[t]=new R(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){L[e]=new R(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){L[e]=new R(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){L[e]=new R(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){L[e]=new R(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){L[e]=new R(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){L[e]=new R(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){L[e]=new R(e,5,!1,e.toLowerCase(),null,!1,!1)});var V=/[\-:]([a-z])/g;function F(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(V,F);L[t]=new R(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(V,F);L[t]=new R(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(V,F);L[t]=new R(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){L[e]=new R(e,1,!1,e.toLowerCase(),null,!1,!1)}),L.xlinkHref=new R("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){L[e]=new R(e,1,!1,e.toLowerCase(),null,!0,!0)});function W(e,t,n,o){var l=L.hasOwnProperty(t)?L[t]:null;(l!==null?l.type!==0:o||!(2h||l[f]!==a[h]){var y=` +`+l[f].replace(" at new "," at ");return e.displayName&&y.includes("")&&(y=y.replace("",e.displayName)),y}while(1<=f&&0<=h);break}}}finally{oe=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?D(e):""}function de(e){switch(e.tag){case 5:return D(e.type);case 16:return D("Lazy");case 13:return D("Suspense");case 19:return D("SuspenseList");case 0:case 2:case 15:return e=le(e.type,!1),e;case 11:return e=le(e.type.render,!1),e;case 1:return e=le(e.type,!0),e;default:return""}}function ce(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case H:return"Fragment";case T:return"Portal";case Ve:return"Profiler";case se:return"StrictMode";case Je:return"Suspense";case at:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case qt:return(e.displayName||"Context")+".Consumer";case At:return(e._context.displayName||"Context")+".Provider";case gt:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case yt:return t=e.displayName||null,t!==null?t:ce(e.type)||"Memo";case We:t=e._payload,e=e._init;try{return ce(e(t))}catch{}}return null}function ve(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ce(t);case 8:return t===se?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function pe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ge(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Be(e){var t=ge(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(f){o=""+f,a.call(this,f)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(f){o=""+f},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function bt(e){e._valueTracker||(e._valueTracker=Be(e))}function Rt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=ge(e)?e.checked?"true":"false":e.value),e=o,e!==n?(t.setValue(e),!0):!1}function Ao(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function hs(e,t){var n=t.checked;return q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Ku(e,t){var n=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;n=pe(t.value!=null?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Xu(e,t){t=t.checked,t!=null&&W(e,"checked",t,!1)}function ms(e,t){Xu(e,t);var n=pe(t.value),o=t.type;if(n!=null)o==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?gs(e,t.type,n):t.hasOwnProperty("defaultValue")&&gs(e,t.type,pe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ju(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function gs(e,t,n){(t!=="number"||Ao(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var jr=Array.isArray;function Gn(e,t,n,o){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Ro.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ir(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var _r={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Kp=["Webkit","ms","Moz","O"];Object.keys(_r).forEach(function(e){Kp.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),_r[t]=_r[e]})});function oa(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||_r.hasOwnProperty(e)&&_r[e]?(""+t).trim():t+"px"}function ia(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var o=n.indexOf("--")===0,l=oa(n,t[n],o);n==="float"&&(n="cssFloat"),o?e.setProperty(n,l):e[n]=l}}var Xp=q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ws(e,t){if(t){if(Xp[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(s(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(s(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(t.style!=null&&typeof t.style!="object")throw Error(s(62))}}function xs(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ss=null;function ks(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Es=null,Yn=null,Kn=null;function sa(e){if(e=Jr(e)){if(typeof Es!="function")throw Error(s(280));var t=e.stateNode;t&&(t=Yo(t),Es(e.stateNode,e.type,t))}}function la(e){Yn?Kn?Kn.push(e):Kn=[e]:Yn=e}function ua(){if(Yn){var e=Yn,t=Kn;if(Kn=Yn=null,sa(e),t)for(e=0;e>>=0,e===0?32:31-(uh(e)/ah|0)|0}var No=64,Oo=4194304;function Lr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function To(e,t){var n=e.pendingLanes;if(n===0)return 0;var o=0,l=e.suspendedLanes,a=e.pingedLanes,f=n&268435455;if(f!==0){var h=f&~l;h!==0?o=Lr(h):(a&=f,a!==0&&(o=Lr(a)))}else f=n&~l,f!==0?o=Lr(f):a!==0&&(o=Lr(a));if(o===0)return 0;if(t!==0&&t!==o&&!(t&l)&&(l=o&-o,a=t&-t,l>=a||l===16&&(a&4194240)!==0))return t;if(o&4&&(o|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0n;n++)t.push(e);return t}function Dr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Pt(t),e[t]=n}function ph(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Vr),za=" ",Ma=!1;function Ua(e,t){switch(e){case"keyup":return $h.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Fa(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Zn=!1;function Vh(e,t){switch(e){case"compositionend":return Fa(t);case"keypress":return t.which!==32?null:(Ma=!0,za);case"textInput":return e=t.data,e===za&&Ma?null:e;default:return null}}function Wh(e,t){if(Zn)return e==="compositionend"||!$s&&Ua(e,t)?(e=_a(),Uo=Ds=an=null,Zn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=o}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=qa(n)}}function Ga(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ga(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ya(){for(var e=window,t=Ao();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ao(e.document)}return t}function Ws(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Zh(e){var t=Ya(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ga(n.ownerDocument.documentElement,n)){if(o!==null&&Ws(n)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,a=Math.min(o.start,l);o=o.end===void 0?a:Math.min(o.end,l),!e.extend&&a>o&&(l=o,o=a,a=l),l=ba(n,a);var f=ba(n,o);l&&f&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==f.node||e.focusOffset!==f.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),a>o?(e.addRange(t),e.extend(f.node,f.offset)):(t.setEnd(f.node,f.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,er=null,Qs=null,br=null,qs=!1;function Ka(e,t,n){var o=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;qs||er==null||er!==Ao(o)||(o=er,"selectionStart"in o&&Ws(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),br&&qr(br,o)||(br=o,o=qo(Qs,"onSelect"),0ir||(e.current=ol[ir],ol[ir]=null,ir--)}function ke(e,t){ir++,ol[ir]=e.current,e.current=t}var pn={},Qe=dn(pn),tt=dn(!1),Pn=pn;function sr(e,t){var n=e.type.contextTypes;if(!n)return pn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var l={},a;for(a in n)l[a]=t[a];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function nt(e){return e=e.childContextTypes,e!=null}function Ko(){Ce(tt),Ce(Qe)}function fc(e,t,n){if(Qe.current!==pn)throw Error(s(168));ke(Qe,t),ke(tt,n)}function dc(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return n;o=o.getChildContext();for(var l in o)if(!(l in t))throw Error(s(108,ve(e)||"Unknown",l));return q({},n,o)}function Xo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||pn,Pn=Qe.current,ke(Qe,e),ke(tt,tt.current),!0}function pc(e,t,n){var o=e.stateNode;if(!o)throw Error(s(169));n?(e=dc(e,t,Pn),o.__reactInternalMemoizedMergedChildContext=e,Ce(tt),Ce(Qe),ke(Qe,e)):Ce(tt),ke(tt,n)}var Yt=null,Jo=!1,il=!1;function hc(e){Yt===null?Yt=[e]:Yt.push(e)}function fm(e){Jo=!0,hc(e)}function hn(){if(!il&&Yt!==null){il=!0;var e=0,t=xe;try{var n=Yt;for(xe=1;e>=f,l-=f,Kt=1<<32-Pt(t)+l|n<re?(Ue=ne,ne=null):Ue=ne.sibling;var ye=z(k,ne,C[re],B);if(ye===null){ne===null&&(ne=Ue);break}e&&ne&&ye.alternate===null&&t(k,ne),w=a(ye,w,re),te===null?Z=ye:te.sibling=ye,te=ye,ne=Ue}if(re===C.length)return n(k,ne),Re&&In(k,re),Z;if(ne===null){for(;rere?(Ue=ne,ne=null):Ue=ne.sibling;var En=z(k,ne,ye.value,B);if(En===null){ne===null&&(ne=Ue);break}e&&ne&&En.alternate===null&&t(k,ne),w=a(En,w,re),te===null?Z=En:te.sibling=En,te=En,ne=Ue}if(ye.done)return n(k,ne),Re&&In(k,re),Z;if(ne===null){for(;!ye.done;re++,ye=C.next())ye=U(k,ye.value,B),ye!==null&&(w=a(ye,w,re),te===null?Z=ye:te.sibling=ye,te=ye);return Re&&In(k,re),Z}for(ne=o(k,ne);!ye.done;re++,ye=C.next())ye=b(ne,k,re,ye.value,B),ye!==null&&(e&&ye.alternate!==null&&ne.delete(ye.key===null?re:ye.key),w=a(ye,w,re),te===null?Z=ye:te.sibling=ye,te=ye);return e&&ne.forEach(function(Wm){return t(k,Wm)}),Re&&In(k,re),Z}function Ne(k,w,C,B){if(typeof C=="object"&&C!==null&&C.type===H&&C.key===null&&(C=C.props.children),typeof C=="object"&&C!==null){switch(C.$$typeof){case $:e:{for(var Z=C.key,te=w;te!==null;){if(te.key===Z){if(Z=C.type,Z===H){if(te.tag===7){n(k,te.sibling),w=l(te,C.props.children),w.return=k,k=w;break e}}else if(te.elementType===Z||typeof Z=="object"&&Z!==null&&Z.$$typeof===We&&xc(Z)===te.type){n(k,te.sibling),w=l(te,C.props),w.ref=Zr(k,te,C),w.return=k,k=w;break e}n(k,te);break}else t(k,te);te=te.sibling}C.type===H?(w=Mn(C.props.children,k.mode,B,C.key),w.return=k,k=w):(B=Ri(C.type,C.key,C.props,null,k.mode,B),B.ref=Zr(k,w,C),B.return=k,k=B)}return f(k);case T:e:{for(te=C.key;w!==null;){if(w.key===te)if(w.tag===4&&w.stateNode.containerInfo===C.containerInfo&&w.stateNode.implementation===C.implementation){n(k,w.sibling),w=l(w,C.children||[]),w.return=k,k=w;break e}else{n(k,w);break}else t(k,w);w=w.sibling}w=nu(C,k.mode,B),w.return=k,k=w}return f(k);case We:return te=C._init,Ne(k,w,te(C._payload),B)}if(jr(C))return Y(k,w,C,B);if(ee(C))return X(k,w,C,B);ni(k,C)}return typeof C=="string"&&C!==""||typeof C=="number"?(C=""+C,w!==null&&w.tag===6?(n(k,w.sibling),w=l(w,C),w.return=k,k=w):(n(k,w),w=tu(C,k.mode,B),w.return=k,k=w),f(k)):n(k,w)}return Ne}var cr=Sc(!0),kc=Sc(!1),ri=dn(null),oi=null,fr=null,fl=null;function dl(){fl=fr=oi=null}function pl(e){var t=ri.current;Ce(ri),e._currentValue=t}function hl(e,t,n){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function dr(e,t){oi=e,fl=fr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(rt=!0),e.firstContext=null)}function xt(e){var t=e._currentValue;if(fl!==e)if(e={context:e,memoizedValue:t,next:null},fr===null){if(oi===null)throw Error(s(308));fr=e,oi.dependencies={lanes:0,firstContext:e}}else fr=fr.next=e;return t}var _n=null;function ml(e){_n===null?_n=[e]:_n.push(e)}function Ec(e,t,n,o){var l=t.interleaved;return l===null?(n.next=n,ml(t)):(n.next=l.next,l.next=n),t.interleaved=n,Jt(e,o)}function Jt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var mn=!1;function gl(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Cc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Zt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function gn(e,t,n){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,me&2){var l=o.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),o.pending=t,Jt(e,n)}return l=o.interleaved,l===null?(t.next=t,ml(o)):(t.next=l.next,l.next=t),o.interleaved=t,Jt(e,n)}function ii(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,_s(e,n)}}function Ac(e,t){var n=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,n===o)){var l=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var f={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};a===null?l=a=f:a=a.next=f,n=n.next}while(n!==null);a===null?l=a=t:a=a.next=t}else l=a=t;n={baseState:o.baseState,firstBaseUpdate:l,lastBaseUpdate:a,shared:o.shared,effects:o.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function si(e,t,n,o){var l=e.updateQueue;mn=!1;var a=l.firstBaseUpdate,f=l.lastBaseUpdate,h=l.shared.pending;if(h!==null){l.shared.pending=null;var y=h,A=y.next;y.next=null,f===null?a=A:f.next=A,f=y;var M=e.alternate;M!==null&&(M=M.updateQueue,h=M.lastBaseUpdate,h!==f&&(h===null?M.firstBaseUpdate=A:h.next=A,M.lastBaseUpdate=y))}if(a!==null){var U=l.baseState;f=0,M=A=y=null,h=a;do{var z=h.lane,b=h.eventTime;if((o&z)===z){M!==null&&(M=M.next={eventTime:b,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,next:null});e:{var Y=e,X=h;switch(z=t,b=n,X.tag){case 1:if(Y=X.payload,typeof Y=="function"){U=Y.call(b,U,z);break e}U=Y;break e;case 3:Y.flags=Y.flags&-65537|128;case 0:if(Y=X.payload,z=typeof Y=="function"?Y.call(b,U,z):Y,z==null)break e;U=q({},U,z);break e;case 2:mn=!0}}h.callback!==null&&h.lane!==0&&(e.flags|=64,z=l.effects,z===null?l.effects=[h]:z.push(h))}else b={eventTime:b,lane:z,tag:h.tag,payload:h.payload,callback:h.callback,next:null},M===null?(A=M=b,y=U):M=M.next=b,f|=z;if(h=h.next,h===null){if(h=l.shared.pending,h===null)break;z=h,h=z.next,z.next=null,l.lastBaseUpdate=z,l.shared.pending=null}}while(!0);if(M===null&&(y=U),l.baseState=y,l.firstBaseUpdate=A,l.lastBaseUpdate=M,t=l.shared.interleaved,t!==null){l=t;do f|=l.lane,l=l.next;while(l!==t)}else a===null&&(l.shared.lanes=0);Tn|=f,e.lanes=f,e.memoizedState=U}}function Rc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var o=Sl.transition;Sl.transition={};try{e(!1),t()}finally{xe=n,Sl.transition=o}}function Qc(){return St().memoizedState}function mm(e,t,n){var o=xn(e);if(n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},qc(e))bc(t,n);else if(n=Ec(e,t,n,o),n!==null){var l=et();Tt(n,e,o,l),Gc(n,t,o)}}function gm(e,t,n){var o=xn(e),l={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(qc(e))bc(t,l);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var f=t.lastRenderedState,h=a(f,n);if(l.hasEagerState=!0,l.eagerState=h,jt(h,f)){var y=t.interleaved;y===null?(l.next=l,ml(t)):(l.next=y.next,y.next=l),t.interleaved=l;return}}catch{}finally{}n=Ec(e,t,l,o),n!==null&&(l=et(),Tt(n,e,o,l),Gc(n,t,o))}}function qc(e){var t=e.alternate;return e===je||t!==null&&t===je}function bc(e,t){ro=ai=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Gc(e,t,n){if(n&4194240){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,_s(e,n)}}var di={readContext:xt,useCallback:qe,useContext:qe,useEffect:qe,useImperativeHandle:qe,useInsertionEffect:qe,useLayoutEffect:qe,useMemo:qe,useReducer:qe,useRef:qe,useState:qe,useDebugValue:qe,useDeferredValue:qe,useTransition:qe,useMutableSource:qe,useSyncExternalStore:qe,useId:qe,unstable_isNewReconciler:!1},ym={readContext:xt,useCallback:function(e,t){return Bt().memoizedState=[e,t===void 0?null:t],e},useContext:xt,useEffect:Mc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ci(4194308,4,Bc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ci(4194308,4,e,t)},useInsertionEffect:function(e,t){return ci(4,2,e,t)},useMemo:function(e,t){var n=Bt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=Bt();return t=n!==void 0?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=mm.bind(null,je,e),[o.memoizedState,e]},useRef:function(e){var t=Bt();return e={current:e},t.memoizedState=e},useState:Dc,useDebugValue:jl,useDeferredValue:function(e){return Bt().memoizedState=e},useTransition:function(){var e=Dc(!1),t=e[0];return e=hm.bind(null,e[1]),Bt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=je,l=Bt();if(Re){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),Me===null)throw Error(s(349));On&30||_c(o,t,n)}l.memoizedState=n;var a={value:n,getSnapshot:t};return l.queue=a,Mc(Oc.bind(null,o,a,e),[e]),o.flags|=2048,so(9,Nc.bind(null,o,a,n,t),void 0,null),n},useId:function(){var e=Bt(),t=Me.identifierPrefix;if(Re){var n=Xt,o=Kt;n=(o&~(1<<32-Pt(o)-1)).toString(32)+n,t=":"+t+"R"+n,n=oo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=f.createElement(n,{is:o.is}):(e=f.createElement(n),n==="select"&&(f=e,o.multiple?f.multiple=!0:o.size&&(f.size=o.size))):e=f.createElementNS(e,n),e[Ut]=t,e[Xr]=o,mf(e,t,!1,!1),t.stateNode=e;e:{switch(f=xs(n,o),n){case"dialog":Ee("cancel",e),Ee("close",e),l=o;break;case"iframe":case"object":case"embed":Ee("load",e),l=o;break;case"video":case"audio":for(l=0;lyr&&(t.flags|=128,o=!0,lo(a,!1),t.lanes=4194304)}else{if(!o)if(e=li(f),e!==null){if(t.flags|=128,o=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),lo(a,!0),a.tail===null&&a.tailMode==="hidden"&&!f.alternate&&!Re)return be(t),null}else 2*_e()-a.renderingStartTime>yr&&n!==1073741824&&(t.flags|=128,o=!0,lo(a,!1),t.lanes=4194304);a.isBackwards?(f.sibling=t.child,t.child=f):(n=a.last,n!==null?n.sibling=f:t.child=f,a.last=f)}return a.tail!==null?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=_e(),t.sibling=null,n=Pe.current,ke(Pe,o?n&1|2:n&1),t):(be(t),null);case 22:case 23:return Jl(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&t.mode&1?pt&1073741824&&(be(t),t.subtreeFlags&6&&(t.flags|=8192)):be(t),null;case 24:return null;case 25:return null}throw Error(s(156,t.tag))}function Am(e,t){switch(ll(t),t.tag){case 1:return nt(t.type)&&Ko(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return pr(),Ce(tt),Ce(Qe),xl(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return vl(t),null;case 13:if(Ce(Pe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));ar()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ce(Pe),null;case 4:return pr(),null;case 10:return pl(t.type._context),null;case 22:case 23:return Jl(),null;case 24:return null;default:return null}}var gi=!1,Ge=!1,Rm=typeof WeakSet=="function"?WeakSet:Set,G=null;function mr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(o){Ie(e,t,o)}else n.current=null}function Bl(e,t,n){try{n()}catch(o){Ie(e,t,o)}}var vf=!1;function Pm(e,t){if(Js=zo,e=Ya(),Ws(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var o=n.getSelection&&n.getSelection();if(o&&o.rangeCount!==0){n=o.anchorNode;var l=o.anchorOffset,a=o.focusNode;o=o.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break e}var f=0,h=-1,y=-1,A=0,M=0,U=e,z=null;t:for(;;){for(var b;U!==n||l!==0&&U.nodeType!==3||(h=f+l),U!==a||o!==0&&U.nodeType!==3||(y=f+o),U.nodeType===3&&(f+=U.nodeValue.length),(b=U.firstChild)!==null;)z=U,U=b;for(;;){if(U===e)break t;if(z===n&&++A===l&&(h=f),z===a&&++M===o&&(y=f),(b=U.nextSibling)!==null)break;U=z,z=U.parentNode}U=b}n=h===-1||y===-1?null:{start:h,end:y}}else n=null}n=n||{start:0,end:0}}else n=null;for(Zs={focusedElem:e,selectionRange:n},zo=!1,G=t;G!==null;)if(t=G,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,G=e;else for(;G!==null;){t=G;try{var Y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(Y!==null){var X=Y.memoizedProps,Ne=Y.memoizedState,k=t.stateNode,w=k.getSnapshotBeforeUpdate(t.elementType===t.type?X:_t(t.type,X),Ne);k.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var C=t.stateNode.containerInfo;C.nodeType===1?C.textContent="":C.nodeType===9&&C.documentElement&&C.removeChild(C.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(s(163))}}catch(B){Ie(t,t.return,B)}if(e=t.sibling,e!==null){e.return=t.return,G=e;break}G=t.return}return Y=vf,vf=!1,Y}function uo(e,t,n){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var l=o=o.next;do{if((l.tag&e)===e){var a=l.destroy;l.destroy=void 0,a!==void 0&&Bl(t,n,a)}l=l.next}while(l!==o)}}function yi(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function $l(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function wf(e){var t=e.alternate;t!==null&&(e.alternate=null,wf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ut],delete t[Xr],delete t[rl],delete t[am],delete t[cm])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function xf(e){return e.tag===5||e.tag===3||e.tag===4}function Sf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||xf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Hl(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Go));else if(o!==4&&(e=e.child,e!==null))for(Hl(e,t,n),e=e.sibling;e!==null;)Hl(e,t,n),e=e.sibling}function Vl(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Vl(e,t,n),e=e.sibling;e!==null;)Vl(e,t,n),e=e.sibling}var $e=null,Nt=!1;function yn(e,t,n){for(n=n.child;n!==null;)kf(e,t,n),n=n.sibling}function kf(e,t,n){if(Mt&&typeof Mt.onCommitFiberUnmount=="function")try{Mt.onCommitFiberUnmount(_o,n)}catch{}switch(n.tag){case 5:Ge||mr(n,t);case 6:var o=$e,l=Nt;$e=null,yn(e,t,n),$e=o,Nt=l,$e!==null&&(Nt?(e=$e,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):$e.removeChild(n.stateNode));break;case 18:$e!==null&&(Nt?(e=$e,n=n.stateNode,e.nodeType===8?nl(e.parentNode,n):e.nodeType===1&&nl(e,n),Br(e)):nl($e,n.stateNode));break;case 4:o=$e,l=Nt,$e=n.stateNode.containerInfo,Nt=!0,yn(e,t,n),$e=o,Nt=l;break;case 0:case 11:case 14:case 15:if(!Ge&&(o=n.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){l=o=o.next;do{var a=l,f=a.destroy;a=a.tag,f!==void 0&&(a&2||a&4)&&Bl(n,t,f),l=l.next}while(l!==o)}yn(e,t,n);break;case 1:if(!Ge&&(mr(n,t),o=n.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(h){Ie(n,t,h)}yn(e,t,n);break;case 21:yn(e,t,n);break;case 22:n.mode&1?(Ge=(o=Ge)||n.memoizedState!==null,yn(e,t,n),Ge=o):yn(e,t,n);break;default:yn(e,t,n)}}function Ef(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Rm),t.forEach(function(o){var l=zm.bind(null,e,o);n.has(o)||(n.add(o),o.then(l,l))})}}function Ot(e,t){var n=t.deletions;if(n!==null)for(var o=0;ol&&(l=f),o&=~a}if(o=l,o=_e()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Im(o/1960))-o,10e?16:e,wn===null)var o=!1;else{if(e=wn,wn=null,ki=0,me&6)throw Error(s(331));var l=me;for(me|=4,G=e.current;G!==null;){var a=G,f=a.child;if(G.flags&16){var h=a.deletions;if(h!==null){for(var y=0;y_e()-ql?Dn(e,0):Ql|=n),it(e,t)}function zf(e,t){t===0&&(e.mode&1?(t=Oo,Oo<<=1,!(Oo&130023424)&&(Oo=4194304)):t=1);var n=et();e=Jt(e,t),e!==null&&(Dr(e,t,n),it(e,n))}function Dm(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),zf(e,n)}function zm(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(s(314))}o!==null&&o.delete(t),zf(e,n)}var Mf;Mf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||tt.current)rt=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return rt=!1,Em(e,t,n);rt=!!(e.flags&131072)}else rt=!1,Re&&t.flags&1048576&&mc(t,ei,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;mi(e,t),e=t.pendingProps;var l=sr(t,Qe.current);dr(t,n),l=El(null,t,o,e,l,n);var a=Cl();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,nt(o)?(a=!0,Xo(t)):a=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,gl(t),l.updater=pi,t.stateNode=l,l._reactInternals=t,_l(t,o,e,n),t=Ll(null,t,o,!0,a,n)):(t.tag=0,Re&&a&&sl(t),Ze(null,t,l,n),t=t.child),t;case 16:o=t.elementType;e:{switch(mi(e,t),e=t.pendingProps,l=o._init,o=l(o._payload),t.type=o,l=t.tag=Um(o),e=_t(o,e),l){case 0:t=Tl(null,t,o,e,n);break e;case 1:t=af(null,t,o,e,n);break e;case 11:t=rf(null,t,o,e,n);break e;case 14:t=of(null,t,o,_t(o.type,e),n);break e}throw Error(s(306,o,""))}return t;case 0:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),Tl(e,t,o,l,n);case 1:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),af(e,t,o,l,n);case 3:e:{if(cf(t),e===null)throw Error(s(387));o=t.pendingProps,a=t.memoizedState,l=a.element,Cc(e,t),si(t,o,null,n);var f=t.memoizedState;if(o=f.element,a.isDehydrated)if(a={element:o,isDehydrated:!1,cache:f.cache,pendingSuspenseBoundaries:f.pendingSuspenseBoundaries,transitions:f.transitions},t.updateQueue.baseState=a,t.memoizedState=a,t.flags&256){l=hr(Error(s(423)),t),t=ff(e,t,o,n,l);break e}else if(o!==l){l=hr(Error(s(424)),t),t=ff(e,t,o,n,l);break e}else for(dt=fn(t.stateNode.containerInfo.firstChild),ft=t,Re=!0,It=null,n=kc(t,null,o,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(ar(),o===l){t=en(e,t,n);break e}Ze(e,t,o,n)}t=t.child}return t;case 5:return Pc(t),e===null&&al(t),o=t.type,l=t.pendingProps,a=e!==null?e.memoizedProps:null,f=l.children,el(o,l)?f=null:a!==null&&el(o,a)&&(t.flags|=32),uf(e,t),Ze(e,t,f,n),t.child;case 6:return e===null&&al(t),null;case 13:return df(e,t,n);case 4:return yl(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=cr(t,null,o,n):Ze(e,t,o,n),t.child;case 11:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),rf(e,t,o,l,n);case 7:return Ze(e,t,t.pendingProps,n),t.child;case 8:return Ze(e,t,t.pendingProps.children,n),t.child;case 12:return Ze(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,l=t.pendingProps,a=t.memoizedProps,f=l.value,ke(ri,o._currentValue),o._currentValue=f,a!==null)if(jt(a.value,f)){if(a.children===l.children&&!tt.current){t=en(e,t,n);break e}}else for(a=t.child,a!==null&&(a.return=t);a!==null;){var h=a.dependencies;if(h!==null){f=a.child;for(var y=h.firstContext;y!==null;){if(y.context===o){if(a.tag===1){y=Zt(-1,n&-n),y.tag=2;var A=a.updateQueue;if(A!==null){A=A.shared;var M=A.pending;M===null?y.next=y:(y.next=M.next,M.next=y),A.pending=y}}a.lanes|=n,y=a.alternate,y!==null&&(y.lanes|=n),hl(a.return,n,t),h.lanes|=n;break}y=y.next}}else if(a.tag===10)f=a.type===t.type?null:a.child;else if(a.tag===18){if(f=a.return,f===null)throw Error(s(341));f.lanes|=n,h=f.alternate,h!==null&&(h.lanes|=n),hl(f,n,t),f=a.sibling}else f=a.child;if(f!==null)f.return=a;else for(f=a;f!==null;){if(f===t){f=null;break}if(a=f.sibling,a!==null){a.return=f.return,f=a;break}f=f.return}a=f}Ze(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,o=t.pendingProps.children,dr(t,n),l=xt(l),o=o(l),t.flags|=1,Ze(e,t,o,n),t.child;case 14:return o=t.type,l=_t(o,t.pendingProps),l=_t(o.type,l),of(e,t,o,l,n);case 15:return sf(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),mi(e,t),t.tag=1,nt(o)?(e=!0,Xo(t)):e=!1,dr(t,n),Kc(t,o,l),_l(t,o,l,n),Ll(null,t,o,!0,e,n);case 19:return hf(e,t,n);case 22:return lf(e,t,n)}throw Error(s(156,t.tag))};function Uf(e,t){return ga(e,t)}function Mm(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Et(e,t,n,o){return new Mm(e,t,n,o)}function eu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Um(e){if(typeof e=="function")return eu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===gt)return 11;if(e===yt)return 14}return 2}function kn(e,t){var n=e.alternate;return n===null?(n=Et(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ri(e,t,n,o,l,a){var f=2;if(o=e,typeof e=="function")eu(e)&&(f=1);else if(typeof e=="string")f=5;else e:switch(e){case H:return Mn(n.children,l,a,t);case se:f=8,l|=8;break;case Ve:return e=Et(12,n,t,l|2),e.elementType=Ve,e.lanes=a,e;case Je:return e=Et(13,n,t,l),e.elementType=Je,e.lanes=a,e;case at:return e=Et(19,n,t,l),e.elementType=at,e.lanes=a,e;case Se:return Pi(n,l,a,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case At:f=10;break e;case qt:f=9;break e;case gt:f=11;break e;case yt:f=14;break e;case We:f=16,o=null;break e}throw Error(s(130,e==null?e:typeof e,""))}return t=Et(f,n,t,l),t.elementType=e,t.type=o,t.lanes=a,t}function Mn(e,t,n,o){return e=Et(7,e,o,t),e.lanes=n,e}function Pi(e,t,n,o){return e=Et(22,e,o,t),e.elementType=Se,e.lanes=n,e.stateNode={isHidden:!1},e}function tu(e,t,n){return e=Et(6,e,null,t),e.lanes=n,e}function nu(e,t,n){return t=Et(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Fm(e,t,n,o,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Is(0),this.expirationTimes=Is(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Is(0),this.identifierPrefix=o,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function ru(e,t,n,o,l,a,f,h,y){return e=new Fm(e,t,n,h,y),t===1?(t=1,a===!0&&(t|=8)):t=0,a=Et(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},gl(a),e}function Bm(e,t,n){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),au.exports=Xm(),au.exports}var Jf;function Zm(){if(Jf)return Li;Jf=1;var r=Jm();return Li.createRoot=r.createRoot,Li.hydrateRoot=r.hydrateRoot,Li}var eg=Zm(),Ke=function(){return Ke=Object.assign||function(i){for(var s,u=1,c=arguments.length;u0?Fe(Ar,--Ct):0,kr--,Te===10&&(kr=1,rs--),Te}function Lt(){return Te=Ct2||Au(Te)>3?"":" "}function cg(r,i){for(;--i&&Lt()&&!(Te<48||Te>102||Te>57&&Te<65||Te>70&&Te<97););return is(r,Hi()+(i<6&&$n()==32&&Lt()==32))}function Ru(r){for(;Lt();)switch(Te){case r:return Ct;case 34:case 39:r!==34&&r!==39&&Ru(Te);break;case 40:r===41&&Ru(r);break;case 92:Lt();break}return Ct}function fg(r,i){for(;Lt()&&r+Te!==57;)if(r+Te===84&&$n()===47)break;return"/*"+is(i,Ct-1)+"*"+Hu(r===47?r:Lt())}function dg(r){for(;!Au($n());)Lt();return is(r,Ct)}function pg(r){return ug(Vi("",null,null,null,[""],r=lg(r),0,[0],r))}function Vi(r,i,s,u,c,d,p,m,v){for(var x=0,E=0,j=p,O=0,P=0,I=0,R=1,L=1,V=1,F=0,W="",K=c,$=d,T=u,H=W;L;)switch(I=F,F=Lt()){case 40:if(I!=108&&Fe(H,j-1)==58){$i(H+=ae(du(F),"&","&\f"),"&\f",Kd(x?m[x-1]:0))!=-1&&(V=-1);break}case 34:case 39:case 91:H+=du(F);break;case 9:case 10:case 13:case 32:H+=ag(I);break;case 92:H+=cg(Hi()-1,7);continue;case 47:switch($n()){case 42:case 47:go(hg(fg(Lt(),Hi()),i,s,v),v);break;default:H+="/"}break;case 123*R:m[x++]=Vt(H)*V;case 125*R:case 59:case 0:switch(F){case 0:case 125:L=0;case 59+E:V==-1&&(H=ae(H,/\f/g,"")),P>0&&Vt(H)-j&&go(P>32?td(H+";",u,s,j-1,v):td(ae(H," ","")+";",u,s,j-2,v),v);break;case 59:H+=";";default:if(go(T=ed(H,i,s,x,E,c,m,W,K=[],$=[],j,d),d),F===123)if(E===0)Vi(H,i,T,T,K,d,j,m,$);else switch(O===99&&Fe(H,3)===110?100:O){case 100:case 108:case 109:case 115:Vi(r,T,T,u&&go(ed(r,T,T,0,0,c,m,W,c,K=[],j,$),$),c,$,j,m,u?K:$);break;default:Vi(H,T,T,T,[""],$,0,m,$)}}x=E=P=0,R=V=1,W=H="",j=p;break;case 58:j=1+Vt(H),P=I;default:if(R<1){if(F==123)--R;else if(F==125&&R++==0&&sg()==125)continue}switch(H+=Hu(F),F*R){case 38:V=E>0?1:(H+="\f",-1);break;case 44:m[x++]=(Vt(H)-1)*V,V=1;break;case 64:$n()===45&&(H+=du(Lt())),O=$n(),E=j=Vt(W=H+=dg(Hi())),F++;break;case 45:I===45&&Vt(H)==2&&(R=0)}}return d}function ed(r,i,s,u,c,d,p,m,v,x,E,j){for(var O=c-1,P=c===0?d:[""],I=Jd(P),R=0,L=0,V=0;R0?P[F]+" "+W:ae(W,/&\f/g,P[F])))&&(v[V++]=K);return os(r,i,s,c===0?ns:m,v,x,E,j)}function hg(r,i,s,u){return os(r,i,s,Gd,Hu(ig()),Sr(r,2,-2),0,u)}function td(r,i,s,u,c){return os(r,i,s,$u,Sr(r,0,u),Sr(r,u+1,-1),u,c)}function ep(r,i,s){switch(rg(r,i)){case 5103:return we+"print-"+r+r;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return we+r+r;case 4789:return wo+r+r;case 5349:case 4246:case 4810:case 6968:case 2756:return we+r+wo+r+Ae+r+r;case 5936:switch(Fe(r,i+11)){case 114:return we+r+Ae+ae(r,/[svh]\w+-[tblr]{2}/,"tb")+r;case 108:return we+r+Ae+ae(r,/[svh]\w+-[tblr]{2}/,"tb-rl")+r;case 45:return we+r+Ae+ae(r,/[svh]\w+-[tblr]{2}/,"lr")+r}case 6828:case 4268:case 2903:return we+r+Ae+r+r;case 6165:return we+r+Ae+"flex-"+r+r;case 5187:return we+r+ae(r,/(\w+).+(:[^]+)/,we+"box-$1$2"+Ae+"flex-$1$2")+r;case 5443:return we+r+Ae+"flex-item-"+ae(r,/flex-|-self/g,"")+(nn(r,/flex-|baseline/)?"":Ae+"grid-row-"+ae(r,/flex-|-self/g,""))+r;case 4675:return we+r+Ae+"flex-line-pack"+ae(r,/align-content|flex-|-self/g,"")+r;case 5548:return we+r+Ae+ae(r,"shrink","negative")+r;case 5292:return we+r+Ae+ae(r,"basis","preferred-size")+r;case 6060:return we+"box-"+ae(r,"-grow","")+we+r+Ae+ae(r,"grow","positive")+r;case 4554:return we+ae(r,/([^-])(transform)/g,"$1"+we+"$2")+r;case 6187:return ae(ae(ae(r,/(zoom-|grab)/,we+"$1"),/(image-set)/,we+"$1"),r,"")+r;case 5495:case 3959:return ae(r,/(image-set\([^]*)/,we+"$1$`$1");case 4968:return ae(ae(r,/(.+:)(flex-)?(.*)/,we+"box-pack:$3"+Ae+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+we+r+r;case 4200:if(!nn(r,/flex-|baseline/))return Ae+"grid-column-align"+Sr(r,i)+r;break;case 2592:case 3360:return Ae+ae(r,"template-","")+r;case 4384:case 3616:return s&&s.some(function(u,c){return i=c,nn(u.props,/grid-\w+-end/)})?~$i(r+(s=s[i].value),"span",0)?r:Ae+ae(r,"-start","")+r+Ae+"grid-row-span:"+(~$i(s,"span",0)?nn(s,/\d+/):+nn(s,/\d+/)-+nn(r,/\d+/))+";":Ae+ae(r,"-start","")+r;case 4896:case 4128:return s&&s.some(function(u){return nn(u.props,/grid-\w+-start/)})?r:Ae+ae(ae(r,"-end","-span"),"span ","")+r;case 4095:case 3583:case 4068:case 2532:return ae(r,/(.+)-inline(.+)/,we+"$1$2")+r;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(Vt(r)-1-i>6)switch(Fe(r,i+1)){case 109:if(Fe(r,i+4)!==45)break;case 102:return ae(r,/(.+:)(.+)-([^]+)/,"$1"+we+"$2-$3$1"+wo+(Fe(r,i+3)==108?"$3":"$2-$3"))+r;case 115:return~$i(r,"stretch",0)?ep(ae(r,"stretch","fill-available"),i,s)+r:r}break;case 5152:case 5920:return ae(r,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(u,c,d,p,m,v,x){return Ae+c+":"+d+x+(p?Ae+c+"-span:"+(m?v:+v-+d)+x:"")+r});case 4949:if(Fe(r,i+6)===121)return ae(r,":",":"+we)+r;break;case 6444:switch(Fe(r,Fe(r,14)===45?18:11)){case 120:return ae(r,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+we+(Fe(r,14)===45?"inline-":"")+"box$3$1"+we+"$2$3$1"+Ae+"$2box$3")+r;case 100:return ae(r,":",":"+Ae)+r}break;case 5719:case 2647:case 2135:case 3927:case 2391:return ae(r,"scroll-","scroll-snap-")+r}return r}function Ki(r,i){for(var s="",u=0;u-1&&!r.return)switch(r.type){case $u:r.return=ep(r.value,r.length,s);return;case Yd:return Ki([Cn(r,{value:ae(r.value,"@","@"+we)})],u);case ns:if(r.length)return og(s=r.props,function(c){switch(nn(c,u=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":wr(Cn(r,{props:[ae(c,/:(read-\w+)/,":"+wo+"$1")]})),wr(Cn(r,{props:[c]})),Cu(r,{props:Zf(s,u)});break;case"::placeholder":wr(Cn(r,{props:[ae(c,/:(plac\w+)/,":"+we+"input-$1")]})),wr(Cn(r,{props:[ae(c,/:(plac\w+)/,":"+wo+"$1")]})),wr(Cn(r,{props:[ae(c,/:(plac\w+)/,Ae+"input-$1")]})),wr(Cn(r,{props:[c]})),Cu(r,{props:Zf(s,u)});break}return""})}}var wg={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},ht={},Er=typeof process<"u"&&ht!==void 0&&(ht.REACT_APP_SC_ATTR||ht.SC_ATTR)||"data-styled",tp="active",np="data-styled-version",ss="6.1.14",Vu=`/*!sc*/ +`,Xi=typeof window<"u"&&"HTMLElement"in window,xg=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&ht!==void 0&&ht.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&ht.REACT_APP_SC_DISABLE_SPEEDY!==""?ht.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&ht.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&ht!==void 0&&ht.SC_DISABLE_SPEEDY!==void 0&&ht.SC_DISABLE_SPEEDY!==""&&ht.SC_DISABLE_SPEEDY!=="false"&&ht.SC_DISABLE_SPEEDY),ls=Object.freeze([]),Cr=Object.freeze({});function Sg(r,i,s){return s===void 0&&(s=Cr),r.theme!==s.theme&&r.theme||i||s.theme}var rp=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),kg=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,Eg=/(^-|-$)/g;function nd(r){return r.replace(kg,"-").replace(Eg,"")}var Cg=/(a)(d)/gi,Di=52,rd=function(r){return String.fromCharCode(r+(r>25?39:97))};function Pu(r){var i,s="";for(i=Math.abs(r);i>Di;i=i/Di|0)s=rd(i%Di)+s;return(rd(i%Di)+s).replace(Cg,"$1-$2")}var pu,op=5381,xr=function(r,i){for(var s=i.length;s;)r=33*r^i.charCodeAt(--s);return r},ip=function(r){return xr(op,r)};function Ag(r){return Pu(ip(r)>>>0)}function Rg(r){return r.displayName||r.name||"Component"}function hu(r){return typeof r=="string"&&!0}var sp=typeof Symbol=="function"&&Symbol.for,lp=sp?Symbol.for("react.memo"):60115,Pg=sp?Symbol.for("react.forward_ref"):60112,jg={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Ig={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},up={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},_g=((pu={})[Pg]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},pu[lp]=up,pu);function od(r){return("type"in(i=r)&&i.type.$$typeof)===lp?up:"$$typeof"in r?_g[r.$$typeof]:jg;var i}var Ng=Object.defineProperty,Og=Object.getOwnPropertyNames,id=Object.getOwnPropertySymbols,Tg=Object.getOwnPropertyDescriptor,Lg=Object.getPrototypeOf,sd=Object.prototype;function ap(r,i,s){if(typeof i!="string"){if(sd){var u=Lg(i);u&&u!==sd&&ap(r,u,s)}var c=Og(i);id&&(c=c.concat(id(i)));for(var d=od(r),p=od(i),m=0;m0?" Args: ".concat(i.join(", ")):""))}var Dg=function(){function r(i){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=i}return r.prototype.indexOfGroup=function(i){for(var s=0,u=0;u=this.groupSizes.length){for(var u=this.groupSizes,c=u.length,d=c;i>=d;)if((d<<=1)<0)throw Qn(16,"".concat(i));this.groupSizes=new Uint32Array(d),this.groupSizes.set(u),this.length=d;for(var p=c;p=this.length||this.groupSizes[i]===0)return s;for(var u=this.groupSizes[i],c=this.indexOfGroup(i),d=c+u,p=c;p=0){var u=document.createTextNode(s);return this.element.insertBefore(u,this.nodes[i]||null),this.length++,!0}return!1},r.prototype.deleteRule=function(i){this.element.removeChild(this.nodes[i]),this.length--},r.prototype.getRule=function(i){return i0&&(L+="".concat(V,","))}),v+="".concat(I).concat(R,'{content:"').concat(L,'"}').concat(Vu)},E=0;E0?".".concat(i):O},E=v.slice();E.push(function(O){O.type===ns&&O.value.includes("&")&&(O.props[0]=O.props[0].replace(qg,s).replace(u,x))}),p.prefix&&E.push(vg),E.push(mg);var j=function(O,P,I,R){P===void 0&&(P=""),I===void 0&&(I=""),R===void 0&&(R="&"),i=R,s=P,u=new RegExp("\\".concat(s,"\\b"),"g");var L=O.replace(bg,""),V=pg(I||P?"".concat(I," ").concat(P," { ").concat(L," }"):L);p.namespace&&(V=dp(V,p.namespace));var F=[];return Ki(V,gg(E.concat(yg(function(W){return F.push(W)})))),F};return j.hash=v.length?v.reduce(function(O,P){return P.name||Qn(15),xr(O,P.name)},op).toString():"",j}var Yg=new fp,Iu=Gg(),pp=rn.createContext({shouldForwardProp:void 0,styleSheet:Yg,stylis:Iu});pp.Consumer;rn.createContext(void 0);function cd(){return ue.useContext(pp)}var Kg=function(){function r(i,s){var u=this;this.inject=function(c,d){d===void 0&&(d=Iu);var p=u.name+d.hash;c.hasNameForId(u.id,p)||c.insertRules(u.id,p,d(u.rules,p,"@keyframes"))},this.name=i,this.id="sc-keyframes-".concat(i),this.rules=s,Qu(this,function(){throw Qn(12,String(u.name))})}return r.prototype.getName=function(i){return i===void 0&&(i=Iu),this.name+i.hash},r}(),Xg=function(r){return r>="A"&&r<="Z"};function fd(r){for(var i="",s=0;s>>0);if(!s.hasNameForId(this.componentId,p)){var m=u(d,".".concat(p),void 0,this.componentId);s.insertRules(this.componentId,p,m)}c=Un(c,p),this.staticRulesId=p}else{for(var v=xr(this.baseHash,u.hash),x="",E=0;E>>0);s.hasNameForId(this.componentId,P)||s.insertRules(this.componentId,P,u(x,".".concat(P),void 0,this.componentId)),c=Un(c,P)}}return c},r}(),Zi=rn.createContext(void 0);Zi.Consumer;function ty(r){var i=rn.useContext(Zi),s=ue.useMemo(function(){return function(u,c){if(!u)throw Qn(14);if(Wn(u)){var d=u(c);return d}if(Array.isArray(u)||typeof u!="object")throw Qn(8);return c?Ke(Ke({},c),u):u}(r.theme,i)},[r.theme,i]);return r.children?rn.createElement(Zi.Provider,{value:s},r.children):null}var mu={};function ny(r,i,s){var u=Wu(r),c=r,d=!hu(r),p=i.attrs,m=p===void 0?ls:p,v=i.componentId,x=v===void 0?function(K,$){var T=typeof K!="string"?"sc":nd(K);mu[T]=(mu[T]||0)+1;var H="".concat(T,"-").concat(Ag(ss+T+mu[T]));return $?"".concat($,"-").concat(H):H}(i.displayName,i.parentComponentId):v,E=i.displayName,j=E===void 0?function(K){return hu(K)?"styled.".concat(K):"Styled(".concat(Rg(K),")")}(r):E,O=i.displayName&&i.componentId?"".concat(nd(i.displayName),"-").concat(i.componentId):i.componentId||x,P=u&&c.attrs?c.attrs.concat(m).filter(Boolean):m,I=i.shouldForwardProp;if(u&&c.shouldForwardProp){var R=c.shouldForwardProp;if(i.shouldForwardProp){var L=i.shouldForwardProp;I=function(K,$){return R(K,$)&&L(K,$)}}else I=R}var V=new ey(s,O,u?c.componentStyle:void 0);function F(K,$){return function(T,H,se){var Ve=T.attrs,At=T.componentStyle,qt=T.defaultProps,gt=T.foldedComponentIds,Je=T.styledComponentId,at=T.target,yt=rn.useContext(Zi),We=cd(),Se=T.shouldForwardProp||We.shouldForwardProp,Q=Sg(H,yt,qt)||Cr,ee=function(de,ce,ve){for(var pe,ge=Ke(Ke({},ce),{className:void 0,theme:ve}),Be=0;Ber.$hasUnread?r.theme.colors.text.primary:r.theme.colors.text.muted}; + font-weight: ${r=>r.$hasUnread?"600":"normal"}; + cursor: pointer; + background: ${r=>r.$isActive?r.theme.colors.background.hover:"transparent"}; + border-radius: 4px; + + &:hover { + background: ${r=>r.theme.colors.background.hover}; + color: ${r=>r.theme.colors.text.primary}; + } +`,hd=N.div` + margin-bottom: 8px; +`,Nu=N.div` + padding: 8px 16px; + display: flex; + align-items: center; + color: ${J.colors.text.muted}; + text-transform: uppercase; + font-size: 12px; + font-weight: 600; + cursor: pointer; + user-select: none; + + & > span:nth-child(2) { + flex: 1; + margin-right: auto; + } + + &:hover { + color: ${J.colors.text.primary}; + } +`,md=N.span` + margin-right: 4px; + font-size: 10px; + transition: transform 0.2s; + transform: rotate(${r=>r.$folded?"-90deg":"0deg"}); +`,gd=N.div` + display: ${r=>r.$folded?"none":"block"}; +`,yd=N(yp)` + height: ${r=>r.hasSubtext?"42px":"34px"}; +`,ly=N.div` + position: relative; + width: 32px; + height: 32px; + margin: 0 8px; + flex-shrink: 0; + min-width: 40px; + + img { + width: 32px; + height: 32px; + border-radius: 50%; + } +`,vd=N.div` + font-size: 16px; + line-height: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: ${r=>r.$isActive||r.$hasUnread?r.theme.colors.text.primary:r.theme.colors.text.muted}; + font-weight: ${r=>r.$hasUnread?"600":"normal"}; +`,vp=N.div` + position: absolute; + bottom: 0; + right: 0; + width: 10px; + height: 10px; + border-radius: 50%; + background: ${r=>r.$online?J.colors.status.online:J.colors.status.offline}; + border: 2px solid ${J.colors.background.secondary}; + transform: translate(20%, 20%); +`;N(vp)` + border-color: ${J.colors.background.primary}; +`;const wd=N.button` + background: none; + border: none; + color: ${J.colors.text.muted}; + font-size: 18px; + padding: 0; + cursor: pointer; + width: 16px; + height: 16px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.2s, color 0.2s; + + ${Nu}:hover & { + opacity: 1; + } + + &:hover { + color: ${J.colors.text.primary}; + } +`,uy=N.div` + width: 40px; + min-width: 40px; + height: 24px; + margin: 0 8px; + flex-shrink: 0; + position: relative; +`,ay=N.div` + font-size: 12px; + line-height: 13px; + color: ${J.colors.text.muted}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,xd=N.div` + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; + gap: 2px; +`,cy=N.img` + width: 24px; + height: 24px; + border-radius: 50%; + border: 2px solid ${J.colors.background.secondary}; + position: absolute; +`;function fy(){return g.jsx(sy,{children:"채널 목록"})}const Sd=r=>{let i;const s=new Set,u=(x,E)=>{const j=typeof x=="function"?x(i):x;if(!Object.is(j,i)){const O=i;i=E??(typeof j!="object"||j===null)?j:Object.assign({},i,j),s.forEach(P=>P(i,O))}},c=()=>i,m={setState:u,getState:c,getInitialState:()=>v,subscribe:x=>(s.add(x),()=>s.delete(x))},v=i=r(u,c,m);return m},dy=r=>r?Sd(r):Sd,py=r=>r;function hy(r,i=py){const s=rn.useSyncExternalStore(r.subscribe,()=>i(r.getState()),()=>i(r.getInitialState()));return rn.useDebugValue(s),s}const kd=r=>{const i=dy(r),s=u=>hy(i,u);return Object.assign(s,i),s},bn=r=>r?kd(r):kd;function wp(r,i){return function(){return r.apply(i,arguments)}}const{toString:my}=Object.prototype,{getPrototypeOf:qu}=Object,us=(r=>i=>{const s=my.call(i);return r[s]||(r[s]=s.slice(8,-1).toLowerCase())})(Object.create(null)),zt=r=>(r=r.toLowerCase(),i=>us(i)===r),as=r=>i=>typeof i===r,{isArray:Rr}=Array,ko=as("undefined");function gy(r){return r!==null&&!ko(r)&&r.constructor!==null&&!ko(r.constructor)&&mt(r.constructor.isBuffer)&&r.constructor.isBuffer(r)}const xp=zt("ArrayBuffer");function yy(r){let i;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?i=ArrayBuffer.isView(r):i=r&&r.buffer&&xp(r.buffer),i}const vy=as("string"),mt=as("function"),Sp=as("number"),cs=r=>r!==null&&typeof r=="object",wy=r=>r===!0||r===!1,qi=r=>{if(us(r)!=="object")return!1;const i=qu(r);return(i===null||i===Object.prototype||Object.getPrototypeOf(i)===null)&&!(Symbol.toStringTag in r)&&!(Symbol.iterator in r)},xy=zt("Date"),Sy=zt("File"),ky=zt("Blob"),Ey=zt("FileList"),Cy=r=>cs(r)&&mt(r.pipe),Ay=r=>{let i;return r&&(typeof FormData=="function"&&r instanceof FormData||mt(r.append)&&((i=us(r))==="formdata"||i==="object"&&mt(r.toString)&&r.toString()==="[object FormData]"))},Ry=zt("URLSearchParams"),[Py,jy,Iy,_y]=["ReadableStream","Request","Response","Headers"].map(zt),Ny=r=>r.trim?r.trim():r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Eo(r,i,{allOwnKeys:s=!1}={}){if(r===null||typeof r>"u")return;let u,c;if(typeof r!="object"&&(r=[r]),Rr(r))for(u=0,c=r.length;u0;)if(c=s[u],i===c.toLowerCase())return c;return null}const Fn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Ep=r=>!ko(r)&&r!==Fn;function Ou(){const{caseless:r}=Ep(this)&&this||{},i={},s=(u,c)=>{const d=r&&kp(i,c)||c;qi(i[d])&&qi(u)?i[d]=Ou(i[d],u):qi(u)?i[d]=Ou({},u):Rr(u)?i[d]=u.slice():i[d]=u};for(let u=0,c=arguments.length;u(Eo(i,(c,d)=>{s&&mt(c)?r[d]=wp(c,s):r[d]=c},{allOwnKeys:u}),r),Ty=r=>(r.charCodeAt(0)===65279&&(r=r.slice(1)),r),Ly=(r,i,s,u)=>{r.prototype=Object.create(i.prototype,u),r.prototype.constructor=r,Object.defineProperty(r,"super",{value:i.prototype}),s&&Object.assign(r.prototype,s)},Dy=(r,i,s,u)=>{let c,d,p;const m={};if(i=i||{},r==null)return i;do{for(c=Object.getOwnPropertyNames(r),d=c.length;d-- >0;)p=c[d],(!u||u(p,r,i))&&!m[p]&&(i[p]=r[p],m[p]=!0);r=s!==!1&&qu(r)}while(r&&(!s||s(r,i))&&r!==Object.prototype);return i},zy=(r,i,s)=>{r=String(r),(s===void 0||s>r.length)&&(s=r.length),s-=i.length;const u=r.indexOf(i,s);return u!==-1&&u===s},My=r=>{if(!r)return null;if(Rr(r))return r;let i=r.length;if(!Sp(i))return null;const s=new Array(i);for(;i-- >0;)s[i]=r[i];return s},Uy=(r=>i=>r&&i instanceof r)(typeof Uint8Array<"u"&&qu(Uint8Array)),Fy=(r,i)=>{const u=(r&&r[Symbol.iterator]).call(r);let c;for(;(c=u.next())&&!c.done;){const d=c.value;i.call(r,d[0],d[1])}},By=(r,i)=>{let s;const u=[];for(;(s=r.exec(i))!==null;)u.push(s);return u},$y=zt("HTMLFormElement"),Hy=r=>r.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(s,u,c){return u.toUpperCase()+c}),Ed=(({hasOwnProperty:r})=>(i,s)=>r.call(i,s))(Object.prototype),Vy=zt("RegExp"),Cp=(r,i)=>{const s=Object.getOwnPropertyDescriptors(r),u={};Eo(s,(c,d)=>{let p;(p=i(c,d,r))!==!1&&(u[d]=p||c)}),Object.defineProperties(r,u)},Wy=r=>{Cp(r,(i,s)=>{if(mt(r)&&["arguments","caller","callee"].indexOf(s)!==-1)return!1;const u=r[s];if(mt(u)){if(i.enumerable=!1,"writable"in i){i.writable=!1;return}i.set||(i.set=()=>{throw Error("Can not rewrite read-only method '"+s+"'")})}})},Qy=(r,i)=>{const s={},u=c=>{c.forEach(d=>{s[d]=!0})};return Rr(r)?u(r):u(String(r).split(i)),s},qy=()=>{},by=(r,i)=>r!=null&&Number.isFinite(r=+r)?r:i,gu="abcdefghijklmnopqrstuvwxyz",Cd="0123456789",Ap={DIGIT:Cd,ALPHA:gu,ALPHA_DIGIT:gu+gu.toUpperCase()+Cd},Gy=(r=16,i=Ap.ALPHA_DIGIT)=>{let s="";const{length:u}=i;for(;r--;)s+=i[Math.random()*u|0];return s};function Yy(r){return!!(r&&mt(r.append)&&r[Symbol.toStringTag]==="FormData"&&r[Symbol.iterator])}const Ky=r=>{const i=new Array(10),s=(u,c)=>{if(cs(u)){if(i.indexOf(u)>=0)return;if(!("toJSON"in u)){i[c]=u;const d=Rr(u)?[]:{};return Eo(u,(p,m)=>{const v=s(p,c+1);!ko(v)&&(d[m]=v)}),i[c]=void 0,d}}return u};return s(r,0)},Xy=zt("AsyncFunction"),Jy=r=>r&&(cs(r)||mt(r))&&mt(r.then)&&mt(r.catch),Rp=((r,i)=>r?setImmediate:i?((s,u)=>(Fn.addEventListener("message",({source:c,data:d})=>{c===Fn&&d===s&&u.length&&u.shift()()},!1),c=>{u.push(c),Fn.postMessage(s,"*")}))(`axios@${Math.random()}`,[]):s=>setTimeout(s))(typeof setImmediate=="function",mt(Fn.postMessage)),Zy=typeof queueMicrotask<"u"?queueMicrotask.bind(Fn):typeof process<"u"&&process.nextTick||Rp,_={isArray:Rr,isArrayBuffer:xp,isBuffer:gy,isFormData:Ay,isArrayBufferView:yy,isString:vy,isNumber:Sp,isBoolean:wy,isObject:cs,isPlainObject:qi,isReadableStream:Py,isRequest:jy,isResponse:Iy,isHeaders:_y,isUndefined:ko,isDate:xy,isFile:Sy,isBlob:ky,isRegExp:Vy,isFunction:mt,isStream:Cy,isURLSearchParams:Ry,isTypedArray:Uy,isFileList:Ey,forEach:Eo,merge:Ou,extend:Oy,trim:Ny,stripBOM:Ty,inherits:Ly,toFlatObject:Dy,kindOf:us,kindOfTest:zt,endsWith:zy,toArray:My,forEachEntry:Fy,matchAll:By,isHTMLForm:$y,hasOwnProperty:Ed,hasOwnProp:Ed,reduceDescriptors:Cp,freezeMethods:Wy,toObjectSet:Qy,toCamelCase:Hy,noop:qy,toFiniteNumber:by,findKey:kp,global:Fn,isContextDefined:Ep,ALPHABET:Ap,generateString:Gy,isSpecCompliantForm:Yy,toJSONObject:Ky,isAsyncFn:Xy,isThenable:Jy,setImmediate:Rp,asap:Zy};function ie(r,i,s,u,c){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=r,this.name="AxiosError",i&&(this.code=i),s&&(this.config=s),u&&(this.request=u),c&&(this.response=c,this.status=c.status?c.status:null)}_.inherits(ie,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:_.toJSONObject(this.config),code:this.code,status:this.status}}});const Pp=ie.prototype,jp={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(r=>{jp[r]={value:r}});Object.defineProperties(ie,jp);Object.defineProperty(Pp,"isAxiosError",{value:!0});ie.from=(r,i,s,u,c,d)=>{const p=Object.create(Pp);return _.toFlatObject(r,p,function(v){return v!==Error.prototype},m=>m!=="isAxiosError"),ie.call(p,r.message,i,s,u,c),p.cause=r,p.name=r.name,d&&Object.assign(p,d),p};const e0=null;function Tu(r){return _.isPlainObject(r)||_.isArray(r)}function Ip(r){return _.endsWith(r,"[]")?r.slice(0,-2):r}function Ad(r,i,s){return r?r.concat(i).map(function(c,d){return c=Ip(c),!s&&d?"["+c+"]":c}).join(s?".":""):i}function t0(r){return _.isArray(r)&&!r.some(Tu)}const n0=_.toFlatObject(_,{},null,function(i){return/^is[A-Z]/.test(i)});function fs(r,i,s){if(!_.isObject(r))throw new TypeError("target must be an object");i=i||new FormData,s=_.toFlatObject(s,{metaTokens:!0,dots:!1,indexes:!1},!1,function(R,L){return!_.isUndefined(L[R])});const u=s.metaTokens,c=s.visitor||E,d=s.dots,p=s.indexes,v=(s.Blob||typeof Blob<"u"&&Blob)&&_.isSpecCompliantForm(i);if(!_.isFunction(c))throw new TypeError("visitor must be a function");function x(I){if(I===null)return"";if(_.isDate(I))return I.toISOString();if(!v&&_.isBlob(I))throw new ie("Blob is not supported. Use a Buffer instead.");return _.isArrayBuffer(I)||_.isTypedArray(I)?v&&typeof Blob=="function"?new Blob([I]):Buffer.from(I):I}function E(I,R,L){let V=I;if(I&&!L&&typeof I=="object"){if(_.endsWith(R,"{}"))R=u?R:R.slice(0,-2),I=JSON.stringify(I);else if(_.isArray(I)&&t0(I)||(_.isFileList(I)||_.endsWith(R,"[]"))&&(V=_.toArray(I)))return R=Ip(R),V.forEach(function(W,K){!(_.isUndefined(W)||W===null)&&i.append(p===!0?Ad([R],K,d):p===null?R:R+"[]",x(W))}),!1}return Tu(I)?!0:(i.append(Ad(L,R,d),x(I)),!1)}const j=[],O=Object.assign(n0,{defaultVisitor:E,convertValue:x,isVisitable:Tu});function P(I,R){if(!_.isUndefined(I)){if(j.indexOf(I)!==-1)throw Error("Circular reference detected in "+R.join("."));j.push(I),_.forEach(I,function(V,F){(!(_.isUndefined(V)||V===null)&&c.call(i,V,_.isString(F)?F.trim():F,R,O))===!0&&P(V,R?R.concat(F):[F])}),j.pop()}}if(!_.isObject(r))throw new TypeError("data must be an object");return P(r),i}function Rd(r){const i={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(r).replace(/[!'()~]|%20|%00/g,function(u){return i[u]})}function bu(r,i){this._pairs=[],r&&fs(r,this,i)}const _p=bu.prototype;_p.append=function(i,s){this._pairs.push([i,s])};_p.toString=function(i){const s=i?function(u){return i.call(this,u,Rd)}:Rd;return this._pairs.map(function(c){return s(c[0])+"="+s(c[1])},"").join("&")};function r0(r){return encodeURIComponent(r).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Np(r,i,s){if(!i)return r;const u=s&&s.encode||r0;_.isFunction(s)&&(s={serialize:s});const c=s&&s.serialize;let d;if(c?d=c(i,s):d=_.isURLSearchParams(i)?i.toString():new bu(i,s).toString(u),d){const p=r.indexOf("#");p!==-1&&(r=r.slice(0,p)),r+=(r.indexOf("?")===-1?"?":"&")+d}return r}class Pd{constructor(){this.handlers=[]}use(i,s,u){return this.handlers.push({fulfilled:i,rejected:s,synchronous:u?u.synchronous:!1,runWhen:u?u.runWhen:null}),this.handlers.length-1}eject(i){this.handlers[i]&&(this.handlers[i]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(i){_.forEach(this.handlers,function(u){u!==null&&i(u)})}}const Op={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},o0=typeof URLSearchParams<"u"?URLSearchParams:bu,i0=typeof FormData<"u"?FormData:null,s0=typeof Blob<"u"?Blob:null,l0={isBrowser:!0,classes:{URLSearchParams:o0,FormData:i0,Blob:s0},protocols:["http","https","file","blob","url","data"]},Gu=typeof window<"u"&&typeof document<"u",Lu=typeof navigator=="object"&&navigator||void 0,u0=Gu&&(!Lu||["ReactNative","NativeScript","NS"].indexOf(Lu.product)<0),a0=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",c0=Gu&&window.location.href||"http://localhost",f0=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Gu,hasStandardBrowserEnv:u0,hasStandardBrowserWebWorkerEnv:a0,navigator:Lu,origin:c0},Symbol.toStringTag,{value:"Module"})),Ye={...f0,...l0};function d0(r,i){return fs(r,new Ye.classes.URLSearchParams,Object.assign({visitor:function(s,u,c,d){return Ye.isNode&&_.isBuffer(s)?(this.append(u,s.toString("base64")),!1):d.defaultVisitor.apply(this,arguments)}},i))}function p0(r){return _.matchAll(/\w+|\[(\w*)]/g,r).map(i=>i[0]==="[]"?"":i[1]||i[0])}function h0(r){const i={},s=Object.keys(r);let u;const c=s.length;let d;for(u=0;u=s.length;return p=!p&&_.isArray(c)?c.length:p,v?(_.hasOwnProp(c,p)?c[p]=[c[p],u]:c[p]=u,!m):((!c[p]||!_.isObject(c[p]))&&(c[p]=[]),i(s,u,c[p],d)&&_.isArray(c[p])&&(c[p]=h0(c[p])),!m)}if(_.isFormData(r)&&_.isFunction(r.entries)){const s={};return _.forEachEntry(r,(u,c)=>{i(p0(u),c,s,0)}),s}return null}function m0(r,i,s){if(_.isString(r))try{return(i||JSON.parse)(r),_.trim(r)}catch(u){if(u.name!=="SyntaxError")throw u}return(0,JSON.stringify)(r)}const Co={transitional:Op,adapter:["xhr","http","fetch"],transformRequest:[function(i,s){const u=s.getContentType()||"",c=u.indexOf("application/json")>-1,d=_.isObject(i);if(d&&_.isHTMLForm(i)&&(i=new FormData(i)),_.isFormData(i))return c?JSON.stringify(Tp(i)):i;if(_.isArrayBuffer(i)||_.isBuffer(i)||_.isStream(i)||_.isFile(i)||_.isBlob(i)||_.isReadableStream(i))return i;if(_.isArrayBufferView(i))return i.buffer;if(_.isURLSearchParams(i))return s.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),i.toString();let m;if(d){if(u.indexOf("application/x-www-form-urlencoded")>-1)return d0(i,this.formSerializer).toString();if((m=_.isFileList(i))||u.indexOf("multipart/form-data")>-1){const v=this.env&&this.env.FormData;return fs(m?{"files[]":i}:i,v&&new v,this.formSerializer)}}return d||c?(s.setContentType("application/json",!1),m0(i)):i}],transformResponse:[function(i){const s=this.transitional||Co.transitional,u=s&&s.forcedJSONParsing,c=this.responseType==="json";if(_.isResponse(i)||_.isReadableStream(i))return i;if(i&&_.isString(i)&&(u&&!this.responseType||c)){const p=!(s&&s.silentJSONParsing)&&c;try{return JSON.parse(i)}catch(m){if(p)throw m.name==="SyntaxError"?ie.from(m,ie.ERR_BAD_RESPONSE,this,null,this.response):m}}return i}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ye.classes.FormData,Blob:Ye.classes.Blob},validateStatus:function(i){return i>=200&&i<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};_.forEach(["delete","get","head","post","put","patch"],r=>{Co.headers[r]={}});const g0=_.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),y0=r=>{const i={};let s,u,c;return r&&r.split(` +`).forEach(function(p){c=p.indexOf(":"),s=p.substring(0,c).trim().toLowerCase(),u=p.substring(c+1).trim(),!(!s||i[s]&&g0[s])&&(s==="set-cookie"?i[s]?i[s].push(u):i[s]=[u]:i[s]=i[s]?i[s]+", "+u:u)}),i},jd=Symbol("internals");function mo(r){return r&&String(r).trim().toLowerCase()}function bi(r){return r===!1||r==null?r:_.isArray(r)?r.map(bi):String(r)}function v0(r){const i=Object.create(null),s=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let u;for(;u=s.exec(r);)i[u[1]]=u[2];return i}const w0=r=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(r.trim());function yu(r,i,s,u,c){if(_.isFunction(u))return u.call(this,i,s);if(c&&(i=s),!!_.isString(i)){if(_.isString(u))return i.indexOf(u)!==-1;if(_.isRegExp(u))return u.test(i)}}function x0(r){return r.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(i,s,u)=>s.toUpperCase()+u)}function S0(r,i){const s=_.toCamelCase(" "+i);["get","set","has"].forEach(u=>{Object.defineProperty(r,u+s,{value:function(c,d,p){return this[u].call(this,i,c,d,p)},configurable:!0})})}class lt{constructor(i){i&&this.set(i)}set(i,s,u){const c=this;function d(m,v,x){const E=mo(v);if(!E)throw new Error("header name must be a non-empty string");const j=_.findKey(c,E);(!j||c[j]===void 0||x===!0||x===void 0&&c[j]!==!1)&&(c[j||v]=bi(m))}const p=(m,v)=>_.forEach(m,(x,E)=>d(x,E,v));if(_.isPlainObject(i)||i instanceof this.constructor)p(i,s);else if(_.isString(i)&&(i=i.trim())&&!w0(i))p(y0(i),s);else if(_.isHeaders(i))for(const[m,v]of i.entries())d(v,m,u);else i!=null&&d(s,i,u);return this}get(i,s){if(i=mo(i),i){const u=_.findKey(this,i);if(u){const c=this[u];if(!s)return c;if(s===!0)return v0(c);if(_.isFunction(s))return s.call(this,c,u);if(_.isRegExp(s))return s.exec(c);throw new TypeError("parser must be boolean|regexp|function")}}}has(i,s){if(i=mo(i),i){const u=_.findKey(this,i);return!!(u&&this[u]!==void 0&&(!s||yu(this,this[u],u,s)))}return!1}delete(i,s){const u=this;let c=!1;function d(p){if(p=mo(p),p){const m=_.findKey(u,p);m&&(!s||yu(u,u[m],m,s))&&(delete u[m],c=!0)}}return _.isArray(i)?i.forEach(d):d(i),c}clear(i){const s=Object.keys(this);let u=s.length,c=!1;for(;u--;){const d=s[u];(!i||yu(this,this[d],d,i,!0))&&(delete this[d],c=!0)}return c}normalize(i){const s=this,u={};return _.forEach(this,(c,d)=>{const p=_.findKey(u,d);if(p){s[p]=bi(c),delete s[d];return}const m=i?x0(d):String(d).trim();m!==d&&delete s[d],s[m]=bi(c),u[m]=!0}),this}concat(...i){return this.constructor.concat(this,...i)}toJSON(i){const s=Object.create(null);return _.forEach(this,(u,c)=>{u!=null&&u!==!1&&(s[c]=i&&_.isArray(u)?u.join(", "):u)}),s}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([i,s])=>i+": "+s).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(i){return i instanceof this?i:new this(i)}static concat(i,...s){const u=new this(i);return s.forEach(c=>u.set(c)),u}static accessor(i){const u=(this[jd]=this[jd]={accessors:{}}).accessors,c=this.prototype;function d(p){const m=mo(p);u[m]||(S0(c,p),u[m]=!0)}return _.isArray(i)?i.forEach(d):d(i),this}}lt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);_.reduceDescriptors(lt.prototype,({value:r},i)=>{let s=i[0].toUpperCase()+i.slice(1);return{get:()=>r,set(u){this[s]=u}}});_.freezeMethods(lt);function vu(r,i){const s=this||Co,u=i||s,c=lt.from(u.headers);let d=u.data;return _.forEach(r,function(m){d=m.call(s,d,c.normalize(),i?i.status:void 0)}),c.normalize(),d}function Lp(r){return!!(r&&r.__CANCEL__)}function Pr(r,i,s){ie.call(this,r??"canceled",ie.ERR_CANCELED,i,s),this.name="CanceledError"}_.inherits(Pr,ie,{__CANCEL__:!0});function Dp(r,i,s){const u=s.config.validateStatus;!s.status||!u||u(s.status)?r(s):i(new ie("Request failed with status code "+s.status,[ie.ERR_BAD_REQUEST,ie.ERR_BAD_RESPONSE][Math.floor(s.status/100)-4],s.config,s.request,s))}function k0(r){const i=/^([-+\w]{1,25})(:?\/\/|:)/.exec(r);return i&&i[1]||""}function E0(r,i){r=r||10;const s=new Array(r),u=new Array(r);let c=0,d=0,p;return i=i!==void 0?i:1e3,function(v){const x=Date.now(),E=u[d];p||(p=x),s[c]=v,u[c]=x;let j=d,O=0;for(;j!==c;)O+=s[j++],j=j%r;if(c=(c+1)%r,c===d&&(d=(d+1)%r),x-p{s=E,c=null,d&&(clearTimeout(d),d=null),r.apply(null,x)};return[(...x)=>{const E=Date.now(),j=E-s;j>=u?p(x,E):(c=x,d||(d=setTimeout(()=>{d=null,p(c)},u-j)))},()=>c&&p(c)]}const es=(r,i,s=3)=>{let u=0;const c=E0(50,250);return C0(d=>{const p=d.loaded,m=d.lengthComputable?d.total:void 0,v=p-u,x=c(v),E=p<=m;u=p;const j={loaded:p,total:m,progress:m?p/m:void 0,bytes:v,rate:x||void 0,estimated:x&&m&&E?(m-p)/x:void 0,event:d,lengthComputable:m!=null,[i?"download":"upload"]:!0};r(j)},s)},Id=(r,i)=>{const s=r!=null;return[u=>i[0]({lengthComputable:s,total:r,loaded:u}),i[1]]},_d=r=>(...i)=>_.asap(()=>r(...i)),A0=Ye.hasStandardBrowserEnv?((r,i)=>s=>(s=new URL(s,Ye.origin),r.protocol===s.protocol&&r.host===s.host&&(i||r.port===s.port)))(new URL(Ye.origin),Ye.navigator&&/(msie|trident)/i.test(Ye.navigator.userAgent)):()=>!0,R0=Ye.hasStandardBrowserEnv?{write(r,i,s,u,c,d){const p=[r+"="+encodeURIComponent(i)];_.isNumber(s)&&p.push("expires="+new Date(s).toGMTString()),_.isString(u)&&p.push("path="+u),_.isString(c)&&p.push("domain="+c),d===!0&&p.push("secure"),document.cookie=p.join("; ")},read(r){const i=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return i?decodeURIComponent(i[3]):null},remove(r){this.write(r,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function P0(r){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(r)}function j0(r,i){return i?r.replace(/\/?\/$/,"")+"/"+i.replace(/^\/+/,""):r}function zp(r,i){return r&&!P0(i)?j0(r,i):i}const Nd=r=>r instanceof lt?{...r}:r;function qn(r,i){i=i||{};const s={};function u(x,E,j,O){return _.isPlainObject(x)&&_.isPlainObject(E)?_.merge.call({caseless:O},x,E):_.isPlainObject(E)?_.merge({},E):_.isArray(E)?E.slice():E}function c(x,E,j,O){if(_.isUndefined(E)){if(!_.isUndefined(x))return u(void 0,x,j,O)}else return u(x,E,j,O)}function d(x,E){if(!_.isUndefined(E))return u(void 0,E)}function p(x,E){if(_.isUndefined(E)){if(!_.isUndefined(x))return u(void 0,x)}else return u(void 0,E)}function m(x,E,j){if(j in i)return u(x,E);if(j in r)return u(void 0,x)}const v={url:d,method:d,data:d,baseURL:p,transformRequest:p,transformResponse:p,paramsSerializer:p,timeout:p,timeoutMessage:p,withCredentials:p,withXSRFToken:p,adapter:p,responseType:p,xsrfCookieName:p,xsrfHeaderName:p,onUploadProgress:p,onDownloadProgress:p,decompress:p,maxContentLength:p,maxBodyLength:p,beforeRedirect:p,transport:p,httpAgent:p,httpsAgent:p,cancelToken:p,socketPath:p,responseEncoding:p,validateStatus:m,headers:(x,E,j)=>c(Nd(x),Nd(E),j,!0)};return _.forEach(Object.keys(Object.assign({},r,i)),function(E){const j=v[E]||c,O=j(r[E],i[E],E);_.isUndefined(O)&&j!==m||(s[E]=O)}),s}const Mp=r=>{const i=qn({},r);let{data:s,withXSRFToken:u,xsrfHeaderName:c,xsrfCookieName:d,headers:p,auth:m}=i;i.headers=p=lt.from(p),i.url=Np(zp(i.baseURL,i.url),r.params,r.paramsSerializer),m&&p.set("Authorization","Basic "+btoa((m.username||"")+":"+(m.password?unescape(encodeURIComponent(m.password)):"")));let v;if(_.isFormData(s)){if(Ye.hasStandardBrowserEnv||Ye.hasStandardBrowserWebWorkerEnv)p.setContentType(void 0);else if((v=p.getContentType())!==!1){const[x,...E]=v?v.split(";").map(j=>j.trim()).filter(Boolean):[];p.setContentType([x||"multipart/form-data",...E].join("; "))}}if(Ye.hasStandardBrowserEnv&&(u&&_.isFunction(u)&&(u=u(i)),u||u!==!1&&A0(i.url))){const x=c&&d&&R0.read(d);x&&p.set(c,x)}return i},I0=typeof XMLHttpRequest<"u",_0=I0&&function(r){return new Promise(function(s,u){const c=Mp(r);let d=c.data;const p=lt.from(c.headers).normalize();let{responseType:m,onUploadProgress:v,onDownloadProgress:x}=c,E,j,O,P,I;function R(){P&&P(),I&&I(),c.cancelToken&&c.cancelToken.unsubscribe(E),c.signal&&c.signal.removeEventListener("abort",E)}let L=new XMLHttpRequest;L.open(c.method.toUpperCase(),c.url,!0),L.timeout=c.timeout;function V(){if(!L)return;const W=lt.from("getAllResponseHeaders"in L&&L.getAllResponseHeaders()),$={data:!m||m==="text"||m==="json"?L.responseText:L.response,status:L.status,statusText:L.statusText,headers:W,config:r,request:L};Dp(function(H){s(H),R()},function(H){u(H),R()},$),L=null}"onloadend"in L?L.onloadend=V:L.onreadystatechange=function(){!L||L.readyState!==4||L.status===0&&!(L.responseURL&&L.responseURL.indexOf("file:")===0)||setTimeout(V)},L.onabort=function(){L&&(u(new ie("Request aborted",ie.ECONNABORTED,r,L)),L=null)},L.onerror=function(){u(new ie("Network Error",ie.ERR_NETWORK,r,L)),L=null},L.ontimeout=function(){let K=c.timeout?"timeout of "+c.timeout+"ms exceeded":"timeout exceeded";const $=c.transitional||Op;c.timeoutErrorMessage&&(K=c.timeoutErrorMessage),u(new ie(K,$.clarifyTimeoutError?ie.ETIMEDOUT:ie.ECONNABORTED,r,L)),L=null},d===void 0&&p.setContentType(null),"setRequestHeader"in L&&_.forEach(p.toJSON(),function(K,$){L.setRequestHeader($,K)}),_.isUndefined(c.withCredentials)||(L.withCredentials=!!c.withCredentials),m&&m!=="json"&&(L.responseType=c.responseType),x&&([O,I]=es(x,!0),L.addEventListener("progress",O)),v&&L.upload&&([j,P]=es(v),L.upload.addEventListener("progress",j),L.upload.addEventListener("loadend",P)),(c.cancelToken||c.signal)&&(E=W=>{L&&(u(!W||W.type?new Pr(null,r,L):W),L.abort(),L=null)},c.cancelToken&&c.cancelToken.subscribe(E),c.signal&&(c.signal.aborted?E():c.signal.addEventListener("abort",E)));const F=k0(c.url);if(F&&Ye.protocols.indexOf(F)===-1){u(new ie("Unsupported protocol "+F+":",ie.ERR_BAD_REQUEST,r));return}L.send(d||null)})},N0=(r,i)=>{const{length:s}=r=r?r.filter(Boolean):[];if(i||s){let u=new AbortController,c;const d=function(x){if(!c){c=!0,m();const E=x instanceof Error?x:this.reason;u.abort(E instanceof ie?E:new Pr(E instanceof Error?E.message:E))}};let p=i&&setTimeout(()=>{p=null,d(new ie(`timeout ${i} of ms exceeded`,ie.ETIMEDOUT))},i);const m=()=>{r&&(p&&clearTimeout(p),p=null,r.forEach(x=>{x.unsubscribe?x.unsubscribe(d):x.removeEventListener("abort",d)}),r=null)};r.forEach(x=>x.addEventListener("abort",d));const{signal:v}=u;return v.unsubscribe=()=>_.asap(m),v}},O0=function*(r,i){let s=r.byteLength;if(s{const c=T0(r,i);let d=0,p,m=v=>{p||(p=!0,u&&u(v))};return new ReadableStream({async pull(v){try{const{done:x,value:E}=await c.next();if(x){m(),v.close();return}let j=E.byteLength;if(s){let O=d+=j;s(O)}v.enqueue(new Uint8Array(E))}catch(x){throw m(x),x}},cancel(v){return m(v),c.return()}},{highWaterMark:2})},ds=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Up=ds&&typeof ReadableStream=="function",D0=ds&&(typeof TextEncoder=="function"?(r=>i=>r.encode(i))(new TextEncoder):async r=>new Uint8Array(await new Response(r).arrayBuffer())),Fp=(r,...i)=>{try{return!!r(...i)}catch{return!1}},z0=Up&&Fp(()=>{let r=!1;const i=new Request(Ye.origin,{body:new ReadableStream,method:"POST",get duplex(){return r=!0,"half"}}).headers.has("Content-Type");return r&&!i}),Td=64*1024,Du=Up&&Fp(()=>_.isReadableStream(new Response("").body)),ts={stream:Du&&(r=>r.body)};ds&&(r=>{["text","arrayBuffer","blob","formData","stream"].forEach(i=>{!ts[i]&&(ts[i]=_.isFunction(r[i])?s=>s[i]():(s,u)=>{throw new ie(`Response type '${i}' is not supported`,ie.ERR_NOT_SUPPORT,u)})})})(new Response);const M0=async r=>{if(r==null)return 0;if(_.isBlob(r))return r.size;if(_.isSpecCompliantForm(r))return(await new Request(Ye.origin,{method:"POST",body:r}).arrayBuffer()).byteLength;if(_.isArrayBufferView(r)||_.isArrayBuffer(r))return r.byteLength;if(_.isURLSearchParams(r)&&(r=r+""),_.isString(r))return(await D0(r)).byteLength},U0=async(r,i)=>{const s=_.toFiniteNumber(r.getContentLength());return s??M0(i)},F0=ds&&(async r=>{let{url:i,method:s,data:u,signal:c,cancelToken:d,timeout:p,onDownloadProgress:m,onUploadProgress:v,responseType:x,headers:E,withCredentials:j="same-origin",fetchOptions:O}=Mp(r);x=x?(x+"").toLowerCase():"text";let P=N0([c,d&&d.toAbortSignal()],p),I;const R=P&&P.unsubscribe&&(()=>{P.unsubscribe()});let L;try{if(v&&z0&&s!=="get"&&s!=="head"&&(L=await U0(E,u))!==0){let $=new Request(i,{method:"POST",body:u,duplex:"half"}),T;if(_.isFormData(u)&&(T=$.headers.get("content-type"))&&E.setContentType(T),$.body){const[H,se]=Id(L,es(_d(v)));u=Od($.body,Td,H,se)}}_.isString(j)||(j=j?"include":"omit");const V="credentials"in Request.prototype;I=new Request(i,{...O,signal:P,method:s.toUpperCase(),headers:E.normalize().toJSON(),body:u,duplex:"half",credentials:V?j:void 0});let F=await fetch(I);const W=Du&&(x==="stream"||x==="response");if(Du&&(m||W&&R)){const $={};["status","statusText","headers"].forEach(Ve=>{$[Ve]=F[Ve]});const T=_.toFiniteNumber(F.headers.get("content-length")),[H,se]=m&&Id(T,es(_d(m),!0))||[];F=new Response(Od(F.body,Td,H,()=>{se&&se(),R&&R()}),$)}x=x||"text";let K=await ts[_.findKey(ts,x)||"text"](F,r);return!W&&R&&R(),await new Promise(($,T)=>{Dp($,T,{data:K,headers:lt.from(F.headers),status:F.status,statusText:F.statusText,config:r,request:I})})}catch(V){throw R&&R(),V&&V.name==="TypeError"&&/fetch/i.test(V.message)?Object.assign(new ie("Network Error",ie.ERR_NETWORK,r,I),{cause:V.cause||V}):ie.from(V,V&&V.code,r,I)}}),zu={http:e0,xhr:_0,fetch:F0};_.forEach(zu,(r,i)=>{if(r){try{Object.defineProperty(r,"name",{value:i})}catch{}Object.defineProperty(r,"adapterName",{value:i})}});const Ld=r=>`- ${r}`,B0=r=>_.isFunction(r)||r===null||r===!1,Bp={getAdapter:r=>{r=_.isArray(r)?r:[r];const{length:i}=r;let s,u;const c={};for(let d=0;d`adapter ${m} `+(v===!1?"is not supported by the environment":"is not available in the build"));let p=i?d.length>1?`since : +`+d.map(Ld).join(` +`):" "+Ld(d[0]):"as no adapter specified";throw new ie("There is no suitable adapter to dispatch the request "+p,"ERR_NOT_SUPPORT")}return u},adapters:zu};function wu(r){if(r.cancelToken&&r.cancelToken.throwIfRequested(),r.signal&&r.signal.aborted)throw new Pr(null,r)}function Dd(r){return wu(r),r.headers=lt.from(r.headers),r.data=vu.call(r,r.transformRequest),["post","put","patch"].indexOf(r.method)!==-1&&r.headers.setContentType("application/x-www-form-urlencoded",!1),Bp.getAdapter(r.adapter||Co.adapter)(r).then(function(u){return wu(r),u.data=vu.call(r,r.transformResponse,u),u.headers=lt.from(u.headers),u},function(u){return Lp(u)||(wu(r),u&&u.response&&(u.response.data=vu.call(r,r.transformResponse,u.response),u.response.headers=lt.from(u.response.headers))),Promise.reject(u)})}const $p="1.7.9",ps={};["object","boolean","number","function","string","symbol"].forEach((r,i)=>{ps[r]=function(u){return typeof u===r||"a"+(i<1?"n ":" ")+r}});const zd={};ps.transitional=function(i,s,u){function c(d,p){return"[Axios v"+$p+"] Transitional option '"+d+"'"+p+(u?". "+u:"")}return(d,p,m)=>{if(i===!1)throw new ie(c(p," has been removed"+(s?" in "+s:"")),ie.ERR_DEPRECATED);return s&&!zd[p]&&(zd[p]=!0,console.warn(c(p," has been deprecated since v"+s+" and will be removed in the near future"))),i?i(d,p,m):!0}};ps.spelling=function(i){return(s,u)=>(console.warn(`${u} is likely a misspelling of ${i}`),!0)};function $0(r,i,s){if(typeof r!="object")throw new ie("options must be an object",ie.ERR_BAD_OPTION_VALUE);const u=Object.keys(r);let c=u.length;for(;c-- >0;){const d=u[c],p=i[d];if(p){const m=r[d],v=m===void 0||p(m,d,r);if(v!==!0)throw new ie("option "+d+" must be "+v,ie.ERR_BAD_OPTION_VALUE);continue}if(s!==!0)throw new ie("Unknown option "+d,ie.ERR_BAD_OPTION)}}const Gi={assertOptions:$0,validators:ps},Ht=Gi.validators;class Vn{constructor(i){this.defaults=i,this.interceptors={request:new Pd,response:new Pd}}async request(i,s){try{return await this._request(i,s)}catch(u){if(u instanceof Error){let c={};Error.captureStackTrace?Error.captureStackTrace(c):c=new Error;const d=c.stack?c.stack.replace(/^.+\n/,""):"";try{u.stack?d&&!String(u.stack).endsWith(d.replace(/^.+\n.+\n/,""))&&(u.stack+=` +`+d):u.stack=d}catch{}}throw u}}_request(i,s){typeof i=="string"?(s=s||{},s.url=i):s=i||{},s=qn(this.defaults,s);const{transitional:u,paramsSerializer:c,headers:d}=s;u!==void 0&&Gi.assertOptions(u,{silentJSONParsing:Ht.transitional(Ht.boolean),forcedJSONParsing:Ht.transitional(Ht.boolean),clarifyTimeoutError:Ht.transitional(Ht.boolean)},!1),c!=null&&(_.isFunction(c)?s.paramsSerializer={serialize:c}:Gi.assertOptions(c,{encode:Ht.function,serialize:Ht.function},!0)),Gi.assertOptions(s,{baseUrl:Ht.spelling("baseURL"),withXsrfToken:Ht.spelling("withXSRFToken")},!0),s.method=(s.method||this.defaults.method||"get").toLowerCase();let p=d&&_.merge(d.common,d[s.method]);d&&_.forEach(["delete","get","head","post","put","patch","common"],I=>{delete d[I]}),s.headers=lt.concat(p,d);const m=[];let v=!0;this.interceptors.request.forEach(function(R){typeof R.runWhen=="function"&&R.runWhen(s)===!1||(v=v&&R.synchronous,m.unshift(R.fulfilled,R.rejected))});const x=[];this.interceptors.response.forEach(function(R){x.push(R.fulfilled,R.rejected)});let E,j=0,O;if(!v){const I=[Dd.bind(this),void 0];for(I.unshift.apply(I,m),I.push.apply(I,x),O=I.length,E=Promise.resolve(s);j{if(!u._listeners)return;let d=u._listeners.length;for(;d-- >0;)u._listeners[d](c);u._listeners=null}),this.promise.then=c=>{let d;const p=new Promise(m=>{u.subscribe(m),d=m}).then(c);return p.cancel=function(){u.unsubscribe(d)},p},i(function(d,p,m){u.reason||(u.reason=new Pr(d,p,m),s(u.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(i){if(this.reason){i(this.reason);return}this._listeners?this._listeners.push(i):this._listeners=[i]}unsubscribe(i){if(!this._listeners)return;const s=this._listeners.indexOf(i);s!==-1&&this._listeners.splice(s,1)}toAbortSignal(){const i=new AbortController,s=u=>{i.abort(u)};return this.subscribe(s),i.signal.unsubscribe=()=>this.unsubscribe(s),i.signal}static source(){let i;return{token:new Yu(function(c){i=c}),cancel:i}}}function H0(r){return function(s){return r.apply(null,s)}}function V0(r){return _.isObject(r)&&r.isAxiosError===!0}const Mu={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Mu).forEach(([r,i])=>{Mu[i]=r});function Hp(r){const i=new Vn(r),s=wp(Vn.prototype.request,i);return _.extend(s,Vn.prototype,i,{allOwnKeys:!0}),_.extend(s,i,null,{allOwnKeys:!0}),s.create=function(c){return Hp(qn(r,c))},s}const he=Hp(Co);he.Axios=Vn;he.CanceledError=Pr;he.CancelToken=Yu;he.isCancel=Lp;he.VERSION=$p;he.toFormData=fs;he.AxiosError=ie;he.Cancel=he.CanceledError;he.all=function(i){return Promise.all(i)};he.spread=H0;he.isAxiosError=V0;he.mergeConfig=qn;he.AxiosHeaders=lt;he.formToJSON=r=>Tp(_.isHTMLForm(r)?new FormData(r):r);he.getAdapter=Bp.getAdapter;he.HttpStatusCode=Mu;he.default=he;const Xe={apiBaseUrl:"/api"},Dt=bn(r=>({users:[],fetchUsers:async()=>{try{const i=await he.get(`${Xe.apiBaseUrl}/users`);r({users:i.data})}catch(i){console.error("사용자 목록 조회 실패:",i)}},updateUserStatus:async i=>{try{await he.patch(`${Xe.apiBaseUrl}/users/${i}/userStatus`,{newLastActiveAt:new Date().toISOString()})}catch(s){console.error("사용자 상태 업데이트 실패:",s)}}})),Wt=bn(r=>({profileImages:{},fetchProfileImage:async i=>{try{const s=await he.get(`${Xe.apiBaseUrl}/binaryContents/${i}`),u=s.data.bytes,d=`data:${s.data.contentType};base64,${u}`;return r(p=>({profileImages:{...p.profileImages,[i]:d}})),d}catch(s){return console.error("프로필 이미지 로딩 실패:",s),null}}}));function Vp(r,i){let s;try{s=r()}catch{return}return{getItem:c=>{var d;const p=v=>v===null?null:JSON.parse(v,void 0),m=(d=s.getItem(c))!=null?d:null;return m instanceof Promise?m.then(p):p(m)},setItem:(c,d)=>s.setItem(c,JSON.stringify(d,void 0)),removeItem:c=>s.removeItem(c)}}const Uu=r=>i=>{try{const s=r(i);return s instanceof Promise?s:{then(u){return Uu(u)(s)},catch(u){return this}}}catch(s){return{then(u){return this},catch(u){return Uu(u)(s)}}}},W0=(r,i)=>(s,u,c)=>{let d={storage:Vp(()=>localStorage),partialize:R=>R,version:0,merge:(R,L)=>({...L,...R}),...i},p=!1;const m=new Set,v=new Set;let x=d.storage;if(!x)return r((...R)=>{console.warn(`[zustand persist middleware] Unable to update item '${d.name}', the given storage is currently unavailable.`),s(...R)},u,c);const E=()=>{const R=d.partialize({...u()});return x.setItem(d.name,{state:R,version:d.version})},j=c.setState;c.setState=(R,L)=>{j(R,L),E()};const O=r((...R)=>{s(...R),E()},u,c);c.getInitialState=()=>O;let P;const I=()=>{var R,L;if(!x)return;p=!1,m.forEach(F=>{var W;return F((W=u())!=null?W:O)});const V=((L=d.onRehydrateStorage)==null?void 0:L.call(d,(R=u())!=null?R:O))||void 0;return Uu(x.getItem.bind(x))(d.name).then(F=>{if(F)if(typeof F.version=="number"&&F.version!==d.version){if(d.migrate){const W=d.migrate(F.state,F.version);return W instanceof Promise?W.then(K=>[!0,K]):[!0,W]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,F.state];return[!1,void 0]}).then(F=>{var W;const[K,$]=F;if(P=d.merge($,(W=u())!=null?W:O),s(P,!0),K)return E()}).then(()=>{V==null||V(P,void 0),P=u(),p=!0,v.forEach(F=>F(P))}).catch(F=>{V==null||V(void 0,F)})};return c.persist={setOptions:R=>{d={...d,...R},R.storage&&(x=R.storage)},clearStorage:()=>{x==null||x.removeItem(d.name)},getOptions:()=>d,rehydrate:()=>I(),hasHydrated:()=>p,onHydrate:R=>(m.add(R),()=>{m.delete(R)}),onFinishHydration:R=>(v.add(R),()=>{v.delete(R)})},d.skipHydration||I(),P||O},Q0=W0,ut=bn(Q0(r=>({currentUserId:null,setCurrentUser:i=>r({currentUserId:i.id}),logout:()=>{const i=ut.getState().currentUserId;i&&Dt.getState().updateUserStatus(i),r({currentUserId:null})},updateUser:async(i,s)=>{try{const u=await he.patch(`${Xe.apiBaseUrl}/users/${i}`,s,{headers:{"Content-Type":"multipart/form-data"}});return await Dt.getState().fetchUsers(),u.data}catch(u){throw console.error("사용자 정보 수정 실패:",u),u}}}),{name:"user-storage",storage:Vp(()=>sessionStorage)})),Qt="data:image/png;base64,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";function Md({channel:r,isActive:i,onClick:s,hasUnread:u}){const c=ut(x=>x.currentUserId),d=Dt(x=>x.users),p=Wt(x=>x.profileImages);if(r.type==="PUBLIC")return g.jsxs(yp,{$isActive:i,onClick:s,$hasUnread:u,children:["# ",r.name]});const m=r.participantIds.map(x=>d.find(E=>E.id===x)).filter(Boolean);if(m.length>2){const x=m.filter(E=>E.id!==c).map(E=>E.username).join(", ");return g.jsxs(yd,{$isActive:i,onClick:s,children:[g.jsx(uy,{children:m.filter(E=>E.id!==c).slice(0,2).map((E,j)=>g.jsx(cy,{src:E.profileId?p[E.profileId]:Qt,style:{position:"absolute",left:j*16,zIndex:2-j}},E.id))}),g.jsxs(xd,{children:[g.jsx(vd,{$hasUnread:u,children:x}),g.jsxs(ay,{children:["멤버 ",m.length,"명"]})]})]})}const v=m.filter(x=>x.id!==c)[0];return g.jsxs(yd,{$isActive:i,onClick:s,children:[g.jsxs(ly,{children:[g.jsx("img",{src:v.profileId?p[v.profileId]:Qt,alt:"profile"}),g.jsx(vp,{$online:v.online})]}),g.jsx(xd,{children:g.jsx(vd,{$hasUnread:u,children:v.username})})]})}function q0({isOpen:r,onClose:i,user:s,onSubmit:u}){const[c,d]=ue.useState(s.username),[p,m]=ue.useState(s.email),[v,x]=ue.useState(""),[E,j]=ue.useState(null),[O,P]=ue.useState(""),[I,R]=ue.useState(null),L=Wt(T=>T.profileImages),V=Wt(T=>T.fetchProfileImage),F=ut(T=>T.logout);ue.useEffect(()=>{s.profileId&&!L[s.profileId]&&V(s.profileId)},[s.profileId,L,V]);const W=()=>{d(s.username),m(s.email),x(""),j(null),R(null),P(""),i()},K=T=>{const H=T.target.files[0];if(H){j(H);const se=new FileReader;se.onloadend=()=>{R(se.result)},se.readAsDataURL(H)}},$=async T=>{T.preventDefault(),P("");try{const H=new FormData,se={};c!==s.username&&(se.newUsername=c),p!==s.email&&(se.newEmail=p),v&&(se.newPassword=v),(Object.keys(se).length>0||E)&&(H.append("userUpdateRequest",new Blob([JSON.stringify(se)],{type:"application/json"})),E&&H.append("profile",E),await u(H)),i()}catch{P("사용자 정보 수정에 실패했습니다.")}};return r?g.jsx(b0,{children:g.jsxs(G0,{children:[g.jsx("h2",{children:"프로필 수정"}),g.jsxs("form",{onSubmit:$,children:[g.jsxs(Mi,{children:[g.jsx(Ui,{children:"프로필 이미지"}),g.jsxs(K0,{children:[g.jsx(X0,{src:I||L[s.profileId]||Qt,alt:"profile"}),g.jsx(J0,{type:"file",accept:"image/*",onChange:K,id:"profile-image"}),g.jsx(Z0,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),g.jsxs(Mi,{children:[g.jsxs(Ui,{children:["사용자명 ",g.jsx(Fd,{children:"*"})]}),g.jsx(xu,{type:"text",value:c,onChange:T=>d(T.target.value),required:!0})]}),g.jsxs(Mi,{children:[g.jsxs(Ui,{children:["이메일 ",g.jsx(Fd,{children:"*"})]}),g.jsx(xu,{type:"email",value:p,onChange:T=>m(T.target.value),required:!0})]}),g.jsxs(Mi,{children:[g.jsx(Ui,{children:"새 비밀번호"}),g.jsx(xu,{type:"password",placeholder:"변경하지 않으려면 비워두세요",value:v,onChange:T=>x(T.target.value)})]}),O&&g.jsx(Y0,{children:O}),g.jsxs(ev,{children:[g.jsx(Ud,{type:"button",onClick:W,$secondary:!0,children:"취소"}),g.jsx(Ud,{type:"submit",children:"저장"})]})]}),g.jsx(tv,{onClick:F,children:"로그아웃"})]})}):null}const b0=N.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,G0=N.div` + background: ${({theme:r})=>r.colors.background.secondary}; + padding: 32px; + border-radius: 5px; + width: 100%; + max-width: 480px; + + h2 { + color: ${({theme:r})=>r.colors.text.primary}; + margin-bottom: 24px; + text-align: center; + font-size: 24px; + } +`,xu=N.input` + width: 100%; + padding: 10px; + margin-bottom: 10px; + border: none; + border-radius: 4px; + background: ${({theme:r})=>r.colors.background.input}; + color: ${({theme:r})=>r.colors.text.primary}; + + &::placeholder { + color: ${({theme:r})=>r.colors.text.muted}; + } + + &:focus { + outline: none; + box-shadow: 0 0 0 2px ${({theme:r})=>r.colors.brand.primary}; + } +`,Ud=N.button` + width: 100%; + padding: 10px; + border: none; + border-radius: 4px; + background: ${({$secondary:r,theme:i})=>r?"transparent":i.colors.brand.primary}; + color: ${({theme:r})=>r.colors.text.primary}; + cursor: pointer; + font-weight: 500; + + &:hover { + background: ${({$secondary:r,theme:i})=>r?i.colors.background.hover:i.colors.brand.hover}; + } +`,Y0=N.div` + color: ${({theme:r})=>r.colors.status.error}; + font-size: 14px; + margin-bottom: 10px; +`,K0=N.div` + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 20px; +`,X0=N.img` + width: 100px; + height: 100px; + border-radius: 50%; + margin-bottom: 10px; + object-fit: cover; +`,J0=N.input` + display: none; +`,Z0=N.label` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + font-size: 14px; + + &:hover { + text-decoration: underline; + } +`,ev=N.div` + display: flex; + gap: 10px; + margin-top: 20px; +`,tv=N.button` + width: 100%; + padding: 10px; + margin-top: 16px; + border: none; + border-radius: 4px; + background: transparent; + color: ${({theme:r})=>r.colors.status.error}; + cursor: pointer; + font-weight: 500; + + &:hover { + background: ${({theme:r})=>r.colors.status.error}20; + } +`,Mi=N.div` + margin-bottom: 20px; +`,Ui=N.label` + display: block; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 12px; + font-weight: 700; + margin-bottom: 8px; +`,Fd=N.span` + color: ${({theme:r})=>r.colors.status.error}; +`,Wp=N.div` + position: absolute; + bottom: -3px; + right: -3px; + width: 16px; + height: 16px; + border-radius: 50%; + background: ${r=>r.$online?J.colors.status.online:J.colors.status.offline}; + border: 4px solid ${r=>r.$background||J.colors.background.secondary}; +`,nv=N.div` + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem 0.75rem; + background-color: ${({theme:r})=>r.colors.background.tertiary}; + width: 100%; + height: 52px; +`,rv=N.div` + position: relative; + width: 32px; + height: 32px; + flex-shrink: 0; +`,ov=N.img` + width: 100%; + height: 100%; + border-radius: 50%; + object-fit: cover; +`,iv=N.div` + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; +`,sv=N.div` + font-weight: 500; + color: ${({theme:r})=>r.colors.text.primary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 0.875rem; + line-height: 1.2; +`,lv=N.div` + font-size: 0.75rem; + color: ${({theme:r})=>r.colors.text.secondary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.2; +`,uv=N.div` + display: flex; + align-items: center; + flex-shrink: 0; +`,av=N.button` + background: none; + border: none; + padding: 0.25rem; + cursor: pointer; + color: ${({theme:r})=>r.colors.text.secondary}; + font-size: 18px; + + &:hover { + color: ${({theme:r})=>r.colors.text.primary}; + } +`;function cv({user:r}){const[i,s]=ue.useState(!1);ut(m=>m.logout);const u=ut(m=>m.updateUser),c=Wt(m=>m.profileImages),d=Wt(m=>m.fetchProfileImage);ue.useEffect(()=>{r.profileId&&!c[r.profileId]&&d(r.profileId)},[r.profileId,c,d]);const p=async m=>{await u(r.id,m)};return g.jsxs(g.Fragment,{children:[g.jsxs(nv,{children:[g.jsxs(rv,{children:[g.jsx(ov,{src:c[r.profileId]||Qt}),g.jsx(Wp,{$online:r.online,$background:J.colors.background.tertiary})]}),g.jsxs(iv,{children:[g.jsx(sv,{children:r.username}),g.jsx(lv,{children:r.email})]}),g.jsx(uv,{children:g.jsx(av,{onClick:()=>s(!0),children:"⚙️"})})]}),g.jsx(q0,{isOpen:i,onClose:()=>s(!1),user:r,onSubmit:p})]})}const fv=N.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.85); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,dv=N.div` + background: ${J.colors.background.primary}; + border-radius: 4px; + width: 440px; + max-width: 90%; +`,pv=N.div` + padding: 16px; + display: flex; + justify-content: space-between; + align-items: center; +`,hv=N.h2` + color: ${J.colors.text.primary}; + font-size: 20px; + font-weight: 600; + margin: 0; +`,mv=N.div` + padding: 0 16px 16px; +`,gv=N.form` + display: flex; + flex-direction: column; + gap: 16px; +`,Su=N.div` + display: flex; + flex-direction: column; + gap: 8px; +`,ku=N.label` + color: ${J.colors.text.primary}; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; +`,yv=N.p` + color: ${J.colors.text.muted}; + font-size: 14px; + margin: -4px 0 0; +`,Fu=N.input` + padding: 10px; + background: ${J.colors.background.tertiary}; + border: none; + border-radius: 3px; + color: ${J.colors.text.primary}; + font-size: 16px; + + &:focus { + outline: none; + box-shadow: 0 0 0 2px ${J.colors.status.online}; + } + + &::placeholder { + color: ${J.colors.text.muted}; + } +`,vv=N.button` + margin-top: 8px; + padding: 12px; + background: ${J.colors.status.online}; + color: white; + border: none; + border-radius: 3px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: #3ca374; + } +`,wv=N.button` + background: none; + border: none; + color: ${J.colors.text.muted}; + font-size: 24px; + cursor: pointer; + padding: 4px; + line-height: 1; + + &:hover { + color: ${J.colors.text.primary}; + } +`,xv=N(Fu)` + margin-bottom: 8px; +`,Sv=N.div` + max-height: 300px; + overflow-y: auto; + background: ${J.colors.background.tertiary}; + border-radius: 4px; +`,kv=N.div` + display: flex; + align-items: center; + padding: 8px 12px; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: ${J.colors.background.hover}; + } + + & + & { + border-top: 1px solid ${J.colors.border.primary}; + } +`,Ev=N.input` + margin-right: 12px; + width: 16px; + height: 16px; + cursor: pointer; +`,Bd=N.img` + width: 32px; + height: 32px; + border-radius: 50%; + margin-right: 12px; +`,Cv=N.div` + flex: 1; + min-width: 0; +`,Av=N.div` + color: ${J.colors.text.primary}; + font-size: 14px; + font-weight: 500; +`,Rv=N.div` + color: ${J.colors.text.muted}; + font-size: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,Pv=N.div` + padding: 16px; + text-align: center; + color: ${J.colors.text.muted}; +`,jv=N.div` + color: ${J.colors.status.error}; + font-size: 14px; + padding: 8px 0; + text-align: center; + background-color: ${({theme:r})=>r.colors.background.tertiary}; + border-radius: 4px; + margin-bottom: 8px; +`,Bn=bn((r,i)=>({channels:[],pollingInterval:null,fetchChannels:async s=>{try{const u=await he.get(`${Xe.apiBaseUrl}/channels`,{params:{userId:s}});return r({channels:u.data}),u.data}catch(u){console.error("채널 목록 조회 실패:",u)}},startPolling:s=>{i().pollingInterval&&clearInterval(i().pollingInterval);const u=setInterval(()=>{i().fetchChannels(s)},3e3);r({pollingInterval:u})},stopPolling:()=>{i().pollingInterval&&(clearInterval(i().pollingInterval),r({pollingInterval:null}))},createPublicChannel:async s=>{try{const u=await he.post(`${Xe.apiBaseUrl}/channels/public`,s),c={...u.data,participantIds:[],lastMessageAt:u.data.createdAt};return r(d=>({channels:[...d.channels,c]})),c}catch(u){throw console.error("공개 채널 생성 실패:",u),u}},createPrivateChannel:async s=>{try{const u=await he.post(`${Xe.apiBaseUrl}/channels/private`,{participantIds:s}),c={...u.data,participantIds:s,lastMessageAt:u.data.createdAt};return r(d=>({channels:[...d.channels,c]})),c}catch(u){throw console.error("비공개 채널 생성 실패:",u),u}}}));function Iv({isOpen:r,type:i,onClose:s,onCreateSuccess:u}){const[c,d]=ue.useState({name:"",description:""}),[p,m]=ue.useState(""),[v,x]=ue.useState([]),[E,j]=ue.useState(""),O=Dt($=>$.users),P=Wt($=>$.profileImages),I=ut($=>$.currentUserId),R=ue.useMemo(()=>O.filter($=>$.id!==I).filter($=>$.username.toLowerCase().includes(p.toLowerCase())||$.email.toLowerCase().includes(p.toLowerCase())),[p,O]),L=Bn($=>$.createPublicChannel),V=Bn($=>$.createPrivateChannel),F=$=>{const{name:T,value:H}=$.target;d(se=>({...se,[T]:H}))},W=$=>{x(T=>T.includes($)?T.filter(H=>H!==$):[...T,$])},K=async $=>{var T,H;$.preventDefault(),j("");try{if(i==="PUBLIC"){if(!c.name.trim()){j("채널 이름을 입력해주세요.");return}await L({name:c.name,description:c.description})}else{if(v.length===0){j("대화 상대를 선택해주세요.");return}const se=[...v,I];await V(se)}u()}catch(se){console.error("채널 생성 실패:",se),j(((H=(T=se.response)==null?void 0:T.data)==null?void 0:H.message)||"채널 생성에 실패했습니다. 다시 시도해주세요.")}};return r?g.jsx(fv,{onClick:s,children:g.jsxs(dv,{onClick:$=>$.stopPropagation(),children:[g.jsxs(pv,{children:[g.jsx(hv,{children:i==="PUBLIC"?"채널 만들기":"개인 메시지 시작하기"}),g.jsx(wv,{onClick:s,children:"×"})]}),g.jsx(mv,{children:g.jsxs(gv,{onSubmit:K,children:[E&&g.jsx(jv,{children:E}),i==="PUBLIC"?g.jsxs(g.Fragment,{children:[g.jsxs(Su,{children:[g.jsx(ku,{children:"채널 이름"}),g.jsx(Fu,{name:"name",value:c.name,onChange:F,placeholder:"새로운-채널",required:!0})]}),g.jsxs(Su,{children:[g.jsx(ku,{children:"채널 설명"}),g.jsx(yv,{children:"이 채널의 주제를 설명해주세요."}),g.jsx(Fu,{name:"description",value:c.description,onChange:F,placeholder:"채널 설명을 입력하세요"})]})]}):g.jsxs(Su,{children:[g.jsx(ku,{children:"사용자 검색"}),g.jsx(xv,{type:"text",value:p,onChange:$=>m($.target.value),placeholder:"사용자명 또는 이메일로 검색"}),g.jsx(Sv,{children:R.length>0?R.map($=>g.jsxs(kv,{children:[g.jsx(Ev,{type:"checkbox",checked:v.includes($.id),onChange:()=>W($.id)}),$.profileId?g.jsx(Bd,{src:P[$.profileId]}):g.jsx(Bd,{src:Qt}),g.jsxs(Cv,{children:[g.jsx(Av,{children:$.username}),g.jsx(Rv,{children:$.email})]})]},$.id)):g.jsx(Pv,{children:"검색 결과가 없습니다."})})]}),g.jsx(vv,{type:"submit",children:i==="PUBLIC"?"채널 만들기":"대화 시작하기"})]})})]})}):null}const yo=bn((r,i)=>({readStatuses:{},fetchReadStatuses:async()=>{try{const s=ut.getState().currentUserId;if(!s)return;const c=(await he.get(`${Xe.apiBaseUrl}/readStatuses`,{params:{userId:s}})).data.reduce((d,p)=>(d[p.channelId]={id:p.id,lastReadAt:p.lastReadAt},d),{});r({readStatuses:c})}catch(s){console.error("읽음 상태 조회 실패:",s)}},updateReadStatus:async s=>{try{const u=ut.getState().currentUserId;if(!u)return;const c=i().readStatuses[s];let d;c?d=await he.patch(`${Xe.apiBaseUrl}/readStatuses/${c.id}`,{newLastReadAt:new Date().toISOString()}):d=await he.post(`${Xe.apiBaseUrl}/readStatuses`,{userId:u,channelId:s,lastReadAt:new Date().toISOString()}),r(p=>({readStatuses:{...p.readStatuses,[s]:{id:d.data.id,lastReadAt:d.data.lastReadAt}}}))}catch(u){console.error("읽음 상태 업데이트 실패:",u)}},hasUnreadMessages:(s,u)=>{const c=i().readStatuses[s],d=c==null?void 0:c.lastReadAt;return!d||new Date(u)>new Date(d)}}));function _v({currentUser:r,activeChannel:i,onChannelSelect:s}){var K,$;const[u,c]=ue.useState({PUBLIC:!1,PRIVATE:!1}),[d,p]=ue.useState({isOpen:!1,type:null}),m=Bn(T=>T.channels),v=Bn(T=>T.fetchChannels),x=Bn(T=>T.startPolling),E=Bn(T=>T.stopPolling);yo(T=>T.readStatuses);const j=yo(T=>T.fetchReadStatuses),O=yo(T=>T.updateReadStatus),P=yo(T=>T.hasUnreadMessages);ue.useEffect(()=>{if(r)return v(r.id),j(),x(r.id),()=>{E()}},[r,v,j,x,E]);const I=T=>{c(H=>({...H,[T]:!H[T]}))},R=(T,H)=>{H.stopPropagation(),p({isOpen:!0,type:T})},L=()=>{p({isOpen:!1,type:null})},V=async T=>{try{await v(r.id),L()}catch(H){console.error("채널 생성 실패:",H)}},F=T=>{s(T),O(T.id)},W=m.reduce((T,H)=>(T[H.type]||(T[H.type]=[]),T[H.type].push(H),T),{});return g.jsxs(oy,{children:[g.jsx(fy,{}),g.jsxs(iy,{children:[g.jsxs(hd,{children:[g.jsxs(Nu,{onClick:()=>I("PUBLIC"),children:[g.jsx(md,{$folded:u.PUBLIC,children:"▼"}),g.jsx("span",{children:"일반 채널"}),g.jsx(wd,{onClick:T=>R("PUBLIC",T),children:"+"})]}),g.jsx(gd,{$folded:u.PUBLIC,children:(K=W.PUBLIC)==null?void 0:K.map(T=>g.jsx(Md,{channel:T,isActive:(i==null?void 0:i.id)===T.id,hasUnread:P(T.id,T.lastMessageAt),onClick:()=>F(T)},T.id))})]}),g.jsxs(hd,{children:[g.jsxs(Nu,{onClick:()=>I("PRIVATE"),children:[g.jsx(md,{$folded:u.PRIVATE,children:"▼"}),g.jsx("span",{children:"개인 메시지"}),g.jsx(wd,{onClick:T=>R("PRIVATE",T),children:"+"})]}),g.jsx(gd,{$folded:u.PRIVATE,children:($=W.PRIVATE)==null?void 0:$.map(T=>g.jsx(Md,{channel:T,isActive:(i==null?void 0:i.id)===T.id,hasUnread:P(T.id,T.lastMessageAt),onClick:()=>F(T)},T.id))})]})]}),g.jsx(Nv,{children:g.jsx(cv,{user:r})}),g.jsx(Iv,{isOpen:d.isOpen,type:d.type,onClose:L,onCreateSuccess:V})]})}const Nv=N.div` + margin-top: auto; + border-top: 1px solid ${({theme:r})=>r.colors.border.primary}; + background-color: ${({theme:r})=>r.colors.background.tertiary}; +`,Ov=N.div` + flex: 1; + display: flex; + flex-direction: column; + background: ${({theme:r})=>r.colors.background.primary}; +`,Tv=N.div` + display: flex; + flex-direction: column; + height: 100%; + background: ${({theme:r})=>r.colors.background.primary}; +`,Lv=N(Tv)` + justify-content: center; + align-items: center; + flex: 1; + padding: 0 20px; +`,Dv=N.div` + text-align: center; + max-width: 400px; + padding: 20px; + margin-bottom: 80px; +`,zv=N.div` + font-size: 48px; + margin-bottom: 16px; + animation: wave 2s infinite; + transform-origin: 70% 70%; + + @keyframes wave { + 0% { transform: rotate(0deg); } + 10% { transform: rotate(14deg); } + 20% { transform: rotate(-8deg); } + 30% { transform: rotate(14deg); } + 40% { transform: rotate(-4deg); } + 50% { transform: rotate(10deg); } + 60% { transform: rotate(0deg); } + 100% { transform: rotate(0deg); } + } +`,Mv=N.h2` + color: ${({theme:r})=>r.colors.text.primary}; + font-size: 28px; + font-weight: 700; + margin-bottom: 16px; +`,Uv=N.p` + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 16px; + line-height: 1.6; + word-break: keep-all; +`,$d=N.div` + height: 48px; + padding: 0 16px; + background: ${J.colors.background.primary}; + border-bottom: 1px solid ${J.colors.border.primary}; + display: flex; + align-items: center; +`,Hd=N.div` + display: flex; + align-items: center; + gap: 8px; + height: 100%; +`,Fv=N.div` + display: flex; + align-items: center; + gap: 12px; + height: 100%; +`,Bv=N.div` + position: relative; + width: 24px; + height: 24px; + flex-shrink: 0; +`,Vd=N.img` + width: 24px; + height: 24px; + border-radius: 50%; +`,$v=N.div` + position: relative; + width: 40px; + height: 24px; + flex-shrink: 0; +`,Hv=N.div` + position: absolute; + bottom: -2px; + right: -2px; + width: 14px; + height: 14px; + border-radius: 50%; + background: ${r=>r.online?J.colors.status.online:J.colors.status.offline}; + border: 3px solid ${J.colors.background.secondary}; +`,Vv=N(Hv)` + border-color: ${J.colors.background.primary}; + bottom: -3px; + right: -3px; +`,Wv=N.div` + font-size: 12px; + color: ${J.colors.text.muted}; + line-height: 13px; +`,Wd=N.div` + font-weight: bold; + color: ${J.colors.text.primary}; + line-height: 20px; + font-size: 16px; +`,Qv=N.div` + flex: 1; + display: flex; + flex-direction: column-reverse; + overflow-y: auto; +`,qv=N.div` + padding: 16px; + display: flex; + flex-direction: column; +`,bv=N.div` + margin-bottom: 16px; + display: flex; + align-items: flex-start; +`,Gv=N.div` + position: relative; + margin-right: 16px; + flex-shrink: 0; +`,Yv=N.img` + width: 40px; + height: 40px; + border-radius: 50%; +`,Kv=N.div` + display: flex; + align-items: center; + margin-bottom: 4px; +`,Xv=N.span` + font-weight: bold; + color: ${J.colors.text.primary}; + margin-right: 8px; +`,Jv=N.span` + font-size: 0.75rem; + color: ${J.colors.text.muted}; +`,Zv=N.div` + color: ${J.colors.text.secondary}; + margin-top: 4px; +`,e1=N.form` + display: flex; + align-items: center; + gap: 8px; + padding: 16px; + background: ${({theme:r})=>r.colors.background.secondary}; +`,t1=N.textarea` + flex: 1; + padding: 12px; + background: ${({theme:r})=>r.colors.background.tertiary}; + border: none; + border-radius: 4px; + color: ${({theme:r})=>r.colors.text.primary}; + font-size: 14px; + resize: none; + min-height: 44px; + max-height: 144px; + + &:focus { + outline: none; + } + + &::placeholder { + color: ${({theme:r})=>r.colors.text.muted}; + } +`,n1=N.button` + background: none; + border: none; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 24px; + cursor: pointer; + padding: 4px 8px; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + color: ${({theme:r})=>r.colors.text.primary}; + } +`;N.div` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + color: ${J.colors.text.muted}; + font-size: 16px; + font-weight: 500; + padding: 20px; + text-align: center; +`;const Qd=N.div` + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 8px; + width: 100%; +`,r1=N.a` + display: block; + border-radius: 4px; + overflow: hidden; + max-width: 300px; + + img { + width: 100%; + height: auto; + display: block; + } +`,o1=N.a` + display: flex; + align-items: center; + gap: 12px; + padding: 12px; + background: ${({theme:r})=>r.colors.background.tertiary}; + border-radius: 8px; + text-decoration: none; + width: fit-content; + + &:hover { + background: ${({theme:r})=>r.colors.background.hover}; + } +`,i1=N.div` + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + font-size: 40px; + color: #0B93F6; +`,s1=N.div` + display: flex; + flex-direction: column; + gap: 2px; +`,l1=N.span` + font-size: 14px; + color: #0B93F6; + font-weight: 500; +`,u1=N.span` + font-size: 13px; + color: ${({theme:r})=>r.colors.text.muted}; +`,a1=N.div` + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 8px 0; +`,Qp=N.div` + position: relative; + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: ${({theme:r})=>r.colors.background.tertiary}; + border-radius: 4px; + max-width: 300px; +`,c1=N(Qp)` + padding: 0; + overflow: hidden; + width: 200px; + height: 120px; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } +`,f1=N.div` + color: #0B93F6; + font-size: 20px; +`,d1=N.div` + font-size: 13px; + color: ${({theme:r})=>r.colors.text.primary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,qd=N.button` + position: absolute; + top: -6px; + right: -6px; + width: 20px; + height: 20px; + border-radius: 50%; + background: ${({theme:r})=>r.colors.background.secondary}; + border: none; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 16px; + line-height: 1; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + padding: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + + &:hover { + color: ${({theme:r})=>r.colors.text.primary}; + } +`,vo=bn((r,i)=>({messages:[],pollingIntervals:{},lastMessageId:null,fetchMessages:async s=>{try{const u=await he.get(`${Xe.apiBaseUrl}/messages`,{params:{channelId:s}}),c=u.data[u.data.length-1],d=(c==null?void 0:c.id)!==i().lastMessageId;return r({messages:u.data,lastMessageId:c==null?void 0:c.id}),d}catch(u){return console.error("메시지 목록 조회 실패:",u),!1}},startPolling:s=>{const u=i();u.pollingIntervals[s]&&clearTimeout(u.pollingIntervals[s]);let c=300;const d=3e3;r(m=>({pollingIntervals:{...m.pollingIntervals,[s]:!0}}));const p=async()=>{const m=i();if(!m.pollingIntervals[s])return;if(await m.fetchMessages(s)?c=300:c=Math.min(c*1.5,d),i().pollingIntervals[s]){const x=setTimeout(p,c);r(E=>({pollingIntervals:{...E.pollingIntervals,[s]:x}}))}};p()},stopPolling:s=>{const{pollingIntervals:u}=i();if(u[s]){const c=u[s];typeof c=="number"&&clearTimeout(c),r(d=>{const p={...d.pollingIntervals};return delete p[s],{pollingIntervals:p}})}},createMessage:async s=>{try{const u=new FormData;u.append("messageCreateRequest",new Blob([JSON.stringify({content:s.content,channelId:s.channelId,authorId:s.authorId})],{type:"application/json"})),s.attachments&&s.attachments.forEach(p=>{u.append("attachments",p)});const c=await he.post(`${Xe.apiBaseUrl}/messages`,u,{headers:{"Content-Type":"multipart/form-data"}}),d=yo.getState().updateReadStatus;return await d(s.channelId),r(p=>({messages:[...p.messages,c.data]})),c.data}catch(u){throw console.error("메시지 생성 실패:",u),u}}})),p1=bn((r,i)=>({attachments:{},fetchAttachment:async s=>{if(i().attachments[s])return i().attachments[s];try{const u=await he.get(`${Xe.apiBaseUrl}/binaryContents/${s}`),{bytes:c,contentType:d,fileName:p,size:m}=u.data,x={url:`data:${d};base64,${c}`,contentType:d,originalName:p,size:m};return r(E=>({attachments:{...E.attachments,[s]:x}})),x}catch(u){return console.error("첨부파일 정보 조회 실패:",u),null}}})),h1=r=>r<1024?r+" B":r<1024*1024?(r/1024).toFixed(2)+" KB":r<1024*1024*1024?(r/(1024*1024)).toFixed(2)+" MB":(r/(1024*1024*1024)).toFixed(2)+" GB";function m1({channel:r}){const i=vo(P=>P.messages),s=vo(P=>P.fetchMessages),u=vo(P=>P.startPolling),c=vo(P=>P.stopPolling),d=Wt(P=>P.profileImages),p=Dt(P=>P.users),{attachments:m,fetchAttachment:v}=p1();ue.useEffect(()=>{if(r!=null&&r.id)return s(r.id),u(r.id),()=>{c(r.id)}},[r==null?void 0:r.id,s,u,c]),ue.useEffect(()=>{i.forEach(P=>{var I;(I=P.attachmentIds)==null||I.forEach(R=>{m[R]||v(R)})})},[i,m,v]);const x=async(P,I)=>{try{const R=await he.get(`${Xe.apiBaseUrl}/binaryContents/${P}`,{responseType:"blob"}),L=new Blob([R.data],{type:R.headers["content-type"]}),V=window.URL.createObjectURL(L),F=document.createElement("a");F.href=V,F.download=I,F.style.display="none",document.body.appendChild(F);try{const K=await(await window.showSaveFilePicker({suggestedName:I,types:[{description:"Files",accept:{"*/*":[".txt",".pdf",".doc",".docx",".xls",".xlsx",".jpg",".jpeg",".png",".gif"]}}]})).createWritable();await K.write(L),await K.close()}catch(W){W.name!=="AbortError"&&F.click()}document.body.removeChild(F),window.URL.revokeObjectURL(V)}catch(R){console.error("파일 다운로드 실패:",R)}},E=P=>P!=null&&P.length?P.map(I=>{const R=m[I];return R?R.contentType.startsWith("image/")?g.jsx(Qd,{children:g.jsx(r1,{href:"#",onClick:V=>{V.preventDefault(),x(I,R.originalName)},children:g.jsx("img",{src:R.url,alt:R.originalName})})},I):g.jsx(Qd,{children:g.jsxs(o1,{href:"#",onClick:V=>{V.preventDefault(),x(I,R.originalName)},children:[g.jsx(i1,{children:g.jsxs("svg",{width:"40",height:"40",viewBox:"0 0 40 40",fill:"none",children:[g.jsx("path",{d:"M8 3C8 1.89543 8.89543 1 10 1H22L32 11V37C32 38.1046 31.1046 39 30 39H10C8.89543 39 8 38.1046 8 37V3Z",fill:"#0B93F6",fillOpacity:"0.1"}),g.jsx("path",{d:"M22 1L32 11H24C22.8954 11 22 10.1046 22 9V1Z",fill:"#0B93F6",fillOpacity:"0.3"}),g.jsx("path",{d:"M13 19H27M13 25H27M13 31H27",stroke:"#0B93F6",strokeWidth:"2",strokeLinecap:"round"})]})}),g.jsxs(s1,{children:[g.jsx(l1,{children:R.originalName}),g.jsx(u1,{children:h1(R.size)})]})]})},I):null}):null,j=P=>new Date(P).toLocaleTimeString(),O=[...i].sort((P,I)=>P.createdAt.localeCompare(I.createdAt));return g.jsx(Qv,{children:g.jsx(qv,{children:O.map(P=>{const I=p.find(R=>R.id===P.authorId);return g.jsxs(bv,{children:[g.jsx(Gv,{children:g.jsx(Yv,{src:I&&I.profileId?d[I.profileId]:Qt,alt:I&&I.username||"알 수 없음"})}),g.jsxs("div",{children:[g.jsxs(Kv,{children:[g.jsx(Xv,{children:I&&I.username||"알 수 없음"}),g.jsx(Jv,{children:j(P.createdAt)})]}),g.jsx(Zv,{children:P.content}),E(P.attachmentIds)]})]},P.id)})})})}function g1({channel:r}){const[i,s]=ue.useState(""),[u,c]=ue.useState([]),d=vo(O=>O.createMessage),p=ut(O=>O.currentUserId),m=async O=>{if(O.preventDefault(),!(!i.trim()&&u.length===0))try{await d({content:i.trim(),channelId:r.id,authorId:p,attachments:u}),s(""),c([])}catch(P){console.error("메시지 전송 실패:",P)}},v=O=>{const P=Array.from(O.target.files);c(I=>[...I,...P]),O.target.value=""},x=O=>{c(P=>P.filter((I,R)=>R!==O))},E=O=>{O.key==="Enter"&&!O.shiftKey&&(O.preventDefault(),m(O))},j=(O,P)=>O.type.startsWith("image/")?g.jsxs(c1,{children:[g.jsx("img",{src:URL.createObjectURL(O),alt:O.name}),g.jsx(qd,{onClick:()=>x(P),children:"×"})]},P):g.jsxs(Qp,{children:[g.jsx(f1,{children:"📎"}),g.jsx(d1,{children:O.name}),g.jsx(qd,{onClick:()=>x(P),children:"×"})]},P);return ue.useEffect(()=>()=>{u.forEach(O=>{O.type.startsWith("image/")&&URL.revokeObjectURL(O)})},[u]),r?g.jsxs(g.Fragment,{children:[u.length>0&&g.jsx(a1,{children:u.map((O,P)=>j(O,P))}),g.jsxs(e1,{onSubmit:m,children:[g.jsxs(n1,{as:"label",children:["+",g.jsx("input",{type:"file",multiple:!0,onChange:v,style:{display:"none"}})]}),g.jsx(t1,{value:i,onChange:O=>s(O.target.value),onKeyPress:E,placeholder:r.type==="PUBLIC"?`#${r.name}에 메시지 보내기`:"메시지 보내기"})]})]}):null}function y1({channel:r}){const i=ut(v=>v.currentUserId),s=Dt(v=>v.users),u=Wt(v=>v.profileImages);if(!r)return null;if(r.type==="PUBLIC")return g.jsx($d,{children:g.jsx(Hd,{children:g.jsxs(Wd,{children:["# ",r.name]})})});const c=r.participantIds.map(v=>s.find(x=>x.id===v)).filter(Boolean),d=c.filter(v=>v.id!==i),p=c.length>2,m=c.filter(v=>v.id!==i).map(v=>v.username).join(", ");return g.jsx($d,{children:g.jsx(Hd,{children:g.jsxs(Fv,{children:[p?g.jsx($v,{children:d.slice(0,2).map((v,x)=>g.jsx(Vd,{src:v.profileId?u[v.profileId]:Qt,style:{position:"absolute",left:x*16,zIndex:2-x}},v.id))}):g.jsxs(Bv,{children:[g.jsx(Vd,{src:d[0].profileId?u[d[0].profileId]:Qt}),g.jsx(Vv,{online:d[0].online})]}),g.jsxs("div",{children:[g.jsx(Wd,{children:m}),p&&g.jsxs(Wv,{children:["멤버 ",c.length,"명"]})]})]})})})}function v1({channel:r}){return r?g.jsxs(Ov,{children:[g.jsx(y1,{channel:r}),g.jsx(m1,{channel:r}),g.jsx(g1,{channel:r})]}):g.jsx(Lv,{children:g.jsxs(Dv,{children:[g.jsx(zv,{children:"👋"}),g.jsx(Mv,{children:"채널을 선택해주세요"}),g.jsxs(Uv,{children:["왼쪽의 채널 목록에서 채널을 선택하여",g.jsx("br",{}),"대화를 시작하세요."]})]})})}const w1=N.div` + width: 240px; + background: ${J.colors.background.secondary}; + border-left: 1px solid ${J.colors.border.primary}; +`,x1=N.div` + padding: 16px; + font-size: 14px; + font-weight: bold; + color: ${J.colors.text.muted}; + text-transform: uppercase; +`,S1=N.div` + padding: 8px 16px; + display: flex; + align-items: center; + color: ${J.colors.text.muted}; +`,k1=N.div` + position: relative; + width: 32px; + height: 32px; + margin-right: 12px; +`,bd=N.img` + width: 100%; + height: 100%; + border-radius: 50%; +`,E1=N.div` + display: flex; + align-items: center; +`;N.div` + width: 8px; + height: 8px; + border-radius: 50%; + margin-right: 8px; + background: ${r=>J.colors.status[r.status]}; +`;function C1({member:r}){const i=Wt(u=>u.profileImages),s=Wt(u=>u.fetchProfileImage);return ue.useEffect(()=>{r.profileId&&!i[r.profileId]&&s(r.profileId)},[r.profileId,i,s]),g.jsxs(S1,{children:[g.jsxs(k1,{children:[i[r.profileId]?g.jsx(bd,{src:i[r.profileId]}):g.jsx(bd,{src:Qt}),g.jsx(Wp,{$online:r.online})]}),g.jsx(E1,{children:r.username})]})}function A1(){const r=Dt(c=>c.users),i=Dt(c=>c.fetchUsers),s=ut(c=>c.currentUserId);ue.useEffect(()=>{i()},[i]);const u=[...r].sort((c,d)=>c.id===s?-1:d.id===s?1:c.online&&!d.online?-1:!c.online&&d.online?1:c.username.localeCompare(d.username));return g.jsxs(w1,{children:[g.jsxs(x1,{children:["멤버 목록 - ",r.length]}),u.map(c=>g.jsx(C1,{member:c},c.id))]})}const qp=N.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,bp=N.div` + background: ${J.colors.background.primary}; + padding: 32px; + border-radius: 8px; + width: 440px; + + h2 { + color: ${J.colors.text.primary}; + margin-bottom: 24px; + font-size: 24px; + font-weight: bold; + } + + form { + display: flex; + flex-direction: column; + gap: 16px; + } +`,xo=N.input` + width: 100%; + padding: 10px; + border-radius: 4px; + background: ${J.colors.background.input}; + border: none; + color: ${J.colors.text.primary}; + font-size: 16px; + + &::placeholder { + color: ${J.colors.text.muted}; + } + + &:focus { + outline: none; + } +`,Gp=N.button` + width: 100%; + padding: 12px; + border-radius: 4px; + background: ${J.colors.brand.primary}; + color: white; + font-size: 16px; + font-weight: 500; + border: none; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background: ${J.colors.brand.hover}; + } +`,Yp=N.div` + color: ${J.colors.status.error}; + font-size: 14px; + text-align: center; +`,R1=N.p` + text-align: center; + margin-top: 16px; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 14px; +`,P1=N.span` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +`;function j1({isOpen:r,onClose:i}){const[s,u]=ue.useState(""),[c,d]=ue.useState(""),[p,m]=ue.useState(""),[v,x]=ue.useState(null),[E,j]=ue.useState(null),[O,P]=ue.useState(""),I=ut(V=>V.setCurrentUser),R=V=>{const F=V.target.files[0];if(F){x(F);const W=new FileReader;W.onloadend=()=>{j(W.result)},W.readAsDataURL(F)}},L=async V=>{V.preventDefault(),P("");try{const F=new FormData;F.append("userCreateRequest",new Blob([JSON.stringify({email:s,username:c,password:p})],{type:"application/json"})),v&&F.append("profile",v);const W=await he.post(`${Xe.apiBaseUrl}/users`,F);I(W.data),i()}catch{P("회원가입에 실패했습니다.")}};return r?g.jsx(qp,{children:g.jsxs(bp,{children:[g.jsx("h2",{children:"계정 만들기"}),g.jsxs("form",{onSubmit:L,children:[g.jsxs(Fi,{children:[g.jsxs(Bi,{children:["이메일 ",g.jsx(Eu,{children:"*"})]}),g.jsx(xo,{type:"email",value:s,onChange:V=>u(V.target.value),required:!0})]}),g.jsxs(Fi,{children:[g.jsxs(Bi,{children:["사용자명 ",g.jsx(Eu,{children:"*"})]}),g.jsx(xo,{type:"text",value:c,onChange:V=>d(V.target.value),required:!0})]}),g.jsxs(Fi,{children:[g.jsxs(Bi,{children:["비밀번호 ",g.jsx(Eu,{children:"*"})]}),g.jsx(xo,{type:"password",value:p,onChange:V=>m(V.target.value),required:!0})]}),g.jsxs(Fi,{children:[g.jsx(Bi,{children:"프로필 이미지"}),g.jsxs(I1,{children:[g.jsx(_1,{src:E||Qt,alt:"profile"}),g.jsx(N1,{type:"file",accept:"image/*",onChange:R,id:"profile-image"}),g.jsx(O1,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),O&&g.jsx(Yp,{children:O}),g.jsx(Gp,{type:"submit",children:"계속하기"}),g.jsx(L1,{onClick:i,children:"이미 계정이 있으신가요?"})]})]})}):null}const Fi=N.div` + margin-bottom: 20px; +`,Bi=N.label` + display: block; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 12px; + font-weight: 700; + margin-bottom: 8px; +`,Eu=N.span` + color: ${({theme:r})=>r.colors.status.error}; +`,I1=N.div` + display: flex; + flex-direction: column; + align-items: center; + margin: 10px 0; +`,_1=N.img` + width: 80px; + height: 80px; + border-radius: 50%; + margin-bottom: 10px; + object-fit: cover; +`,N1=N.input` + display: none; +`,O1=N.label` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + font-size: 14px; + + &:hover { + text-decoration: underline; + } +`;N.p` + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 12px; + margin-top: 16px; + text-align: center; +`;const T1=N.span` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +`,L1=N(T1)` + display: block; + text-align: center; + margin-top: 16px; +`,D1=({isOpen:r,onClose:i})=>{const[s,u]=ue.useState(""),[c,d]=ue.useState(""),[p,m]=ue.useState(""),[v,x]=ue.useState(!1),E=ut(P=>P.setCurrentUser),{fetchUsers:j}=Dt(),O=async()=>{var P;try{const I=await he.post(`${Xe.apiBaseUrl}/auth/login`,{username:s,password:c});I.status===200&&(await j(),E(I.data),m(""),i())}catch(I){console.error("로그인 에러:",I),((P=I.response)==null?void 0:P.status)===401?m("아이디 또는 비밀번호가 올바르지 않습니다."):m("로그인에 실패했습니다.")}};return r?g.jsxs(g.Fragment,{children:[g.jsx(qp,{children:g.jsxs(bp,{children:[g.jsx("h2",{children:"돌아오신 것을 환영해요!"}),g.jsxs("form",{onSubmit:P=>{P.preventDefault(),O()},children:[g.jsx(xo,{type:"text",placeholder:"사용자 이름",value:s,onChange:P=>u(P.target.value)}),g.jsx(xo,{type:"password",placeholder:"비밀번호",value:c,onChange:P=>d(P.target.value)}),p&&g.jsx(Yp,{children:p}),g.jsx(Gp,{type:"submit",children:"로그인"})]}),g.jsxs(R1,{children:["계정이 필요한가요? ",g.jsx(P1,{onClick:()=>x(!0),children:"가입하기"})]})]})}),g.jsx(j1,{isOpen:v,onClose:()=>x(!1)})]}):null};function z1(){const r=ut(v=>v.currentUserId),i=Dt(v=>v.users),{fetchUsers:s,updateUserStatus:u}=Dt(),[c,d]=ue.useState(null),p=Bn(v=>v.channels),m=r?i.find(v=>v.id===r):null;return ue.useEffect(()=>{let v;if(r){s(),u(r),v=setInterval(()=>{u(r)},3e4);const x=setInterval(()=>{s()},6e4);return()=>{clearInterval(v),clearInterval(x)}}},[r,s,u]),g.jsx(ty,{theme:J,children:m?g.jsxs(M1,{children:[g.jsx(_v,{channels:p,currentUser:m,activeChannel:c,onChannelSelect:d}),g.jsx(v1,{channel:c}),g.jsx(A1,{})]}):g.jsx(D1,{isOpen:!0,onClose:()=>{}})})}const M1=N.div` + display: flex; + height: 100vh; + width: 100vw; + position: relative; +`;eg.createRoot(document.getElementById("root")).render(g.jsx(ue.StrictMode,{children:g.jsx(z1,{})})); diff --git a/src/main/resources/static/fe_1.0.0/assets/index-kQJbKSsj.css b/src/main/resources/static/fe_1.0.0/assets/index-kQJbKSsj.css new file mode 100644 index 000000000..096eb4112 --- /dev/null +++ b/src/main/resources/static/fe_1.0.0/assets/index-kQJbKSsj.css @@ -0,0 +1 @@ +:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}} diff --git a/src/main/resources/static/fe_1.0.0/favicon.ico b/src/main/resources/static/fe_1.0.0/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..479bed6a3da0a8dbdd08a51d81b30e4d4fabae89 GIT binary patch literal 1588 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!Dv>Mu*Du8ycRt4Yw>0&$ytddU zdTHwA$vlU)7;*ZQn^d>r9eiw}SEV3v&DP3PpZVm?c2D=&D? zJg+7dT;x9cg;(mDqrovi2QemjySudY+_R1aaySb-B8!2p69!>MhFNnYfC{QST^vI! zPM@6=9?WDY()wLtM|S>=KoQ44K~Zk4us5=<8xs!eeY>~&=ly4!jD%AXj+wvro>aU~ zrMO$=?`j4U&ZyW$Je*!Zo0>H2RZVqmn^V&mZ(9Dkv!~|IuDF1RBN|EPJE zX3ok)rzF<3&vZKWEj4ag73&t}uJvVk^<~M;*V0n54#8@&v!WGjE_hAaeAZEF z$~V4aF>{^dUc7o%=f8f9m%*2vzjfI@vJ2Z97)VU5x-s2*r@e{H>FEn3A3Dr3G&8U| z)>wFiQO&|Yl6}UkXAQ>%q$jNWac-tTL*)AEyto|onkmnmcJLf?71w_<>4WODmBMxF zwGM7``txcQgT`x>(tH-DrT2Kg=4LzpNv>|+a@TgYDZ`5^$KJVb`K=%k^tRpoxP|4? zwXb!O5~dXYKYt*j(YSx+#_rP{TNcK=40T|)+k3s|?t||EQTgwGgs{E0Y+(QPL&Wx4 zMP23By&sn`zn7oCQQLp%-(Axm|M=5-u;TlFiTn5B^PWnb%fAPV8r2flh?11Vl2ohY zqEsNoU}Ruqple{LYiJr`U}|M-Vr62aZD3$!V6dZTmJ5o8-29Zxv`X9>PU+TH>UWRL)v7?M$%n`C9>lAm0fo0?Z*WfcHaTFhX${Qqu! zG&Nv5t*kOqGt)Cl7z{0q_!){?fojB&%z>&2&rB)F04ce=Mv()kL=s7fZ)R?4No7GQ z1K3si1$pWAo5K9i%<&BYs$wuSHMcY{Gc&O;(${(hEL0izk<1CstV(4taB`Zm$nFhL zDhx>~G{}=7Ei)$-=zaa%ypo*!bp5o%vdrZCykdPs#ORw@rkW)uCz=~4Cz={1nkQNs oC7PHSBpVtgnwc6|q*&+yb?5=zccWrGsMu%lboFyt=akR{0N~++#sB~S literal 0 HcmV?d00001 diff --git a/src/main/resources/static/fe_1.0.0/index.html b/src/main/resources/static/fe_1.0.0/index.html new file mode 100644 index 000000000..66e849757 --- /dev/null +++ b/src/main/resources/static/fe_1.0.0/index.html @@ -0,0 +1,26 @@ + + + + + + Discodeit + + + + + +
+ + From fb10d42edde08d5b5df0a3161ed42bc34e8d0738 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 24 Feb 2025 16:44:57 +0900 Subject: [PATCH 074/115] Update Controller --- result/binarycontent.ser | Bin 89354 -> 9951 bytes result/users.ser | Bin 1037 -> 1185 bytes result/userstatus.ser | Bin 822 -> 1188 bytes .../discodeit/controller/AuthController.java | 8 +- .../controller/BinaryContentController.java | 2 +- .../controller/MessageController.java | 6 +- .../discodeit/controller/UserController.java | 43 ++++- .../discodeit/domain/BinaryContent.java | 33 ++-- .../CreateBinaryContentRequest.java | 9 + .../discodeit/dto/login/LoginRequest.java | 5 +- .../discodeit/dto/user/CreateUserRequest.java | 19 +- .../discodeit/service/UserService.java | 17 +- .../service/basic/BasicAuthService.java | 24 +-- .../basic/BasicBinaryContentService.java | 59 +++--- .../service/basic/BasicUserService.java | 177 ++++++++++-------- .../{fe_1.0.0 => }/assets/index-CRrRqFH4.js | 0 .../{fe_1.0.0 => }/assets/index-kQJbKSsj.css | 0 .../static/{fe_1.0.0 => }/favicon.ico | Bin .../static/{fe_1.0.0 => }/index.html | 0 19 files changed, 233 insertions(+), 169 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java rename src/main/resources/static/{fe_1.0.0 => }/assets/index-CRrRqFH4.js (100%) rename src/main/resources/static/{fe_1.0.0 => }/assets/index-kQJbKSsj.css (100%) rename src/main/resources/static/{fe_1.0.0 => }/favicon.ico (100%) rename src/main/resources/static/{fe_1.0.0 => }/index.html (100%) diff --git a/result/binarycontent.ser b/result/binarycontent.ser index 56a281ee8f9043d05e1dcf75fb7960e658eb6485..d3bcf39a82c909cafbb4a603800ab21633d99b40 100644 GIT binary patch delta 218 zcmeC$#d_a&LI5Mn#6TN??uz6&wbN_#mfaPrpKRc|Z{l2gPS$7!)}+dk)Z&TH16lkM zb5keVFv^Nn6qFV*Fhx79`7Hi}jU(g%69Ypq&GA+J!$vKrFr1RO!3}*2c&h21PmI9#i%-qEERDFr`KJ04)LO7np2sEyGwad275f8(2VOvSI>IVEU36MkRKzh(rYd=<`YX delta 80245 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

R&IC+aDb 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 z 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 diff --git a/result/users.ser b/result/users.ser index 7b405b875245d5fb88e19bda780a639f0483e118..e0f789e6ab832b5d5e2bf8e94d8255fa6af71d01 100644 GIT binary patch delta 146 zcmeC>SjagcfRS}$;BIEI;zEWx2BwC-tn21G{B8E7RxF+Q*KgnC2TY<_dz9W7{+|4! zqJ%*#t2D1XKi|^A(7?dlAuq8kwMZ{HKNqA`r-XqGB3r`16_Q$9VrXP+qNoTlw!0#E fPVMv>y=8aB>L(kx?gNW*mh&<(06{v;{DKMqzrHoX delta 14 VcmZ3;*~>8@fRSZm;BIEd3IHMl1YQ6D diff --git a/result/userstatus.ser b/result/userstatus.ser index cca25e5e02fc60736741197e57ebaf3214fcd222..063009a8b86a17fc4c5a90d3a730476437eba9c4 100644 GIT binary patch delta 348 zcmdnSwuEy+03-Xxz#2w@W}%$ak6+$Bzp~xz3*BDQ2^{6OhsAJ$Q z29X@)yi5#0kiJKe-zX|_Lj@Mm*clK}rUj4p@O_vhZKqd}Pn7#esyY4r>3qV!} v>`}CqRc~+rTdj>|HBjp5Hvx33L85zFN&c!Ji5ij-C|&#in<} delta 40 wcmZ3&xs7c?03*xBz#7KM?o5V^ypt=LJSJN+8!`${&SkD-l$`vW*@>|N0PB(qBLDyZ diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java index 1cfc88355..8ed037d0a 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.service.basic.BasicAuthService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -12,14 +13,15 @@ @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor +@Slf4j public class AuthController { private final BasicAuthService authService; @PostMapping("/login") - public ResponseEntity login(@RequestParam("id") UUID userId, - @RequestBody LoginRequest request) { - UserDTO login = authService.login(userId, request); + public ResponseEntity login(@RequestBody LoginRequest request) { + UserDTO login = authService.login(request); + log.info(request.username() + "님 환영합니다~. 로그인이 완료되었습니다"); return ResponseEntity.ok( "User Id: " + login.getId() + "User Name: " + login.getName() + diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index d0e2fa5f5..b68737536 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -35,7 +35,7 @@ public ResponseEntity viewFile(@PathVariable("id") UUID id) { return ResponseEntity.ok() .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 - .body(binaryContent.getContent()); // 파일 데이터 반환 + .body(binaryContent.getBytes()); // 파일 데이터 반환 } @GetMapping("/{binaryContentIds}") diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index 8040bcb31..1f6df1067 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -33,14 +33,14 @@ public ResponseEntity> getAllByChannelId( } @PatchMapping("/{messageId}") // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 - public ResponseEntity update(@PathVariable UUID messageId, + public ResponseEntity update(@PathVariable("messageId") UUID messageId, @RequestBody UpdateMessageRequest request) { Message message = messageService.updateMessageContent(messageId, request); return ResponseEntity.ok(message); } - @DeleteMapping - public ResponseEntity delete(@RequestParam("messageId") UUID messageId) { + @DeleteMapping("/{messageId}") + public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { Message message = messageService.deleteMessage(messageId); return ResponseEntity.ok( "메시지 ID: " + message.getId() + diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index c1b981764..35ac37aed 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -1,32 +1,63 @@ package com.sprint.mission.discodeit.controller; +import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.CreateUserRequest; import com.sprint.mission.discodeit.dto.user.UpdatePasswordRequest; import com.sprint.mission.discodeit.dto.user.UpdateProfileRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.UserStatusService; import jakarta.validation.Valid; +import java.io.IOException; +import java.util.Optional; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; +import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/api/users") @RequiredArgsConstructor +@Slf4j public class UserController { private final UserService userService; + private final UserStatusService userStatusService; @PostMapping - public ResponseEntity createUser(@Valid @RequestBody CreateUserRequest request) { - UserDTO userDTO = userService.create(request); - return ResponseEntity.ok(userDTO); + public ResponseEntity createUser( + @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile) { + + Optional profileRequest = Optional.empty(); + if (profile != null && !profile.isEmpty()) { + try { + profileRequest = Optional.of(new CreateBinaryContentRequest( + profile.getOriginalFilename(), + profile.getContentType(), + profile.getBytes() + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + UserDTO createdUser = userService.create(userCreateRequest, profileRequest); + log.info(createdUser.getName() + "님 환영합니다. 회원가입이 완료되었습니다."); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(createdUser); } + @GetMapping public ResponseEntity> findAllUsers() { List all = userService.findAll(); @@ -47,6 +78,12 @@ public ResponseEntity updateProfile(@RequestParam("userId") UUID userId, return ResponseEntity.ok(update); } + @PatchMapping("/{userId}/userStatus") + public ResponseEntity updateUserStatus(@PathVariable("userId") UUID userId) { + UserStatus userStatus = userStatusService.updateByUserId(userId); + return ResponseEntity.ok(userStatus); + } + @DeleteMapping public ResponseEntity deleteUser(@RequestParam("id") UUID id) { UserDTO delete = userService.delete(id); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java index d5c858813..672758773 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java @@ -9,23 +9,20 @@ @Data public class BinaryContent implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private byte[] content; - private String filePath; - private String contentType; - private String originalFileName; - private String storedFileName; - public BinaryContent(byte[] content, String filePath, String contentType, String originalFileName, String storedFileName) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.content = content; - this.contentType = contentType; - this.originalFileName = originalFileName; - this.storedFileName = storedFileName; - this.filePath = filePath; - } + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; + private Instant createdAt; + private byte[] bytes; + private String contentType; + private String fileName; + + public BinaryContent(byte[] bytes, String contentType, String fileName) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.bytes = bytes; + this.contentType = contentType; + this.fileName = fileName; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java new file mode 100644 index 000000000..c21e68d25 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.binarycontent; + +public record CreateBinaryContentRequest( + String fileName, + String contentType, + byte[] bytes +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java index 43bbeedbd..bb5e7dbce 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java @@ -1,7 +1,8 @@ package com.sprint.mission.discodeit.dto.login; public record LoginRequest( - String userName, - String password + String username, + String password ) { + } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java index b67e1c555..bc9358a63 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java @@ -1,18 +1,17 @@ package com.sprint.mission.discodeit.dto.user; + import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; -import java.util.UUID; +public record CreateUserRequest( + @NotNull + String username, + @NotBlank(message = "이메일은 필수 입력값입니다.") + @Email + String email, + @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") + String password) { -public record CreateUserRequest ( - @NotNull - String name, - @NotBlank(message = "이메일은 필수 입력값입니다.") - @Email - String email, - @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") - String password, - UUID profileId) { } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 346a54643..fcbbb5766 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.*; import java.util.List; @@ -8,17 +9,19 @@ import java.util.UUID; public interface UserService { - UserDTO create(CreateUserRequest request); - UserDTO find(UUID userId); + UserDTO create(CreateUserRequest request, + Optional binaryContentRequest); - List getOnlineUsers(); + UserDTO find(UUID userId); - List findAll(); + List getOnlineUsers(); - User updatePassword(UUID userId, UpdatePasswordRequest request); + List findAll(); - User updateProfile(UUID userId, UpdateProfileRequest request); + User updatePassword(UUID userId, UpdatePasswordRequest request); - UserDTO delete(UUID id); + User updateProfile(UUID userId, UpdateProfileRequest request); + + UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 558c1aa46..f5fcfde64 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -7,28 +7,24 @@ import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.time.Instant; -import java.util.UUID; - @Service @RequiredArgsConstructor public class BasicAuthService { - private final UserRepository userRepository; - - private final UserStatusService userStatusService; - @UpdateUserStatus - public UserDTO login(UUID userId, LoginRequest request) { // 요청으로 name과 password가 들어온 상황 - User findUser = userRepository.findByName(request.userName()).orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); + private final UserRepository userRepository; - if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 - throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); - } + @UpdateUserStatus + public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 + User findUser = userRepository.findByName(request.username()) + .orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); - return UserDTO.fromDomain(findUser); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 + throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } + + return UserDTO.fromDomain(findUser); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index c5b8c60be..1199e761e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -16,41 +16,42 @@ @Service @RequiredArgsConstructor public class BasicBinaryContentService implements BinaryContentService { - private final BinaryContentRepository binaryContentRepository; - @Override - public BinaryContent saveFile(MultipartFile file) throws IOException { - if (file.isEmpty()) { - throw new IllegalArgumentException("파일이 비어 있습니다."); - } + private final BinaryContentRepository binaryContentRepository; - String originalFileName = file.getOriginalFilename(); - String storedFileName = UUID.randomUUID() + "_" + originalFileName; // 고유 저장 이름 - byte[] content = file.getBytes(); - String contentType = file.getContentType(); + @Override + public BinaryContent saveFile(MultipartFile file) throws IOException { + if (file.isEmpty()) { + throw new IllegalArgumentException("파일이 비어 있습니다."); + } - BinaryContent binaryContent = new BinaryContent(content, storedFileName, contentType, originalFileName, storedFileName); + String filename = file.getOriginalFilename(); + byte[] bytes = file.getBytes(); + String contentType = file.getContentType(); - return binaryContentRepository.save(binaryContent); - } + BinaryContent binaryContent = new BinaryContent(bytes, contentType, filename); - @Override - public BinaryContent find(UUID id) { - return binaryContentRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - } + return binaryContentRepository.save(binaryContent); + } - @Override - public List findAllByIdIn(List uuidList) { - return binaryContentRepository.findAllIdIn(uuidList); - } + @Override + public BinaryContent find(UUID id) { + return binaryContentRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + } - @Override - public List findAll() { - return binaryContentRepository.findAll(); - } + @Override + public List findAllByIdIn(List uuidList) { + return binaryContentRepository.findAllIdIn(uuidList); + } - @Override - public void delete(UUID id) { - binaryContentRepository.deleteById(id); - } + @Override + public List findAll() { + return binaryContentRepository.findAll(); + } + + @Override + public void delete(UUID id) { + binaryContentRepository.deleteById(id); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 4f7909c4a..12417ba82 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.*; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; @@ -13,6 +14,7 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.util.type.OnlineStatusType; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -25,94 +27,111 @@ @Service @RequiredArgsConstructor public class BasicUserService implements UserService { - private final UserRepository userRepository; - private final BinaryContentRepository binaryContentRepository; - private final UserStatusRepository userStatusRepository; - private final UserStatusService userStatusService; - @Override - public UserDTO create(CreateUserRequest request) { - userRepository.findByEmail(request.email()).ifPresent(x -> { - throw new ServiceException(ErrorCode.DUPLICATE_EMAIL);}); + private final UserRepository userRepository; + private final BinaryContentRepository binaryContentRepository; + private final UserStatusRepository userStatusRepository; + private final UserStatusService userStatusService; - userRepository.findByName(request.name()).ifPresent(x -> { - throw new ServiceException(ErrorCode.DUPLICATE_NAME);}); // 유저의 이름이 같으면 안된다. + @Override + public UserDTO create(CreateUserRequest request, + Optional binaryContentRequest) { + userRepository.findByEmail(request.email()).ifPresent(x -> { + throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); + }); - if (request.profileId() != null) { - binaryContentRepository.findById(request.profileId()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - } + userRepository.findByName(request.username()).ifPresent(x -> { + throw new ServiceException(ErrorCode.DUPLICATE_NAME); + }); - User createdUser = new User(request.name(), request.email(), request.password(), request.profileId(), null); - userRepository.save(createdUser); // User 레포지토리에 저장하기 + BinaryContent profile = null; + if (binaryContentRequest.isPresent()) { + CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); - Instant lastActiveAt = Instant.now(); - UserStatus userStatus = new UserStatus(createdUser.getId(), lastActiveAt);// UserStatus 생성 - createdUser.setUserStatusId(userStatus.getId()); + profile = new BinaryContent(contentRequest.bytes(), contentRequest.contentType(), + contentRequest.fileName()); - userStatusRepository.save(userStatus); - - return UserDTO.fromDomain(createdUser); - } - - @Override - public UserDTO find(UUID userId) { - User findUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - UserStatus status = userStatusRepository.findByUserId(findUser.getId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - return UserDTO.fromDomain(findUser); - } - - @Override - public List getOnlineUsers() { - List onlineUserIds = userStatusRepository.findByIsOnlineTrue().stream() - .map(UserStatus::getUserId) - .toList(); - - return userRepository.findAllById(onlineUserIds).stream() - .map(UserDTO::fromDomain) - .toList(); - } - - @Override - public List findAll() { - return userRepository.findAll().stream() - .map(UserDTO::fromDomain) - .collect(Collectors.toList()); + binaryContentRepository.save(profile); } - @UpdateUserStatus - @Override - public User updatePassword(UUID userId, UpdatePasswordRequest request) { - User updateUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - updateUser.updatePassword(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. - - userRepository.save(updateUser); - return updateUser; - } - - @UpdateUserStatus - @Override - public User updateProfile(UUID userId, UpdateProfileRequest request) { - User updateUser = userRepository.findById(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - BinaryContent profile = binaryContentRepository.findById(request.profileId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - - updateUser.updateProfile(request.profileId(), request.newProfileId()); - userRepository.save(updateUser); - return updateUser; + // 프로필이 없을 경우에도 null로 처리 + User createdUser = new User(request.username(), request.email(), request.password(), + profile != null ? profile.getId() : null, null); + userRepository.save(createdUser); + + Instant lastActiveAt = Instant.now(); + UserStatus userStatus = new UserStatus(createdUser.getId(), lastActiveAt); + createdUser.setUserStatusId(userStatus.getId()); + + userStatusRepository.save(userStatus); + + return UserDTO.fromDomain(createdUser); + } + + @Override + public UserDTO find(UUID userId) { + User findUser = userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + UserStatus status = userStatusRepository.findByUserId(findUser.getId()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + return UserDTO.fromDomain(findUser); + } + + @Override + public List getOnlineUsers() { + List onlineUserIds = userStatusRepository.findByIsOnlineTrue().stream() + .map(UserStatus::getUserId) + .toList(); + + return userRepository.findAllById(onlineUserIds).stream() + .map(UserDTO::fromDomain) + .toList(); + } + + @Override + public List findAll() { + return userRepository.findAll().stream() + .map(UserDTO::fromDomain) + .collect(Collectors.toList()); + } + + @UpdateUserStatus + @Override + public User updatePassword(UUID userId, UpdatePasswordRequest request) { + User updateUser = userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + updateUser.updatePassword(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. + + userRepository.save(updateUser); + return updateUser; + } + + @UpdateUserStatus + @Override + public User updateProfile(UUID userId, UpdateProfileRequest request) { + User updateUser = userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + BinaryContent profile = binaryContentRepository.findById(request.profileId()) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + + updateUser.updateProfile(request.profileId(), request.newProfileId()); + userRepository.save(updateUser); + return updateUser; + } + + + @Override + public UserDTO delete(UUID id) { + User deleteUser = userRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + + if (deleteUser.getProfileImageId() != null) { // 만약 프로필이 등록되어 있다면 해당 프로필도 같이 삭제 + binaryContentRepository.deleteById(deleteUser.getProfileImageId()); } + userStatusRepository.deleteByUserId(deleteUser.getId()); // UserStatus 도 같이 삭제 + userRepository.delete(id); - @Override - public UserDTO delete(UUID id) { - User deleteUser = userRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - - if (deleteUser.getProfileImageId() != null) { // 만약 프로필이 등록되어 있다면 해당 프로필도 같이 삭제 - binaryContentRepository.deleteById(deleteUser.getProfileImageId()); - } - userStatusRepository.deleteByUserId(deleteUser.getId()); // UserStatus 도 같이 삭제 - - userRepository.delete(id); - - return UserDTO.fromDomain(deleteUser); - } + return UserDTO.fromDomain(deleteUser); + } } diff --git a/src/main/resources/static/fe_1.0.0/assets/index-CRrRqFH4.js b/src/main/resources/static/assets/index-CRrRqFH4.js similarity index 100% rename from src/main/resources/static/fe_1.0.0/assets/index-CRrRqFH4.js rename to src/main/resources/static/assets/index-CRrRqFH4.js diff --git a/src/main/resources/static/fe_1.0.0/assets/index-kQJbKSsj.css b/src/main/resources/static/assets/index-kQJbKSsj.css similarity index 100% rename from src/main/resources/static/fe_1.0.0/assets/index-kQJbKSsj.css rename to src/main/resources/static/assets/index-kQJbKSsj.css diff --git a/src/main/resources/static/fe_1.0.0/favicon.ico b/src/main/resources/static/favicon.ico similarity index 100% rename from src/main/resources/static/fe_1.0.0/favicon.ico rename to src/main/resources/static/favicon.ico diff --git a/src/main/resources/static/fe_1.0.0/index.html b/src/main/resources/static/index.html similarity index 100% rename from src/main/resources/static/fe_1.0.0/index.html rename to src/main/resources/static/index.html From b62040b3324cabee4198287b97ac973a8cf2a33b Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 26 Feb 2025 11:25:21 +0900 Subject: [PATCH 075/115] Update controller --- build.gradle | 3 +- result/binarycontent.ser | Bin 9951 -> 15066 bytes result/channels.ser | Bin 1009 -> 0 bytes result/messages.ser | Bin 82 -> 0 bytes result/readstatus.ser | Bin 82 -> 0 bytes result/users.ser | Bin 1185 -> 553 bytes result/userstatus.ser | Bin 1188 -> 578 bytes .../discodeit/config/SwaggerConfig.java | 8 +- .../discodeit/controller/AuthController.java | 11 +- .../controller/BinaryContentController.java | 7 +- .../controller/ChannelController.java | 38 +++-- .../controller/MessageController.java | 43 ++++- .../controller/ReadStatusController.java | 16 +- .../discodeit/controller/UserController.java | 34 ++-- .../controller/UserStatusController.java | 2 +- .../mission/discodeit/domain/Channel.java | 23 ++- .../mission/discodeit/domain/Message.java | 48 +++--- .../discodeit/domain/PrivateChannel.java | 15 +- .../discodeit/domain/PublicChannel.java | 31 ++-- .../discodeit/dto/channel/ChannelDTO.java | 87 +++++----- .../discodeit/dto/channel/CreateChannel.java | 36 ++-- .../dto/message/CreateMessageRequest.java | 6 +- .../dto/message/UpdateMessageRequest.java | 13 +- .../readstatus/CreateReadStatusRequest.java | 2 +- .../readstatus/UpdateReadStatusRequest.java | 7 - .../dto/user/UpdatePasswordRequest.java | 4 - .../dto/user/UpdateProfileRequest.java | 6 - .../discodeit/dto/user/UpdateUserRequest.java | 5 + .../discodeit/exception/BaseException.java | 15 ++ .../discodeit/exception/ErrorCode.java | 47 ++--- .../discodeit/exception/ErrorResponse.java | 24 +++ .../discodeit/exception/ExceptionHandler.java | 17 ++ .../discodeit/exception/ServiceException.java | 11 +- .../file/FileChannelRepository.java | 79 ++++----- .../discodeit/service/ChannelService.java | 11 +- .../discodeit/service/MessageService.java | 8 +- .../discodeit/service/ReadStatusService.java | 16 +- .../discodeit/service/UserService.java | 5 +- .../service/basic/BasicChannelService.java | 96 +++-------- .../service/basic/BasicMessageService.java | 50 +++--- .../service/basic/BasicReadStatusService.java | 130 +++++++------- .../service/basic/BasicUserService.java | 35 ++-- src/main/resources/static/script.js | 161 +++++++++--------- 43 files changed, 594 insertions(+), 556 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/BaseException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java diff --git a/build.gradle b/build.gradle index fbc65f2db..0d25b8c2b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.4.2' + id 'org.springframework.boot' version '3.3.1' id 'io.spring.dependency-management' version '1.1.7' } @@ -27,7 +27,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-aop' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' compileOnly 'org.projectlombok:lombok' diff --git a/result/binarycontent.ser b/result/binarycontent.ser index d3bcf39a82c909cafbb4a603800ab21633d99b40..6d1fa0f09745b548fdacf3ff5ba62ca10895dfc6 100644 GIT binary patch delta 14766 zcmb7Lbxa+=lYY3nyZd`M6p9t6NO5;}cYU}^ad#{3?(XjH?ogc4>+dd?+`l);{xLg~ z{Wg(1VznAP^A|QBhEd(9wxN zG~_g(|F`_@1z>>T0egTwCK~+N>F0M`~nW1%fQ{g<-kM`|AY3wSpN+U4FiCM`)B>~Z(EQMkWkPFP%!`8 z{^Rpc!+@s1WD|zLQZ%Gw|8K0hTkO6)Dh?5)J6KK}r@+7K0A#3t%VI!b0E7TjWy>rP zxl~fCbgz8weH?>N1-=iYWq8{CN7QNsXkcEHiKc>%_#XXorNJ-wJo3o-l{$(RYE|A) zxLNf^>UfFF>z1!2Bckaye5AyjkimLETobL%n!&_vc%1cvVQ)z6ND_htL^;i6UI>Nb zksgy7ma*doul2|-3Lx|^>dJ&FVsNL|L$-N?97OQ*GRD(SDNRBWln37o9uhpw*}#LO z-|BzZLXHVGBJrHU0}3>M)&jdk;Kwv%VF?qVLLTOPjErZm43%d z!PsdK;VKeVNyT96Iuu_l36`t)bqemoC>76=8vP^ms3ak;%-N8LXFU0o!Q-$Te;?ig ztJ6naQWt8%!_U@XUWa7iF3z`?2$rn)?od~)6-p@Kaxqp^c^>)b1R0eUzR+rQn4%HY zh#y<5#>r3v%iPn*(J0P)DXYc5)Zk>oYiJv#$j^k4;Gx-vF-WQfljUmx8w=*sK;PFa z^-tiWKgLXik8hA!P5Xu$VM1H`B5BkV;AsWIsXTTeKoRK`k4{+C9&8ypZ^QSRHYg2E z55pKl#*~FZbsQ&kL)P6-Dc6w9S`>Zj$f#mI9m<>ls?|oh2M~+1j?lHX5j^cI;A-E; z=u$_&Ruf^dhiYRH-kDeAdx7asMGq*)>3+5Z?bAVcaZ*CcYIpUrQFg632Dc`3{7|H+ ztT5L#PLj&Cn3hQ^j{3e#gcsOQH;Hp+Jt*BbS3!Ldc7|i>cC>2Ajl8#krpNng!#!a`+8pZM5tJS9|@qC|R=we61K#0l1Tjl8x#*OAK{ zfP3ruY+O6p+$U_@1`1y1LKQY>82$yQLv_mK2s|K*EZGHSWCu?u~NJMTn%sh(a`x?mHfdl%zPY=6`B>Amh$&mugQE_W4@NsZ9b8Li&e zuU?EuF>$JNKgX~V9RjBfz^hcrb~fy1*KOK5Q)cr?No&U>HRE0EXte25VX58sRT@@K z@q|+wq)<{vA(*0Q6KEzF9AQ7=+==yH;or(ht(-DK0gQ1+IS18^Ob1v+(k|m=(_!$N zk&6Sq*w8`-OH^kxM@B8wQBmfu3$p!cBP}luFAPAAB8|5Tw+6$ec@X|8W2U55S`^Nn zDj^@FVjDU_j5|Ky!l+6yu#a#O zQp&q;=HpmOZ1(}2G%?=xu^De)(CtJa08dQj3& zh}>(1wsE9CdWka48>h1l4b)KDO~15-=4M z!d*G@D=JcWxRZ>5RTDp+zfIPIOzJXPs)1Rt6}tS7nc^ia?*tSkqEw*)hnco>TT2;k zh+hH0u*6WoBk?{^Je)6_JZM)UlpvY%QArd#9W2AGO;t75r$)SZ^B3^MG-W3qA;WOb z4s=Jck`DX1enej3OKs?4FIwY46%1|SS#jYyHTbKcK%26Sj7yBB;L@(2NiIhg6_7pk z6ALS$!;?Rp{GL2u13iUGqHi89G}7r9Ni!DT8g+zFFU*Baez14(Nu6j?wDDajWpPki z3S5dh)Ig21p;M%3)R^8-d>KM=NWYJB#krXlotZqJR~z|@g=A1e0VG{a7fjf@q@EbLEi)>IL!p%l%k;76G*wHl6X19>)aj zSyEHYAWi`>Xf^BLPc#?8-%Pt@Ns$;2z)cACzFSs;&sU!qncUY+O%n--AJ%MuC|v^gRj(e%(J$Z9#5N~>F^)^uXP=MT^xn<}@)t_m^A)TJ%+}qehklp_kA0nt zr=4zInm_t|qoA=7^Ij>zYQ-;GTrtl(&?)b_Fgh_Y$ZbOHqy?RoHDVB*qeY&WR|jYE zTo~K8MpB1?Tg;zgqa7F?T+dbqo)GgdP&YErB8E7CGbwqW4N0bNBu>XoX9=e78jaFAQ{biNE{7 z*e!IlElA7c(p;IjhwUdnY?UBXUinOA|6cK@ew1`*K9ya;y?m&3lAj}HC24LzP$e(4 zYuof04jUBLTwXry(mlHZr9H}N5JMKBdxYyr?j|01O0{jBp4aWY#Ci} z0z#t%oWX-KOkUOUe8VLc_V`BhX&S4Sk#05_0Cu0e@{Li;f-I`SjIl*R1!;ld6&3hxy%sa}U#uZF~mIxwFRmN%V`HlWK}J+;rsQ zTK}J;b>7&SE{-!`=Iph_Tm!bRu!ZG%mVc0^w^Jdh-v!tDC$*{8tAV9g+JoBLAZpNY1nbmd2QN!*?V$Dyy%kkvJDc zXYoFo-+f6dWn9!OL(++-C5tjrCMrxatvgnU@;=CipZHlp$MXW|He8Ao@2GG>PY*9q z|B+|Z0zitbu-~WbFSSXg`<3G1guNyd^i(aHrsyR5DcZBM+~MrZA~<)wUz1NA|@pX|s|iHIz4Z z5&;|hzI5u%%FJ6n%C^YX-b3Vn}XxD*ax6ihQ@{ksV}QwL9DN z4f^@6GGw(p`miD-7a$e%v&fxMch|xBXJ5$PGg00=826A+n&@9%_-OGQ$jS0M#UWOi zmv-yO{@x2pV$&IqCEt{UgC?Pz(h5yOrS*+7TtkQ{XWo|-N7@ySm@s?PW9w0QFTh2jc(fylCa~CcgS&%tBtXAzdE~81i zF*EKw6`-W~LYE?DP*58{Bo3nOY%)bjI$ngb1qxN4ig#f+|Hzo2Tt}u>otKSot$+Lu z-o02B-E*L5oCzso4iHF>FTqk|Q!CffGsSl;PZ@-)lC3=TY&O+tcO-5ioX>b>y{s!9 z?1WYYUTS1EV17UT-X>V95D~=dYRITVkr|8?#3-+bO<1rtyiciWYH78Af5v(nILAZF z-R#Z_Eo{o(EliA2A(dR@b2j>jLc%T#rUeaFC^GJo5Fk0CbN8nq4L2wBs>oiOTX7NB zN8y0_@lCCz4aRN6l-rxQLakIeo4NRrtWD(gZ*ur~M^6S);J%P&x@wp)9QNAc}YYFBz z*7K$|bHhlEqAybD_Qpvb*>KI=F3o16J)CNbU$*2|KSK+f5x;)(x5%TvC4_G&x9<3! zzLl$YEmNk9oUV|aiSaHLXJgK!udF!R4#Q}DlJteb2Z3%ehElg1TJlFjo20QimnJ{9 zn5b(m>(v@3r_n!F8XEQnH%uuHM#cvgbTMRPFu{_%kqH2Oe~wNfs6>U9IO5KFZqr4> zD4jb~MsFW(-qA(FA=v}%F=gNxXmvyK=QOZa3uBb3m?;?j&bWFGo1ntJ+b4iAnY(rG zoXX6Y1&L}ld2Vo{!yx#vr6aA;M6+uU(ie?jLZuM2keUvASE=?f^ zvlc2F8oG+2+Vtu=t+|rF3GP;2jXjo^E2)((yLM%y_vcck+#*+pq*PgvgQJAt=3SZn zTxXKBWYFU}D~zWle5Ajda&L2?w*d<)Qt(MrN`{B=2yp4pE7SA91BvMS7>O1}SX6c0 zG?0K7;Sv^M{@BH0tl4`@Ag$$Lk>|f-Bm)r*dD4&VQbs4__>X{sPZ^%(Sg8_R$F_&W@XAq zHr5}wchKv%I~Gi^hi2uR5#TNk@k-ge!dPCa(ISUZOB~%}dB=Yk zK$N81AC5<($l(yho*_I83TEK;^O;$aPWuZ`B=El@*YNE3K71k=7?_G*+H)?(Bmt^> zphinZR$x-ZVh%fqu~c<3P(@m%lB0azgnihhuxZK;i^&G(XQh}Yjq*;tQXHCT;OGAe z%IL?v3X8k>O-jw$T*)8A^Dd3}ZWK5>^Go+qpZYUbiT4q6_(?EQDDrcZt03}(rF82L zf|^Xh$BW+~4$ggaBXUu~33*o^`RXx*Fw#x!ipFwE3W#z2XpChiwR0q;r9Cmj_GIF; z;g-j0$*2unRA0r7;lm)y0;u7<3E!wQsc762snQ*PF#GC~iL1htZV)^&Us5+u3F-pTMrbDMS z$1<5lBy6FcNa!~f`LPa;N~kwHJ{HJksxDO4F>6(}%&joOkY{D}@x2VUTmNysW`A_y z)z~x*yYhnqmcOovucuG9CoEqtNQK40c1@OTS>e%kQ_q*m@|~4!bmDx{lio9Z*Q+yBVZ&?;%8#w^439YAMKivVngA)~$T@3qq1-MI!mW3a^ zzfBbB*2pB%YO|8K@!SlvsFx_hk*|B2Zh$pRb`Xi+k78a(2~$xxYMbdoURiQm@oVJl zE_l3L;ToHwL`&S96W5t$UbMp;Z3}3`BE%@4yb9@|{IdKBGu%9$`!L7I%GKjeaa`e&-S#Wf-K7AI~aHl z$u|y_V;4CzESJvQ)m82hjGoh(S)Ye!e*q-=+z(e^!=8#ZmywgkvM-or0_EvU zn+a>5_i;Xia|@(V$9-N=J6~R}!Hiv^+sEZ*ne`JBc5bi27S_?uSs%fSAMq!{YR?>I zb%dMoFNq{AQ8Xj`BcOtByI5~7u!QkxW0>hFVd6nSkT_~hQC1LyF@rh|H!-}GGB8Z@ zHw5haHP$XMb~@zTSixRt5k$Gqk|(g035Pp_*O-G@S`L>pRDH)lcjETWclWpKQ1p^@ z>7~obnf=inZw&&&2btYe@B*CaOUhq>^u=fRJJW0bd(*Bw7PC4L{J_Ep@G-SVOkwai zY9z0uDjJEVm9CA*cvs=nO(u*7<(x{^Bh9V`T~ZY@ zVw_oS`l+iG!drXY$XH~dx!@t8y5OkXN=c{9?=PT^XcN*eGRoHyoEcZzPQ_~?Zcr)* ziZx(KLI?Ff?Hm|Ul*@;OX(Ph9!x{KX^y3Nj$ozu zkdj|!0N1i&@1!QF^nkJ&A`Z}p zQ#>AXFcmUolTu=ihEW(U)wfuF+MWZCnL`U>p<9Fe!Liqx6Sf}sWR}UOWWSjJuTt1l zg|DN28;KVlg3v?H)kF|I;?d0u?(hi0`E_laWCN#=@M$Ap$Ws1bY%TndAh*DVf_Sda z=oUdkx%|g!2KtwJCDzF1I;bZVFC;&VGWY7q_diak3AohHMX@~Z#j)h4@@#MIj-NEua zdy?e{C6X2fZ`~|2P91-f#9!s*m0>`Hjkfz@w zOxUl1(U9p_65{OMsap{zup$O-AMA^BC8p2S1bo@U>;Z9r9@9i#^-fknCwMN3`%OY9V<~g&k=L_t zh17-^xGmGht)zR^@lHjDILp5p16_DLtXaT3&AUmWHS-2OR`wcI*XYU6H&i|8kyq<9fLjxS#-FMj-#w-p;AIdy7DNA58rK>bx(p~KA0 zVgN?hX^Hd--(8&79E{ZPD`7u;=B64o%g2C^fVJG64aG_@EQ_>AN;@8vD&^^4JuLu- zh+RM$!Tw4Y+%n1r?)sl*c-}oj92#4Ts-yVG*UZYz|E>+G6g_^y_~SLugyf>Q_#j*A zQLQG>={PbtLhLY19uze~Y_sZziH{WikkD1AcWM}NWOLZiDWX?x9k1F6?QqWP@>=hY zr1c5q-Z>naaVFi_T~JEBN@QUr!+Qt@2tTL2{p8Qjh!BMCl2WFx^2Z9`GxnX?0)^gbr>_Sy)fAc zp9{&f-t?Vwvz{Z8ir4;9xpGix_WfGq5Di4^XkHWupP|^)h;hyO;AF+V(WsqLcQ9z6-H!~@>YK$BO(mdZgI|j zqtf6Ul%_yXCSSnacX=qRcZ!fMDS@b)3omTqSxpKZsT3X;B7?6h$=~32ImbS%h?VU= zN~_!V7%7Z)h@^kV0MJu!=&5fDB{80wQfP%AGb9(!r(ELL?b`Sf&gp~Oec4{G7;z2%_kcz+E&$uTs?r3i z#6Z;XN=YAbblGMxy(GVX`?HoSZ-%>n?=YxE>Q+1G)UANjh-cZo~oo+%h>1 zK4OhJRLA+=J1yAjc|G(hD*h#-r1QD$O9g zqeYxWOv)%ziWXD0wnY4K*GWLPeF5JjpFBg`ZPme&z%mk{D}gDeWu{Q*Z2P)Ta>ht> zztk-v=i@RM%j(Au1r3oCoH^K@r*|~oj2x{AbKE+b)KRYcSCK?rF-@g}TZq4aD}y&o zU%dOk&)g`i&6z(Dj-5^^8lz@Ytwcvto<>i90$DzpMpW0HEv@9lJ)0Bl_q7|8Rja1i zZGR6~`n07Vb2MQI3lKkLWIUQ3P4km{o7xqB-@9u7hnNXLf!cofr6@lg`M?JIr?J7V4 z+;pJvK(0lUPqtDW<1v9LI4#*^hJ7>J}dr~)Z66uX3 z^7wVIE_2H<1@1sQC9(Xn;nij^Q%vl4Qrw&H2|7bOt0$S71!WllBQG(<;_0?Uha0H0 zn~)zZQv~f>oLyeaK1y#{yDo)=p3I<3*OxEgys%;XSY%(p3XbcemYsozUZ_USW1XSa z9U#Phwi3S!+@wTz&Jg4LEmuVj?rz4orSl4yx)<@`E4pV;Z=WXqG(Wqhu=_5dZ8oM^ zMC4u)Z0%Q8Y7PB>ogS%Ty$r6^qMV)FZ20;m9z*Opbm2ve9a{mz6!z&{6H&@`Ba2Gg z@i%d8ioqxi%`vYZv#mQGGdU@`NazhPP3t8$!2;ADa8*Chek}JOjev-EMD!{vge>U5 zg8uQi7qjAClPXPEsZ^0RgFBvllNS9=IKecpF=^(iydKw&f#&4C&VlRbJ`}f6zL4UQ z1CzZfKOsozX8jy|2a9U^y(_T{`ABFoCN*D=c~v}_yVZl`<>X`{ZF?xBe~FuEXShvW z#!!fqaw~Q+Xj<@QLV($gnli@dZ$%iuEHl%R(#NTY8uSM*v3Nfa7i81fE%q3K$K3yv z#gwj5$130~nY3L7L{q;;-LyRBJB^zp@rI!O1z7(6vs&A@bi(2|S0dmJ=a;?m7tr0a zp86{M%mpq-3hjYLAAZ6Ol!i%K5M9-c+Ww?m?le;z-tb(VSklC|MK$w{+T)-B>y5Bq z{QAhN42r_jS&HDUosvXJo(JX$I#F;RDqz_&jnJjDH#tu99xyA^=bifla5u{fZ=u$R zW9Wr};uuEwSqWkV->&)EAUyCj3huYrRTkHfK)XIa8{$65ie~lFBJ6wUChgy4wQH1P zP17o=_|41na~}@n^!Ta;rn`p0`^;q`qX!xIF+`?<=qZkv=QfF)5TW5CGxgqa_mK?? z#vWighi@blI8iAf~Q+Nx6}Yr{u)8BnSQLamu09n zQOx;9wGbO&(z)u~I3qo)@(QVgTud~gbNSc-q-Hc?tUXDvR;c2xB1s>{SOTzaoJJiz zky?{!9H}E*Dp>(O2O5)F$un0Y2OG1`9W^hTKb}#0l3eEquO)X6iYZ^e@>Z-eSis!> z7@@vt3BcJ#P4Rjyg7O9YD6jDf1tXyATD9#Hk6F*AC)n3v=4K~h(BP*Sdl6V>IHVqz zTaRH^J={eS+>xnyDAUaIL_*`mATvKLoGg|y!K~SRLRHq|p&*Y!!L?+wgWcvCkN>5E zV{GZ+Bqut>X1HIrc93lw7OkOX@CgsrUhssF%SdI^t(l0EWq#CI2Hpww! zl2=KsXhU6WLtV8S-&6afDn``J+IYoRP|GQ^U8SM(}c(qu+sWW5m)E z5VemV#E1FgWmZEcGK<&K;H>{{Dzq@5$4tW&jzL<09bWQvV(ke>usW@iceaRfJy<(Z;=SPFb z*E+Z)(VY*gHK-o2v_3M;2pB2MKSsSZx>9$I$k&a}7-zSwTuomTYwcVkCPqtyuA)JSQ> zD(cN1^&E(rBf?}w-O8%AI5TTe6>C_gE8odfo!=eh;i%mD7eHTA+O@>Y5+T8kXW0w^ zo>yVJ7DEDG8Lj+|O1Pr=WP1tOK1g7ZS^fG0#M`MWxuuBcTWEY3zx6Q&{&xBo&_s48 zl=SazfxS8=!0~DWPuKiQ)mFTLwdW+&%0l%?S-=PCMfYUHqV2(_^4K>-NrZGu6wpX*YOGrlvLI}hvS?kqL4soWl+M;5w>;4 zUEE*6Rpa-<#ZKYK4wK7V#Y;CYYiIt9cAHri`qFE?N6_*V_p)^N&eEo|WyW2zZ-K>7 ztgPHVF-8w;shbnYDj9sfUgjv+EXmwzxnrB_i$YW4tgwtrF+*6dO z^xXuz#Ng=^3*r}wn|4LVk*!OVWpa*9(aO{rvT!}e)&alhE2&tP5e_G-+=8Bs^RoLAzH+!_cQ+1Hb%X}} zjGnN!y}nmzQA*id6B^Nd&O{Xz{@Aa`^ce>`wJUokMtVo}h72T$&kZ86eS2oBN?1k! z#Ez{JxVatX5!eK471i`|p=sVRSeMcytI`};1Ur^X(rqAq(b5P4AXwybSkMxj@8H3gGc@oQ6N zL;fgpNovaqNXAYy)jeLBQ`a6^GEtgf{*|#kewi&mk7c%QGFNSONw=sx@)X-y)y}B< z%SjI&VFsQ4sId#R|7iIr6w4}}Y)=!H_>2gP3F{opP9j^&Fc&#CN=7V- zdJgdRgt|am7lSqClH!Op|>73n-U?&rU#|Agy*bDx45KhE`uZ zFU4;idY67$Kd9&OQg07E7U(owoQOpfJpfi_FD}SruuqDm@qVp9lR%&U)})ORCc7gY z^=Hje|MzI%zCo)PfzU3vJE8+kP=6_{QporF(_mSxccV)Btt!j0>J*tKM%S8=_p+qR zH$TMO5DP)hlfM9B-M*!R&`NZw2$=?uaa<8dv9l@SI0J&t7w%3>2R)l}fclQ_Ol;`9v% zsRo%T`um=BV?l1kyYJBW>2KNZBTphG6}1pmRo5qXL4SPA$9epAUg#cmSmKvQWHk-L zalIdFx_7=zfSU=BlF}Q*=jwSyvwbZst&L0UT1rww&KLTbtg-t0u83Fj(&JehOT%dC zv+&Qz_lNl*&EeC)si)p>jVH*YR4P3U^3%-4wPpM>q=2=31XzW^ECjps`UVO_&m27? z;Mq|uWz)K+whf_A!vkiK@>jQ{jkHCt+h}j=B)wCHCHe>94}qbA3iMf{99|6nPdo{o zvyO-(v|tH!?aWmJT;XJQcrOjkd>EWy=ye|pWhu)H+{*&+A3A~fy}@TFD3cee1aoGb zMD{)e4%OAIs8A#K1i95*8?)~>ZRxy(F?uX_R<1tLhYgGYGnKA_iWO^1d=zoWDO=<1 z3w}IU7k=oBkP-fjRV8dlKa(-<6H2+>p6JSLyh@(tIa@6wF#QCI*UwKqWW(6z=18gD_4jcBZasFTqdJ!y zQSqi?K*))7u1qyWgZkB*pdNWSOMW5e_lWuPM?7wDeb>dMo?NFXGqKDoYw=VGJ;eLh zb2Jn#tv{eym07Iki`7zQa)4R@V0s0E{#kD;Ld-qE+w9>UgEdH(c{b zQ&^TVo-Z+1G`g&IIvfV0{X~(D$Av7=`KNFA)-iuCyJ$Y4X^ppcdaD6iufLk{#yBm+uEo!=XlKc#1b{Tbp%R zY;(c6)KX>)MCmm{rX6vrN))z3&Ix*t&txP5aUZf5mJZi}9_c_p$uo30kv$a^y30;S zuttTlKB`BX2ZK-!tB|~0<62J6{56ph{J0!=X{7d=l1mL3N|4XP0Q5+~Ca^U=^o(`P zG_^xR9_~(s^Y0>lAM8uo6ak!}SQ{rG>~RI4Od>KX17Uj}lm2m&G4oi;!39Ffa$V^) zJL52j3+jlPq)aQhS5xSL(-A^h1nsSTJxd=gaYAgqUFuqkBi6}u%o$6V*BG>4k%{1P z%u}((+fCodX+{|Pl-4X%K2mF7Vn;Xkn8feE{*E{*bACURUg6nik7E%6 zVksNmEC8p|e$oV|XXu$xAdi@#WLEfWRC)vSAXTKBONS;7URxa(B@QnXPr$eO4=|PX zNRz5ks^i}&(lch3CX6b~2uLEjQ^~E!sY`$9a-#|?C&;^Z3x0c>WH;$kKngueGKHy% zk1waqgC=he<2 z3LA(rO;XHz{rt)f_O6s!bij3T^&Ro#{w79l3%&;fHH#BwUVRzeh zVEZs5;07z#wc&Hu5*IgEsIU0dWkoMPURAGtfFLfnu&6FAiiKGrctLK3yNmX;hVi@_ z;bsW&Va%B0@FDADUK?y&$`&!!L;IO~d$5mv!`|+Y4EmlKuc@H(TMBu(6>ri^HUnYX zDe5}%i>A4&s*ik%=Sx>=1A_57H-jTLrGYY`PGib*xArf}L54+!8_2m+hQ*-`>NbSU$M#s$_`7m^^YS4~@Z@lvFdU>#!*^Jmjty@Zr?Xvfa zEtd?&MAP@{q3zZw*X}457>J$94U3J`9*6kK5A;uQ(f@cw{m-eQdVHs++2>Sth`ob;gHMf{Hb(7m-+TEl+s7 zMy)b4PtX%t(&zVC80E6{Up$PMnZIb$ZxQm2lLR$p1P4Rsf2F4}o1k5(1tbLhAfPJP z)GxS2zKC8as+S2}G;>kWDJ*83v|nalJs#zuIGrvz+};RTx5+vo>8+60wP)iSw(6J7 z(3PRAe_{b=v8A$z_OK@!=C$(Q6shtGbH{eb6V(mPrl>4*Ha4aR;~M`YI?LGDbWhp& zRlCie)sS_KS8>3^9JpA}SS zHrd`(zXlKW&EA10*1^iIywpArOq$D4HK>M(&`}Q#rq4TcvDRCsg2m-W>HQr?S(w)P zQqs)?<7IPwsl;1MsnQ*GL_47j`YD&|gj^PAWRZ{rkp}7dr4jppVQt%#c0oQ=kO?g- z_lF*A4K*Z>RD$;RmM_u9CW#|K9=0{) zLfXjSJ9_&oK^x&qfI+&m>1e`Gl+~aaviP-q4Hlx8g^Z`^yZ#28U%PdJRKB|2B|HZ$ z>Fto;QC?wbIe$TSk4{ud{mPjfdYqT>d-@!P!E3CI~ zc!bn!>g%s5!^>eW9obkmBkmG`+96yjKh{Zb2}6DyT6zY#wjq%i$xje1oji~O7FFfQ zjO6FWec9_sH_7I-;y89O{&(6I?-WZ%W6p+{(ddCeNc+p+_7_}u&!pDeR-A@Mu~jUe zJg*jwzyE&80Fb%2o{9Pb=9Bv%?=*jkhbvYDK_w`@KJV$Zo3!UfF);c=E-!Gs=>Plx z8yD5rGdubCx9a@FrEh7=rE9y(^r{zXXxXyJ@)Eo^s?&Z7WuV1j90-X!flJ&{CWRMg zjzHg|qOtzUC}@d$Ob;m>hQj_ zHF(8>O#4oTx|1}LhJ|y~O3tsC^=43ZUO`waiX@AXU4({d8b@mGDs@fQLyD{SkR!eB zVk`>R`G~?!W?GY%Qf;QZ!W7v0G9ggEzAb;U*2_3oAVRFzOgWUXNouTSLN?>hf)j+f z0XY~WPFs;nBvyGcW)p6-%Wch7c6gw?T>vq;x03F5y!x^{*zGUCSWwOJSRW9zsKvi8 zGTu<$u{$P(r5inwy5Ye8FYHMTqc+w_ZRBEC<*5&<8$Aq=bO9*`d0jXCpU7oz-_us< zq5n|YpB1@7%rEeGjU`)Ir8jYd?*pTHyW!)R^nGL!X{aNP)F)HdjO`>9&j!YM*@xVv z`P1AHMh1vTE4dQI^_l9UG3`S(g?kbr=brjA1jUme`X;kEB5w7M3s21bm!vOoydIu z7!a)@++(wT&IGIYOrF(96^(qY0VtBATEROd9V)6>>H7s+tzA_(bU=E|F=q=Fj!n({Z$-PP`5@N+u9?0h z8{KfhW=dLNbGI^99*`7&z~qoMu)$|bHfzpU*S%>!{(z&mKf9ayh@8=TlRWlh_YgO` zUP@1&3TZ?>JR(Ga2@Ry>5@+LBoE{1rRUfe8XdLt3(P_Ea2E&hBW%5);93;7tN(_TchG3BysAc3+f_+ zYM<2iPEac{u?NPG6P=)Y^Cc&moT*WM!r^TP{!n)x$Gr^M0t5*}xur(v8@S|GVP{SL z87m7M(kxzIgnDZ%oJ5#acOK+C$DUeI+5~M9*~}D8$V@QN{mMM9ZglMwm6^He*V`B# zAxYRcR7tcrRL51g4y>Y~6j{+1JR1@7(J!O#|0w44#$P}j-OY5!H(B1~Gk17gjh}rD zJvI8U?J$hCqS@m}Z^a|0&w~l>} zd7j!?{#b$k0^Vx!mCRp{zPx-MB0ZX3bM)MkU8?^DT%3pT3pM|%gGhNyhW_>NdiI`2 z@-BB&@s9o!RDscOV=|&ACV0p$)Za_~0)A0e7p^c{3N_s@lp5(T3i<92=Po`cbM>c$>JvVCC@E{tM7eCGwHx z$KuKC^bnTv2%xVsZPfx&{iJA~lw8r%s48{BPxfdBypncx;AKp?>#LU0HWB#_`5 zB-qFEKJ~rl)LB(~b@#gWzE<~--Ceb+m;8Qcq-lXrVcHUei2=6nLb8Lo->;BEGoCAc zhUI@lVbRL)1hGPiiHV5G9*vTc@}GwMUq?y)&xn$aje(Mym4=Lrk(ZH`i-Vh+n}VKS zgr8HGjfnSgxyab#o9)Cu_` zgBk>&fd5SZ{r^c&QNU;*^hc402mn8(0HdIyfzkd|A2a+X0f{WyBc6$mKfI`6{e)Rg z2iErb)C^it+pc_H`E=@NP4Im&il*7({u4mxSs4weai@-)3e%3Ra>Z2?& zp5S1VQxa*fz2bziotEr(`zc_xM6a~*iLggQ=-|m13rlqd!n(a?CAJbdbUjVzBZM^` zHFsa?cLQ&>`=+e${M#&9eo@B!QQ0e>LMoC0!nAr6MB{19e3gwqQQKIV0C3jM(ua$W z4BxqqJk*zpV?IbbcC;+0GQ(avZndWzBxGLdC*KS*){8kkXi8x6IAXe4b{&INo4|%1})7)24Il0|w~d&Ewjr1LiaX zj|B~9<)38ILVo9)N1Y*e9Pv4^VGS;b4(#1ZqCR^OsFrUn8&xmQ=^hhdQ(j>20jxmer!y~a z^h;SM*DCk5?u*>=4vuco7&BhLe{+w94kMR7>aL?oX5CDQR?Q*4&f^V!O5u!jNYyjv zJ)FdVcd9g`)(!MUCr^~sY{~uU3d5z8$-Vu}p*gj~c#7$e=#ks0w^fR)=`M~^R9qG8 zYk^yTElugtsY9J~miXKuPs;I6X8cnUM)4HV#bAI7QVGVE8LwTc2GH(ludqe^ryHN% zS>|on1Y#1b&_;Su&y;6{i6ukyoXq;*e3ZYz3&j=R6xApzrO7rV<8*DapW|*?L0|Tc z+)H!qC6}t%PfuYDQqoKwx~-`v_o$=Ih*A}^96)y4&oT6+UO2te)qJYzi6AU$MD8Co zpyBr&6)}66y^~XmPf#`f5S}Z3NySsqvK~ErhBCL1@WcZ#wl;mXe0}N*QLBfHs95M;YoEQ$oON?D}HUa6XNqRJw*3`sUMS=MF(O*oB7Se4`b7E?a$75$-e z%%VuHr@Nt-wY~p=L?2iCLxFYu^n>W}s6eoW#oWi-{Sd`-DLC7#)E|DFJ}8yIasbKw z<&8;2H9gbS&j(Y`ZR$esJ|v*vhjxQ(B7(BjH7a}+hQ zy$89h`>)rS&f%)3W7X1dW(^5Sq?+hV>SiIZ3a(E>?0#+xJ&4mba>SH@r zz!*5=we8e61oW{L5TGemMJS9d=`msg#HPa~)8T+>ytA3QhC(wpD+0q>jSC_ zC5+k2_=V9MJM-DlY@si!mBG?E#jq@@St=SOUE4ppt(}!O@!c0NRr+5BmgV&~bBa;D zyqo}q5c*9bwdM04G`(EYw&*mZ%uz5LguQ7x>2eIposiJkaghjAiY4tctLkA^dY6l5 z-#bL`!D(?_H+66_Yi)7Q3h0N$Cv0~MB3fH(Bu7J2lOFFvR@y~6fJy!_jCv;2_osxJ z)?hNYDS6W%jZO6UlA^IrzhO3J;Ih7<;%oGQ7g0~~T}h=;06!2qFAez-asK}K#7*L> zp{>$jbC$sAp1OPJ!t(&d4Rv&UGUX9`X7&$M^c|dej99BeKcwc#6bo^gU8D-AYC&hH z?vM@Qk1Kc&z&89)lcz?d2h5Bbjni zWKw3YL7HKQmKsKJCsbD2J5;=18iLp9W;n*-d4rltf_()=d11TTg`J(eWz6MAfuW^@ zNF`L-sCd(KOU@~+%QtS0ULp|`A)xj(YwogxD~RM0AzX#5G*#4l*U2Z>EKS-M5Zom# z-&(FVv(f2=&?D{j5>_%iY>s0PtKu$zD8`)%mUzEvx>}Eae)aY{lNo1%kG+nn9>mR0 z%T=&5Z1n>)ZFZ`;nP#4NKEkicq-5uiuD|}O^lL1f)?|B7{~jq;Hvxn6@}+g{>qQ6% ziKU8N7xAVDNwol$bG;^Cygi!idl8XDgu^*`5?1Uw`^KMgxoTfV%vF&qA8H4Xf58!0 z+$=g9wCEpeRZZf+EmnG)R-{w{$ztuEl|d<;fZITwuE@RT(-f+-Sxs0WdZGsHp0QbQ z$t*aa67TGaqg`xL7;6G#$Eq=-=(&n%V;Y3fM?=ELZ&6$&(rwmWoX~sCjqyyv+Ro~$@R=}Ih3px_@LJj{81B0N8u(YyOgUubp2}P} zb^8om4Wq}YDc%_zeHo%HnXOVS>i86+a{Nsxim;MfsXwJQM4dR)SFM@16iH>wQJE*@ zU}Q?tFA`N(VO&aYY^)ay=h`t~7pE-Y;)ZG^wz&|U?*>;C@Q3GNrEIv6s%;@v(fx<` zUa-JaraM5K!cUGSG1tAnG6dVk;2ieTof25`R7eTxUmuFnW!rr33W)OV`=FFVmS|+e zozU-Lz3DQ2m15qjDSbl1p0S!?p~LAK`_d1|h&Qz;9qj+4CnH3H|PL z!DABoG9%I|)vx}ow{%Vq(r!B1F8nZ zwg?_MS)1U~Wv8>^2jJLDf$onrB)KP|R-$M5$4`$f^PNuD$kvk&LL5=D32|v3Rl)4I z*!7*W@XXz6ylxCFMJwGkTpd;1NN6X?2jLuDm%lWYzbw_PPpD?7hwo}V-M+|ibiWbl$|JWuVWY;hz^j>#Se^7miR`(^g zJ)T%|S4QO@qexE`W*Y&4nwQqcN6e_nR15p%$c4X zZ-hOwo{N)f#s?`dl7gNx8bkd>Hx#DFGb8vhqf_P%=|6iQoy_D(8RLISV@{9lW6aH_ zw-DLCwe;lYN70YBk-Lm7DNH-5J`C08%eYDL-1PgP*Py)ED8>sUM6^I>h=bIAnVfW8ET7=rm9{}?6Lk=hz(<}dEO}nUw zYRs{v#AUD#OtJa0V~<#@GIR9QS-MwTfZHgp_6gs3e(t`h#_)Gdko9Tt40Gn@XjE@_ z5GksqH-6japxfV_f#q;wWDupWx!$7u1+0fBo3zBN_}N*bL(*-cigX{F>PG#V)r7(N zOMPvtDbXFDpI9vWq=isO`&p$WnsAzqq(0a9cj_CXG#TpJrxCO5sN`0Zvk zm&cji^l{DQ0r>5C^~Zr|5VyO!SQIzE%(r0z*Cks~D8yaKqB!+9zykyYLT6>SR(136 z2aIDB&1D>ta~8mvY{|*dV8<}WBkG=NQ6!)XVie8!=(clN z`u(VhFGKxBpD0cC#=zK0Jr}8CtsXHBx#Ty$`E{{3vquTu7I?*w1(9NTL^|`;w;wW> z&A9{f6ikspLbBvMRQQWZGSaQ^=}R(1{3n^;il55l*P$+Yl?B67i?H5(|9H9->JSW8sK2 z8o{vpnmi^L z@}q61zHS_+V?Qh#k`B_5t^el!@d;RW#^6~W)Wxr~#n}^ip24u;m4lUj60OyFVx1G` zaDb0agz$M0|mt8>sd{23%Zc~2Id%CzOWGCTHr9(Pf3`MZ1&_9yQL z0P}@}GpP~WY@p{aUOZrty=G;YUBQF)uA|b{V*hCz0N_0Cy;c}%yKu<4g9ypH+yzx= z@M-Ee+nBvdwf?`bNnYy83NN0xYCy2cmhlmi!f-oLAf$6NSw+ABIZ^t^|uKOTUk55gLxKSMaI19Tzb zYrtP@Z#d)|Kbp!EQif=Y4Bc9HtDJulSe7XY2v_tX6Y+!m3z->*^161l#?dJ8_S^xZ4pOZdHKyTt ztdi1VxbAPoDx8hC+oWYW*|7A>AT_O>)Am1?fyHt>X~^eE}>^59!}VBh~7|n zg$_~%S6!>DB0V=+6aiXDpo%Ltij?Pl8pfo94AcWHqsLp1V?}-A6xRX;;Aw_Uc8F_J z;sJIz5;0CR3@-Vu7guj@<;{P$;7~E9-GhI}aTQ3%FJzP${ebdZYr=7&whHtl@jfSQ zUOWKfkp3P$inMFx^TzwjI*yS*566|hc~z$^Z=*(1yL!N3v`tv3K?Eh}-$d1J5adThD=h{l`II za!ql-Y6WE>l(dV=mWsBduD$2tV`M-|GXcezI+)YjbA#oWFD>=1R8)myN7=|E$9rzn zYWSK?9w7xG_;iYd`=++(@rM7Zc3yn`)>T5ei&k$RK)^Ctijzowc-+VB*|J z(Fz|ynf!7Te1^#}*@~-}qKsU?`MfG|3V}vcarL^$OYmiQIWUH&!01d68^{cvM7Nx{ zWn>zFegfo1e14A!dU^Yb`PV%FelNCyxg9*~*y=UF`5HeoJVK&h{BktgpnTqHZy5KN zO$qqZ2x;yZXrDKO$LZ&Bltied%dN=hvZFTtU1|_bzqsG~TcV5hIsXn%7!AWAF8i|< z+E?9~>GLtl%%CkRx7IyPgE3L>_FyV_=Oq~gs#mFuW6AM|!`Et^c`esWm|rlj#Fy z)vIr<4UO80D-AdSubRpLS}X!fIDT~Uw^+DbaOgF z^)U`rPo7oO(s2a~F~F2cirH>(rp@FNyU{*5X=5$$J1fW0EJb=f@#|3}q5MhQUgxLt zli#G`u zp0M#NsEpe>cm#l4l9!}%X_jvE%Pje)kB{73mny@(P43n( z3S#aZYDIMHv{_Gw{OIITV1;8)iQq%UCc(HyOX}~ji>Vf@uu!IpYRpz)vRVBA55nLv z$ti?`?y70t!3HMST+FS!c)@}%Dl>Es$L}!jz;<)XG&nR=B3HAK|J3U+*dJS`mRLry z8@3XRgJBw<9Q{V=^EGKpnSOvQf5#;2IwMq4IOG)fY*43`lA zCErHZx+_fcN%B)VKrJRy++V+Fm{xtF@(2G_?N)lxII9_pp!nqV&$6=g*srVrFaM0F zNj|)irAFq7L!HyRnR0O45>jbKOsGP;6CjS?btTp+FF-1s1I|T`kv8QAi`B2Qv_+VM{0Bz-K zA?hDqM#}|H9{}F6L@|e)NDMaC1NJt~_Qb-NL0@W|0MJ}E!3LAu`aWg4oBLkzB0uZh zR(qj(Dxn5DR5W6Z#npW!uy}ubm&Z!@OHqkiO8nXgaEPPqhFwo($W9$uf7a<>L0vF= zbc^>)KzOXaHAX3*9>Eia)Bx}QPrN#yDQvyxei!rVm4`+%?N zh~r|3#U#5pCBII%k?X30ugAw7c~7%%F+K2}Poj=JPzXZ(i{q~o#@0!AX2VSQtNPC7 zl#fvd)Nj&!L5R^j8DMgXV#Iv=NJ=9e+?QVw!W_)J91`l%D3zFxyxlu zAmeOYG5szZ@x)-9lYxBOR2wVcxa)Kc*{hP#@EfxL&QDXTe5ukn z%ns#qvt!n_#Jeh(erA~smCSAOJ`wr|H*N4#pw04*r$+gUf^VB8u=Ep0sK7<@MP(e4 zCFzyDf=zD3cGvbevMxj^tNPV&`;6MD3x~7c2WVkz&%_5Tv_v+()joS7Ff;L1O&%m) z@c5+al5(>(V9h^Qh6y6;p1)o%PJT)~P5I7%Ce|ADs+j?YGr-fV@g?)VF*9n?NVhvT z(7@G37JsI`@hXF_YZ09CCOkS5=Cb-XnL}mE{dLzyw+b)z5uwc8B9Z$bWXp-v z;sCK{$*COChF$fx0RVZsYcyeFJytib4I{c^qdhm*wWu=FpD1JYXIYiBE;7Lt55?6T z0n#63k@5IbGeQouR z(zeeq)SA7$eEt4#5uVotPM&|zV=t}cC4skCp=7wui;*D4--qS%Y$&pO*67#1#<<_C zL#wl)J)NPlK&pd@ylnqqXmHguw=TuLn46p?O6NK4Osl9kjrkdv$ZY5>s0gdHgKGNd zy!X*Tpl>>7&`h2?!)PW!l&hr!=R(32ypMl(idr^l6GXTIixr?waCV71Zslc~W_VVD zM;rM3PN*Cbpdp;w{6~!{my4A+>o9fvolJDGOH~7~_NKSsGRbc*DdSive$2w$ zfY>?3DrVZAnHs_>zm-Czu`!ft_bNt@-fFF7{WKd~g)+zE4_pXw0`ZJ#~8 z2ZV7v61u|Ik;c=?9Q3xSB691ue(G|o?3m!qNf2K#pA;=knQ8{Hb~ z5ai;{c#}z&sW4HumPGGO{p7wHDnp2;>c$47H4d40<=_CHOzg4M3X)mf`+2~eR{nG^ z1aopffJz%Sce3&}OJ8zDU)~?8WB{#T;Sia1Kw&f=l!iILB@EX;LIZsK~g-4^9z zZb*NcZAE(q;t6Qif>89^)aI75&m09FwCA74bQ6=urAlQ7G*}>G;(PUNpHO_YpdxMb zOMi-6sfZN~45`AvB4FN@>yEl(nBD|$|HugF(pFg1UBC3Bzeay}XY<_Bj+x?^7ojS) zCSv?I{&}W#Gy8An<k5 zFJA?-+U|qnp^NbuSdbCPdUN2Lq~fG>^m>2;&twJ6PA-L*{hTi#uX`rIDa0AdI`GwI z1YgU$LfCxZ0jQDNFp^~srK?-qCSSOWBR~D|Tgs1{YV0l{Wirj(IM0uB;Aadq$OpOq zx(Wl>WQTG{#K~}Z^a`P6`prAAWUK`qd9mxKbgCZQQDH}`A|z6^OPzVfM64)>>01Xo zgxChpxYtO6f^W-7IssOM1xoWo{KE3iQcj%u%)48(|U7F@T5ww z=BctBRVljiNFRw^x=`!*V%UjFKHoiO@uoM|@#H;oL~@cXQ^W*6AzzC=+C=f-I{4Si z7Go%<$rKy8fnVbm%V$+?o*b$biJniZ*F= z?Rc)uB}%vw#^VP}q}$1{5arWlbGTFRPJ*HDvxP9Ie|4Cu_wl~iuhoxwGdGtemq?ht zS%r!lJZ^b>>yt&({CO+5x|uYyQK8F=C7>_Chl6Xd@I{%%Q4w{>p8T3w4RK#G!~vE` zK3@OKl#H6jt>(6xNzKUe0fWOMb3OlQ(CWxr|=y%hZ1lJO+Ip_P(XBpL_G z65a@4SAZ5c*d(!|CH<@FkGHw=Os|PXNBsFH&5Zr!bI0P|+}?W^$$b zcxrs*X^d^&Rlq1_7^A+LeMj|}KC@+S=Y*{r&u6&*fJ{2`z+R5ITKx$wr{b$)>j}CC zAUeBIAAs0L>#*AxqvpWX)9l2_^q~Mv#(UGR@PR+=p{ZAp{_GN{?$DK)s9{qwUCpZP zk56=}xPc_|Y999_G3a+u{%2aD1ISUqVX3EYo!DoIJEQZZbA}=WFKrdi_307itsN|y zRRg703*bN0(_dMipBnn6xJ9(4V#IRw&wV$Jr@7Y+$|dU+aYcT$xoBD1dw>ESvIb2w z1o6q4f<5W4(OUL=wv@AD6bM=3sws5LW#_$Dl`aM2$G15BrrD-8Hjm%#1>itqV zA;<*N;Fdo9MB=F`+97mW6s)7qS>14v100G{x z|3s>VJu!LXq=UdPcxQ3}2h=hy=#ferp=*CM?`Du{Z$mMQKl0oT@ZaownVV&fxf$Mj z0Q#noMycm~_uKiQrJ?;Lu@8Va!QJl%Kz@Gg3rS$%92_D=_Lu(C-<((fiQ)Oi*09_F diff --git a/result/channels.ser b/result/channels.ser index 5fe7e3cf6ce251f04c195dd0dc3ebbfbd6bd9d54..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmb7DO-NKx6h8B2Y?^e!lz!-krrH&}hat6Skv};&GKMe;Z3?gRZZlWjU+><@XM`k9 zBH2PnNn?zNa@9f$4a^8>Q3NfDBnS-J`eq;(74Eus-lVySJn$~ubME(@^WE>hCj}^@ zHtgy~SCO1yM3b8lO}8SeEcj*d^`6cTevqQDLo<;YMM-AbF$l4=jcMA{RL4472O=tZ zw)3@;e?CsObAzm-BX(|K!vAYrzo|$dwLpc25oHOIY9NfZK)G(N?;Pv#T5fc8uJ8Nd zPX}+keI8xrTs28km#JkFgULFfl$eIB5}GtsOqi^iIwFSLmg&++vN4Se18c#_<>UR| zvNaL};t)=H$*5`Th%q=7=X{FCrn%0353)EQzsFFW!GW{rSfOM}YhsQoZp;>TMhK3U;UeGzrJjITsenok6ME7ZVHnmg=s1+4)u9z4}W(rEL?nYst-@TJ_r(U|lL+Ro{X$ai}U&WBaxM7vwRcD&t%=~i1QnwBx+Rv diff --git a/result/messages.ser b/result/messages.ser index 496eab0e4aaf72fb4a7a365fdfb2959c0977536c..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 fJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-fS45kZuA$C diff --git a/result/readstatus.ser b/result/readstatus.ser index c5975123e324fcbdfc5624e1442489e4e62468d6..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 82 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 eJQ+AkGKx}*GxBp%Dhli!7{H*M14s#gm=yqSWEX`1 diff --git a/result/users.ser b/result/users.ser index e0f789e6ab832b5d5e2bf8e94d8255fa6af71d01..7a6d5b5f9849283d157c67c3978f398d607fb212 100644 GIT binary patch delta 150 zcmZ3;xsqi<03+kXKpTO%JD7DZUsTR-OWSuUuF4~7<6LpZ(tR;jtoMW+DoPmml1i(p z9P$#&Qj7GG^K%Os>KK?y7+64}B@A34sl_FRM#d(Jip3xqrlzPKcg4dDZv=I(7@P|A oU;vA9mh&<(06{v~)Wn1eh}yNBKJg9htv}q(cF#V?=-F8T06c>;QUCw| delta 787 zcmZ3vw%*oaGqz zZQ0csQ}+9A^*aR?W??`zX$M~lYlm9~(2=}FsTHVB6f9w21`3uiaG|@dCnLqoEPx~Y z!=8m5{{$VLqnRmCr)FkV&j58^Z{(4Mldf*Kvxv`JJ$a|ID#Up$0rzKb_;235_v7+A zF;R{tI9#`neWFwW&o) zWTh4tXQm>#upStV$|VeJ5D6@fT&n&|YP0Na1skotOE&M^ozdM0G zIm&sN7=R#sUyP=*@$m%}SVT{EKt!3=Jm)XGxPL9i&Kk&OA<>;i$RV70!AhVwkQU+{JfmZyi^|s z&g7!h#FEq$$C45TVIPp|^h+{xQ}sRbic1pnO00btm@-pJ7z7|vpis~UIUFd?lLK_E zV{%DmS*l}6AwwMls}BQ5X+a9mG&rBF6llF?3P_f%qJRfVyBjYT`xNpm@&X}^_cdOqih|N3JpXdly zkxg(>;k~ z(wTq#_CaiJYTLV6O<3|pCEKE;38j9TSZ&_Hw~u|vivwVr<$0TyZ3%vekUf%(F7ve=)pPdh|<%)ODm*4GOhEKC1fQEKQSy9wRyZ)0R_h-(Tea8!umY8~12nyeIIHfRq`@?tLZ+sVEwRw-C vwXAxB1K4J5unM@%AgQO{1kh{-i~fa$_O{d+uV;nmtJVAy{Hb8!=ve^(?df|g diff --git a/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java b/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java index e4b541911..b90d313b4 100644 --- a/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java @@ -18,10 +18,6 @@ public OpenAPI customOpenAPI() { .description("디스코드와 비슷한 서비스를 제공하는 백엔드 API입니다") .version("1.0") .contact(new Contact() - .name("개발팀") - .email("junnukim1007@gmail.com")) - .license(new License() - .name("Apache 2.0") - .url("http://www.apache.org/licenses/LICENSE-2.0"))); + .email("junnukim1007@gmail.com"))); } -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java index 8ed037d0a..22a546a1c 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -5,6 +5,7 @@ import com.sprint.mission.discodeit.service.basic.BasicAuthService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,13 +20,11 @@ public class AuthController { private final BasicAuthService authService; @PostMapping("/login") - public ResponseEntity login(@RequestBody LoginRequest request) { + public ResponseEntity login(@RequestBody LoginRequest request) { UserDTO login = authService.login(request); log.info(request.username() + "님 환영합니다~. 로그인이 완료되었습니다"); - return ResponseEntity.ok( - "User Id: " + login.getId() + - "User Name: " + login.getName() + - " 님의 로그인이 완료되었습니다." - ); + return ResponseEntity + .status(HttpStatus.OK) + .body(login); } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index b68737536..8474250f2 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -38,9 +38,9 @@ public ResponseEntity viewFile(@PathVariable("id") UUID id) { .body(binaryContent.getBytes()); // 파일 데이터 반환 } - @GetMapping("/{binaryContentIds}") + @GetMapping() public ResponseEntity> getFiles( - @PathVariable List binaryContentIds) { + @RequestParam("binaryContentIds") List binaryContentIds) { List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); return ResponseEntity.ok(binaryContents); } @@ -52,7 +52,8 @@ public ResponseEntity> getFiles() { } @GetMapping("/{binaryContentId}") - public ResponseEntity findFile(@PathVariable UUID binaryContentId) { + public ResponseEntity findFile( + @PathVariable("binaryContentId") UUID binaryContentId) { BinaryContent binaryContent = binaryContentService.find(binaryContentId); return ResponseEntity.ok(binaryContent); } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 365e6888a..4aaf21b5c 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -7,6 +7,7 @@ import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.service.ChannelService; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -35,35 +36,36 @@ public ResponseEntity createPrivateChannel( } @GetMapping - public ResponseEntity> getAllChannels() { - List allChannel = channelService.findAll(); - return ResponseEntity.ok(allChannel); + public ResponseEntity> getAllChannels(@RequestParam("userId") UUID userId) { + List allChannel = channelService.findAllPrivate(userId); + return ResponseEntity + .status(HttpStatus.OK) + .body(allChannel); + } + + @GetMapping + public ResponseEntity> getAllPublicChannels() { + List allPublic = channelService.findAllPublic(); + return ResponseEntity.ok(allPublic); } // 채널 정보 수정은 Public channel 만 가능합니다. @PatchMapping("/{channelId}") public ResponseEntity updateChannel( - @PathVariable UUID channelId, - UpdatePublicChannel request) { + @PathVariable("channelId") UUID channelId, + @RequestBody UpdatePublicChannel request) { PublicChannel update = channelService.update(channelId, request); - return ResponseEntity.ok(update); + return ResponseEntity + .status(HttpStatus.OK) + .body(update); } - @DeleteMapping("/private") - public ResponseEntity deletePrivateChannel(@RequestParam("id") UUID uuid) { - Channel removeChannel = channelService.deletePrivate(uuid); + @DeleteMapping("/{channelId}") + public ResponseEntity deletePrivateChannel(@PathVariable("channelId") UUID channelId) { + Channel removeChannel = channelService.delete(channelId); return ResponseEntity.ok( "Remove Private Channel ID: " + removeChannel.getId() + " delete complete!" ); } - - @DeleteMapping("/public") - public ResponseEntity deletePublicChannel(@RequestParam("id") UUID uuid) { - Channel removeChannel = channelService.deletePublic(uuid); - return ResponseEntity.ok( - "Remove Public Channel ID: " + removeChannel.getId() + - " delete complete!" - ); - } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index 1f6df1067..0c891ca65 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -1,15 +1,20 @@ package com.sprint.mission.discodeit.controller; +import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.service.MessageService; +import java.io.IOException; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; +import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/api/messages") @@ -19,9 +24,24 @@ public class MessageController { private final MessageService messageService; @PostMapping - public ResponseEntity createMessage(@RequestParam("id") UUID writerId, - @RequestBody CreateMessageRequest request) { - Message message = messageService.create(writerId, request); + public ResponseEntity createMessage( + @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, + @RequestPart("file") + MultipartFile file) { + Optional fileRequest = Optional.empty(); + if (file != null && !file.isEmpty()) { + try { + fileRequest = Optional.of(new CreateBinaryContentRequest( + file.getOriginalFilename(), + file.getContentType(), + file.getBytes() + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + Message message = messageService.create(createMessageRequest, fileRequest); return ResponseEntity.ok(message); } @@ -34,8 +54,21 @@ public ResponseEntity> getAllByChannelId( @PatchMapping("/{messageId}") // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 public ResponseEntity update(@PathVariable("messageId") UUID messageId, - @RequestBody UpdateMessageRequest request) { - Message message = messageService.updateMessageContent(messageId, request); + @RequestPart("messageRequest") UpdateMessageRequest messageRequest, + @RequestPart("file") MultipartFile file) { + Optional fileRequest = Optional.empty(); + if (file != null && !file.isEmpty()) { + try { + fileRequest = Optional.of(new CreateBinaryContentRequest( + file.getOriginalFilename(), + file.getContentType(), + file.getBytes() + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + Message message = messageService.updateMessageContent(messageId, messageRequest, fileRequest); return ResponseEntity.ok(message); } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index 220d44afd..9d04917d6 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -1,7 +1,9 @@ package com.sprint.mission.discodeit.controller; import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.service.ReadStatusService; +import jakarta.websocket.server.PathParam; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,8 +20,20 @@ public class ReadStatusController { private final ReadStatusService readStatusService; @GetMapping - public ResponseEntity> getStatusesByUserId(@RequestParam("id") UUID userID) { + public ResponseEntity> getStatusesByUserId(@RequestParam("userId") UUID userID) { List allByUserId = readStatusService.findAllByUserId(userID); return ResponseEntity.ok(allByUserId); } + + @PostMapping + public ResponseEntity createReadStatus(@RequestBody CreateReadStatusRequest request) { + ReadStatus readStatus = readStatusService.create(request); + return ResponseEntity.ok(readStatus); + } + + @PatchMapping + public ResponseEntity update(@PathParam("readStatusId") UUID readStatusId) { + ReadStatus updateReadStatus = readStatusService.update(readStatusId); + return ResponseEntity.ok(updateReadStatus); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 35ac37aed..2f6690dc1 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -1,12 +1,10 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UpdatePasswordRequest; -import com.sprint.mission.discodeit.dto.user.UpdateProfileRequest; +import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; @@ -57,25 +55,31 @@ public ResponseEntity createUser( .body(createdUser); } - @GetMapping public ResponseEntity> findAllUsers() { List all = userService.findAll(); return ResponseEntity.ok(all); } - @PatchMapping("/{userId}/password") + @PatchMapping("/{userId}") public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, - @RequestBody UpdatePasswordRequest request) { - User update = userService.updatePassword(userId, request); - return ResponseEntity.ok(update); - } - - @PatchMapping("/{userId}/profile") - public ResponseEntity updateProfile(@RequestParam("userId") UUID userId, - @RequestBody UpdateProfileRequest request) { - User update = userService.updateProfile(userId, request); - return ResponseEntity.ok(update); + @RequestPart("updateUserRequest") UpdateUserRequest updateUserRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile) { + Optional profileRequest = Optional.empty(); + if (profile != null && !profile.isEmpty()) { + try { + profileRequest = Optional.of(new CreateBinaryContentRequest( + profile.getOriginalFilename(), + profile.getContentType(), + profile.getBytes() + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + User updateUser = userService.update(userId, updateUserRequest, profileRequest); + log.info("회원 수정이 완료되었습니다"); + return ResponseEntity.ok(updateUser); } @PatchMapping("/{userId}/userStatus") diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java index d1807017a..215a584cf 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -16,7 +16,7 @@ public class UserStatusController { private final UserStatusService userStatusService; - @GetMapping("/all") + @GetMapping public ResponseEntity> getAll() { List all = userStatusService.findAll(); return ResponseEntity.ok(all); diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java index 07c981376..42a1acab3 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Channel.java @@ -10,17 +10,16 @@ @Getter public abstract class Channel implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private Instant updatedAt; - private List joinMembers; - public Channel(List joinMembers) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updatedAt = Instant.now(); - this.joinMembers = joinMembers; - } + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; + private Instant createdAt; + private Instant updatedAt; + + public Channel() { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java index bcbc102b8..a3387881c 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/Message.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.domain; +import java.util.ArrayList; import lombok.Data; import java.io.Serial; @@ -10,29 +11,30 @@ @Data public class Message implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private Instant updatedAt; - private String content; - private UUID writerID; - private UUID channelID; - private List attachmentsID; - public Message(String content, UUID writerID, UUID channelID, List attachmentsID) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updatedAt = Instant.now(); - this.content = content; - this.writerID = writerID; - this.channelID = channelID; - this.attachmentsID = attachmentsID; - } + @Serial + private static final long serialVersionUID = 1L; + private final UUID id; + private Instant createdAt; + private Instant updatedAt; + private String content; + private UUID writerID; + private UUID channelID; + private List attachmentsID; - public void update(String content, UUID newAttachment) { - this.content = content; - this.attachmentsID.add(newAttachment); - this.updatedAt = Instant.now(); - } + public Message(String content, UUID writerID, UUID channelID) { + this.id = UUID.randomUUID(); + this.createdAt = Instant.now(); + this.updatedAt = Instant.now(); + this.content = content; + this.writerID = writerID; + this.channelID = channelID; + this.attachmentsID = new ArrayList<>(); + } + + public void update(String content, UUID newAttachment) { + this.content = content; + this.attachmentsID.add(newAttachment); + this.updatedAt = Instant.now(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java index 2dad5fff4..4804d3e9b 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java @@ -1,7 +1,5 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Getter; import lombok.ToString; @@ -11,12 +9,11 @@ @Getter @ToString public class PrivateChannel extends Channel { // - private ChannelFormat channelFormat; - private ChannelType channelType; - public PrivateChannel(List joinMember, ChannelFormat channelFormat) { - super(joinMember); - this.channelFormat = channelFormat; - this.channelType = ChannelType.PRIVATE; - } + private List joinMembers; + + public PrivateChannel(List joinMember) { + super(); + this.joinMembers = joinMember; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java index 4b3b8e782..94b071d52 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java @@ -1,32 +1,25 @@ package com.sprint.mission.discodeit.domain; -import com.sprint.mission.discodeit.util.type.ChannelFormat; -import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Getter; import lombok.ToString; -import java.util.List; import java.util.UUID; @Getter @ToString public class PublicChannel extends Channel { - private String name; - private String description; - private ChannelFormat channelFormat; - private ChannelType channelType; - public PublicChannel(String name, String description, ChannelFormat channelFormat, List joinMember) { - super(joinMember); - this.name = name; - this.description = description; - this.channelFormat = channelFormat; - this.channelType = ChannelType.PUBLIC; - } + private String name; + private String description; - public void update(String name, String description, UUID newUserID) { - this.name = name; - this.description = description; - super.getJoinMembers().add(newUserID); - } + public PublicChannel(String name, String description) { + super(); + this.name = name; + this.description = description; + } + + public void update(String name, String description, UUID newUserID) { + this.name = name; + this.description = description; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java index 65b159339..6ba686458 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -11,51 +11,50 @@ import java.util.UUID; public class ChannelDTO { - @Getter - @Builder - public static class PublicChannelDTO { - private UUID id; - private Instant createdAt; - private Instant updatedAt; - private String name; - private String description; - private ChannelFormat channelFormat; - private ChannelType channelType; - private Instant latestMessageTime; - - public static PublicChannelDTO fromDomain(PublicChannel channel, Instant latestMessageTime) { - return ChannelDTO.PublicChannelDTO.builder() - .id(channel.getId()) - .createdAt(channel.getCreatedAt()) - .updatedAt(channel.getUpdatedAt()) - .name(channel.getName()) - .description(channel.getDescription()) - .channelFormat(channel.getChannelFormat()) - .channelType(ChannelType.PUBLIC) - .latestMessageTime(latestMessageTime) - .build(); - } + + @Getter + @Builder + public static class PublicChannelDTO { + + private UUID id; + private Instant createdAt; + private Instant updatedAt; + private String name; + private String description; + private Instant latestMessageTime; + + public static PublicChannelDTO fromDomain(PublicChannel channel, Instant latestMessageTime) { + return ChannelDTO.PublicChannelDTO.builder() + .id(channel.getId()) + .createdAt(channel.getCreatedAt()) + .updatedAt(channel.getUpdatedAt()) + .name(channel.getName()) + .description(channel.getDescription()) + .latestMessageTime(latestMessageTime) + .build(); } + } + + @Getter + @Builder + public static class PrivateChannelDTO { + + private UUID id; + private Instant createdAt; + private Instant updatedAt; + private ChannelFormat channelFormat; + private ChannelType channelType; + private Instant latestMessageTime; - @Getter - @Builder - public static class PrivateChannelDTO { - private UUID id; - private Instant createdAt; - private Instant updatedAt; - private ChannelFormat channelFormat; - private ChannelType channelType; - private Instant latestMessageTime; - - public static PrivateChannelDTO fromDomain(PrivateChannel channel, Instant latestMessageTime) { - return ChannelDTO.PrivateChannelDTO.builder() - .id(channel.getId()) - .createdAt(channel.getCreatedAt()) - .updatedAt(channel.getUpdatedAt()) - .channelFormat(channel.getChannelFormat()) - .channelType(ChannelType.PRIVATE) - .latestMessageTime(latestMessageTime) - .build(); - } + public static PrivateChannelDTO fromDomain(PrivateChannel channel, Instant latestMessageTime) { + return ChannelDTO.PrivateChannelDTO.builder() + .id(channel.getId()) + .createdAt(channel.getCreatedAt()) + .updatedAt(channel.getUpdatedAt()) + .channelFormat(channel.getChannelFormat()) + .channelType(ChannelType.PRIVATE) + .latestMessageTime(latestMessageTime) + .build(); } + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index 012228618..7c914b79e 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -1,9 +1,5 @@ package com.sprint.mission.discodeit.dto.channel; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.deser.std.UUIDDeserializer; -import com.fasterxml.jackson.databind.ser.std.UUIDSerializer; import com.sprint.mission.discodeit.util.type.ChannelFormat; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,21 +9,21 @@ import java.util.UUID; public class CreateChannel { - @Getter - @AllArgsConstructor - @NoArgsConstructor - public static class PrivateRequest { - private List joinUser; - private ChannelFormat channelFormat; - } - @Getter - @AllArgsConstructor - @NoArgsConstructor - public static class PublicRequest { - private String name; - private String description; - ChannelFormat channelFormat; - private List joinUser; - } + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class PrivateRequest { + + private List joinUser; + } + + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class PublicRequest { + + private String name; + private String description; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java index 5fd1c1bd7..c4fedb13a 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java @@ -1,10 +1,10 @@ package com.sprint.mission.discodeit.dto.message; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.User; import java.util.List; import java.util.UUID; -public record CreateMessageRequest(List attachmentsID, String content, UUID channelID) { +public record CreateMessageRequest(UUID userId, String content, + UUID channelId) { + } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java index f5b96f2ee..c596f9b2b 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java @@ -1,16 +1,5 @@ package com.sprint.mission.discodeit.dto.message; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; -import java.util.UUID; - -public record UpdateMessageRequest(UUID writerId, String newContent, UUID newAttachment) { +public record UpdateMessageRequest(String newContent) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java index c53014109..229381f43 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java @@ -3,6 +3,6 @@ import java.time.Instant; import java.util.UUID; -public record CreateReadStatusRequest(UUID userId, UUID channelId, Instant lastReadAt) { +public record CreateReadStatusRequest(UUID userId, UUID channelId) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java deleted file mode 100644 index 5ee2a6f2e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/UpdateReadStatusRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sprint.mission.discodeit.dto.readstatus; - -import java.time.Instant; -import java.util.UUID; - -public record UpdateReadStatusRequest(UUID readStatusID, Instant lastReadAt) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java deleted file mode 100644 index 0b1dc24a5..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdatePasswordRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -public record UpdatePasswordRequest(String oldPassword ,String newPassword) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java deleted file mode 100644 index c31a579dc..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateProfileRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import java.util.UUID; - -public record UpdateProfileRequest(UUID profileId , UUID newProfileId) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java new file mode 100644 index 000000000..417501b8c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java @@ -0,0 +1,5 @@ +package com.sprint.mission.discodeit.dto.user; + +public record UpdateUserRequest(String oldPassword, String newPassword) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/BaseException.java b/src/main/java/com/sprint/mission/discodeit/exception/BaseException.java new file mode 100644 index 000000000..45f4932b8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/BaseException.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class BaseException extends RuntimeException { + + private final HttpStatus status; + + public BaseException(HttpStatus status, String message) { + super(message); + this.status = status; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index ba619efaa..3c43beae9 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -2,37 +2,38 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import org.springframework.http.HttpStatus; @Getter @AllArgsConstructor public enum ErrorCode { - EMPTY_CONTENT("내용을 입력해주세요"), + EMPTY_CONTENT(HttpStatus.BAD_REQUEST, "내용을 입력해주세요"), - CANNOT_FOUND_MESSAGE("보낸 메시지가 없습니다"), - CANNOT_FOUND_CHANNEL("해당 채널을 찾을 수가 없습니다."), - CANNOT_FOUND_USER("해당하는 회원을 찾을 수 없습니다"), - CANNOT_FOUND_PROFILE("해당하는 프로필 데이터를 찾을 수 없습니다"), - CANNOT_FOUND_USERSTATUS("해당하는 사용자의 상태 정보를 찾을 수 없습니다"), - CANNOT_FOUND_READSTATUS("해당하는 Read Status 정보를 찾을 수 없습니다"), - CANNOT_FOUND_ATTACHMENT("해당하는 첨부자료를 찾을 수 없습니다"), + CANNOT_FOUND_MESSAGE(HttpStatus.NOT_FOUND, "보낸 메시지가 없습니다"), + CANNOT_FOUND_CHANNEL(HttpStatus.NOT_FOUND, "해당 채널을 찾을 수가 없습니다."), + CANNOT_FOUND_USER(HttpStatus.NOT_FOUND, "해당하는 회원을 찾을 수 없습니다"), + CANNOT_FOUND_PROFILE(HttpStatus.NOT_FOUND, "해당하는 프로필 데이터를 찾을 수 없습니다"), + CANNOT_FOUND_USERSTATUS(HttpStatus.NOT_FOUND, "해당하는 사용자의 상태 정보를 찾을 수 없습니다"), + CANNOT_FOUND_READSTATUS(HttpStatus.NOT_FOUND, "해당하는 Read Status 정보를 찾을 수 없습니다"), + CANNOT_FOUND_ATTACHMENT(HttpStatus.NOT_FOUND, "해당하는 첨부자료를 찾을 수 없습니다"), - DUPLICATE_NAME("이미 등록된 사용자 이름입니다."), - DUPLICATE_EMAIL("이미 등록된 이메일 입니다."), - DUPLICATE_CHANNEL("이미 존재하는 채널 이름 입니다."), + DUPLICATE_NAME(HttpStatus.CONFLICT, "이미 등록된 사용자 이름입니다."), + DUPLICATE_EMAIL(HttpStatus.CONFLICT, "이미 등록된 이메일 입니다."), + DUPLICATE_CHANNEL(HttpStatus.CONFLICT, "이미 존재하는 채널 이름 입니다."), - ALREADY_EXIST_READSTATUS("이미 저장된 Read Status 입니다."), - ALREADY_EXIST_USERSTAUTS("이미 저장된 User Status 입니다."), + ALREADY_EXIST_READSTATUS(HttpStatus.CONFLICT, "이미 저장된 Read Status 입니다."), + ALREADY_EXIST_USERSTAUTS(HttpStatus.CONFLICT, "이미 저장된 User Status 입니다."), - INVALID_WRITER("작성자가 올바르지 않습니다"), - INVALID_PROFILE("기존 프로필과 동일한 프로필입니다"), + INVALID_WRITER(HttpStatus.BAD_REQUEST, "작성자가 올바르지 않습니다"), + INVALID_PROFILE(HttpStatus.BAD_REQUEST, "기존 프로필과 동일한 프로필입니다"), - MESSAGE_EDIT_NOT_ALLOWED("메시지 수정은 작성자 본인만 가능합니다"), - PASSWORD_EDIT_NOT_ALLOWED("이전 비밀번호와 일치하지 않습니다"), + MESSAGE_EDIT_NOT_ALLOWED(HttpStatus.FORBIDDEN, "메시지 수정은 작성자 본인만 가능합니다"), + PASSWORD_EDIT_NOT_ALLOWED(HttpStatus.FORBIDDEN, "이전 비밀번호와 일치하지 않습니다"), - PASSWORD_MISMATCH("비밀번호가 일치하지 않습니다"), - USERNAME_MISMATCH("이름이 일치하지 않습니다"), - CHANNEL_TYPE_MISMATCH("채널 타입이 일치하지 않습니다"); + PASSWORD_MISMATCH(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다"), + USERNAME_MISMATCH(HttpStatus.UNAUTHORIZED, "이름이 일치하지 않습니다"), + CHANNEL_TYPE_MISMATCH(HttpStatus.BAD_REQUEST, "채널 타입이 일치하지 않습니다"); - - private final String description; - } + private final HttpStatus status; + private final String description; +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java new file mode 100644 index 000000000..e0ea29b0b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.exception; + +import java.time.LocalDateTime; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class ErrorResponse { + + private final int status; + + private final String error; + + private final String message; + + private final LocalDateTime timestamp; + + public ErrorResponse(HttpStatus status, String message) { + this.status = status.value(); + this.error = status.getReasonPhrase(); + this.message = message; + this.timestamp = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java new file mode 100644 index 000000000..3610b4d1b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.exception; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@Slf4j +@RestControllerAdvice +public class ExceptionHandler { + + @org.springframework.web.bind.annotation.ExceptionHandler(BaseException.class) + public ResponseEntity handleServiceException(BaseException exception) { + ErrorResponse response = new ErrorResponse(exception.getStatus(), exception.getMessage()); + return new ResponseEntity<>(response, exception.getStatus()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java index 0e3b721b5..f32cbd709 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java @@ -1,14 +1,13 @@ package com.sprint.mission.discodeit.exception; import lombok.Getter; +import org.springframework.http.HttpStatus; @Getter -public class ServiceException extends RuntimeException { - private final ErrorCode errorCode; +public class ServiceException extends BaseException { - public ServiceException(ErrorCode errorCode) { - super(errorCode.getDescription()); - this.errorCode = errorCode; - } + public ServiceException(ErrorCode errorCode) { + super(errorCode.getStatus(), errorCode.getDescription()); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java index b535a06e1..b1cb40f95 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java @@ -19,50 +19,51 @@ @Profile("file") @Repository public class FileChannelRepository implements ChannelRepository { - private final Path filePath; - private final Map channelMap; - public FileChannelRepository(@Value("${discodeit.repository.channel-file-path}") Path filePath) { - this.filePath = filePath; - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.channelMap = loadFromFile(this.filePath); - } + private final Path filePath; + private final Map channelMap; - @Override - public Channel save(Channel channel) { - channelMap.put(channel.getId(), channel); - saveToFile(channelMap, filePath); - return channel; + public FileChannelRepository(@Value("${discodeit.repository.channel-file-path}") Path filePath) { + this.filePath = filePath; + if (!Files.exists(this.filePath)) { + try { + Files.createFile(this.filePath); + saveToFile(new HashMap<>(), this.filePath); + } catch (IOException e) { + throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); + } } + this.channelMap = loadFromFile(this.filePath); + } - @Override - public boolean channelExistById(UUID channelID) { - return channelMap.containsKey(channelID); - } + @Override + public Channel save(Channel channel) { + channelMap.put(channel.getId(), channel); + saveToFile(channelMap, filePath); + return channel; + } - @Override - public Optional findById(UUID channelId) { - return channelMap.values().stream() - .filter(channel -> channel.getId().equals(channelId)) - .findFirst(); - } + @Override + public boolean channelExistById(UUID channelID) { + return channelMap.containsKey(channelID); + } - @Override - public List findAll() { - return channelMap.values().stream().toList(); - } + @Override + public Optional findById(UUID channelId) { + return channelMap.values().stream() + .filter(channel -> channel.getId().equals(channelId)) + .findFirst(); + } - @Override - public Channel delete(Channel channel) { - channelMap.remove(channel.getId()); - saveToFile(channelMap, filePath); - return channel; - } + @Override + public List findAll() { + return channelMap.values().stream().toList(); + } + + @Override + public Channel delete(Channel channel) { + channelMap.remove(channel.getId()); + saveToFile(channelMap, filePath); + return channel; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 17aba001e..622df5f3e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -15,17 +15,14 @@ public interface ChannelService { Channel createPrivateChannel(CreateChannel.PrivateRequest request); - ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId); - - ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId); - List findAllPrivate(UUID userId); + List findAllPublic(); + List findAll(); PublicChannel update(UUID channelId, UpdatePublicChannel request); - Channel deletePrivate(UUID channelId); + Channel delete(UUID channelId); - Channel deletePublic(UUID channelId); -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 091a82def..d46ee956e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,21 +1,25 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface MessageService { - Message create(UUID writerID, CreateMessageRequest request); + Message create(CreateMessageRequest messageRequest, + Optional binaryContentRequest); List findAllByChannelId(UUID channelID); List getAllMessage(); - Message updateMessageContent(UUID messageId, UpdateMessageRequest request); + Message updateMessageContent(UUID messageId, UpdateMessageRequest request, + Optional binaryContentRequest); Message deleteMessage(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index 50c264df5..f01f10265 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -1,22 +1,22 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.Channel; import com.sprint.mission.discodeit.domain.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; -import com.sprint.mission.discodeit.dto.readstatus.UpdateReadStatusRequest; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface ReadStatusService { - ReadStatus create(CreateReadStatusRequest request); - ReadStatus find(UUID id); + ReadStatus create(CreateReadStatusRequest request); - List findAllByUserId(UUID userID); + ReadStatus find(UUID id); - List updateByChannelId(UUID channelId); + List findAllByUserId(UUID userID); - void delete(UUID id); + List updateByChannelId(UUID channelId); + + ReadStatus update(UUID id); + + void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index fcbbb5766..8581aa92a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -19,9 +19,8 @@ UserDTO create(CreateUserRequest request, List findAll(); - User updatePassword(UUID userId, UpdatePasswordRequest request); - - User updateProfile(UUID userId, UpdateProfileRequest request); + User update(UUID userId, UpdateUserRequest updateUserRequest, + Optional binaryContentRequest); UserDTO delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 3cf7ef7ac..8fbb606c3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -3,7 +3,6 @@ import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; @@ -13,8 +12,6 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserStatusService; -import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -34,20 +31,10 @@ public class BasicChannelService implements ChannelService { private final ReadStatusRepository readStatusRepository; private final MessageRepository messageRepository; private final UserRepository userRepository; - private final UserStatusService userStatusService; @Override public Channel createPublicChannel(CreateChannel.PublicRequest request) { - // User가 UserRepository에 저장되어 있는지 확인 - for (UUID userID : request.getJoinUser()) { - Optional userOptional = userRepository.findById(userID); - if (userOptional.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - } - - Channel channel = new PublicChannel(request.getName(), request.getDescription(), - request.getChannelFormat(), request.getJoinUser()); + Channel channel = new PublicChannel(request.getName(), request.getDescription()); channelRepository.save(channel); return channel; } @@ -64,7 +51,7 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { } } // Private 채널 생성 후 저장 - Channel channel = new PrivateChannel(users, request.getChannelFormat()); + Channel channel = new PrivateChannel(users); channelRepository.save(channel); // User마다 ReadStatus 생성하기 @@ -77,53 +64,27 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { return channel; } + @UpdateUserStatus @Override - public ChannelDTO.PublicChannelDTO findPublicChannel(UUID channelId) { - PublicChannel findChannel = (PublicChannel) channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - Message lastestMessage = messageRepository.findLatestByChannelId(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - return ChannelDTO.PublicChannelDTO.fromDomain(findChannel, lastestMessage.getCreatedAt()); - } - - @Override - public ChannelDTO.PrivateChannelDTO findPrivateChannel(UUID channelId) { - PrivateChannel findChannel = (PrivateChannel) channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - if (findChannel.getChannelType().equals(ChannelType.PUBLIC)) { - throw new ServiceException(ErrorCode.CHANNEL_TYPE_MISMATCH); - } - - // 해당 채널의 가장 최근 메시지의 시간 정보를 포함합니다. - Instant latestMessageTime = Instant.EPOCH; // 초기값 설정 - List messageList = messageRepository.findAll(); - - for (Message message : messageList) { - if (message.getChannelID().equals(findChannel.getId())) { - if (message.getCreatedAt().isAfter(latestMessageTime)) { - latestMessageTime = message.getCreatedAt(); - } - } - } + public List findAllPrivate(UUID userId) { + validUser(userId); + List allChannels = channelRepository.findAll(); - //Private 채널인 경우 참여한 User의 Id 정보를 포함합니다. - return ChannelDTO.PrivateChannelDTO.fromDomain(findChannel, latestMessageTime); + // PrivateChannel 타입 필터링 및 joinMembers에 userId가 있는지 확인 + return allChannels.stream() + .filter(channel -> channel instanceof PrivateChannel) + .map(channel -> (PrivateChannel) channel) + .filter(privateChannel -> privateChannel.getJoinMembers().contains(userId)) + .collect(Collectors.toList()); } - @UpdateUserStatus @Override - public List findAllPrivate( - UUID userId) { // 통일성을 위해 findAllByUserId보다는 findAllPrivate으로 하였습니다. - // 해당 userId를 갖는 User가 repository에 저장되어 있는지 확인하기 - validUser(userId); - - // Private 채널 내에서 userId가 같은 회원을 joinMembers 리스트에 갖고 있는 채널만 선택한다. + public List findAllPublic() { List allChannels = channelRepository.findAll(); + + // PrivateChannel 타입 필터링 및 joinMembers에 userId가 있는지 확인 return allChannels.stream() - .filter(channel -> channel instanceof PrivateChannel) - .filter(channel -> channel.getJoinMembers().stream() - .anyMatch(userID -> userID.equals(userId))) + .filter(channel -> channel instanceof PublicChannel) .collect(Collectors.toList()); } @@ -147,7 +108,7 @@ public PublicChannel update(UUID channelId, } @Override - public Channel deletePrivate(UUID channelId) { + public Channel delete(UUID channelId) { validChannel(channelId); Channel removeChannel = channelRepository.findById(channelId) @@ -159,25 +120,10 @@ public Channel deletePrivate(UUID channelId) { messages.forEach(message -> messageRepository.delete(message)); } - // 채널에 포함된 ReadStatus 삭제하기 - List readStatuses = readStatusRepository.findAllByChannelId(channelId); - readStatusRepository.deleteAll(readStatuses); - - channelRepository.delete(removeChannel); - return removeChannel; - } - - @Override - public Channel deletePublic(UUID channelId) { - validChannel(channelId); - - Channel removeChannel = channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - // 채널에 포함된 메시지 삭제하기 - List messages = messageService.findAllByChannelId(channelId); - if (!messages.isEmpty()) { - messages.forEach(message -> messageRepository.delete(message)); + if (removeChannel instanceof PrivateChannel) { + // 채널에 포함된 ReadStatus 삭제하기 + List readStatuses = readStatusRepository.findAllByChannelId(channelId); + readStatusRepository.deleteAll(readStatuses); } channelRepository.delete(removeChannel); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 3a90e11dc..29bd4cd2d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -5,6 +5,7 @@ import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.exception.ErrorCode; @@ -34,27 +35,29 @@ public class BasicMessageService implements MessageService { @UpdateUserStatus @Override - public Message create(UUID writerID, CreateMessageRequest request) { - if (request.content().isEmpty()) { + public Message create(CreateMessageRequest messageRequest, + Optional binaryContentRequest) { + if (messageRequest.content().isEmpty()) { throw new ServiceException(ErrorCode.EMPTY_CONTENT); } // 작성자와 채널에 대한 검증 - validUser(writerID); - validChannel(request.channelID()); - - // 해당 첨부자료가 레포지토리에 저장되어 있는지 확인 - if (request.attachmentsID() != null) { - for (UUID attachmentID : request.attachmentsID()) { - Optional attachment = binaryContentRepository.findById(attachmentID); - if (attachment.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_ATTACHMENT); - } - } + validUser(messageRequest.userId()); + validChannel(messageRequest.channelId()); + + BinaryContent file = null; + if (binaryContentRequest.isPresent()) { + CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); + + file = new BinaryContent(contentRequest.bytes(), contentRequest.contentType(), + contentRequest.fileName()); + + binaryContentRepository.save(file); } - Message message = new Message(request.content(), writerID, request.channelID(), - request.attachmentsID()); + Message message = new Message(messageRequest.content(), messageRequest.userId(), + messageRequest.channelId()); + message.getAttachmentsID().add(file.getId()); messageRepository.save(message); return message; } @@ -74,19 +77,24 @@ public List getAllMessage() { @UpdateUserStatus @Override - public Message updateMessageContent(UUID messageId, UpdateMessageRequest request) { + public Message updateMessageContent(UUID messageId, UpdateMessageRequest request, + Optional binaryContentRequest) { validMessage(messageId); - validUser(request.writerId()); Message message = messageRepository.findById(messageId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - // 메시지 수정은 작성자만이 할 수 있다. - if (!message.getWriterID().equals(request.writerId())) { - throw new ServiceException(ErrorCode.MESSAGE_EDIT_NOT_ALLOWED); + BinaryContent file = null; + if (binaryContentRequest.isPresent()) { + CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); + + file = new BinaryContent(contentRequest.bytes(), contentRequest.contentType(), + contentRequest.fileName()); + + binaryContentRepository.save(file); } - message.update(request.newContent(), request.newAttachment()); + message.update(request.newContent(), file.getId()); return messageRepository.save(message); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 391b924dc..ffbdb70fc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; -import com.sprint.mission.discodeit.dto.readstatus.UpdateReadStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; @@ -19,73 +18,88 @@ @Service @RequiredArgsConstructor public class BasicReadStatusService implements ReadStatusService { - private final UserRepository userRepository; - private final ChannelRepository channelRepository; - private final ReadStatusRepository readStatusRepository; - - @Override - public ReadStatus create(CreateReadStatusRequest request) { - // User와 Channel 검증하기 - validUser(request.userId()); - validChannel(request.channelId()); - - List readStatuses = readStatusRepository.findAllByUserId(request.userId()); - boolean exists = readStatuses.stream() - .anyMatch(readStatus -> readStatus.getChannelId().equals(request.channelId())); - if (exists) { - throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); - } - - Instant lastReadAt = Instant.now(); - ReadStatus readStatus = new ReadStatus(request.userId(), request.channelId(), lastReadAt); - readStatusRepository.save(readStatus); - return readStatus; - } - @Override - public ReadStatus find(UUID id) { - return readStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + private final UserRepository userRepository; + private final ChannelRepository channelRepository; + private final ReadStatusRepository readStatusRepository; + + @Override + public ReadStatus create(CreateReadStatusRequest request) { + // User와 Channel 검증하기 + validUser(request.userId()); + validChannel(request.channelId()); + + List readStatuses = readStatusRepository.findAllByUserId(request.userId()); + boolean exists = readStatuses.stream() + .anyMatch(readStatus -> readStatus.getChannelId().equals(request.channelId())); + if (exists) { + throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); } - @Override - public List findAllByUserId(UUID userID) { - validUser(userID); - return readStatusRepository.findAllByUserId(userID); - } + Instant lastReadAt = Instant.now(); + ReadStatus readStatus = new ReadStatus(request.userId(), request.channelId(), lastReadAt); + readStatusRepository.save(readStatus); + return readStatus; + } - /* - User가 채널에서 메시지를 읽은 시간을 업데이트 - */ - @Override - public List updateByChannelId(UUID channelId) { - validChannel(channelId); + @Override + public ReadStatus find(UUID id) { + return readStatusRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + } - // 채널에 해당하는 ReadStatus 목록을 가져옴 - List readStatuses = readStatusRepository.findAllByChannelId(channelId); + @Override + public List findAllByUserId(UUID userID) { + validUser(userID); + return readStatusRepository.findAllByUserId(userID); + } - // 모든 ReadStatus의 'lastReadTime'을 업데이트 - readStatuses.forEach(readStatus -> readStatus.updateLastReadTime(Instant.now())); + /* + User가 채널에서 메시지를 읽은 시간을 업데이트 + */ + @Override + public List updateByChannelId(UUID channelId) { + validChannel(channelId); - // 모든 수정된 ReadStatus 저장 - readStatusRepository.saveAll(readStatuses); + // 채널에 해당하는 ReadStatus 목록을 가져옴 + List readStatuses = readStatusRepository.findAllByChannelId(channelId); - return readStatuses; - } + // 모든 ReadStatus의 'lastReadTime'을 업데이트 + readStatuses.forEach(readStatus -> readStatus.updateLastReadTime(Instant.now())); + // 모든 수정된 ReadStatus 저장 + readStatusRepository.saveAll(readStatuses); - @Override - public void delete(UUID id) { - ReadStatus readStatus = readStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - readStatusRepository.delete(readStatus); - } + return readStatuses; + } - private void validUser(UUID userId) { - userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - } + @Override + public ReadStatus update(UUID id) { + ReadStatus readStatus = readStatusRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - private void validChannel(UUID channelId) { - channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - } + readStatus.updateLastReadTime(Instant.now()); + + readStatusRepository.save(readStatus); + + return readStatus; + } + + + @Override + public void delete(UUID id) { + ReadStatus readStatus = readStatusRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + readStatusRepository.delete(readStatus); + } + + private void validUser(UUID userId) { + userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + } + + private void validChannel(UUID channelId) { + channelRepository.findById(channelId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 12417ba82..1de568fe8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -95,31 +95,28 @@ public List findAll() { .collect(Collectors.toList()); } - @UpdateUserStatus @Override - public User updatePassword(UUID userId, UpdatePasswordRequest request) { - User updateUser = userRepository.findById(userId) + public User update(UUID userId, UpdateUserRequest updateUserRequest, + Optional binaryContentRequest) { + User findUser = userRepository.findById(userId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - updateUser.updatePassword(request.oldPassword(), request.newPassword()); // 비밀번호를 수정합니다. - - userRepository.save(updateUser); - return updateUser; - } + findUser.updatePassword(updateUserRequest.oldPassword(), updateUserRequest.newPassword()); + if (binaryContentRequest.isPresent()) { + if (findUser.getProfileImageId() != null) { // 이미 프로필이 등록되어 있다면 기존 프로필은 삭제 + binaryContentRepository.deleteById(findUser.getProfileImageId()); + } + CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); - @UpdateUserStatus - @Override - public User updateProfile(UUID userId, UpdateProfileRequest request) { - User updateUser = userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - BinaryContent profile = binaryContentRepository.findById(request.profileId()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + BinaryContent profile = new BinaryContent(contentRequest.bytes(), + contentRequest.contentType(), + contentRequest.fileName()); - updateUser.updateProfile(request.profileId(), request.newProfileId()); - userRepository.save(updateUser); - return updateUser; + binaryContentRepository.save(profile); + findUser.updateProfile(findUser.getProfileImageId(), profile.getId()); + } + return findUser; } - @Override public UserDTO delete(UUID id) { User deleteUser = userRepository.findById(id) diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js index aac822d38..764fc4a16 100644 --- a/src/main/resources/static/script.js +++ b/src/main/resources/static/script.js @@ -1,95 +1,100 @@ // API endpoints const API_BASE_URL = '/api'; const ENDPOINTS = { - USERS: `${API_BASE_URL}/user/findAll`, - USER_STATUS: `${API_BASE_URL}/userStatuses/all`, - BINARY_CONTENT: `${API_BASE_URL}/binaryContents` + USERS: `${API_BASE_URL}/users`, + USER_STATUS: `${API_BASE_URL}/userStatuses`, + BINARY_CONTENT: `${API_BASE_URL}/binaryContents` }; // Initialize the application document.addEventListener('DOMContentLoaded', () => { - fetchAndRenderUsers(); + fetchAndRenderUsers(); }); async function fetchAndRenderUsers() { - try { - // 사용자 데이터 가져오기 - const usersResponse = await fetch(ENDPOINTS.USERS); - if (!usersResponse.ok) { - throw new Error(`Failed to fetch users: ${usersResponse.status}`); - } - const users = await usersResponse.json(); - console.log("Users fetched:", users); - - // 사용자 상태 데이터 가져오기 - const userStatusesResponse = await fetch(ENDPOINTS.USER_STATUS); - if (!userStatusesResponse.ok) { - throw new Error(`Failed to fetch userStatuses: ${userStatusesResponse.status}`); - } - const userStatuses = await userStatusesResponse.json(); - console.log("User statuses fetched:", userStatuses); - - // 프로필 데이터 가져오기 - const profileResponse = await fetch(ENDPOINTS.BINARY_CONTENT); - if (!profileResponse.ok) { - throw new Error(`Failed to fetch profiles: ${profileResponse.status}`); - } - const profiles = await profileResponse.json(); - console.log("Profiles fetched:", profiles); - - // 사용자 목록 렌더링 - renderUserList(users, userStatuses, profiles); - } catch (error) { - console.error('Error fetching users or user statuses:', error); + try { + // 사용자 데이터 가져오기 + const usersResponse = await fetch(ENDPOINTS.USERS); + if (!usersResponse.ok) { + throw new Error(`Failed to fetch users: ${usersResponse.status}`); } -} - -// 사용자 목록 렌더링 -async function renderUserList(users, userStatuses, profiles) { - const userListElement = document.getElementById('userList'); - if (!userListElement) { - console.error("Error: userList element not found"); - return; + const users = await usersResponse.json(); + console.log("Users fetched:", users); + + // 사용자 상태 데이터 가져오기 + const userStatusesResponse = await fetch(ENDPOINTS.USER_STATUS); + if (!userStatusesResponse.ok) { + throw new Error( + `Failed to fetch userStatuses: ${userStatusesResponse.status}`); } + const userStatuses = await userStatusesResponse.json(); + console.log("User statuses fetched:", userStatuses); - userListElement.innerHTML = ''; // 기존 내용 삭제 - - // 사용자 상태 맵 생성 (ID를 문자열로 변환) - const userStatusMap = new Map(); - userStatuses.forEach(status => { - userStatusMap.set(String(status.id), status); - }); - console.log("User Status Map:", userStatusMap); - - // 프로필 맵 생성 (id → URL 매핑) - const profileMap = new Map(); - profiles.forEach(profile => { - profileMap.set(profile.id, `/api/binaryContents/view/${profile.id}`); - }); - console.log("Profile Map:", profileMap); + // 프로필 데이터 가져오기 + const profileResponse = await fetch(ENDPOINTS.BINARY_CONTENT); + if (!profileResponse.ok) { + throw new Error(`Failed to fetch profiles: ${profileResponse.status}`); + } + const profiles = await profileResponse.json(); + console.log("Profiles fetched:", profiles); // 사용자 목록 렌더링 - for (const user of users) { - console.log(`User ${user.name} userStatusId:`, user.userStatusId); - console.log("User Status Map has userStatusId:", userStatusMap.has(String(user.userStatusId))); - - // 사용자 상태 가져오기 - const userStatus = userStatusMap.get(String(user.userStatusId)); - console.log(`User ${user.name} status:`, userStatus); - console.log(`User ${user.name} online value:`, userStatus ? userStatus.online : "N/A"); - - const isOnline = userStatus ? userStatus.online : false; // 기본값: 오프라인 - - // 프로필 이미지 URL 가져오기 - console.log(`User ${user.name} profileId:`, user.profileImageId); - console.log("Profile Map has profileId:", profileMap.has(user.profileImageId)); - - const profileUrl = profileMap.get(user.profileImageId) || '/default-avatar.png'; - console.log(`Final profileUrl for ${user.name}:`, profileUrl); + renderUserList(users, userStatuses, profiles); + } catch (error) { + console.error('Error fetching users or user statuses:', error); + } +} - const userElement = document.createElement('div'); - userElement.className = 'user-item'; - userElement.innerHTML = ` +// 사용자 목록 렌더링 +async function renderUserList(users, userStatuses, profiles) { + const userListElement = document.getElementById('userList'); + if (!userListElement) { + console.error("Error: userList element not found"); + return; + } + + userListElement.innerHTML = ''; // 기존 내용 삭제 + + // 사용자 상태 맵 생성 (ID를 문자열로 변환) + const userStatusMap = new Map(); + userStatuses.forEach(status => { + userStatusMap.set(String(status.id), status); + }); + console.log("User Status Map:", userStatusMap); + + // 프로필 맵 생성 (id → URL 매핑) + const profileMap = new Map(); + profiles.forEach(profile => { + profileMap.set(profile.id, `/api/binaryContents/view/${profile.id}`); + }); + console.log("Profile Map:", profileMap); + + // 사용자 목록 렌더링 + for (const user of users) { + console.log(`User ${user.name} userStatusId:`, user.userStatusId); + console.log("User Status Map has userStatusId:", + userStatusMap.has(String(user.userStatusId))); + + // 사용자 상태 가져오기 + const userStatus = userStatusMap.get(String(user.userStatusId)); + console.log(`User ${user.name} status:`, userStatus); + console.log(`User ${user.name} online value:`, + userStatus ? userStatus.online : "N/A"); + + const isOnline = userStatus ? userStatus.online : false; // 기본값: 오프라인 + + // 프로필 이미지 URL 가져오기 + console.log(`User ${user.name} profileId:`, user.profileImageId); + console.log("Profile Map has profileId:", + profileMap.has(user.profileImageId)); + + const profileUrl = profileMap.get(user.profileImageId) + || '/default-avatar.png'; + console.log(`Final profileUrl for ${user.name}:`, profileUrl); + + const userElement = document.createElement('div'); + userElement.className = 'user-item'; + userElement.innerHTML = ` ${user.name}

`; - userListElement.appendChild(userElement); - } + userListElement.appendChild(userElement); + } } From 824d64a59bf684d0281eaffef2c8c87a2f32c611 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 26 Feb 2025 13:49:35 +0900 Subject: [PATCH 076/115] Refactor : BinaryContentController --- result/binarycontent.ser | Bin 15066 -> 59387 bytes result/channels.ser | Bin 0 -> 562 bytes result/messages.ser | Bin 0 -> 622 bytes result/readstatus.ser | Bin 0 -> 609 bytes result/users.ser | Bin 553 -> 705 bytes result/userstatus.ser | Bin 578 -> 578 bytes .../discodeit/aspect/ReadStatusAspect.java | 26 ------------------ .../discodeit/aspect/UpdateReadStatus.java | 11 -------- .../discodeit/aspect/UpdateUserStatus.java | 11 -------- .../discodeit/aspect/UserStatusAspect.java | 26 ------------------ .../controller/BinaryContentController.java | 18 ++++++------ .../controller/ChannelController.java | 2 +- .../discodeit/dto/channel/ChannelDTO.java | 3 -- .../discodeit/dto/channel/CreateChannel.java | 1 - .../dto/message/CreateMessageRequest.java | 2 -- .../service/basic/BasicAuthService.java | 4 +-- .../service/basic/BasicChannelService.java | 4 +-- .../service/basic/BasicMessageService.java | 7 +---- .../service/basic/BasicUserService.java | 2 -- .../discodeit/util/type/ChannelFormat.java | 8 ------ src/main/resources/static/script.js | 2 +- 21 files changed, 14 insertions(+), 113 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/ReadStatusAspect.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java diff --git a/result/binarycontent.ser b/result/binarycontent.ser index 6d1fa0f09745b548fdacf3ff5ba62ca10895dfc6..5660c31d52571747fc25390dedf2aa8245bf285b 100644 GIT binary patch delta 44687 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�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‚XjIqH+eYCfo>ztv(|3E$y$KOAbSg54=8fvGe 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 delta 75 zcmex;p7~bkgaAgyiGel(O;J7Wiia8A29JOe(Fa(gTSXGSo3JR{#KEf*aZZ diff --git a/result/channels.ser b/result/channels.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6394110d557c7a0fa4b88a019fde68183953e094 100644 GIT binary patch literal 562 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05K!bFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#JR^jz|P{buDsF1|`xyNwQ_K(maJ^KXGxPKUiZaU*OH!RP67%v>a~>@&lKsJQ%ASdV(T9OM zD?c;OH#IjYwWzp+LBI#(G<}di^?fpnOROu37_^D80cteJuRy@a#K7#sz?oc>3bZxF zv804S7-DcqW^Ss!XI^nhVqS^04+B$X3aXu;-~ftqmKLNybQUtyF|bz@06oeJ4m6Mf zdcmnhQ)63pNh^75;$dK@C@AM;0@<3rZ{{mzW9f_vkS6A05XpriB_B`$G)Nc``i@0K ziIpIKRy1Ccoq0TQE;9q8Cj(1yW>soM0nkLIauyH?Hi~J2%KL@>bG&}FX4ERJ{qFJ~ YBHG7hywtrcc3Y>@Z9k@&j{7Pq0D+yl6951J literal 0 HcmV?d00001 diff --git a/result/messages.ser b/result/messages.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..01057edca6339894783a481c84cb85ef89fc5252 100644 GIT binary patch literal 622 zcmZ8dO=uHA6n@#XCap=WEqbwq7`zF);>ClYZ3#6Sw)PNm62W12+#T6Jccx}5C|Xij zP{f0lHbk)pTZ-{u=}AN>3SK;Dj}|-&yXvvvrJYH{q7UZ5y!XEEecx;UfL_`>=g!Ihts3 zu9Ldw$kY#r%VdX8N<3FK2-Q6U6DAv;gNQ3nVM>vSg%Tbq2{Ibw5o1WV9PBcxmKY3b zLX{#cDjK2etOk9$g*Ho&EYcV_M03(KtaXv8I9bm-4 zit18^T){69<2u}i1ANnrZ**rxA*(^Q9uS5DwbU61eeQI4|7znwfM$ir@b1>=(ns_p z4Jj3RD7lG4UpTDyh)e}ox^rgk^x}5w;=7-)@a$CiQ`jv>_qV3wWNov5V0QG}tFa>t zit&0QS&0hCTsv896yin{w>Jv$+P&mylq_r{%}2+%jC@Cia3WW6@c44$^|4}kJqHl_ v^}HnRYrbt>7|E}G55@X)XWOBFS}#8T(eUuZujT1h<@daGtN3!Kv>WaL^NQDR literal 0 HcmV?d00001 diff --git a/result/readstatus.ser b/result/readstatus.ser index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b0f3ea85827c094fd5065cecd52c45a3fa6c1cb9 100644 GIT binary patch literal 609 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05KELFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#IeSCPnO488q4Yn%6Voy(qXGxPL;i$RV70!AhVHXjDgut%1kL_sAFLD z0R{lj)gWseOF$w(!#PR|Qh>VQe74f!)FMxa`ig>LkSeB*o=g6(->f{y#aAh7x6wfq z=pSBi*nsTO3r;PX8r!lFKble9Kop#cgf8h^Lxi9nl7v;LRO#zFtfUMxaG%P&g n0N8duOsO#E3@o;X$E<+bK0)RELjO5lzgjbDmDYZD`CkD5oV>#E literal 0 HcmV?d00001 diff --git a/result/users.ser b/result/users.ser index 7a6d5b5f9849283d157c67c3978f398d607fb212..33fc924977d1743dec8f0ba25e600d8e88b1cbed 100644 GIT binary patch delta 303 zcmZ3u2sZs4o9dQNkdQm0Db! znd*?2Se9C(mzkH1W&8Fgd TcQ*d=d4w>V58_OS;RO`{5sGZ? delta 149 zcmX@ex{_r=03+kXKpTO%JD7DZUsTR-OWSuUuF4~7<6H^Gk{B!2d%_MCB@BE?rBzi9 zd5LAIMS98kxrGdM49q1AEFjSm2Ck6Q;u1q6V-rQiVvr0|Q&f+;;$en2g1T1>PKA0f ofJHgWd6^i1AblUm)Wn1eh}yNBKJg9htv}q(cF#V?=-F8T0OFB1b0r0;_$fQT|pP7xM48q+=RG8nBb=4{F8bEgrw-*{wM=U{ec~J1TYtEn?Vf#( z(X$gQ%EE|lkQM7o289Zc>AV 0 && args[0] instanceof UUID channelId) { - readStatusService.updateByChannelId(channelId); - } - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java b/src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java deleted file mode 100644 index aaa65b1d7..000000000 --- a/src/main/java/com/sprint/mission/discodeit/aspect/UpdateReadStatus.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sprint.mission.discodeit.aspect; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpdateReadStatus { -} diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java b/src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java deleted file mode 100644 index f3b9b9b43..000000000 --- a/src/main/java/com/sprint/mission/discodeit/aspect/UpdateUserStatus.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sprint.mission.discodeit.aspect; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface UpdateUserStatus { -} diff --git a/src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java b/src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java deleted file mode 100644 index b3472cc99..000000000 --- a/src/main/java/com/sprint/mission/discodeit/aspect/UserStatusAspect.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sprint.mission.discodeit.aspect; - -import com.sprint.mission.discodeit.service.UserStatusService; -import lombok.RequiredArgsConstructor; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.springframework.stereotype.Component; - -import java.util.UUID; - -@Aspect -@Component -@RequiredArgsConstructor -public class UserStatusAspect { - private final UserStatusService userStatusService; - - @Before("@annotation(UpdateUserStatus)") - public void updateUserStatus(JoinPoint joinPoint) { - Object[] args = joinPoint.getArgs(); - - if (args.length > 0 && args[0] instanceof UUID userId) { - userStatusService.updateByUserId(userId); - } - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 8474250f2..b1f3b5348 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -38,23 +38,23 @@ public ResponseEntity viewFile(@PathVariable("id") UUID id) { .body(binaryContent.getBytes()); // 파일 데이터 반환 } - @GetMapping() - public ResponseEntity> getFiles( - @RequestParam("binaryContentIds") List binaryContentIds) { + @GetMapping("{binaryContentIds}") + public ResponseEntity> getFilesById( + @PathVariable("binaryContentIds") List binaryContentIds) { List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); return ResponseEntity.ok(binaryContents); } - @GetMapping - public ResponseEntity> getFiles() { - List binaryContents = binaryContentService.findAll(); - return ResponseEntity.ok(binaryContents); - } - @GetMapping("/{binaryContentId}") public ResponseEntity findFile( @PathVariable("binaryContentId") UUID binaryContentId) { BinaryContent binaryContent = binaryContentService.find(binaryContentId); return ResponseEntity.ok(binaryContent); } + + @GetMapping() + public ResponseEntity> findAll() { + List all = binaryContentService.findAll(); + return ResponseEntity.ok(all); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 4aaf21b5c..76ac09c96 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -43,7 +43,7 @@ public ResponseEntity> getAllChannels(@RequestParam("userId") UUID .body(allChannel); } - @GetMapping + @GetMapping("/public") public ResponseEntity> getAllPublicChannels() { List allPublic = channelService.findAllPublic(); return ResponseEntity.ok(allPublic); diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java index 6ba686458..207397ab6 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -2,7 +2,6 @@ import com.sprint.mission.discodeit.domain.PrivateChannel; import com.sprint.mission.discodeit.domain.PublicChannel; -import com.sprint.mission.discodeit.util.type.ChannelFormat; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Builder; import lombok.Getter; @@ -42,7 +41,6 @@ public static class PrivateChannelDTO { private UUID id; private Instant createdAt; private Instant updatedAt; - private ChannelFormat channelFormat; private ChannelType channelType; private Instant latestMessageTime; @@ -51,7 +49,6 @@ public static PrivateChannelDTO fromDomain(PrivateChannel channel, Instant lates .id(channel.getId()) .createdAt(channel.getCreatedAt()) .updatedAt(channel.getUpdatedAt()) - .channelFormat(channel.getChannelFormat()) .channelType(ChannelType.PRIVATE) .latestMessageTime(latestMessageTime) .build(); diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index 7c914b79e..bc1b7aa8f 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.util.type.ChannelFormat; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java index c4fedb13a..2a8c9ae6a 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java @@ -1,7 +1,5 @@ package com.sprint.mission.discodeit.dto.message; - -import java.util.List; import java.util.UUID; public record CreateMessageRequest(UUID userId, String content, diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index f5fcfde64..47aa06aef 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.dto.login.LoginRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; @@ -15,8 +14,7 @@ public class BasicAuthService { private final UserRepository userRepository; - - @UpdateUserStatus + public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 User findUser = userRepository.findByName(request.username()) .orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 8fbb606c3..a61b77c9d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; @@ -63,8 +62,7 @@ public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { return channel; } - - @UpdateUserStatus + @Override public List findAllPrivate(UUID userId) { validUser(userId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 29bd4cd2d..6f613bc71 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,7 +1,5 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.aspect.UpdateReadStatus; -import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.Message; import com.sprint.mission.discodeit.domain.UserStatus; @@ -33,7 +31,6 @@ public class BasicMessageService implements MessageService { private final ChannelRepository channelRepository; private final BinaryContentRepository binaryContentRepository; - @UpdateUserStatus @Override public Message create(CreateMessageRequest messageRequest, Optional binaryContentRequest) { @@ -62,7 +59,6 @@ public Message create(CreateMessageRequest messageRequest, return message; } - @UpdateReadStatus @Override public List findAllByChannelId(UUID channelID) { validChannel(channelID); @@ -74,8 +70,7 @@ public List findAllByChannelId(UUID channelID) { public List getAllMessage() { return messageRepository.findAll(); } - - @UpdateUserStatus + @Override public Message updateMessageContent(UUID messageId, UpdateMessageRequest request, Optional binaryContentRequest) { diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 1de568fe8..3f83f2288 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.aspect.UpdateUserStatus; import com.sprint.mission.discodeit.domain.BinaryContent; import com.sprint.mission.discodeit.domain.User; import com.sprint.mission.discodeit.domain.UserStatus; @@ -13,7 +12,6 @@ import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; -import com.sprint.mission.discodeit.util.type.OnlineStatusType; import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java deleted file mode 100644 index 5edca055d..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelFormat.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sprint.mission.discodeit.util.type; - -import com.fasterxml.jackson.annotation.JsonFormat; - -@JsonFormat(shape = JsonFormat.Shape.STRING) -public enum ChannelFormat { - TEXT, VOICE -} \ No newline at end of file diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js index 764fc4a16..804027e10 100644 --- a/src/main/resources/static/script.js +++ b/src/main/resources/static/script.js @@ -3,7 +3,7 @@ const API_BASE_URL = '/api'; const ENDPOINTS = { USERS: `${API_BASE_URL}/users`, USER_STATUS: `${API_BASE_URL}/userStatuses`, - BINARY_CONTENT: `${API_BASE_URL}/binaryContents` + BINARY_CONTENT: `${API_BASE_URL}/binaryContents/check` }; // Initialize the application From b024e8abb819a1687a06376e3a2254bf536303b9 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 4 Mar 2025 11:07:31 +0900 Subject: [PATCH 077/115] Update ErrorHandler --- .../discodeit/exception/ExceptionHandler.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java index 3610b4d1b..a515e4ddb 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java @@ -3,7 +3,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.NoHandlerFoundException; + +import java.util.Arrays; @Slf4j @RestControllerAdvice @@ -14,4 +19,29 @@ public ResponseEntity handleServiceException(BaseException except ErrorResponse response = new ErrorResponse(exception.getStatus(), exception.getMessage()); return new ResponseEntity<>(response, exception.getStatus()); } + + @ResponseBody + @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class) + public String exceptCommon(Exception ex) { + log.error("---------------------------------------------"); + log.error(ex.getMessage()); + + StringBuilder buffer = new StringBuilder("
    "); + + buffer.append("
  • " + ex.getMessage() + "
  • "); + + Arrays.stream(ex.getStackTrace()).forEach(stackTraceElement -> { + buffer.append("
  • " + stackTraceElement.toString() + "
  • "); + }); + + buffer.append("
"); + + return buffer.toString(); + } + + @org.springframework.web.bind.annotation.ExceptionHandler(NoHandlerFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public String notFound() { + return "custom404"; + } } From 51e9c90a374811b5226f2016e665d6654ba4c7d7 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 6 Mar 2025 13:16:57 +0900 Subject: [PATCH 078/115] =?UTF-8?q?ModelMapper=20=EB=B9=88=EB=93=B1?= =?UTF-8?q?=EB=A1=9D,=20=EC=A0=84=EC=97=AD=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ .../mission/discodeit/config/RootConfig.java | 20 ++++++++++++ ...onHandler.java => MyExceptionHandler.java} | 32 +++++++++++++++---- 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/config/RootConfig.java rename src/main/java/com/sprint/mission/discodeit/exception/{ExceptionHandler.java => MyExceptionHandler.java} (53%) diff --git a/build.gradle b/build.gradle index 0d25b8c2b..b820c0b35 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.modelmapper:modelmapper:3.1.0' + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok:1.18.30' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java b/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java new file mode 100644 index 000000000..b08662ffb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java @@ -0,0 +1,20 @@ +package com.sprint.mission.discodeit.config; + +import org.modelmapper.ModelMapper; +import org.modelmapper.convention.MatchingStrategies; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RootConfig { + @Bean + public ModelMapper getMapper() { + ModelMapper modelMapper = new ModelMapper(); + modelMapper.getConfiguration() + .setFieldMatchingEnabled(true) // 필드 이름이 같으면 자동 매핑 + .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) // private 필드에도 접근 가능 + .setMatchingStrategy(MatchingStrategies.STRICT); // 엄격한 매칭 전략 사용 + + return modelMapper; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java similarity index 53% rename from src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java rename to src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java index a515e4ddb..1903f3061 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java @@ -3,25 +3,29 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; @Slf4j @RestControllerAdvice -public class ExceptionHandler { +public class MyExceptionHandler { - @org.springframework.web.bind.annotation.ExceptionHandler(BaseException.class) + @ExceptionHandler(BaseException.class) public ResponseEntity handleServiceException(BaseException exception) { ErrorResponse response = new ErrorResponse(exception.getStatus(), exception.getMessage()); return new ResponseEntity<>(response, exception.getStatus()); } @ResponseBody - @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class) + @ExceptionHandler(Exception.class) public String exceptCommon(Exception ex) { log.error("---------------------------------------------"); log.error(ex.getMessage()); @@ -39,9 +43,23 @@ public String exceptCommon(Exception ex) { return buffer.toString(); } - @org.springframework.web.bind.annotation.ExceptionHandler(NoHandlerFoundException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public String notFound() { - return "custom404"; + @ExceptionHandler(NoHandlerFoundException.class) + public ResponseEntity notFound(NoHandlerFoundException ex) { + log.error("404 Error: " + ex.getMessage()); + return new ResponseEntity<>("custom404", HttpStatus.NOT_FOUND); + } + + // 객체 바인딩 예외 처리 + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) { + log.error("Validation error: ", ex); + Map errors = new HashMap<>(); + + ex.getBindingResult().getFieldErrors().forEach(error -> { + errors.put(error.getField(), error.getDefaultMessage()); + }); + + return ResponseEntity.badRequest().body(errors); } } From e4706c11b1e6851e74a604af1aaf2aecbb8395af Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 6 Mar 2025 15:39:06 +0900 Subject: [PATCH 079/115] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=A0=80=EC=9E=A5=ED=96=88=EB=8D=98=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=82=AD=EC=A0=9C=ED=95=98=EA=B3=A0=20jpa,=20postq?= =?UTF-8?q?resql=20=EC=97=B0=EB=8F=99=20=EC=84=A4=EC=A0=95=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 + json/binarycontent.json | 1 - json/channels.json | 34 --- json/readstatus.json | 226 ------------------ json/users.json | 42 ---- json/userstatus.json | 34 --- result/binarycontent.ser | Bin 59387 -> 0 bytes result/channels.ser | Bin 562 -> 0 bytes result/messages.ser | Bin 622 -> 0 bytes result/readstatus.ser | Bin 609 -> 0 bytes result/users.ser | Bin 705 -> 0 bytes result/userstatus.ser | Bin 578 -> 0 bytes .../exception/MyExceptionHandler.java | 18 +- src/main/resources/application.yml | 12 + 14 files changed, 34 insertions(+), 339 deletions(-) delete mode 100644 json/binarycontent.json delete mode 100644 json/channels.json delete mode 100644 json/readstatus.json delete mode 100644 json/users.json delete mode 100644 json/userstatus.json delete mode 100644 result/binarycontent.ser delete mode 100644 result/channels.ser delete mode 100644 result/messages.ser delete mode 100644 result/readstatus.ser delete mode 100644 result/users.ser delete mode 100644 result/userstatus.ser diff --git a/build.gradle b/build.gradle index b820c0b35..d0ca59923 100644 --- a/build.gradle +++ b/build.gradle @@ -24,10 +24,13 @@ repositories { } dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.5' + implementation 'org.modelmapper:modelmapper:3.1.0' @@ -35,6 +38,9 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.30' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { diff --git a/json/binarycontent.json b/json/binarycontent.json deleted file mode 100644 index 6f31cf5a2..000000000 --- a/json/binarycontent.json +++ /dev/null @@ -1 +0,0 @@ -{ } \ No newline at end of file diff --git a/json/channels.json b/json/channels.json deleted file mode 100644 index 9eec84db9..000000000 --- a/json/channels.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "a6d47dd2-b23c-4157-b965-165a810707a4" : { - "id" : "a6d47dd2-b23c-4157-b965-165a810707a4", - "createdAt" : 1739523025.057472000, - "updatedAt" : 1739523025.057472000, - "joinMembers" : [ "25c9fe38-de4a-48d6-80ca-d51ddee201e6", "8af8b386-9c5b-4aad-8b98-b54dccfd3a88" ], - "channelFormat" : "TEXT", - "channelType" : "PRIVATE" - }, - "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2" : { - "id" : "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2", - "createdAt" : 1739523025.041896000, - "updatedAt" : 1739523025.041897000, - "joinMembers" : [ "25c9fe38-de4a-48d6-80ca-d51ddee201e6", "16038eba-e395-4179-b84e-b15e5176bb70" ], - "channelFormat" : "TEXT", - "channelType" : "PRIVATE" - }, - "808ee585-d924-4942-b818-0f0fb9009172" : { - "id" : "808ee585-d924-4942-b818-0f0fb9009172", - "createdAt" : 1739523025.051266000, - "updatedAt" : 1739523025.051266000, - "joinMembers" : [ "16038eba-e395-4179-b84e-b15e5176bb70", "920454f2-f5c9-409a-bfc7-a0d75dadc697" ], - "channelFormat" : "TEXT", - "channelType" : "PRIVATE" - }, - "439655ab-aa4c-496a-9ccb-4b6ffb156c70" : { - "id" : "439655ab-aa4c-496a-9ccb-4b6ffb156c70", - "createdAt" : 1739523025.054514000, - "updatedAt" : 1739523025.054514000, - "joinMembers" : [ "920454f2-f5c9-409a-bfc7-a0d75dadc697", "8af8b386-9c5b-4aad-8b98-b54dccfd3a88" ], - "channelFormat" : "TEXT", - "channelType" : "PRIVATE" - } -} \ No newline at end of file diff --git a/json/readstatus.json b/json/readstatus.json deleted file mode 100644 index 73f1ca5e9..000000000 --- a/json/readstatus.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "5a787883-82ef-4a60-af22-1f3b5d000b68" : { - "id" : "5a787883-82ef-4a60-af22-1f3b5d000b68", - "createdAt" : 1739522820.430950000, - "updateAt" : 1739522820.430950000, - "userId" : "2ce0519c-fdbc-4915-8003-c61aae9d2a9e", - "channelId" : "a011080c-970b-4779-b360-18564bab3c18", - "lastReadAt" : 1739522820.430947000 - }, - "cb139a4d-8156-4ea3-bbd3-573f6c5c16de" : { - "id" : "cb139a4d-8156-4ea3-bbd3-573f6c5c16de", - "createdAt" : 1739522820.433360000, - "updateAt" : 1739522820.433360000, - "userId" : "cf470c9e-291b-455d-b070-910a7c4558c6", - "channelId" : "06eacbe5-90e6-43cd-a06a-40cea725edbf", - "lastReadAt" : 1739522820.433327000 - }, - "ff5b5779-78eb-4c74-8921-d31fd07d27b9" : { - "id" : "ff5b5779-78eb-4c74-8921-d31fd07d27b9", - "createdAt" : 1739523025.051612000, - "updateAt" : 1739523025.051613000, - "userId" : "16038eba-e395-4179-b84e-b15e5176bb70", - "channelId" : "808ee585-d924-4942-b818-0f0fb9009172", - "lastReadAt" : 1739523025.051595000 - }, - "418814f4-abfb-489f-8b81-efc65ae62fb7" : { - "id" : "418814f4-abfb-489f-8b81-efc65ae62fb7", - "createdAt" : 1739522820.425426000, - "updateAt" : 1739522820.425427000, - "userId" : "cf470c9e-291b-455d-b070-910a7c4558c6", - "channelId" : "0bf7c0c9-7331-4076-9061-535d9164833f", - "lastReadAt" : 1739522820.425378000 - }, - "9a0402dd-d18f-46f6-bdb3-d8b32d5ec831" : { - "id" : "9a0402dd-d18f-46f6-bdb3-d8b32d5ec831", - "createdAt" : 1739522467.047077000, - "updateAt" : 1739522467.047077000, - "userId" : "3ab84f3b-b964-4db3-b753-d260fefbcc94", - "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", - "lastReadAt" : 1739522467.047056000 - }, - "3aaf1816-bbab-4075-88ea-6f6621ea404e" : { - "id" : "3aaf1816-bbab-4075-88ea-6f6621ea404e", - "createdAt" : 1739523025.056255000, - "updateAt" : 1739523025.056255000, - "userId" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", - "channelId" : "439655ab-aa4c-496a-9ccb-4b6ffb156c70", - "lastReadAt" : 1739523025.056157000 - }, - "13318767-6db0-4ff8-92b5-b28a014cbffe" : { - "id" : "13318767-6db0-4ff8-92b5-b28a014cbffe", - "createdAt" : 1739521662.474076000, - "updateAt" : 1739521662.474076000, - "userId" : "19bbec7c-6fa0-42dd-b83f-a5ce2a011554", - "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", - "lastReadAt" : 1739521662.474052000 - }, - "2fc1cce9-a8ae-4354-9338-c2c2505f6461" : { - "id" : "2fc1cce9-a8ae-4354-9338-c2c2505f6461", - "createdAt" : 1739523025.057830000, - "updateAt" : 1739523025.057830000, - "userId" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", - "channelId" : "a6d47dd2-b23c-4157-b965-165a810707a4", - "lastReadAt" : 1739523025.057814000 - }, - "6a50c3d5-8034-48a3-b7bf-1a4670bda48f" : { - "id" : "6a50c3d5-8034-48a3-b7bf-1a4670bda48f", - "createdAt" : 1739522820.428922000, - "updateAt" : 1739522820.428922000, - "userId" : "15bbd349-93b6-449b-8110-10481f71b18e", - "channelId" : "9c74b565-453d-4dcb-8ef7-89b7b0b2b38c", - "lastReadAt" : 1739522820.428883000 - }, - "67dc242a-2170-49c1-a4d1-13a93668c44d" : { - "id" : "67dc242a-2170-49c1-a4d1-13a93668c44d", - "createdAt" : 1739523025.052784000, - "updateAt" : 1739523025.052784000, - "userId" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", - "channelId" : "808ee585-d924-4942-b818-0f0fb9009172", - "lastReadAt" : 1739523025.052765000 - }, - "d29fdf7f-e681-4362-9f1e-f3e38bdb60fe" : { - "id" : "d29fdf7f-e681-4362-9f1e-f3e38bdb60fe", - "createdAt" : 1739522467.046292000, - "updateAt" : 1739522467.046292000, - "userId" : "2b41ba68-ef5f-450c-9c11-6f4210929780", - "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", - "lastReadAt" : 1739522467.046251000 - }, - "c72490ab-84bf-446a-bbeb-0be9569c2264" : { - "id" : "c72490ab-84bf-446a-bbeb-0be9569c2264", - "createdAt" : 1739521581.413754000, - "updateAt" : 1739521581.413754000, - "userId" : "cc203d11-2d76-481e-99e8-1e54047e5ae8", - "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", - "lastReadAt" : 1739521581.413672000 - }, - "82f555f7-5659-4df9-b390-01fb371b4a76" : { - "id" : "82f555f7-5659-4df9-b390-01fb371b4a76", - "createdAt" : 1739522820.427187000, - "updateAt" : 1739522820.427188000, - "userId" : "15bbd349-93b6-449b-8110-10481f71b18e", - "channelId" : "0bf7c0c9-7331-4076-9061-535d9164833f", - "lastReadAt" : 1739522820.427164000 - }, - "317352bf-5179-4557-ac9b-390296f3bf2c" : { - "id" : "317352bf-5179-4557-ac9b-390296f3bf2c", - "createdAt" : 1739522820.434459000, - "updateAt" : 1739522820.434459000, - "userId" : "b5f44c73-aae9-4752-a518-e8da6ed1b664", - "channelId" : "06eacbe5-90e6-43cd-a06a-40cea725edbf", - "lastReadAt" : 1739522820.434432000 - }, - "1f98073a-7286-4e5b-a0c5-441c721ff390" : { - "id" : "1f98073a-7286-4e5b-a0c5-441c721ff390", - "createdAt" : 1739522820.429771000, - "updateAt" : 1739522820.429771000, - "userId" : "2ce0519c-fdbc-4915-8003-c61aae9d2a9e", - "channelId" : "9c74b565-453d-4dcb-8ef7-89b7b0b2b38c", - "lastReadAt" : 1739522820.429751000 - }, - "09a974bf-119f-4093-b820-c5b549875b22" : { - "id" : "09a974bf-119f-4093-b820-c5b549875b22", - "createdAt" : 1739521662.476633000, - "updateAt" : 1739521662.476633000, - "userId" : "6638f1b4-92c2-4666-b82e-f77af7230dd3", - "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", - "lastReadAt" : 1739521662.476611000 - }, - "d79ffea8-1c73-44ce-8235-1b6f95e5f31e" : { - "id" : "d79ffea8-1c73-44ce-8235-1b6f95e5f31e", - "createdAt" : 1739521581.412811000, - "updateAt" : 1739521581.412811000, - "userId" : "ed838bc5-35af-4a37-a46d-1205e65e2c69", - "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", - "lastReadAt" : 1739521581.412779000 - }, - "f287b530-8f88-41eb-9b1f-695828be3480" : { - "id" : "f287b530-8f88-41eb-9b1f-695828be3480", - "createdAt" : 1739521581.411408000, - "updateAt" : 1739521581.411408000, - "userId" : "ef786d73-0345-49c0-93c2-638457c5dd42", - "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", - "lastReadAt" : 1739521581.411330000 - }, - "9f67a420-3935-4f69-9104-432b2c100b0b" : { - "id" : "9f67a420-3935-4f69-9104-432b2c100b0b", - "createdAt" : 1739521581.412439000, - "updateAt" : 1739521581.412439000, - "userId" : "b4107df1-3525-4f8a-a4d0-5923a85e97a3", - "channelId" : "a675f52a-bd81-4060-8cbc-1c8520211cea", - "lastReadAt" : 1739521581.412306000 - }, - "bd86849f-1a54-42eb-9197-3e1cec3d787f" : { - "id" : "bd86849f-1a54-42eb-9197-3e1cec3d787f", - "createdAt" : 1739521662.472656000, - "updateAt" : 1739521662.472656000, - "userId" : "2d27f294-2b2c-425f-84f9-e8396d83cfb0", - "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", - "lastReadAt" : 1739521662.472651000 - }, - "52dd3949-ef69-4f73-8a4e-1a94ac09026f" : { - "id" : "52dd3949-ef69-4f73-8a4e-1a94ac09026f", - "createdAt" : 1739522467.042969000, - "updateAt" : 1739522467.042969000, - "userId" : "53a43047-7d6d-4e95-ae47-1d84fa582c7c", - "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", - "lastReadAt" : 1739522467.042939000 - }, - "055e4201-2822-4cc5-901c-317d8d22838f" : { - "id" : "055e4201-2822-4cc5-901c-317d8d22838f", - "createdAt" : 1739522820.432075000, - "updateAt" : 1739522820.432075000, - "userId" : "b5f44c73-aae9-4752-a518-e8da6ed1b664", - "channelId" : "a011080c-970b-4779-b360-18564bab3c18", - "lastReadAt" : 1739522820.432045000 - }, - "ad9a5847-f840-40f4-b227-6240f3c4c3bc" : { - "id" : "ad9a5847-f840-40f4-b227-6240f3c4c3bc", - "createdAt" : 1739521662.472040000, - "updateAt" : 1739521662.472041000, - "userId" : "b31d9b03-95c1-4aa4-adbc-c2cbaa0960b9", - "channelId" : "8e01056e-4b07-4f8b-bc6f-a1fc337c76bc", - "lastReadAt" : 1739521662.472010000 - }, - "78c14b89-75eb-4f62-8a82-333a16186cd7" : { - "id" : "78c14b89-75eb-4f62-8a82-333a16186cd7", - "createdAt" : 1739523025.054885000, - "updateAt" : 1739523025.054885000, - "userId" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", - "channelId" : "439655ab-aa4c-496a-9ccb-4b6ffb156c70", - "lastReadAt" : 1739523025.054881000 - }, - "9df46df3-d08b-4e41-887f-f0eccfd358fb" : { - "id" : "9df46df3-d08b-4e41-887f-f0eccfd358fb", - "createdAt" : 1739523025.058979000, - "updateAt" : 1739523025.058979000, - "userId" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", - "channelId" : "a6d47dd2-b23c-4157-b965-165a810707a4", - "lastReadAt" : 1739523025.058963000 - }, - "6516ab64-858e-4618-b969-781f9bfdd758" : { - "id" : "6516ab64-858e-4618-b969-781f9bfdd758", - "createdAt" : 1739522467.045483000, - "updateAt" : 1739522467.045483000, - "userId" : "4680ce8e-55ab-408b-b6a6-019965c0d93c", - "channelId" : "f8a0d3d3-f2be-48f8-b547-d39590a4e70b", - "lastReadAt" : 1739522467.045476000 - }, - "71f1d690-bf16-456c-af67-92b62f582da8" : { - "id" : "71f1d690-bf16-456c-af67-92b62f582da8", - "createdAt" : 1739523025.044957000, - "updateAt" : 1739523025.044957000, - "userId" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", - "channelId" : "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2", - "lastReadAt" : 1739523025.044911000 - }, - "b56b6114-96c3-4497-90ca-d0c323d5a848" : { - "id" : "b56b6114-96c3-4497-90ca-d0c323d5a848", - "createdAt" : 1739523025.048757000, - "updateAt" : 1739523025.048757000, - "userId" : "16038eba-e395-4179-b84e-b15e5176bb70", - "channelId" : "4c6c3101-21b0-4dcc-a209-c81bfd02c0c2", - "lastReadAt" : 1739523025.048723000 - } -} \ No newline at end of file diff --git a/json/users.json b/json/users.json deleted file mode 100644 index 2d4597e90..000000000 --- a/json/users.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "16038eba-e395-4179-b84e-b15e5176bb70" : { - "id" : "16038eba-e395-4179-b84e-b15e5176bb70", - "createdAt" : 1739523025.035552000, - "updatedAt" : 1739523025.035553000, - "name" : "테스트유저2", - "phone" : "010-2222-1111", - "password" : "Abcdefg1234!!", - "profileImageId" : null, - "userStatusId" : "27a24815-9453-46a2-bc73-4b29c43dfa98" - }, - "8af8b386-9c5b-4aad-8b98-b54dccfd3a88" : { - "id" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", - "createdAt" : 1739523025.037423000, - "updatedAt" : 1739523025.037424000, - "name" : "테스트유저4", - "phone" : "010-4444-1111", - "password" : "Abcdefg1234!!", - "profileImageId" : null, - "userStatusId" : null - }, - "25c9fe38-de4a-48d6-80ca-d51ddee201e6" : { - "id" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", - "createdAt" : 1739523025.030502000, - "updatedAt" : 1739523025.030503000, - "name" : "테스트유저1", - "phone" : "010-1111-1111", - "password" : "Abcdefg1234!!", - "profileImageId" : null, - "userStatusId" : "79fd43ab-4520-4acb-a704-86c6dabdabe8" - }, - "920454f2-f5c9-409a-bfc7-a0d75dadc697" : { - "id" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", - "createdAt" : 1739523025.036256000, - "updatedAt" : 1739523025.036257000, - "name" : "테스트유저3", - "phone" : "010-3333-1111", - "password" : "Abcdefg1234!!", - "profileImageId" : null, - "userStatusId" : "c5284c01-df30-4d19-a856-3af835249c9d" - } -} \ No newline at end of file diff --git a/json/userstatus.json b/json/userstatus.json deleted file mode 100644 index c9174f6d0..000000000 --- a/json/userstatus.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "4a21c5be-89cd-42f5-b924-549be7cc9a00" : { - "id" : "4a21c5be-89cd-42f5-b924-549be7cc9a00", - "createdAt" : 1739523025.038580000, - "updateAt" : 1739523025.038580000, - "lastActiveAt" : 1739523025.038534000, - "userId" : "8af8b386-9c5b-4aad-8b98-b54dccfd3a88", - "onlineStatusType" : "ACTIVE" - }, - "c5284c01-df30-4d19-a856-3af835249c9d" : { - "id" : "c5284c01-df30-4d19-a856-3af835249c9d", - "createdAt" : 1739523025.036702000, - "updateAt" : 1739523025.036702000, - "lastActiveAt" : 1739523025.036698000, - "userId" : "920454f2-f5c9-409a-bfc7-a0d75dadc697", - "onlineStatusType" : "ACTIVE" - }, - "27a24815-9453-46a2-bc73-4b29c43dfa98" : { - "id" : "27a24815-9453-46a2-bc73-4b29c43dfa98", - "createdAt" : 1739523025.035871000, - "updateAt" : 1739523025.035871000, - "lastActiveAt" : 1739523025.035848000, - "userId" : "16038eba-e395-4179-b84e-b15e5176bb70", - "onlineStatusType" : "ACTIVE" - }, - "79fd43ab-4520-4acb-a704-86c6dabdabe8" : { - "id" : "79fd43ab-4520-4acb-a704-86c6dabdabe8", - "createdAt" : 1739523025.032042000, - "updateAt" : 1739523025.061759000, - "lastActiveAt" : 1739523025.061479000, - "userId" : "25c9fe38-de4a-48d6-80ca-d51ddee201e6", - "onlineStatusType" : "ACTIVE" - } -} \ No newline at end of file diff --git a/result/binarycontent.ser b/result/binarycontent.ser deleted file mode 100644 index 5660c31d52571747fc25390dedf2aa8245bf285b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59387 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 bY8s$;bN~x#Wpi_BWiD!PWoK~!egGDDb!0Md diff --git a/result/channels.ser b/result/channels.ser deleted file mode 100644 index 6394110d557c7a0fa4b88a019fde68183953e094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05K!bFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#JR^jz|P{buDsF1|`xyNwQ_K(maJ^KXGxPKUiZaU*OH!RP67%v>a~>@&lKsJQ%ASdV(T9OM zD?c;OH#IjYwWzp+LBI#(G<}di^?fpnOROu37_^D80cteJuRy@a#K7#sz?oc>3bZxF zv804S7-DcqW^Ss!XI^nhVqS^04+B$X3aXu;-~ftqmKLNybQUtyF|bz@06oeJ4m6Mf zdcmnhQ)63pNh^75;$dK@C@AM;0@<3rZ{{mzW9f_vkS6A05XpriB_B`$G)Nc``i@0K ziIpIKRy1Ccoq0TQE;9q8Cj(1yW>soM0nkLIauyH?Hi~J2%KL@>bG&}FX4ERJ{qFJ~ YBHG7hywtrcc3Y>@Z9k@&j{7Pq0D+yl6951J diff --git a/result/messages.ser b/result/messages.ser deleted file mode 100644 index 01057edca6339894783a481c84cb85ef89fc5252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmZ8dO=uHA6n@#XCap=WEqbwq7`zF);>ClYZ3#6Sw)PNm62W12+#T6Jccx}5C|Xij zP{f0lHbk)pTZ-{u=}AN>3SK;Dj}|-&yXvvvrJYH{q7UZ5y!XEEecx;UfL_`>=g!Ihts3 zu9Ldw$kY#r%VdX8N<3FK2-Q6U6DAv;gNQ3nVM>vSg%Tbq2{Ibw5o1WV9PBcxmKY3b zLX{#cDjK2etOk9$g*Ho&EYcV_M03(KtaXv8I9bm-4 zit18^T){69<2u}i1ANnrZ**rxA*(^Q9uS5DwbU61eeQI4|7znwfM$ir@b1>=(ns_p z4Jj3RD7lG4UpTDyh)e}ox^rgk^x}5w;=7-)@a$CiQ`jv>_qV3wWNov5V0QG}tFa>t zit&0QS&0hCTsv896yin{w>Jv$+P&mylq_r{%}2+%jC@Cia3WW6@c44$^|4}kJqHl_ v^}HnRYrbt>7|E}G55@X)XWOBFS}#8T(eUuZujT1h<@daGtN3!Kv>WaL^NQDR diff --git a/result/readstatus.ser b/result/readstatus.ser deleted file mode 100644 index b0f3ea85827c094fd5065cecd52c45a3fa6c1cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmZ4UmVvdnh(Rzbu`E%qv?Mb}&m*xo!#A;jmHpPi!(s^+nHiYe7`Srs6I0w0lS}f8 zJQ+AkGKx}*GxBp%Dhli!7(jrhoC8P-05KELFg}D~p`o5GduB3!pOM?D&&0sw#lVx3 znpj*CoSE*FSyJr9z@3{9=T#IeSCPnO488q4Yn%6Voy(qXGxPL;i$RV70!AhVHXjDgut%1kL_sAFLD z0R{lj)gWseOF$w(!#PR|Qh>VQe74f!)FMxa`ig>LkSeB*o=g6(->f{y#aAh7x6wfq z=pSBi*nsTO3r;PX8r!lFKble9Kop#cgf8h^Lxi9nl7v;LRO#zFtfUMxaG%P&g n0N8duOsO#E3@o;X$E<+bK0)RELjO5lzgjbDmDYZD`CkD5oV>#E diff --git a/result/users.ser b/result/users.ser deleted file mode 100644 index 33fc924977d1743dec8f0ba25e600d8e88b1cbed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmZ{gF=!M)6o#LB*-KXM&Wiyp)FQ#cYEO-VXkjjdm_61gUak=W4!4uL3A;P%%)7gl zpdc}Yh@zn2iH(I_EVQuD5D;4%D@9X;RDuL;G!g`zxeZE02WH^?@A1#~{`plfrGVaP z(j;~RnQxB~SwBT0v-|zaS3A$YNr5p6TYXNvQBp-N9I&u1sH}6}i=z`mpiidNqu#u_ zhBC|jF{@OZk%e|@?OrffFu*85#-~JLnbn3F$`Wh~`0px?ZteU0@brVy`dt0ez~i-% zpUP{0l?S$r1Pjp)n3Rl%w#Q_Zdz7K=@qn<>c5(58q7n;CmkJ5LGPpVu8;)u0$hf) z3q28$vc-kBQRgDTr40Ye{ebG&}F zX4ERJ{qFJ~BHAYqR~g~-ra1S`=llQoyp6%4ER5&|oe_xmJ^^eqFBYjg78o`|G(hcO UGhXUm7Q3y}>9!x!Ovil{021W9*Z=?k diff --git a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java index 1903f3061..48f301741 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.exception; -import lombok.extern.slf4j.Slf4j; +import lombok.extern.log4j.Log4j2; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -14,7 +15,7 @@ import java.util.HashMap; import java.util.Map; -@Slf4j +@Log4j2 @RestControllerAdvice public class MyExceptionHandler { @@ -62,4 +63,17 @@ public ResponseEntity> handleValidationExceptions(MethodArgu return ResponseEntity.badRequest().body(errors); } + + // 데이터 무결성이 위반되었을 때 + @ExceptionHandler(DataIntegrityViolationException.class) + @ResponseStatus(HttpStatus.EXPECTATION_FAILED) + public ResponseEntity> handelFKException(Exception e) { + log.error(e); + + Map errorMap = new HashMap<>(); + + errorMap.put("time", "" + System.currentTimeMillis()); + errorMap.put("msg", "constraint fails"); + return ResponseEntity.badRequest().body(errorMap); + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 59985fa69..ed5afc343 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,18 @@ spring: profiles: active: file + datasource: + url: jdbc:postgresql://localhost:5432/discodeit + username: discodeit_user + password: discodeit1234 + driver-class-name: org.postgresql.Driver + + jpa: + database-platform: org.hibernate.dialect.PostgreSQLDialect + hibernate: + ddl-auto: update + show-sql: true + discodeit: repository: user-status-file-path: ./result/userstatus.ser From c48ce0b93b5dad74c0eb70d094fa1f44fe6dab83 Mon Sep 17 00:00:00 2001 From: junwoo Date: Sat, 8 Mar 2025 18:32:55 +0900 Subject: [PATCH 080/115] =?UTF-8?q?=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EA=B5=AC=ED=98=84=EC=B2=B4=20JCF,=20FILE=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/FileBinaryContentRepository.java | 71 --------------- .../file/FileChannelRepository.java | 69 -------------- .../file/FileMessageRepository.java | 74 --------------- .../file/FileReadStatusRepository.java | 90 ------------------- .../repository/file/FileUserRepository.java | 85 ------------------ .../file/FileUserStatusRepository.java | 88 ------------------ .../jcf/JCFBinaryContentRepository.java | 52 ----------- .../repository/jcf/JCFChannelRepository.java | 47 ---------- .../repository/jcf/JCFMessageRepository.java | 58 ------------ .../jcf/JCFReadStatusRepository.java | 70 --------------- .../repository/jcf/JCFUserRepository.java | 66 -------------- .../jcf/JCFUserStatusRepository.java | 68 -------------- 12 files changed, 838 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java deleted file mode 100644 index aa77a1b0f..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileBinaryContentRepository.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.repository.BinaryContentRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("file") -@Repository -public class FileBinaryContentRepository implements BinaryContentRepository { - private final Path filePath; - private final Map repository; - - public FileBinaryContentRepository(@Value("${discodeit.repository.binarycontent-file-path}") Path filePath) { - this.filePath = filePath; - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.repository = loadFromFile(filePath); - } - - @Override - public BinaryContent save(BinaryContent binaryContent) { - repository.put(binaryContent.getId(), binaryContent); - saveToFile(repository, filePath); - return binaryContent; - } - - @Override - public Optional findById(UUID uuid) { - return repository.values().stream() - .filter(binaryContent -> binaryContent.getId().equals(uuid)) - .findFirst(); - } - - @Override - public List findAll() { - return repository.values().stream().toList(); - } - - @Override - public List findAllIdIn(List uuidList) { - if (uuidList == null || uuidList.isEmpty()) { - return Collections.emptyList(); - } - return uuidList.stream() - .map(repository::get) // UUID에 해당하는 BinaryContent 찾기 - .filter(Objects::nonNull) // 존재하는 항목만 필터링 - .toList(); - } - - @Override - public void deleteById(UUID uuid) { - repository.remove(uuid); - saveToFile(repository, filePath); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java deleted file mode 100644 index b1cb40f95..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileChannelRepository.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("file") -@Repository -public class FileChannelRepository implements ChannelRepository { - - private final Path filePath; - private final Map channelMap; - - public FileChannelRepository(@Value("${discodeit.repository.channel-file-path}") Path filePath) { - this.filePath = filePath; - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("채널 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.channelMap = loadFromFile(this.filePath); - } - - @Override - public Channel save(Channel channel) { - channelMap.put(channel.getId(), channel); - saveToFile(channelMap, filePath); - return channel; - } - - @Override - public boolean channelExistById(UUID channelID) { - return channelMap.containsKey(channelID); - } - - @Override - public Optional findById(UUID channelId) { - return channelMap.values().stream() - .filter(channel -> channel.getId().equals(channelId)) - .findFirst(); - } - - @Override - public List findAll() { - return channelMap.values().stream().toList(); - } - - @Override - public Channel delete(Channel channel) { - channelMap.remove(channel.getId()); - saveToFile(channelMap, filePath); - return channel; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java deleted file mode 100644 index ccb804d21..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileMessageRepository.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.repository.MessageRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.FileIOUtil.*; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("file") -@Repository -public class FileMessageRepository implements MessageRepository { - private final Path filePath; - private final Map messageMap; - - public FileMessageRepository(@Value("${discodeit.repository.message-file-path}") Path filePath) { - this.filePath = filePath; - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("메시지 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.messageMap = loadFromFile(this.filePath); - } - - @Override - public Message save(Message message) { - messageMap.put(message.getId(), message); - saveToFile(messageMap, filePath); - return message; - } - - @Override - public Optional findById(UUID uuid) { - return Optional.of(messageMap.get(uuid)); - } - - @Override - public List findByChannelId(UUID channelId) { - return messageMap.values().stream() - .filter(message -> message.getChannelID().equals(channelId)) - .collect(Collectors.toList()); - } - - @Override - public Optional findLatestByChannelId(UUID channelId) { - return messageMap.values().stream() - .filter(message -> message.getChannelID().equals(channelId)) - .max(Comparator.comparing(Message::getCreatedAt)); - } - - @Override - public List findAll() { - return messageMap.values().stream().toList(); - } - - @Override - public Message delete(Message message) { - messageMap.remove(message.getId()); - saveToFile(messageMap, filePath); - return message; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java deleted file mode 100644 index eb716daf4..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileReadStatusRepository.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.domain.ReadStatus; -import com.sprint.mission.discodeit.repository.ReadStatusRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("file") -@Repository -public class FileReadStatusRepository implements ReadStatusRepository { - private final Path filePath; - private final Map readStatusMap; - - public FileReadStatusRepository(@Value("${discodeit.repository.read-status-file-path}") Path filePath) { - this.filePath = filePath; - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.readStatusMap = loadFromFile(this.filePath); - } - - @Override - public ReadStatus save(ReadStatus readStatus) { - readStatusMap.put(readStatus.getId(), readStatus); - saveToFile(readStatusMap, filePath); - return readStatus; - } - - @Override - public Optional findById(UUID id) { - return readStatusMap.values().stream() - .filter(readStatus -> readStatus.getId().equals(id)) - .findFirst(); - } - - @Override - public List findAllByChannelId(UUID channelID) { - return readStatusMap.values().stream() - .filter(readStatus -> readStatus.getChannelId().equals(channelID)) - .toList(); - } - - @Override - public List saveAll(List readStatuses) { - // 각 ReadStatus를 readStatusMap에 추가 - readStatuses.forEach(readStatus -> readStatusMap.put(readStatus.getId(), readStatus)); - - // 파일에 모든 ReadStatus를 저장 - saveToFile(readStatusMap, filePath); - - return readStatuses; - } - - @Override - public void deleteAll(List readStatuses) { - // 각 ReadStatus를 삭제 - readStatuses.forEach(readStatus -> readStatusMap.remove(readStatus.getId())); - - // 변경된 내용을 파일에 반영 - saveToFile(readStatusMap, filePath); - } - - - @Override - public List findAllByUserId(UUID userID) { - return readStatusMap.values().stream() - .filter(readStatus -> readStatus.getUserId().equals(userID)) - .toList(); - } - - @Override - public void delete(ReadStatus readStatus) { - readStatusMap.remove(readStatus.getId()); - saveToFile(readStatusMap, filePath); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java deleted file mode 100644 index 863460e6a..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserRepository.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.repository.UserRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -import static com.sprint.mission.discodeit.util.FileIOUtil.*; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("file") -@Repository -public class FileUserRepository implements UserRepository { - private final Path filePath; - private final Map userMap; - - public FileUserRepository(@Value("${discodeit.repository.user-file-path}") Path filePath) { - this.filePath = filePath; - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - this.userMap = loadFromFile(this.filePath); - } - - @Override - public User save(User user) { - userMap.put(user.getId(), user); - saveToFile(userMap, filePath); - return user; - } - - @Override - public boolean userExistById(UUID userID) { - return userMap.containsKey(userID); - } - - @Override - public Optional findByEmail(String email) { - return userMap.values().stream() - .filter(user -> user.getEmail().equals(email)) - .findFirst(); - } - - @Override - public Optional findByName(String name) { - return userMap.values().stream() - .filter(user -> user.getName().equals(name)) - .findFirst(); - } - - @Override - public Optional findById(UUID userId) { - return Optional.ofNullable(userMap.get(userId)); - } - - @Override - public List findAll() { - return userMap.values().stream().toList(); - } - - @Override - public List findAllById(List userIds) { - return userIds.stream() - .map(userMap::get) - .filter(Objects::nonNull) - .toList(); - } - - @Override - public void delete(UUID id) { - userMap.remove(id); - saveToFile(userMap, filePath); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java deleted file mode 100644 index 08035f247..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/file/FileUserStatusRepository.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.sprint.mission.discodeit.repository.file; - -import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.repository.UserStatusRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -import static com.sprint.mission.discodeit.util.FileIOUtil.loadFromFile; -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("file") -@Repository -public class FileUserStatusRepository implements UserStatusRepository { - private final Path filePath; - private final Map userStatusMap; - - // 생성자에서 Path를 입력받도록 변경 - public FileUserStatusRepository(@Value("${discodeit.repository.user-status-file-path}") Path filePath) { - this.filePath = filePath; - - if (!Files.exists(this.filePath)) { - try { - Files.createFile(this.filePath); - saveToFile(new HashMap<>(), this.filePath); - } catch (IOException e) { - throw new RuntimeException("회원 파일을 초기화 하던 중에 문제가 발생했습니다", e); - } - } - - this.userStatusMap = loadFromFile(this.filePath); - } - - @Override - public List findByIsOnlineTrue() { - return userStatusMap.values().stream() - .filter(UserStatus::isOnline) // isOnline()이 true인 값만 필터링 - .toList(); - } - - - @Override - public UserStatus save(UserStatus userStatus) { - userStatusMap.put(userStatus.getId(), userStatus); - saveToFile(userStatusMap, filePath); - return userStatus; - } - - @Override - public Optional findByUserId(UUID userID) { - return userStatusMap.values().stream() - .filter(userStatus -> userStatus.getUserId().equals(userID)) - .findFirst(); - } - - @Override - public Optional findById(UUID id) { - return userStatusMap.values().stream() - .filter(userStatus -> userStatus.getId().equals(id)) - .findFirst(); - } - - @Override - public List findAll() { - return userStatusMap.values().stream().toList(); - } - - @Override - public void deleteById(UUID id) { - userStatusMap.remove(id); - saveToFile(userStatusMap, filePath); - } - - @Override - public void deleteByUserId(UUID userID) { - List keysToRemove = userStatusMap.entrySet().stream() - .filter(entry -> entry.getValue().getUserId().equals(userID)) - .map(Map.Entry::getKey) - .toList(); - - keysToRemove.forEach(userStatusMap::remove); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java deleted file mode 100644 index 4dd2956ae..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFBinaryContentRepository.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.repository.BinaryContentRepository; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.util.*; - -@Profile("jcf") -@Repository -public class JCFBinaryContentRepository implements BinaryContentRepository { - private final Map repository; - - public JCFBinaryContentRepository() { - this.repository = new HashMap<>(); - } - - @Override - public BinaryContent save(BinaryContent binaryContent) { - repository.put(binaryContent.getId(), binaryContent); - return binaryContent; - } - - @Override - public Optional findById(UUID uuid) { - return repository.values().stream() - .filter(content -> content.getId().equals(uuid)) - .findFirst(); - } - - @Override - public List findAll() { - return repository.values().stream().toList(); - } - - @Override - public List findAllIdIn(List uuidList) { - if (uuidList == null || uuidList.isEmpty()) { - return Collections.emptyList(); - } - return uuidList.stream() - .map(repository::get) // UUID에 해당하는 BinaryContent 찾기 - .filter(Objects::nonNull) // 존재하는 항목만 필터링 - .toList(); - } - - @Override - public void deleteById(UUID uuid) { - repository.remove(uuid); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java deleted file mode 100644 index 349c2096b..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFChannelRepository.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.util.*; - -@Profile("jcf") -@Repository -public class JCFChannelRepository implements ChannelRepository { - private final Map channelMap; - - public JCFChannelRepository() { - this.channelMap = new HashMap<>(); - } - - @Override - public Channel save(Channel channel) { - channelMap.put(channel.getId(), channel); - return channel; - } - - @Override - public boolean channelExistById(UUID channelID) { - return channelMap.containsKey(channelID); - } - - @Override - public Optional findById(UUID channelId) { - return channelMap.values().stream() - .filter(channel -> channel.getId().equals(channelId)) - .findFirst(); - } - - @Override - public List findAll() { - return channelMap.values().stream().toList(); - } - - @Override - public Channel delete(Channel channel) { - channelMap.remove(channel.getId()); - return channel; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java deleted file mode 100644 index 40ac94aca..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFMessageRepository.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.repository.MessageRepository; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - - -import java.util.*; -import java.util.stream.Collectors; - -@Profile("jcf") -@Repository -public class JCFMessageRepository implements MessageRepository { - private final Map messageMap; - - public JCFMessageRepository() { - this.messageMap = new HashMap<>(); - } - - @Override - public Message save(Message message) { - messageMap.put(message.getId(), message); - return message; - } - - @Override - public Optional findById(UUID uuid) { - return messageMap.values().stream() - .filter(message -> message.getId().equals(uuid)) - .findFirst(); - } - - @Override - public List findAll() { - return messageMap.values().stream().toList(); - } - - @Override - public List findByChannelId(UUID channelId) { - return messageMap.values().stream() - .filter(message -> message.getChannelID().equals(channelId)) - .collect(Collectors.toList()); - } - - @Override - public Optional findLatestByChannelId(UUID channelId) { - return messageMap.values().stream() - .filter(message -> message.getChannelID().equals(channelId)) - .max(Comparator.comparing(Message::getCreatedAt)); - } - - @Override - public Message delete(Message message) { - messageMap.remove(message.getId()); - return message; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java deleted file mode 100644 index cca422bdd..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFReadStatusRepository.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.domain.ReadStatus; -import com.sprint.mission.discodeit.repository.ReadStatusRepository; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.sprint.mission.discodeit.util.FileIOUtil.saveToFile; - -@Profile("jcf") -@Repository -public class JCFReadStatusRepository implements ReadStatusRepository { - private final Map repository; - - public JCFReadStatusRepository() { - this.repository = new HashMap<>(); - } - - @Override - public ReadStatus save(ReadStatus readStatus) { - repository.put(readStatus.getId(), readStatus); - return readStatus; - } - - @Override - public List saveAll(List readStatuses) { - // 각 ReadStatus를 repository에 추가 - readStatuses.forEach(readStatus -> repository.put(readStatus.getId(), readStatus)); - - // 파일에 저장하는 부분은 이 클래스에서 처리하지 않음 - // 모든 ReadStatus를 repository에 추가한 후, 리스트 그대로 반환 - return readStatuses; - } - - @Override - public Optional findById(UUID id) { - return repository.values().stream() - .filter(readStatus -> readStatus.getId().equals(id)) - .findFirst(); - } - - @Override - public void deleteAll(List readStatuses) { - // 각 ReadStatus를 삭제 - readStatuses.forEach(readStatus -> repository.remove(readStatus.getId())); - } - - - @Override - public List findAllByChannelId(UUID channelID) { - return repository.values().stream() - .filter(readStatus -> readStatus.getChannelId().equals(channelID)) - .toList(); - } - - @Override - public List findAllByUserId(UUID userID) { - return repository.values().stream() - .filter(readStatus -> readStatus.getUserId().equals(userID)) - .collect(Collectors.toList()); - } - - @Override - public void delete(ReadStatus readStatus) { - repository.remove(readStatus.getId()); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java deleted file mode 100644 index 1f2094f6d..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserRepository.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.repository.UserRepository; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.util.*; - -@Profile("jcf") -@Repository -public class JCFUserRepository implements UserRepository { - private final Map userMap; - - public JCFUserRepository() { - this.userMap = new HashMap<>(); - } - - @Override - public User save(User user) { - userMap.put(user.getId(), user); - return user; - } - - @Override - public boolean userExistById(UUID userID) { - return userMap.containsKey(userID); - } - - @Override - public Optional findByEmail(String email) { - return userMap.values().stream() - .filter(user -> user.getEmail().equals(email)) - .findFirst(); - } - - @Override - public Optional findByName(String name) { - return userMap.values().stream() - .filter(user -> user.getName().equals(name)) - .findFirst(); - } - - @Override - public Optional findById(UUID userId) { - return Optional.ofNullable(userMap.get(userId)); - } - - @Override - public List findAll() { - return userMap.values().stream().toList(); - } - - @Override - public List findAllById(List userIds) { - return userIds.stream() - .map(userMap::get) - .filter(Objects::nonNull) - .toList(); - } - - @Override - public void delete(UUID id) { - userMap.remove(id); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java deleted file mode 100644 index 174467041..000000000 --- a/src/main/java/com/sprint/mission/discodeit/repository/jcf/JCFUserStatusRepository.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.sprint.mission.discodeit.repository.jcf; - -import com.sprint.mission.discodeit.domain.UserStatus; -import com.sprint.mission.discodeit.repository.UserStatusRepository; -import com.sprint.mission.discodeit.repository.file.FileUserRepository; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.util.*; - -@Profile("jcf") -@Repository -public class JCFUserStatusRepository implements UserStatusRepository { - private final Map repository; - - public JCFUserStatusRepository(FileUserRepository fileUserRepository) { - this.repository = new HashMap<>(); - } - - @Override - public UserStatus save(UserStatus userStatus) { - repository.put(userStatus.getId(), userStatus); - return userStatus; - } - - @Override - public Optional findByUserId(UUID userID) { - return repository.values().stream() - .filter(userStatus -> userStatus.getUserId().equals(userID)) - .findFirst(); - } - - @Override - public List findByIsOnlineTrue() { - return repository.values().stream() - .filter(UserStatus::isOnline) // isOnline()이 true인 값만 필터링 - .toList(); - } - - - @Override - public Optional findById(UUID id) { - return repository.values().stream() - .filter(userStatus -> userStatus.getId().equals(id)) - .findFirst(); - } - - @Override - public List findAll() { - return repository.values().stream() - .toList(); - } - - @Override - public void deleteById(UUID id) { - repository.remove(id); - } - - @Override - public void deleteByUserId(UUID userID) { - List keysToRemove = repository.entrySet().stream() - .filter(entry -> entry.getValue().getUserId().equals(userID)) - .map(Map.Entry::getKey) - .toList(); - - keysToRemove.forEach(repository::remove); - } -} From 2365f5ea0e785cb8f4afc5a05869d316f89c2251 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 00:14:13 +0900 Subject: [PATCH 081/115] =?UTF-8?q?BaseEntity=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=A7=8C=EB=93=A4=EC=96=B4=EC=84=9C=20createdAt,?= =?UTF-8?q?=20updatedAt=20=EA=B3=B5=ED=86=B5=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1,=20Entity=EB=A1=9C=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/discodeit/config/RootConfig.java | 2 +- .../controller/BinaryContentController.java | 2 +- .../controller/ChannelController.java | 5 +-- .../controller/MessageController.java | 3 +- .../controller/ReadStatusController.java | 2 +- .../discodeit/controller/UserController.java | 4 +- .../controller/UserStatusController.java | 2 +- .../discodeit/domain/BinaryContent.java | 28 ------------ .../mission/discodeit/domain/Message.java | 40 ----------------- .../mission/discodeit/domain/ReadStatus.java | 36 --------------- .../mission/discodeit/domain/UserStatus.java | 45 ------------------- .../discodeit/dto/channel/ChannelDTO.java | 4 +- .../mission/discodeit/dto/user/UserDTO.java | 2 +- .../mission/discodeit/entity/BaseEntity.java | 25 +++++++++++ .../discodeit/entity/BinaryContent.java | 29 ++++++++++++ .../discodeit/{domain => entity}/Channel.java | 9 +--- .../mission/discodeit/entity/Message.java | 34 ++++++++++++++ .../{domain => entity}/PrivateChannel.java | 2 +- .../{domain => entity}/PublicChannel.java | 2 +- .../mission/discodeit/entity/ReadStatus.java | 31 +++++++++++++ .../discodeit/{domain => entity}/User.java | 38 +++++++--------- .../mission/discodeit/entity/UserStatus.java | 35 +++++++++++++++ .../repository/BinaryContentRepository.java | 2 +- .../repository/ChannelRepository.java | 2 +- .../repository/MessageRepository.java | 2 +- .../repository/ReadStatusRepository.java | 3 +- .../discodeit/repository/UserRepository.java | 2 +- .../repository/UserStatusRepository.java | 2 +- .../service/BinaryContentService.java | 2 +- .../discodeit/service/ChannelService.java | 5 +-- .../discodeit/service/MessageService.java | 2 +- .../discodeit/service/ReadStatusService.java | 2 +- .../discodeit/service/UserService.java | 2 +- .../discodeit/service/UserStatusService.java | 2 +- .../service/basic/BasicAuthService.java | 2 +- .../basic/BasicBinaryContentService.java | 2 +- .../service/basic/BasicChannelService.java | 2 +- .../service/basic/BasicMessageService.java | 7 +-- .../service/basic/BasicReadStatusService.java | 2 +- .../service/basic/BasicUserService.java | 6 +-- .../service/basic/BasicUserStatusService.java | 2 +- 41 files changed, 209 insertions(+), 222 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/domain/Message.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java rename src/main/java/com/sprint/mission/discodeit/{domain => entity}/Channel.java (52%) create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/Message.java rename src/main/java/com/sprint/mission/discodeit/{domain => entity}/PrivateChannel.java (86%) rename src/main/java/com/sprint/mission/discodeit/{domain => entity}/PublicChannel.java (91%) create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java rename src/main/java/com/sprint/mission/discodeit/{domain => entity}/User.java (66%) create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java diff --git a/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java b/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java index b08662ffb..7f7de76dc 100644 --- a/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java @@ -14,7 +14,7 @@ public ModelMapper getMapper() { .setFieldMatchingEnabled(true) // 필드 이름이 같으면 자동 매핑 .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) // private 필드에도 접근 가능 .setMatchingStrategy(MatchingStrategies.STRICT); // 엄격한 매칭 전략 사용 - + return modelMapper; } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index b1f3b5348..f48114255 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.service.BinaryContentService; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 76ac09c96..12e80f66b 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -1,8 +1,7 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.PublicChannel; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.PublicChannel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.service.ChannelService; diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index 0c891ca65..657ef4e01 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index 9d04917d6..1fbc1f7b6 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.service.ReadStatusService; import jakarta.websocket.server.PathParam; diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 2f6690dc1..3bdd343fb 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -1,7 +1,7 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.CreateUserRequest; import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java index 215a584cf..923ce62b5 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java deleted file mode 100644 index 672758773..000000000 --- a/src/main/java/com/sprint/mission/discodeit/domain/BinaryContent.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sprint.mission.discodeit.domain; - -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.util.UUID; - -@Data -public class BinaryContent implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private byte[] bytes; - private String contentType; - private String fileName; - - public BinaryContent(byte[] bytes, String contentType, String fileName) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.bytes = bytes; - this.contentType = contentType; - this.fileName = fileName; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Message.java b/src/main/java/com/sprint/mission/discodeit/domain/Message.java deleted file mode 100644 index a3387881c..000000000 --- a/src/main/java/com/sprint/mission/discodeit/domain/Message.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sprint.mission.discodeit.domain; - -import java.util.ArrayList; -import lombok.Data; - -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.util.List; -import java.util.UUID; - -@Data -public class Message implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private Instant updatedAt; - private String content; - private UUID writerID; - private UUID channelID; - private List attachmentsID; - - public Message(String content, UUID writerID, UUID channelID) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updatedAt = Instant.now(); - this.content = content; - this.writerID = writerID; - this.channelID = channelID; - this.attachmentsID = new ArrayList<>(); - } - - public void update(String content, UUID newAttachment) { - this.content = content; - this.attachmentsID.add(newAttachment); - this.updatedAt = Instant.now(); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java deleted file mode 100644 index 07810a23f..000000000 --- a/src/main/java/com/sprint/mission/discodeit/domain/ReadStatus.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.sprint.mission.discodeit.domain; - -import lombok.Getter; -import lombok.Setter; - -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.util.UUID; - -@Getter -@Setter -public class ReadStatus implements Serializable { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 - @Serial - private static final long serialVersionUID = 1L; - private UUID id; - private Instant createdAt; - private Instant updateAt; - private UUID userId; - private UUID channelId; - private Instant lastReadAt; - - public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updateAt = Instant.now(); - this.userId = userId; - this.channelId = channelId; - this.lastReadAt = lastReadAt; - } - - public void updateLastReadTime(Instant lastReadAt) { - this.updateAt = Instant.now(); - this.lastReadAt = lastReadAt; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java deleted file mode 100644 index 7ca1b06a9..000000000 --- a/src/main/java/com/sprint/mission/discodeit/domain/UserStatus.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.sprint.mission.discodeit.domain; - -import com.sprint.mission.discodeit.util.type.OnlineStatusType; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.UUID; - -@Getter -@Setter -@ToString -public class UserStatus implements Serializable { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private Instant updateAt; - private Instant lastActiveAt; - private UUID userId; - private boolean online; - - public UserStatus(UUID userId, Instant lastActiveAt) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updateAt = Instant.now(); - this.lastActiveAt = lastActiveAt; - this.userId = userId; - this.online = isOnline(); - } - - public boolean isOnline() { - return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; - } - - public void update(Instant lastActiveAt) { - this.updateAt = Instant.now(); - this.lastActiveAt = lastActiveAt; - this.online = isOnline(); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java index 207397ab6..cb3113f4a 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -1,7 +1,7 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.domain.PrivateChannel; -import com.sprint.mission.discodeit.domain.PublicChannel; +import com.sprint.mission.discodeit.entity.PrivateChannel; +import com.sprint.mission.discodeit.entity.PublicChannel; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index f03f57b84..978bb00b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.dto.user; -import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.entity.User; import lombok.*; import java.time.Instant; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java new file mode 100644 index 000000000..fcfafc038 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.Instant; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Getter +abstract class BaseEntity { + + @CreatedDate + @Column(name = "createdAt", updatable = false) + private Instant createdAt; + + @LastModifiedDate + @Column(name = "updatedAt") + private Instant updatedAt; +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java new file mode 100644 index 000000000..616c35d3e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -0,0 +1,29 @@ +package com.sprint.mission.discodeit.entity; + +import jakarta.persistence.*; +import lombok.*; +import org.springframework.data.annotation.CreatedDate; + +import java.io.Serial; +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Builder +@ToString +public class BinaryContent { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + @CreatedDate + @Column(name = "createdAt", updatable = false) + private Instant createdAt; + + private byte[] bytes; + private String contentType; + private String fileName; +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java similarity index 52% rename from src/main/java/com/sprint/mission/discodeit/domain/Channel.java rename to src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 42a1acab3..1124470cc 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,25 +1,20 @@ -package com.sprint.mission.discodeit.domain; +package com.sprint.mission.discodeit.entity; import lombok.Getter; import java.io.Serial; import java.io.Serializable; import java.time.Instant; -import java.util.List; import java.util.UUID; @Getter -public abstract class Channel implements Serializable { +public abstract class Channel extends BaseEntity implements Serializable { @Serial private static final long serialVersionUID = 1L; private final UUID id; - private Instant createdAt; - private Instant updatedAt; public Channel() { this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updatedAt = Instant.now(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java new file mode 100644 index 000000000..7b8c79c71 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -0,0 +1,34 @@ +package com.sprint.mission.discodeit.entity; + +import java.util.ArrayList; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.*; + +import java.util.HashSet; +import java.util.List; +import java.util.UUID; + +@Entity +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Message extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + private String content; + private UUID writerID; + private UUID channelID; + private List binaryContents = new HashSet<>(); + + public void update(String content, UUID newAttachment) { + this.content = content; + this.attachmentsID.add(newAttachment); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java similarity index 86% rename from src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java rename to src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java index 4804d3e9b..0749a8f7b 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PrivateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.domain; +package com.sprint.mission.discodeit.entity; import lombok.Getter; import lombok.ToString; diff --git a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java similarity index 91% rename from src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java rename to src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java index 94b071d52..e01b45ec0 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/PublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.domain; +package com.sprint.mission.discodeit.entity; import lombok.Getter; import lombok.ToString; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java new file mode 100644 index 000000000..4dcb625c5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -0,0 +1,31 @@ +package com.sprint.mission.discodeit.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.*; + +import java.io.Serial; +import java.io.Serializable; +import java.time.Instant; +import java.util.UUID; + +@Entity +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class ReadStatus extends BaseEntity { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + private UUID userId; + private UUID channelId; + private Instant lastReadAt; + + public void updateLastReadTime(Instant lastReadAt) { + this.lastReadAt = lastReadAt; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/domain/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java similarity index 66% rename from src/main/java/com/sprint/mission/discodeit/domain/User.java rename to src/main/java/com/sprint/mission/discodeit/entity/User.java index a6fc409cd..a4e818412 100644 --- a/src/main/java/com/sprint/mission/discodeit/domain/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,8 +1,12 @@ -package com.sprint.mission.discodeit.domain; +package com.sprint.mission.discodeit.entity; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; -import lombok.Data; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.*; import java.io.Serial; import java.io.Serializable; @@ -10,13 +14,16 @@ import java.util.Objects; import java.util.UUID; -@Data -public class User implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; - private Instant createdAt; - private Instant updatedAt; +@Entity +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class User extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; private String name; private String email; private String password; @@ -24,23 +31,11 @@ public class User implements Serializable { private UUID userStatusId; private boolean online; - public User(String name, String email, String password, UUID profileImageId, UUID userStatusId) { - this.id = UUID.randomUUID(); - this.createdAt = Instant.now(); - this.updatedAt = Instant.now(); - this.name = name; - this.email = email; - this.password = password; - this.profileImageId = profileImageId; - this.userStatusId = userStatusId; - } - public void updatePassword(String oldPassword, String newPassword) { if (!this.password.equals(oldPassword) || oldPassword.equals(newPassword)) { throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } this.password = newPassword; - this.updatedAt = Instant.now(); } public void updateProfile(UUID profileImageId, UUID newProfileImageId) { @@ -48,7 +43,6 @@ public void updateProfile(UUID profileImageId, UUID newProfileImageId) { throw new ServiceException(ErrorCode.INVALID_PROFILE); } this.profileImageId = newProfileImageId; - this.updatedAt = Instant.now(); } @Override diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java new file mode 100644 index 000000000..5f41e4779 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -0,0 +1,35 @@ +package com.sprint.mission.discodeit.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.*; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.UUID; + +@Entity +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class UserStatus extends BaseEntity { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + private Instant lastActiveAt; + private UUID userId; + private boolean online; + + public boolean isOnline() { + return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; + } + + public void update(Instant lastActiveAt) { + this.lastActiveAt = lastActiveAt; + this.online = isOnline(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index bbdf1d044..613eb3b73 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.entity.BinaryContent; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 0418c76b9..febe522b7 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.Channel; +import com.sprint.mission.discodeit.entity.Channel; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 53e13678a..160ef6a54 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.entity.Message; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index ed65b81e0..af50577b6 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -1,7 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.entity.ReadStatus; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index b3d1f499f..9845c5942 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.entity.User; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index d2691c4b0..81feea037 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.UserStatus; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index 68331a61f..ad2abcff6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.entity.BinaryContent; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 622df5f3e..1225ac344 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,9 +1,8 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.Channel; -import com.sprint.mission.discodeit.domain.PublicChannel; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.PublicChannel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index d46ee956e..3ca98d282 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.Message; +import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index f01f10265..116d2754a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 8581aa92a..9770658ec 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.*; diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index 9330377bf..c33ef3e98 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; import java.util.List; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 47aa06aef..f75d1decb 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.User; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.dto.login.LoginRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.exception.ErrorCode; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index 1199e761e..8956f656c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.BinaryContent; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index a61b77c9d..defbc002f 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.*; +import com.sprint.mission.discodeit.entity.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.exception.ErrorCode; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 6f613bc71..9f93df72b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,8 +1,7 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.domain.Message; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; @@ -13,11 +12,9 @@ import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index ffbdb70fc..b18406471 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.ReadStatus; +import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 3f83f2288..d070750f0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,8 +1,8 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.BinaryContent; -import com.sprint.mission.discodeit.domain.User; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.*; import com.sprint.mission.discodeit.exception.ErrorCode; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index ba4c8ad01..bbf660c76 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.domain.UserStatus; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; From c744ed2daf521c78ccd69b4efaf28f1d2e9f221c Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 09:14:38 +0900 Subject: [PATCH 082/115] =?UTF-8?q?Entity=20=EC=88=98=EC=A0=95->Message,?= =?UTF-8?q?=20BinaryContent=20=EB=A7=A4=ED=95=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discodeit/entity/BinaryContent.java | 5 +++- .../mission/discodeit/entity/Channel.java | 16 +++++++------ .../mission/discodeit/entity/Message.java | 24 ++++++++----------- .../discodeit/entity/PrivateChannel.java | 13 +++++----- .../discodeit/entity/PublicChannel.java | 14 +++++------ 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index 616c35d3e..4b3dfb3cd 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -14,7 +14,7 @@ @AllArgsConstructor @Getter @Builder -@ToString +@ToString(exclude = "message") public class BinaryContent { @Id @GeneratedValue(strategy = GenerationType.UUID) @@ -26,4 +26,7 @@ public class BinaryContent { private byte[] bytes; private String contentType; private String fileName; + + @ManyToOne + private Message message; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 1124470cc..2efc11933 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,5 +1,9 @@ package com.sprint.mission.discodeit.entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; import lombok.Getter; import java.io.Serial; @@ -7,14 +11,12 @@ import java.time.Instant; import java.util.UUID; +@MappedSuperclass @Getter -public abstract class Channel extends BaseEntity implements Serializable { +public abstract class Channel extends BaseEntity { - @Serial - private static final long serialVersionUID = 1L; - private final UUID id; + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; - public Channel() { - this.id = UUID.randomUUID(); - } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 7b8c79c71..35b679e49 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,16 +1,10 @@ package com.sprint.mission.discodeit.entity; -import java.util.ArrayList; +import java.util.*; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; import lombok.*; - -import java.util.HashSet; -import java.util.List; -import java.util.UUID; +import org.hibernate.annotations.BatchSize; @Entity @Getter @@ -25,10 +19,12 @@ public class Message extends BaseEntity { private String content; private UUID writerID; private UUID channelID; - private List binaryContents = new HashSet<>(); + @OneToOne(mappedBy = "message", + cascade = {CascadeType.ALL}, + fetch = FetchType.LAZY, + orphanRemoval = true) + @Builder.Default + @BatchSize(size = 20) + private Set binaryContents = new HashSet<>(); - public void update(String content, UUID newAttachment) { - this.content = content; - this.attachmentsID.add(newAttachment); - } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java index 0749a8f7b..c8122fd8a 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java @@ -1,19 +1,18 @@ package com.sprint.mission.discodeit.entity; -import lombok.Getter; -import lombok.ToString; +import jakarta.persistence.Entity; +import lombok.*; import java.util.List; import java.util.UUID; +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Builder @Getter @ToString public class PrivateChannel extends Channel { // private List joinMembers; - - public PrivateChannel(List joinMember) { - super(); - this.joinMembers = joinMember; - } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java index e01b45ec0..0317ec0e8 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java @@ -1,10 +1,14 @@ package com.sprint.mission.discodeit.entity; -import lombok.Getter; -import lombok.ToString; +import jakarta.persistence.Entity; +import lombok.*; import java.util.UUID; +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Builder @Getter @ToString public class PublicChannel extends Channel { @@ -12,12 +16,6 @@ public class PublicChannel extends Channel { private String name; private String description; - public PublicChannel(String name, String description) { - super(); - this.name = name; - this.description = description; - } - public void update(String name, String description, UUID newUserID) { this.name = name; this.description = description; From 10afd2e8e3e922eb4000661c371eb75bc4c91473 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 10:26:46 +0900 Subject: [PATCH 083/115] =?UTF-8?q?Entity=20JPA=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20->=20=ED=95=84=EB=93=9C=20=EC=9E=AC=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChannelController.java | 1 - .../discodeit/dto/channel/ChannelDTO.java | 1 - .../discodeit/entity/BinaryContent.java | 24 ++------- .../mission/discodeit/entity/Channel.java | 26 +++++----- .../mission/discodeit/entity/Message.java | 19 ++----- .../discodeit/entity/PrivateChannel.java | 18 ------- .../discodeit/entity/PublicChannel.java | 23 --------- .../mission/discodeit/entity/ReadStatus.java | 21 ++------ .../sprint/mission/discodeit/entity/User.java | 46 ++--------------- .../mission/discodeit/entity/UserStatus.java | 16 ++---- .../discodeit/entity/base/BaseEntity.java | 21 ++++++++ .../BaseUpdateEntity.java} | 10 +--- .../repository/ChannelRepository.java | 2 - .../discodeit/service/ChannelService.java | 1 - .../mission/discodeit/util/FileIOUtil.java | 50 ------------------- src/main/resources/application.yml | 15 +++--- 16 files changed, 65 insertions(+), 229 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java rename src/main/java/com/sprint/mission/discodeit/entity/{BaseEntity.java => base/BaseUpdateEntity.java} (67%) delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 12e80f66b..ae0240d01 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.PublicChannel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java index cb3113f4a..831aa6119 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.entity.PrivateChannel; import com.sprint.mission.discodeit.entity.PublicChannel; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.Builder; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index 4b3dfb3cd..9be03599d 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -1,13 +1,8 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.entity.base.BaseEntity; import jakarta.persistence.*; import lombok.*; -import org.springframework.data.annotation.CreatedDate; - -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.util.UUID; @Entity @NoArgsConstructor @@ -15,18 +10,9 @@ @Getter @Builder @ToString(exclude = "message") -public class BinaryContent { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; - @CreatedDate - @Column(name = "createdAt", updatable = false) - private Instant createdAt; - - private byte[] bytes; - private String contentType; +public class BinaryContent extends BaseEntity { private String fileName; - - @ManyToOne - private Message message; + private String size; + private String contentType; + private byte[] bytes; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 2efc11933..7d228e5e5 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,22 +1,22 @@ package com.sprint.mission.discodeit.entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.MappedSuperclass; -import lombok.Getter; +import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; +import com.sprint.mission.discodeit.util.type.ChannelType; +import jakarta.persistence.Entity; +import lombok.*; -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; import java.util.UUID; -@MappedSuperclass +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Builder @Getter -public abstract class Channel extends BaseEntity { +@ToString +public class Channel extends BaseUpdateEntity { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; + private ChannelType type; + private String name; + private String description; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 35b679e49..44b2677a1 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -2,6 +2,7 @@ import java.util.*; +import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.BatchSize; @@ -12,19 +13,9 @@ @AllArgsConstructor @NoArgsConstructor @ToString -public class Message extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; +public class Message extends BaseUpdateEntity { private String content; - private UUID writerID; - private UUID channelID; - @OneToOne(mappedBy = "message", - cascade = {CascadeType.ALL}, - fetch = FetchType.LAZY, - orphanRemoval = true) - @Builder.Default - @BatchSize(size = 20) - private Set binaryContents = new HashSet<>(); - + private Channel channel; + private User author; + private List attachments; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java b/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java deleted file mode 100644 index c8122fd8a..000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/PrivateChannel.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sprint.mission.discodeit.entity; - -import jakarta.persistence.Entity; -import lombok.*; - -import java.util.List; -import java.util.UUID; - -@Entity -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Getter -@ToString -public class PrivateChannel extends Channel { // - - private List joinMembers; -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java b/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java deleted file mode 100644 index 0317ec0e8..000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/PublicChannel.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sprint.mission.discodeit.entity; - -import jakarta.persistence.Entity; -import lombok.*; - -import java.util.UUID; - -@Entity -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Getter -@ToString -public class PublicChannel extends Channel { - - private String name; - private String description; - - public void update(String name, String description, UUID newUserID) { - this.name = name; - this.description = description; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java index 4dcb625c5..39c29da79 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -1,15 +1,11 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; + import lombok.*; -import java.io.Serial; -import java.io.Serializable; import java.time.Instant; -import java.util.UUID; @Entity @Builder @@ -17,15 +13,8 @@ @AllArgsConstructor @NoArgsConstructor @ToString -public class ReadStatus extends BaseEntity { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; - private UUID userId; - private UUID channelId; +public class ReadStatus extends BaseUpdateEntity { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 + private User user; + private Channel channel; private Instant lastReadAt; - - public void updateLastReadTime(Instant lastReadAt) { - this.lastReadAt = lastReadAt; - } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index a4e818412..708bda802 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,17 +1,11 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; import lombok.*; -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.util.Objects; import java.util.UUID; @Entity @@ -20,40 +14,10 @@ @AllArgsConstructor @NoArgsConstructor @ToString -public class User extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; - private String name; +public class User extends BaseUpdateEntity { + private String username; private String email; private String password; - private UUID profileImageId; - private UUID userStatusId; - private boolean online; - - public void updatePassword(String oldPassword, String newPassword) { - if (!this.password.equals(oldPassword) || oldPassword.equals(newPassword)) { - throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); - } - this.password = newPassword; - } - - public void updateProfile(UUID profileImageId, UUID newProfileImageId) { - if (!this.profileImageId.equals(profileImageId) || profileImageId.equals(newProfileImageId)) { - throw new ServiceException(ErrorCode.INVALID_PROFILE); - } - this.profileImageId = newProfileImageId; - } - - @Override - public boolean equals(Object o) { // User 객체는 UUID, name, phone 3개의 필드가 동일하면 같은 유저라고 판단한다. - if (o == null || getClass() != o.getClass()) return false; - User user = (User) o; - return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(email, user.email); - } - - @Override - public int hashCode() { - return Objects.hash(id, name, email); - } + private BinaryContent profile; + private UserStatus status; } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index 5f41e4779..2d1190412 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -1,9 +1,7 @@ package com.sprint.mission.discodeit.entity; +import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; import lombok.*; import java.time.Instant; @@ -16,20 +14,12 @@ @AllArgsConstructor @NoArgsConstructor @ToString -public class UserStatus extends BaseEntity { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; +public class UserStatus extends BaseUpdateEntity { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 + private User user; private Instant lastActiveAt; - private UUID userId; - private boolean online; public boolean isOnline() { return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; } - public void update(Instant lastActiveAt) { - this.lastActiveAt = lastActiveAt; - this.online = isOnline(); - } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java new file mode 100644 index 000000000..e0091b476 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java @@ -0,0 +1,21 @@ +package com.sprint.mission.discodeit.entity.base; + +import jakarta.persistence.*; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.Instant; +import java.util.UUID; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Getter +public abstract class BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + @CreatedDate + @Column(name = "createdAt", updatable = false) + private Instant createdAt; +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java similarity index 67% rename from src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java rename to src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java index fcfafc038..a1ff514a4 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BaseEntity.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java @@ -1,10 +1,9 @@ -package com.sprint.mission.discodeit.entity; +package com.sprint.mission.discodeit.entity.base; import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import lombok.Getter; -import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -13,12 +12,7 @@ @MappedSuperclass @EntityListeners(AuditingEntityListener.class) @Getter -abstract class BaseEntity { - - @CreatedDate - @Column(name = "createdAt", updatable = false) - private Instant createdAt; - +public abstract class BaseUpdateEntity extends BaseEntity { @LastModifiedDate @Column(name = "updatedAt") private Instant updatedAt; diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index febe522b7..434bcb8b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,7 +1,5 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.entity.Channel; - import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 1225ac344..04089408a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,6 +1,5 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.PublicChannel; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; diff --git a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java b/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java deleted file mode 100644 index d241d5617..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/FileIOUtil.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sprint.mission.discodeit.util; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import java.io.*; -import java.nio.file.*; -import java.util.*; - -public class FileIOUtil { - private static final ObjectMapper objectMapper = new ObjectMapper(); - - static { - objectMapper.registerModule(new JavaTimeModule()); // Instant, UUID 변환 지원 - } - - public static Map loadFromFile(Path filePath) { - if (!Files.exists(filePath)) { - return new HashMap<>(); - } - try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(filePath))) { - return (Map) ois.readObject(); - } catch (EOFException e) { - return new HashMap<>(); // 파일이 비어 있을 경우 빈 맵 반환 - } catch (IOException | ClassNotFoundException e) { - throw new RuntimeException("❌ 파일을 읽는 도중 오류 발생 (" + filePath + "): " + e.getMessage(), e); - } - } - - public static void saveToFile(Map data, Path filePath) { - try { - Files.createDirectories(filePath.getParent()); // 디렉토리 없으면 생성 - try (ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(filePath))) { - oos.writeObject(data); - } - } catch (IOException e) { - throw new RuntimeException("❌ 파일 저장 중 오류 발생 (" + filePath + "): " + e.getMessage(), e); - } - } - - // `.dat` 파일을 읽기 쉬운 JSON 파일로 변환 - public static void convertSerToJson(Path datFilePath, Path jsonFilePath, Class valueType) { - Map data = loadFromFile(datFilePath); - try { - objectMapper.writerWithDefaultPrettyPrinter().writeValue(jsonFilePath.toFile(), data); - } catch (IOException e) { - throw new RuntimeException("❌ JSON 변환 중 오류 발생 (" + jsonFilePath + "): " + e.getMessage(), e); - } - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ed5afc343..ff7978bec 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,12 @@ spring: profiles: active: file +logging: + level: + org.springframework: info + com.sprint.mission.discodeit: debug + + datasource: url: jdbc:postgresql://localhost:5432/discodeit username: discodeit_user @@ -14,15 +20,6 @@ spring: ddl-auto: update show-sql: true -discodeit: - repository: - user-status-file-path: ./result/userstatus.ser - channel-file-path: ./result/channels.ser - binarycontent-file-path: ./result/binarycontent.ser - user-file-path: ./result/users.ser - read-status-file-path: ./result/readstatus.ser - message-file-path: ./result/messages.ser - springdoc: swagger-ui: path: /api-docs \ No newline at end of file From f29746290947d292503d99f623922e281efcf9a5 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 11:57:03 +0900 Subject: [PATCH 084/115] =?UTF-8?q?repository=EC=97=90=20JPA=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20->=20=EC=BF=BC=EB=A6=AC=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=20X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sprint/mission/discodeit/entity/BinaryContent.java | 2 +- src/main/java/com/sprint/mission/discodeit/entity/User.java | 1 + .../mission/discodeit/entity/base/BaseUpdateEntity.java | 2 +- .../discodeit/repository/BinaryContentRepository.java | 3 ++- .../mission/discodeit/repository/ChannelRepository.java | 5 ++++- .../mission/discodeit/repository/MessageRepository.java | 3 ++- .../mission/discodeit/repository/ReadStatusRepository.java | 3 ++- .../sprint/mission/discodeit/repository/UserRepository.java | 3 ++- .../mission/discodeit/repository/UserStatusRepository.java | 3 ++- .../mission/discodeit/storage/BinaryContentStorage.java | 4 ++++ .../sprint/mission/discodeit/util/type/OnlineStatusType.java | 5 ----- .../com/sprint/mission/discodeit/util/type/ProfileUse.java | 5 ----- 12 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index 9be03599d..5ecc2f759 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -12,7 +12,7 @@ @ToString(exclude = "message") public class BinaryContent extends BaseEntity { private String fileName; - private String size; + private Long size; private String contentType; private byte[] bytes; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 708bda802..229c801d5 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -18,6 +18,7 @@ public class User extends BaseUpdateEntity { private String username; private String email; private String password; + private BinaryContent profile; private UserStatus status; } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java index a1ff514a4..ac6ec2715 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java @@ -16,4 +16,4 @@ public abstract class BaseUpdateEntity extends BaseEntity { @LastModifiedDate @Column(name = "updatedAt") private Instant updatedAt; -} +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 613eb3b73..229a3e423 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.BinaryContent; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; import java.util.UUID; -public interface BinaryContentRepository { +public interface BinaryContentRepository extends JpaRepository { BinaryContent save(BinaryContent binaryContent); Optional findById(UUID uuid); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 434bcb8b3..360b61ae8 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,10 +1,13 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.entity.Channel; +import org.springframework.data.jpa.repository.JpaRepository; + import java.util.List; import java.util.Optional; import java.util.UUID; -public interface ChannelRepository { +public interface ChannelRepository extends JpaRepository { Channel save(Channel channel); boolean channelExistById(UUID channelID); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 160ef6a54..18ce41a6f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.Message; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; import java.util.UUID; -public interface MessageRepository { +public interface MessageRepository extends JpaRepository { Message save(Message message); Optional findById(UUID uuid); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index af50577b6..88d93abc1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.ReadStatus; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; import java.util.UUID; -public interface ReadStatusRepository { +public interface ReadStatusRepository extends JpaRepository { ReadStatus save(ReadStatus readStatus); List saveAll(List readStatuses); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 9845c5942..b9001646b 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; import java.util.UUID; -public interface UserRepository { +public interface UserRepository extends JpaRepository { User save(User user); boolean userExistById(UUID userID); diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index 81feea037..ff2f127a5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.UserStatus; +import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; import java.util.UUID; -public interface UserStatusRepository { +public interface UserStatusRepository extends JpaRepository { UserStatus save(UserStatus userStatus); Optional findByUserId(UUID userID); diff --git a/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java new file mode 100644 index 000000000..c75315a64 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.storage; + +public interface BinaryContentStorage { +} diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java b/src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java deleted file mode 100644 index df45fc083..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/type/OnlineStatusType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.util.type; - -public enum OnlineStatusType { - ACTIVE, SLEEP -} diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java b/src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java deleted file mode 100644 index 101614be2..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/type/ProfileUse.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.util.type; - -public enum ProfileUse { - YES, NO -} From 84c6fb6e4a5309902c7761da87ddeecdabe903f8 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 15:21:13 +0900 Subject: [PATCH 085/115] =?UTF-8?q?Entity=20=EB=A7=A4=ED=95=91=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20->=20=EC=95=84=EC=A7=81=20column=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9D=80=20=EC=95=88=20=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/discodeit/entity/BinaryContent.java | 2 +- .../sprint/mission/discodeit/entity/Channel.java | 2 -- .../sprint/mission/discodeit/entity/Message.java | 13 ++++++++++++- .../sprint/mission/discodeit/entity/ReadStatus.java | 5 ++++- .../com/sprint/mission/discodeit/entity/User.java | 7 +++++++ .../sprint/mission/discodeit/entity/UserStatus.java | 6 +++++- 6 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index 5ecc2f759..b6199b839 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -9,7 +9,7 @@ @AllArgsConstructor @Getter @Builder -@ToString(exclude = "message") +@ToString public class BinaryContent extends BaseEntity { private String fileName; private Long size; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 7d228e5e5..102e8de0a 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -5,8 +5,6 @@ import jakarta.persistence.Entity; import lombok.*; -import java.util.UUID; - @Entity @NoArgsConstructor @AllArgsConstructor diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 44b2677a1..38db4ede1 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -12,10 +12,21 @@ @Builder @AllArgsConstructor @NoArgsConstructor -@ToString +@ToString(exclude = {"author", "channel"}) public class Message extends BaseUpdateEntity { private String content; + + @ManyToOne private Channel channel; + + @ManyToOne private User author; + + @ManyToMany + @JoinTable( + name = "message_attachments", // 중간 테이블 이름 + joinColumns = @JoinColumn(name = "message_id"), // `Message` 테이블 외래 키 + inverseJoinColumns = @JoinColumn(name = "attachment_id") // `BinaryContent` 테이블 외래 키 + ) private List attachments; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java index 39c29da79..72bf94133 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -3,6 +3,7 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; import lombok.*; import java.time.Instant; @@ -12,9 +13,11 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@ToString +@ToString(exclude = {"user", "channel"}) public class ReadStatus extends BaseUpdateEntity { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 + @ManyToOne private User user; + @ManyToOne private Channel channel; private Instant lastReadAt; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 229c801d5..0c5931fd2 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -3,7 +3,10 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; +import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; import lombok.*; import java.util.UUID; @@ -19,6 +22,10 @@ public class User extends BaseUpdateEntity { private String email; private String password; + @OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true) + @JoinColumn(name = "profile_id") private BinaryContent profile; + + @OneToOne(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true) private UserStatus status; } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index 2d1190412..a5b067f65 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -2,11 +2,12 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; import lombok.*; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.UUID; @Entity @Builder @@ -15,7 +16,10 @@ @NoArgsConstructor @ToString public class UserStatus extends BaseUpdateEntity { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 + @OneToOne + @JoinColumn(name = "user_id") private User user; + private Instant lastActiveAt; public boolean isOnline() { From 94ec2f3774798720adc123165d5de78f6c2f2fca Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 16:21:49 +0900 Subject: [PATCH 086/115] =?UTF-8?q?Entity=20=EB=A7=A4=ED=95=91=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=B2=98=EB=A6=AC=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/discodeit/entity/BinaryContent.java | 6 ++++++ .../sprint/mission/discodeit/entity/Channel.java | 6 +++++- .../sprint/mission/discodeit/entity/Message.java | 4 +++- .../sprint/mission/discodeit/entity/ReadStatus.java | 7 +++++-- .../com/sprint/mission/discodeit/entity/User.java | 13 +++++-------- .../mission/discodeit/entity/base/BaseEntity.java | 2 +- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index b6199b839..176337eb9 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -2,17 +2,23 @@ import com.sprint.mission.discodeit.entity.base.BaseEntity; import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import lombok.*; @Entity +@Table(name = "binary_contents") @NoArgsConstructor @AllArgsConstructor @Getter @Builder @ToString public class BinaryContent extends BaseEntity { + @Column(nullable = false) private String fileName; + @Column(nullable = false) private Long size; + @Column(nullable = false) private String contentType; + @Column(nullable = false) private byte[] bytes; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 102e8de0a..33146c9b9 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -2,10 +2,12 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import com.sprint.mission.discodeit.util.type.ChannelType; -import jakarta.persistence.Entity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import lombok.*; @Entity +@Table(name = "channels") @NoArgsConstructor @AllArgsConstructor @Builder @@ -13,6 +15,8 @@ @ToString public class Channel extends BaseUpdateEntity { + @Enumerated(EnumType.STRING) + @Column(nullable = false) private ChannelType type; private String name; private String description; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 38db4ede1..276495da8 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -4,10 +4,11 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; import lombok.*; -import org.hibernate.annotations.BatchSize; @Entity +@Table(name = "messages") @Getter @Builder @AllArgsConstructor @@ -17,6 +18,7 @@ public class Message extends BaseUpdateEntity { private String content; @ManyToOne + @NotNull private Channel channel; @ManyToOne diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java index 72bf94133..1d55ab784 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -1,14 +1,14 @@ package com.sprint.mission.discodeit.entity; import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; -import jakarta.persistence.Entity; +import jakarta.persistence.*; -import jakarta.persistence.ManyToOne; import lombok.*; import java.time.Instant; @Entity +@Table(name = "read_statuses") @Builder @Getter @AllArgsConstructor @@ -16,8 +16,11 @@ @ToString(exclude = {"user", "channel"}) public class ReadStatus extends BaseUpdateEntity { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 @ManyToOne + @JoinColumn(unique = true) private User user; @ManyToOne + @JoinColumn(unique = true) private Channel channel; + @Column(nullable = false) private Instant lastReadAt; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 0c5931fd2..d650d04ec 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,25 +1,22 @@ package com.sprint.mission.discodeit.entity; import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import jakarta.persistence.CascadeType; -import jakarta.persistence.Entity; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; +import jakarta.persistence.*; import lombok.*; -import java.util.UUID; - @Entity +@Table(name = "users") @Builder @Getter @AllArgsConstructor @NoArgsConstructor @ToString public class User extends BaseUpdateEntity { + @Column(nullable = false, unique = true) private String username; + @Column(nullable = false, unique = true) private String email; + @Column(nullable = false) private String password; @OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java index e0091b476..7d267c513 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java @@ -16,6 +16,6 @@ public abstract class BaseEntity { @GeneratedValue(strategy = GenerationType.UUID) private UUID id; @CreatedDate - @Column(name = "createdAt", updatable = false) + @Column(name = "createdAt", updatable = false, nullable = false) private Instant createdAt; } From 6438322bf3f79bf1c97b9cc2816ec3b41dea5923 Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 10 Mar 2025 16:24:01 +0900 Subject: [PATCH 087/115] =?UTF-8?q?Repository=20JPA=20=EB=8F=84=EC=9E=85?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C=20->=20=EC=BF=BC=EB=A6=AC=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=82=AC=EC=9A=A9=20X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discodeit/repository/BinaryContentRepository.java | 8 -------- .../mission/discodeit/repository/ChannelRepository.java | 8 -------- .../mission/discodeit/repository/MessageRepository.java | 8 -------- .../discodeit/repository/ReadStatusRepository.java | 6 ------ .../mission/discodeit/repository/UserRepository.java | 6 ------ .../discodeit/repository/UserStatusRepository.java | 8 -------- 6 files changed, 44 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 229a3e423..4ca90e5e6 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -8,13 +8,5 @@ import java.util.UUID; public interface BinaryContentRepository extends JpaRepository { - BinaryContent save(BinaryContent binaryContent); - - Optional findById(UUID uuid); - - List findAll(); - List findAllIdIn(List uuidList); - - void deleteById(UUID uuid); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 360b61ae8..89ac41b93 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -8,13 +8,5 @@ import java.util.UUID; public interface ChannelRepository extends JpaRepository { - Channel save(Channel channel); - boolean channelExistById(UUID channelID); - - Optional findById(UUID channelId); - - List findAll(); - - Channel delete(Channel channel); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 18ce41a6f..3d56c3688 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -8,15 +8,7 @@ import java.util.UUID; public interface MessageRepository extends JpaRepository { - Message save(Message message); - - Optional findById(UUID uuid); - - List findAll(); - List findByChannelId(UUID channelId); Optional findLatestByChannelId(UUID channelId); - - Message delete(Message message); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 88d93abc1..31b73410e 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -8,17 +8,11 @@ import java.util.UUID; public interface ReadStatusRepository extends JpaRepository { - ReadStatus save(ReadStatus readStatus); - List saveAll(List readStatuses); - Optional findById(UUID id); - List findAllByChannelId(UUID channelID); List findAllByUserId(UUID userID); - void delete(ReadStatus readStatus); - void deleteAll(List readStatuses); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index b9001646b..38915ddcc 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -8,7 +8,6 @@ import java.util.UUID; public interface UserRepository extends JpaRepository { - User save(User user); boolean userExistById(UUID userID); @@ -16,11 +15,6 @@ public interface UserRepository extends JpaRepository { Optional findByName(String name); - Optional findById(UUID userId); - - List findAll(); - List findAllById(List userIds); - void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index ff2f127a5..e48d600b1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -8,17 +8,9 @@ import java.util.UUID; public interface UserStatusRepository extends JpaRepository { - UserStatus save(UserStatus userStatus); - Optional findByUserId(UUID userID); - Optional findById(UUID id); - List findByIsOnlineTrue(); - List findAll(); - - void deleteById(UUID id); - void deleteByUserId(UUID userID); } From d22b84752400dda26838fda3d8264de6f4f44805 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Mar 2025 10:00:23 +0900 Subject: [PATCH 088/115] =?UTF-8?q?Repository=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/discodeit/entity/Message.java | 1 + .../sprint/mission/discodeit/entity/User.java | 4 +++ .../mission/discodeit/entity/UserStatus.java | 5 ---- .../repository/ChannelRepository.java | 2 +- .../repository/MessageRepository.java | 5 +++- .../discodeit/repository/UserRepository.java | 7 +++--- .../repository/UserStatusRepository.java | 6 +++-- .../service/basic/BasicMessageService.java | 2 +- .../repository/UserRepositoryTest.java | 25 +++++++++++++++++++ 9 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 276495da8..fe3bc73da 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -30,5 +30,6 @@ public class Message extends BaseUpdateEntity { joinColumns = @JoinColumn(name = "message_id"), // `Message` 테이블 외래 키 inverseJoinColumns = @JoinColumn(name = "attachment_id") // `BinaryContent` 테이블 외래 키 ) + @Builder.Default private List attachments; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index d650d04ec..a705b6d68 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -2,6 +2,8 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.*; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Email; import lombok.*; @Entity @@ -14,8 +16,10 @@ public class User extends BaseUpdateEntity { @Column(nullable = false, unique = true) private String username; + @Column(nullable = false, unique = true) private String email; + @Column(nullable = false) private String password; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index a5b067f65..ad5ed2031 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -21,9 +21,4 @@ public class UserStatus extends BaseUpdateEntity { // 사용자 별 마지막으 private User user; private Instant lastActiveAt; - - public boolean isOnline() { - return ChronoUnit.MINUTES.between(lastActiveAt, Instant.now()) <= 5; - } - } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 89ac41b93..d1b6e9113 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -8,5 +8,5 @@ import java.util.UUID; public interface ChannelRepository extends JpaRepository { - boolean channelExistById(UUID channelID); + boolean channelExistById(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 3d56c3688..ab9ff4b31 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -2,6 +2,8 @@ import com.sprint.mission.discodeit.entity.Message; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; @@ -10,5 +12,6 @@ public interface MessageRepository extends JpaRepository { List findByChannelId(UUID channelId); - Optional findLatestByChannelId(UUID channelId); + @Query("SELECT m FROM Message m WHERE m.channel.id = :channelId ORDER BY m.createdAt DESC") + Optional findLatestByChannelId(@Param("channelId") UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index 38915ddcc..ebb856f76 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -9,12 +9,11 @@ public interface UserRepository extends JpaRepository { - boolean userExistById(UUID userID); + boolean existsById(UUID userId); Optional findByEmail(String email); - Optional findByName(String name); - - List findAllById(List userIds); + Optional findByUsername(String name); + List findAllByIdIn(List userIds); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index e48d600b1..a0828813b 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -2,15 +2,17 @@ import com.sprint.mission.discodeit.entity.UserStatus; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; import java.util.Optional; import java.util.UUID; public interface UserStatusRepository extends JpaRepository { - Optional findByUserId(UUID userID); + Optional findByUserId(UUID userId); + @Query("SELECT u FROM UserStatus u WHERE u.lastActiveAt >= CURRENT_TIMESTAMP - 5") List findByIsOnlineTrue(); - void deleteByUserId(UUID userID); + void deleteByUserId(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 9f93df72b..155633064 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -110,7 +110,7 @@ public Message deleteMessage(UUID messageID) { } private void validUser(UUID userId) { - if (!userRepository.userExistById(userId)) { + if (!userRepository.existsById(userId)) { throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } } diff --git a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java new file mode 100644 index 000000000..a73e46461 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.User; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class UserRepositoryTest { + @Autowired + UserRepository userRepository; + + @Test + void userSave() { + User user = User.builder() + .username("user00") + .email("user00@gmail.com") + .password("Abcdefgh1234!!") + .profile(null) + .build(); + userRepository.save(user); + } +} \ No newline at end of file From 65cdee8a5d1853d639d7ea2146e885c9498c88be Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Mar 2025 10:49:24 +0900 Subject: [PATCH 089/115] =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20DTO=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/binarycontent/BinaryContentDTO.java | 30 +++++++++ .../discodeit/dto/channel/ChannelDTO.java | 66 ++++++------------- .../discodeit/dto/message/MessageDTO.java | 28 ++++++++ .../dto/readstatus/ReadStatusDTO.java | 25 +++++++ .../mission/discodeit/dto/user/UserDTO.java | 36 ++++------ .../dto/userstatus/UserStatusDTO.java | 24 +++++++ .../mission/discodeit/entity/Channel.java | 1 - .../MapperConfig.java} | 4 +- .../{config => swagger}/SwaggerConfig.java | 3 +- 9 files changed, 144 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java rename src/main/java/com/sprint/mission/discodeit/{config/RootConfig.java => mapper/MapperConfig.java} (90%) rename src/main/java/com/sprint/mission/discodeit/{config => swagger}/SwaggerConfig.java (87%) diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java new file mode 100644 index 000000000..17739080b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.dto.binarycontent; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BinaryContentDTO { + private UUID id; + + @NotEmpty + private String fileName; + + @NotNull + private Long size; + + @NotEmpty + private String contentType; + + @NotNull + private byte[] bytes; +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java index 831aa6119..071ef4f40 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java @@ -1,56 +1,32 @@ package com.sprint.mission.discodeit.dto.channel; -import com.sprint.mission.discodeit.entity.PublicChannel; +import com.sprint.mission.discodeit.dto.user.UserDTO; import com.sprint.mission.discodeit.util.type.ChannelType; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Getter; +import lombok.Data; +import lombok.NoArgsConstructor; import java.time.Instant; +import java.util.List; import java.util.UUID; +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder public class ChannelDTO { + private UUID id; - @Getter - @Builder - public static class PublicChannelDTO { - - private UUID id; - private Instant createdAt; - private Instant updatedAt; - private String name; - private String description; - private Instant latestMessageTime; - - public static PublicChannelDTO fromDomain(PublicChannel channel, Instant latestMessageTime) { - return ChannelDTO.PublicChannelDTO.builder() - .id(channel.getId()) - .createdAt(channel.getCreatedAt()) - .updatedAt(channel.getUpdatedAt()) - .name(channel.getName()) - .description(channel.getDescription()) - .latestMessageTime(latestMessageTime) - .build(); - } - } - - @Getter - @Builder - public static class PrivateChannelDTO { - - private UUID id; - private Instant createdAt; - private Instant updatedAt; - private ChannelType channelType; - private Instant latestMessageTime; - - public static PrivateChannelDTO fromDomain(PrivateChannel channel, Instant latestMessageTime) { - return ChannelDTO.PrivateChannelDTO.builder() - .id(channel.getId()) - .createdAt(channel.getCreatedAt()) - .updatedAt(channel.getUpdatedAt()) - .channelType(ChannelType.PRIVATE) - .latestMessageTime(latestMessageTime) - .build(); - } - } + @NotNull + private ChannelType type; + + private String name; + + private String description; + + private List participants; + + private Instant lastMessageAt; } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java new file mode 100644 index 000000000..a8881830b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java @@ -0,0 +1,28 @@ +package com.sprint.mission.discodeit.dto.message; + +import com.sprint.mission.discodeit.dto.user.UserDTO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Instant; +import java.util.UUID; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MessageDTO { + private UUID id; + + private Instant createdAt; + + private Instant updatedAt; + + private String content; + + private UUID channelId; + + private UserDTO author; +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java new file mode 100644 index 000000000..a383d6cd5 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.dto.readstatus; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Instant; +import java.util.UUID; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ReadStatusDTO { + private UUID id; + + private UUID userId; + + private UUID channelId; + + @NotNull + private Instant lastReadAt; +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index 978bb00b3..8521a48a7 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -1,35 +1,25 @@ package com.sprint.mission.discodeit.dto.user; -import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import jakarta.validation.constraints.NotEmpty; import lombok.*; -import java.time.Instant; import java.util.UUID; -@Getter -@Setter +@Data @Builder @NoArgsConstructor @AllArgsConstructor -@ToString public class UserDTO { - private UUID id; - private Instant createdAt; - private Instant updatedAt; - private String name; - private String email; - private UUID profileImageId; - private UUID userStatusId; + private UUID id; - public static UserDTO fromDomain(User user) { - return UserDTO.builder() - .id(user.getId()) - .createdAt(user.getCreatedAt()) - .updatedAt(user.getUpdatedAt()) - .name(user.getName()) - .email(user.getEmail()) - .profileImageId(user.getProfileImageId()) - .userStatusId(user.getUserStatusId()) - .build(); - } + @NotEmpty + private String username; + + @NotEmpty + private String email; + + private BinaryContentDTO profile; + + private Boolean online; } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java new file mode 100644 index 000000000..94a8d48e0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.dto.userstatus; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Instant; +import java.util.UUID; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserStatusDTO { + private UUID id; + + @NotNull + private UUID userId; + + @NotNull + private Instant lastActiveAt; +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 33146c9b9..b251321f5 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -3,7 +3,6 @@ import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import com.sprint.mission.discodeit.util.type.ChannelType; import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; import lombok.*; @Entity diff --git a/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java similarity index 90% rename from src/main/java/com/sprint/mission/discodeit/config/RootConfig.java rename to src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java index 7f7de76dc..4a9e913aa 100644 --- a/src/main/java/com/sprint/mission/discodeit/config/RootConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java @@ -1,4 +1,4 @@ -package com.sprint.mission.discodeit.config; +package com.sprint.mission.discodeit.mapper; import org.modelmapper.ModelMapper; import org.modelmapper.convention.MatchingStrategies; @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration; @Configuration -public class RootConfig { +public class MapperConfig { @Bean public ModelMapper getMapper() { ModelMapper modelMapper = new ModelMapper(); diff --git a/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java b/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java similarity index 87% rename from src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java rename to src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java index b90d313b4..d38226292 100644 --- a/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java @@ -1,8 +1,7 @@ -package com.sprint.mission.discodeit.config; +package com.sprint.mission.discodeit.swagger; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.OpenAPI; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; From b459615a8a4c0f97a979580f0b98e440a359d40b Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 11 Mar 2025 16:00:59 +0900 Subject: [PATCH 090/115] =?UTF-8?q?Service=20=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EC=A4=91=20->=20Message,=20BinaryContent=20=EB=82=A8=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discodeit/controller/AuthController.java | 22 +-- .../controller/BinaryContentController.java | 82 +++++----- .../controller/ChannelController.java | 109 ++++++------- .../controller/MessageController.java | 120 +++++++------- .../controller/ReadStatusController.java | 40 ++--- .../discodeit/controller/UserController.java | 142 ++++++++-------- .../controller/UserStatusController.java | 14 +- .../BinaryContentCreateRequest.java | 8 + .../CreateBinaryContentRequest.java | 3 +- .../discodeit/dto/channel/CreateChannel.java | 2 +- .../dto/channel/UpdatePublicChannel.java | 2 +- .../mission/discodeit/dto/user/UserDTO.java | 2 + .../userstatus/CreateUserStatusRequest.java | 7 - .../mission/discodeit/entity/Channel.java | 4 + .../mission/discodeit/entity/Message.java | 3 +- .../mission/discodeit/entity/ReadStatus.java | 6 +- .../sprint/mission/discodeit/entity/User.java | 26 +++ .../mission/discodeit/entity/UserStatus.java | 4 + .../discodeit/exception/ErrorCode.java | 4 +- .../exception/MyExceptionHandler.java | 2 +- .../repository/UserStatusRepository.java | 1 + .../service/BinaryContentService.java | 10 +- .../discodeit/service/ChannelService.java | 16 +- .../discodeit/service/MessageService.java | 11 +- .../discodeit/service/ReadStatusService.java | 11 +- .../discodeit/service/UserService.java | 4 +- .../discodeit/service/UserStatusService.java | 13 +- .../service/basic/BasicAuthService.java | 8 +- .../basic/BasicBinaryContentService.java | 9 +- .../service/basic/BasicChannelService.java | 154 ++++++++---------- .../service/basic/BasicMessageService.java | 84 +--------- .../service/basic/BasicReadStatusService.java | 82 ++++++---- .../service/basic/BasicUserService.java | 92 +++++++---- .../service/basic/BasicUserStatusService.java | 61 +++++-- 34 files changed, 584 insertions(+), 574 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java index 22a546a1c..f0f9b0fd7 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -16,15 +16,15 @@ @RequiredArgsConstructor @Slf4j public class AuthController { - - private final BasicAuthService authService; - - @PostMapping("/login") - public ResponseEntity login(@RequestBody LoginRequest request) { - UserDTO login = authService.login(request); - log.info(request.username() + "님 환영합니다~. 로그인이 완료되었습니다"); - return ResponseEntity - .status(HttpStatus.OK) - .body(login); - } +// +// private final BasicAuthService authService; +// +// @PostMapping("/login") +// public ResponseEntity login(@RequestBody LoginRequest request) { +// UserDTO login = authService.login(request); +// log.info(request.username() + "님 환영합니다~. 로그인이 완료되었습니다"); +// return ResponseEntity +// .status(HttpStatus.OK) +// .body(login); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index f48114255..e4c318460 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -16,45 +16,45 @@ @RequestMapping("/api/binaryContents") @RequiredArgsConstructor public class BinaryContentController { - - private final BinaryContentService binaryContentService; - - @PostMapping - public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { - try { - BinaryContent binaryContent = binaryContentService.saveFile(file); - return ResponseEntity.ok(binaryContent); - } catch (IOException e) { - throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); - } - } - - @GetMapping("/view/{id}") - public ResponseEntity viewFile(@PathVariable("id") UUID id) { - BinaryContent binaryContent = binaryContentService.find(id); - - return ResponseEntity.ok() - .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 - .body(binaryContent.getBytes()); // 파일 데이터 반환 - } - - @GetMapping("{binaryContentIds}") - public ResponseEntity> getFilesById( - @PathVariable("binaryContentIds") List binaryContentIds) { - List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); - return ResponseEntity.ok(binaryContents); - } - - @GetMapping("/{binaryContentId}") - public ResponseEntity findFile( - @PathVariable("binaryContentId") UUID binaryContentId) { - BinaryContent binaryContent = binaryContentService.find(binaryContentId); - return ResponseEntity.ok(binaryContent); - } - - @GetMapping() - public ResponseEntity> findAll() { - List all = binaryContentService.findAll(); - return ResponseEntity.ok(all); - } +// +// private final BinaryContentService binaryContentService; +// +// @PostMapping +// public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { +// try { +// BinaryContent binaryContent = binaryContentService.saveFile(file); +// return ResponseEntity.ok(binaryContent); +// } catch (IOException e) { +// throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); +// } +// } +// +// @GetMapping("/view/{id}") +// public ResponseEntity viewFile(@PathVariable("id") UUID id) { +// BinaryContent binaryContent = binaryContentService.find(id); +// +// return ResponseEntity.ok() +// .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 +// .body(binaryContent.getBytes()); // 파일 데이터 반환 +// } +// +// @GetMapping("{binaryContentIds}") +// public ResponseEntity> getFilesById( +// @PathVariable("binaryContentIds") List binaryContentIds) { +// List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); +// return ResponseEntity.ok(binaryContents); +// } +// +// @GetMapping("/{binaryContentId}") +// public ResponseEntity findFile( +// @PathVariable("binaryContentId") UUID binaryContentId) { +// BinaryContent binaryContent = binaryContentService.find(binaryContentId); +// return ResponseEntity.ok(binaryContent); +// } +// +// @GetMapping() +// public ResponseEntity> findAll() { +// List all = binaryContentService.findAll(); +// return ResponseEntity.ok(all); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index ae0240d01..17ce679e7 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -1,69 +1,62 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.entity.PublicChannel; -import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; -import com.sprint.mission.discodeit.service.ChannelService; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; + import org.springframework.web.bind.annotation.*; -import java.util.List; -import java.util.UUID; @RestController @RequestMapping("/api/channels") @RequiredArgsConstructor public class ChannelController { - - private final ChannelService channelService; - - @PostMapping("/public") - public ResponseEntity createPublicChannel( - @RequestBody CreateChannel.PublicRequest request) { - Channel publicChannel = channelService.createPublicChannel(request); - return ResponseEntity.ok(publicChannel); - } - - @PostMapping("/private") - public ResponseEntity createPrivateChannel( - @RequestBody CreateChannel.PrivateRequest request) { - Channel privateChannel = channelService.createPrivateChannel(request); - return ResponseEntity.ok(privateChannel); - } - - @GetMapping - public ResponseEntity> getAllChannels(@RequestParam("userId") UUID userId) { - List allChannel = channelService.findAllPrivate(userId); - return ResponseEntity - .status(HttpStatus.OK) - .body(allChannel); - } - - @GetMapping("/public") - public ResponseEntity> getAllPublicChannels() { - List allPublic = channelService.findAllPublic(); - return ResponseEntity.ok(allPublic); - } - - // 채널 정보 수정은 Public channel 만 가능합니다. - @PatchMapping("/{channelId}") - public ResponseEntity updateChannel( - @PathVariable("channelId") UUID channelId, - @RequestBody UpdatePublicChannel request) { - PublicChannel update = channelService.update(channelId, request); - return ResponseEntity - .status(HttpStatus.OK) - .body(update); - } - - @DeleteMapping("/{channelId}") - public ResponseEntity deletePrivateChannel(@PathVariable("channelId") UUID channelId) { - Channel removeChannel = channelService.delete(channelId); - return ResponseEntity.ok( - "Remove Private Channel ID: " + removeChannel.getId() + - " delete complete!" - ); - } +// +// private final ChannelService channelService; +// +// @PostMapping("/public") +// public ResponseEntity createPublicChannel( +// @RequestBody CreateChannel.PublicRequest request) { +// Channel publicChannel = channelService.createPublicChannel(request); +// return ResponseEntity.ok(publicChannel); +// } +// +// @PostMapping("/private") +// public ResponseEntity createPrivateChannel( +// @RequestBody CreateChannel.PrivateRequest request) { +// Channel privateChannel = channelService.createPrivateChannel(request); +// return ResponseEntity.ok(privateChannel); +// } +// +// @GetMapping +// public ResponseEntity> getAllChannels(@RequestParam("userId") UUID userId) { +// List allChannel = channelService.findAllPrivate(userId); +// return ResponseEntity +// .status(HttpStatus.OK) +// .body(allChannel); +// } +// +// @GetMapping("/public") +// public ResponseEntity> getAllPublicChannels() { +// List allPublic = channelService.findAllPublic(); +// return ResponseEntity.ok(allPublic); +// } +// +// // 채널 정보 수정은 Public channel 만 가능합니다. +// @PatchMapping("/{channelId}") +// public ResponseEntity updateChannel( +// @PathVariable("channelId") UUID channelId, +// @RequestBody UpdatePublicChannel request) { +// PublicChannel update = channelService.update(channelId, request); +// return ResponseEntity +// .status(HttpStatus.OK) +// .body(update); +// } +// +// @DeleteMapping("/{channelId}") +// public ResponseEntity deletePrivateChannel(@PathVariable("channelId") UUID channelId) { +// Channel removeChannel = channelService.delete(channelId); +// return ResponseEntity.ok( +// "Remove Private Channel ID: " + removeChannel.getId() + +// " delete complete!" +// ); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index 657ef4e01..f4f2561d3 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -19,64 +19,64 @@ @RequestMapping("/api/messages") @RequiredArgsConstructor public class MessageController { - - private final MessageService messageService; - - @PostMapping - public ResponseEntity createMessage( - @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, - @RequestPart("file") - MultipartFile file) { - Optional fileRequest = Optional.empty(); - if (file != null && !file.isEmpty()) { - try { - fileRequest = Optional.of(new CreateBinaryContentRequest( - file.getOriginalFilename(), - file.getContentType(), - file.getBytes() - )); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - Message message = messageService.create(createMessageRequest, fileRequest); - return ResponseEntity.ok(message); - } - - @GetMapping - public ResponseEntity> getAllByChannelId( - @RequestParam("channelId") UUID channelId) { - List messages = messageService.findAllByChannelId(channelId); - return ResponseEntity.ok(messages); - } - - @PatchMapping("/{messageId}") // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 - public ResponseEntity update(@PathVariable("messageId") UUID messageId, - @RequestPart("messageRequest") UpdateMessageRequest messageRequest, - @RequestPart("file") MultipartFile file) { - Optional fileRequest = Optional.empty(); - if (file != null && !file.isEmpty()) { - try { - fileRequest = Optional.of(new CreateBinaryContentRequest( - file.getOriginalFilename(), - file.getContentType(), - file.getBytes() - )); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - Message message = messageService.updateMessageContent(messageId, messageRequest, fileRequest); - return ResponseEntity.ok(message); - } - - @DeleteMapping("/{messageId}") - public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { - Message message = messageService.deleteMessage(messageId); - return ResponseEntity.ok( - "메시지 ID: " + message.getId() + - " 삭제가 완료되었습니다." - ); - } +// +// private final MessageService messageService; +// +// @PostMapping +// public ResponseEntity createMessage( +// @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, +// @RequestPart("file") +// MultipartFile file) { +// Optional fileRequest = Optional.empty(); +// if (file != null && !file.isEmpty()) { +// try { +// fileRequest = Optional.of(new CreateBinaryContentRequest( +// file.getOriginalFilename(), +// file.getContentType(), +// file.getBytes() +// )); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } +// +// Message message = messageService.create(createMessageRequest, fileRequest); +// return ResponseEntity.ok(message); +// } +// +// @GetMapping +// public ResponseEntity> getAllByChannelId( +// @RequestParam("channelId") UUID channelId) { +// List messages = messageService.findAllByChannelId(channelId); +// return ResponseEntity.ok(messages); +// } +// +// @PatchMapping("/{messageId}") // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 +// public ResponseEntity update(@PathVariable("messageId") UUID messageId, +// @RequestPart("messageRequest") UpdateMessageRequest messageRequest, +// @RequestPart("file") MultipartFile file) { +// Optional fileRequest = Optional.empty(); +// if (file != null && !file.isEmpty()) { +// try { +// fileRequest = Optional.of(new CreateBinaryContentRequest( +// file.getOriginalFilename(), +// file.getContentType(), +// file.getBytes() +// )); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } +// Message message = messageService.updateMessageContent(messageId, messageRequest, fileRequest); +// return ResponseEntity.ok(message); +// } +// +// @DeleteMapping("/{messageId}") +// public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { +// Message message = messageService.deleteMessage(messageId); +// return ResponseEntity.ok( +// "메시지 ID: " + message.getId() + +// " 삭제가 완료되었습니다." +// ); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index 1fbc1f7b6..b613c9093 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -16,24 +16,24 @@ @RequestMapping("/api/readStatuses") @RequiredArgsConstructor public class ReadStatusController { - - private final ReadStatusService readStatusService; - - @GetMapping - public ResponseEntity> getStatusesByUserId(@RequestParam("userId") UUID userID) { - List allByUserId = readStatusService.findAllByUserId(userID); - return ResponseEntity.ok(allByUserId); - } - - @PostMapping - public ResponseEntity createReadStatus(@RequestBody CreateReadStatusRequest request) { - ReadStatus readStatus = readStatusService.create(request); - return ResponseEntity.ok(readStatus); - } - - @PatchMapping - public ResponseEntity update(@PathParam("readStatusId") UUID readStatusId) { - ReadStatus updateReadStatus = readStatusService.update(readStatusId); - return ResponseEntity.ok(updateReadStatus); - } +// +// private final ReadStatusService readStatusService; +// +// @GetMapping +// public ResponseEntity> getStatusesByUserId(@RequestParam("userId") UUID userID) { +// List allByUserId = readStatusService.findAllByUserId(userID); +// return ResponseEntity.ok(allByUserId); +// } +// +// @PostMapping +// public ResponseEntity createReadStatus(@RequestBody CreateReadStatusRequest request) { +// ReadStatus readStatus = readStatusService.create(request); +// return ResponseEntity.ok(readStatus); +// } +// +// @PatchMapping +// public ResponseEntity update(@PathParam("readStatusId") UUID readStatusId) { +// ReadStatus updateReadStatus = readStatusService.update(readStatusId); +// return ResponseEntity.ok(updateReadStatus); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 3bdd343fb..01cce7aee 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -26,75 +26,75 @@ @RequiredArgsConstructor @Slf4j public class UserController { - - private final UserService userService; - private final UserStatusService userStatusService; - - @PostMapping - public ResponseEntity createUser( - @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, - @RequestPart(value = "profile", required = false) MultipartFile profile) { - - Optional profileRequest = Optional.empty(); - if (profile != null && !profile.isEmpty()) { - try { - profileRequest = Optional.of(new CreateBinaryContentRequest( - profile.getOriginalFilename(), - profile.getContentType(), - profile.getBytes() - )); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - UserDTO createdUser = userService.create(userCreateRequest, profileRequest); - log.info(createdUser.getName() + "님 환영합니다. 회원가입이 완료되었습니다."); - return ResponseEntity - .status(HttpStatus.CREATED) - .body(createdUser); - } - - @GetMapping - public ResponseEntity> findAllUsers() { - List all = userService.findAll(); - return ResponseEntity.ok(all); - } - - @PatchMapping("/{userId}") - public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, - @RequestPart("updateUserRequest") UpdateUserRequest updateUserRequest, - @RequestPart(value = "profile", required = false) MultipartFile profile) { - Optional profileRequest = Optional.empty(); - if (profile != null && !profile.isEmpty()) { - try { - profileRequest = Optional.of(new CreateBinaryContentRequest( - profile.getOriginalFilename(), - profile.getContentType(), - profile.getBytes() - )); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - User updateUser = userService.update(userId, updateUserRequest, profileRequest); - log.info("회원 수정이 완료되었습니다"); - return ResponseEntity.ok(updateUser); - } - - @PatchMapping("/{userId}/userStatus") - public ResponseEntity updateUserStatus(@PathVariable("userId") UUID userId) { - UserStatus userStatus = userStatusService.updateByUserId(userId); - return ResponseEntity.ok(userStatus); - } - - @DeleteMapping - public ResponseEntity deleteUser(@RequestParam("id") UUID id) { - UserDTO delete = userService.delete(id); - return ResponseEntity.ok( - "Delete user ID: " + delete.getId() + - " name: " + delete.getName() + - " delete complete!" - ); - } +// +// private final UserService userService; +// private final UserStatusService userStatusService; +// +// @PostMapping +// public ResponseEntity createUser( +// @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, +// @RequestPart(value = "profile", required = false) MultipartFile profile) { +// +// Optional profileRequest = Optional.empty(); +// if (profile != null && !profile.isEmpty()) { +// try { +// profileRequest = Optional.of(new CreateBinaryContentRequest( +// profile.getOriginalFilename(), +// profile.getContentType(), +// profile.getBytes() +// )); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } +// +// UserDTO createdUser = userService.create(userCreateRequest, profileRequest); +// log.info(createdUser.getName() + "님 환영합니다. 회원가입이 완료되었습니다."); +// return ResponseEntity +// .status(HttpStatus.CREATED) +// .body(createdUser); +// } +// +// @GetMapping +// public ResponseEntity> findAllUsers() { +// List all = userService.findAll(); +// return ResponseEntity.ok(all); +// } +// +// @PatchMapping("/{userId}") +// public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, +// @RequestPart("updateUserRequest") UpdateUserRequest updateUserRequest, +// @RequestPart(value = "profile", required = false) MultipartFile profile) { +// Optional profileRequest = Optional.empty(); +// if (profile != null && !profile.isEmpty()) { +// try { +// profileRequest = Optional.of(new CreateBinaryContentRequest( +// profile.getOriginalFilename(), +// profile.getContentType(), +// profile.getBytes() +// )); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } +// User updateUser = userService.update(userId, updateUserRequest, profileRequest); +// log.info("회원 수정이 완료되었습니다"); +// return ResponseEntity.ok(updateUser); +// } +// +// @PatchMapping("/{userId}/userStatus") +// public ResponseEntity updateUserStatus(@PathVariable("userId") UUID userId) { +// UserStatus userStatus = userStatusService.updateByUserId(userId); +// return ResponseEntity.ok(userStatus); +// } +// +// @DeleteMapping +// public ResponseEntity deleteUser(@RequestParam("id") UUID id) { +// UserDTO delete = userService.delete(id); +// return ResponseEntity.ok( +// "Delete user ID: " + delete.getId() + +// " name: " + delete.getName() + +// " delete complete!" +// ); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java index 923ce62b5..4f447b3fb 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java @@ -14,11 +14,11 @@ @RequiredArgsConstructor public class UserStatusController { - private final UserStatusService userStatusService; - - @GetMapping - public ResponseEntity> getAll() { - List all = userStatusService.findAll(); - return ResponseEntity.ok(all); - } +// private final UserStatusService userStatusService; +// +// @GetMapping +// public ResponseEntity> getAll() { +// List all = userStatusService.findAll(); +// return ResponseEntity.ok(all); +// } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java new file mode 100644 index 000000000..d93f08126 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.binarycontent; + +public record BinaryContentCreateRequest( + String fileName, + String contentType, + byte[] bytes +) { +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java index c21e68d25..75bc1ee52 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java @@ -3,7 +3,8 @@ public record CreateBinaryContentRequest( String fileName, String contentType, - byte[] bytes + byte[] bytes, + Long size ) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java index bc1b7aa8f..16bd3d8c8 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java @@ -14,7 +14,7 @@ public class CreateChannel { @NoArgsConstructor public static class PrivateRequest { - private List joinUser; + private List participantIds; } @Getter diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java index 80b40d75a..c8610d4b4 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java @@ -2,6 +2,6 @@ import java.util.UUID; -public record UpdatePublicChannel(String name, String description, UUID newUserID) { +public record UpdatePublicChannel(String name, String description) { } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java index 8521a48a7..cd41b8454 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.dto.user; import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import lombok.*; @@ -16,6 +17,7 @@ public class UserDTO { @NotEmpty private String username; + @Email @NotEmpty private String email; diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java deleted file mode 100644 index 78caac379..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/CreateUserStatusRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sprint.mission.discodeit.dto.userstatus; - -import java.time.Instant; -import java.util.UUID; - -public record CreateUserStatusRequest(UUID userID, Instant lastActiveAt) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index b251321f5..9b12c534a 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -20,4 +20,8 @@ public class Channel extends BaseUpdateEntity { private String name; private String description; + public void update(String name, String description) { + this.name = name; + this.description = description; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index fe3bc73da..99eb9f157 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -6,6 +6,7 @@ import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import lombok.*; +import org.hibernate.annotations.Cascade; @Entity @Table(name = "messages") @@ -17,7 +18,7 @@ public class Message extends BaseUpdateEntity { private String content; - @ManyToOne + @ManyToOne(cascade = CascadeType.ALL) @NotNull private Channel channel; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java index 1d55ab784..ddbca57dd 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -18,9 +18,13 @@ public class ReadStatus extends BaseUpdateEntity { // 사용자가 채널 별 @ManyToOne @JoinColumn(unique = true) private User user; - @ManyToOne + @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(unique = true) private Channel channel; @Column(nullable = false) private Instant lastReadAt; + + public void updateLastReadTime() { + this.lastReadAt = Instant.now(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index a705b6d68..7c096e785 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,6 +1,8 @@ package com.sprint.mission.discodeit.entity; import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import jakarta.persistence.*; import jakarta.validation.Valid; import jakarta.validation.constraints.Email; @@ -29,4 +31,28 @@ public class User extends BaseUpdateEntity { @OneToOne(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true) private UserStatus status; + + public void setStatus(UserStatus status) { + this.status = status; + } + + public void updatePassword(String oldPassword, String newPassword) { + if (newPassword.equals(this.password)) { + throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); + } + + if (!oldPassword.equals(this.password)) { + throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); + } + + if (newPassword.equals(oldPassword)) { + throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); + } + + this.password = newPassword; + } + + public void updateProfile(BinaryContent profile) { + this.profile = profile; + } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index ad5ed2031..091877862 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -21,4 +21,8 @@ public class UserStatus extends BaseUpdateEntity { // 사용자 별 마지막으 private User user; private Instant lastActiveAt; + + public void update() { + this.lastActiveAt = Instant.now(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java index 3c43beae9..3033f25f8 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -32,8 +32,10 @@ public enum ErrorCode { PASSWORD_MISMATCH(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다"), USERNAME_MISMATCH(HttpStatus.UNAUTHORIZED, "이름이 일치하지 않습니다"), - CHANNEL_TYPE_MISMATCH(HttpStatus.BAD_REQUEST, "채널 타입이 일치하지 않습니다"); + CHANNEL_TYPE_MISMATCH(HttpStatus.BAD_REQUEST, "채널 타입이 일치하지 않습니다"), + SAME_AS_OLD_PASSWORD(HttpStatus.BAD_REQUEST, "이전 비밀번호와 동일한 비밀번호입니다"), + CANNOT_MODIFY_PRIVATE_CHANNEL(HttpStatus.BAD_REQUEST, "Private 채널은 수정할 수 없습니다"); private final HttpStatus status; private final String description; } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java index 48f301741..f165fc947 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java @@ -47,7 +47,7 @@ public String exceptCommon(Exception ex) { @ExceptionHandler(NoHandlerFoundException.class) public ResponseEntity notFound(NoHandlerFoundException ex) { log.error("404 Error: " + ex.getMessage()); - return new ResponseEntity<>("custom404", HttpStatus.NOT_FOUND); + return new ResponseEntity<>("404", HttpStatus.NOT_FOUND); } // 객체 바인딩 예외 처리 diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index a0828813b..1b0300edb 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index ad2abcff6..cd6ff2842 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,20 +1,18 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentCreateRequest; import com.sprint.mission.discodeit.entity.BinaryContent; -import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; import java.util.UUID; public interface BinaryContentService { - BinaryContent saveFile(MultipartFile file) throws IOException; + BinaryContent create(BinaryContentCreateRequest request) throws IOException; - BinaryContent find(UUID id); + BinaryContent find(UUID binaryContentId); - List findAllByIdIn(List uuidList); - - List findAll(); + List findAllByIdIn(List binaryContentIds); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index 04089408a..fb9601faa 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,6 +1,6 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.PublicChannel; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; import com.sprint.mission.discodeit.dto.channel.CreateChannel; import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; @@ -9,18 +9,16 @@ public interface ChannelService { - Channel createPublicChannel(CreateChannel.PublicRequest request); + ChannelDTO createPublicChannel(CreateChannel.PublicRequest request); - Channel createPrivateChannel(CreateChannel.PrivateRequest request); + ChannelDTO createPrivateChannel(CreateChannel.PrivateRequest request); - List findAllPrivate(UUID userId); + ChannelDTO find(UUID channelId); - List findAllPublic(); + List findAllByUserId(UUID userId); - List findAll(); + ChannelDTO update(UUID channelId, UpdatePublicChannel request); - PublicChannel update(UUID channelId, UpdatePublicChannel request); - - Channel delete(UUID channelId); + void delete(UUID channelId); } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 3ca98d282..0948b1c22 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -12,14 +12,13 @@ public interface MessageService { Message create(CreateMessageRequest messageRequest, - Optional binaryContentRequest); + List binaryContentRequests); - List findAllByChannelId(UUID channelID); + Message find(UUID messageId); - List getAllMessage(); + List findAllByChannelId(UUID channelID); - Message updateMessageContent(UUID messageId, UpdateMessageRequest request, - Optional binaryContentRequest); + Message update(UUID messageId, UpdateMessageRequest request; - Message deleteMessage(UUID messageID); + void delete(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index 116d2754a..0f3ee7852 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.service; +import com.sprint.mission.discodeit.dto.readstatus.ReadStatusDTO; import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; @@ -8,15 +9,15 @@ public interface ReadStatusService { - ReadStatus create(CreateReadStatusRequest request); + ReadStatusDTO create(CreateReadStatusRequest request); - ReadStatus find(UUID id); + ReadStatusDTO find(UUID id); - List findAllByUserId(UUID userID); + List findAllByUserId(UUID userID); - List updateByChannelId(UUID channelId); + List updateByChannelId(UUID channelId); - ReadStatus update(UUID id); + ReadStatusDTO update(UUID id); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 9770658ec..3face69b3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -19,8 +19,8 @@ UserDTO create(CreateUserRequest request, List findAll(); - User update(UUID userId, UpdateUserRequest updateUserRequest, + UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, Optional binaryContentRequest); - UserDTO delete(UUID id); + void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index c33ef3e98..5e8c37d70 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -1,21 +1,20 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.UserStatus; -import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; +import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; import java.util.List; import java.util.UUID; public interface UserStatusService { - UserStatus create(CreateUserStatusRequest request); + UserStatusDTO create(UUID userId); - UserStatus find(UUID id); + UserStatusDTO find(UUID id); - UserStatus findByUserId(UUID userID); + UserStatusDTO findByUserId(UUID userID); - List findAll(); + List findAll(); - UserStatus updateByUserId(UUID userId); + UserStatusDTO updateByUserId(UUID userId); void delete(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index f75d1decb..89dd1f0b1 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -7,6 +7,7 @@ import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; @Service @@ -14,15 +15,16 @@ public class BasicAuthService { private final UserRepository userRepository; - + private final ModelMapper modelMapper; + public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 - User findUser = userRepository.findByName(request.username()) + User findUser = userRepository.findByUsername(request.username()) .orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } - return UserDTO.fromDomain(findUser); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + return modelMapper.map(findUser, UserDTO.class); // 비밀번호를 보여주지 않기 위해서 DTO 사용 } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index 8956f656c..eeb2aee79 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentCreateRequest; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; @@ -20,7 +21,8 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; @Override - public BinaryContent saveFile(MultipartFile file) throws IOException { + public BinaryContent create(BinaryContentCreateRequest request) throws IOException { + if (file.isEmpty()) { throw new IllegalArgumentException("파일이 비어 있습니다."); } @@ -45,11 +47,6 @@ public List findAllByIdIn(List uuidList) { return binaryContentRepository.findAllIdIn(uuidList); } - @Override - public List findAll() { - return binaryContentRepository.findAll(); - } - @Override public void delete(UUID id) { binaryContentRepository.deleteById(id); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index defbc002f..f67f2c35e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,8 +1,9 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.entity.*; import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; @@ -11,14 +12,15 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import java.time.Instant; import java.util.List; -import java.util.Optional; +import java.util.NoSuchElementException; import java.util.UUID; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -30,113 +32,87 @@ public class BasicChannelService implements ChannelService { private final ReadStatusRepository readStatusRepository; private final MessageRepository messageRepository; private final UserRepository userRepository; + private final ModelMapper modelMapper; + @Transactional @Override - public Channel createPublicChannel(CreateChannel.PublicRequest request) { - Channel channel = new PublicChannel(request.getName(), request.getDescription()); - channelRepository.save(channel); - return channel; - } + public ChannelDTO createPublicChannel(CreateChannel.PublicRequest request) { + Channel channel = Channel.builder() + .type(ChannelType.PUBLIC) + .name(request.getName()) + .description(request.getDescription()) + .build(); - @Override - public Channel createPrivateChannel(CreateChannel.PrivateRequest request) { - List users = request.getJoinUser(); - - // User가 UserRepository에 저장되어 있는지 확인 - for (UUID userID : users) { - Optional userOptional = userRepository.findById(userID); - if (userOptional.isEmpty()) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - } - // Private 채널 생성 후 저장 - Channel channel = new PrivateChannel(users); channelRepository.save(channel); - // User마다 ReadStatus 생성하기 - for (UUID userID : users) { - Instant lastReadAt = Instant.now(); - ReadStatus readStatus = new ReadStatus(userID, channel.getId(), lastReadAt); - readStatusRepository.save(readStatus); - } - - return channel; - } - - @Override - public List findAllPrivate(UUID userId) { - validUser(userId); - List allChannels = channelRepository.findAll(); - - // PrivateChannel 타입 필터링 및 joinMembers에 userId가 있는지 확인 - return allChannels.stream() - .filter(channel -> channel instanceof PrivateChannel) - .map(channel -> (PrivateChannel) channel) - .filter(privateChannel -> privateChannel.getJoinMembers().contains(userId)) - .collect(Collectors.toList()); + return modelMapper.map(channel, ChannelDTO.class); } + @Transactional @Override - public List findAllPublic() { - List allChannels = channelRepository.findAll(); + public ChannelDTO createPrivateChannel(CreateChannel.PrivateRequest request) { + Channel channel = new Channel(ChannelType.PRIVATE, null, null); + Channel createdChannel = channelRepository.save(channel); - // PrivateChannel 타입 필터링 및 joinMembers에 userId가 있는지 확인 - return allChannels.stream() - .filter(channel -> channel instanceof PublicChannel) - .collect(Collectors.toList()); - } + List readStatuses = request.getParticipantIds().stream() + .map(userId -> { + User user = userRepository.findById(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + return new ReadStatus(user, createdChannel, createdChannel.getCreatedAt()); + }) + .toList(); - @Override - public List findAll() { - return channelRepository.findAll(); + readStatusRepository.saveAll(readStatuses); + + return modelMapper.map(createdChannel, ChannelDTO.class); } + @Transactional(readOnly = true) @Override - public PublicChannel update(UUID channelId, - UpdatePublicChannel request) { // 채널에 새로운 유저 참여, 채널 이름, 설명 수정 가능 - validChannel(channelId); - validUser(request.newUserID()); - - PublicChannel updateChannel = (PublicChannel) channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - updateChannel.update(request.name(), request.description(), request.newUserID()); + public ChannelDTO find(UUID channelId) { + Channel channel = channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - channelRepository.save(updateChannel); - return updateChannel; + return modelMapper.map(channel, ChannelDTO.class); } + @Transactional(readOnly = true) @Override - public Channel delete(UUID channelId) { - validChannel(channelId); - - Channel removeChannel = channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - // 채널에 포함된 메시지 삭제하기 - List messages = messageService.findAllByChannelId(channelId); - if (!messages.isEmpty()) { - messages.forEach(message -> messageRepository.delete(message)); - } + public List findAllByUserId(UUID userId) { + List mySubscribedChannelIds = readStatusRepository.findAllByUserId(userId).stream() + .map(readStatus -> readStatus.getChannel().getId()) + .toList(); + + List list = channelRepository.findAll().stream() + .filter(channel -> + channel.getType().equals(ChannelType.PUBLIC) + || mySubscribedChannelIds.contains(channel.getId()) + ) + .toList(); + + return list.stream().map(channel -> modelMapper.map(channel, ChannelDTO.class)).toList(); + } - if (removeChannel instanceof PrivateChannel) { - // 채널에 포함된 ReadStatus 삭제하기 - List readStatuses = readStatusRepository.findAllByChannelId(channelId); - readStatusRepository.deleteAll(readStatuses); + @Transactional + @Override + public ChannelDTO update(UUID channelId, UpdatePublicChannel request) { + Channel channel = channelRepository.findById(channelId) + .orElseThrow( + () -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + if (channel.getType().equals(ChannelType.PRIVATE)) { + throw new ServiceException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); } + channel.update(request.name(), request.description()); - channelRepository.delete(removeChannel); - return removeChannel; + return modelMapper.map(channel, ChannelDTO.class); } - // 채널 검증 - private void validChannel(UUID channelId) { - channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - } + @Transactional + @Override + public void delete(UUID channelId) { + Channel channel = channelRepository.findById(channelId) + .orElseThrow( + () -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - // 유저 검증 - private void validUser(UUID userId) { - userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + channelRepository.delete(channel); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 155633064..f2a7f58e9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -30,99 +30,29 @@ public class BasicMessageService implements MessageService { @Override public Message create(CreateMessageRequest messageRequest, - Optional binaryContentRequest) { - if (messageRequest.content().isEmpty()) { - throw new ServiceException(ErrorCode.EMPTY_CONTENT); - } + List binaryContentRequest) { - // 작성자와 채널에 대한 검증 - validUser(messageRequest.userId()); - validChannel(messageRequest.channelId()); - - BinaryContent file = null; - if (binaryContentRequest.isPresent()) { - CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); - - file = new BinaryContent(contentRequest.bytes(), contentRequest.contentType(), - contentRequest.fileName()); - - binaryContentRepository.save(file); - } + } - Message message = new Message(messageRequest.content(), messageRequest.userId(), - messageRequest.channelId()); - message.getAttachmentsID().add(file.getId()); - messageRepository.save(message); - return message; + @Override + public Message find(UUID messageId) { + return null; } @Override public List findAllByChannelId(UUID channelID) { - validChannel(channelID); - return messageRepository.findByChannelId(channelID); } - @Override - public List getAllMessage() { - return messageRepository.findAll(); - } @Override - public Message updateMessageContent(UUID messageId, UpdateMessageRequest request, - Optional binaryContentRequest) { - validMessage(messageId); - - Message message = messageRepository.findById(messageId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - - BinaryContent file = null; - if (binaryContentRequest.isPresent()) { - CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); - - file = new BinaryContent(contentRequest.bytes(), contentRequest.contentType(), - contentRequest.fileName()); + public Message update(UUID messageId, UpdateMessageRequest request) { - binaryContentRepository.save(file); - } - - message.update(request.newContent(), file.getId()); - - return messageRepository.save(message); } @Override - public Message deleteMessage(UUID messageID) { - Message deleteMessage = messageRepository.findById(messageID) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - - List attachmentsID = deleteMessage.getAttachmentsID(); - if (attachmentsID != null && !attachmentsID.isEmpty()) { - attachmentsID.forEach(id -> { - binaryContentRepository.findById(id) - .ifPresent(binaryContent -> binaryContentRepository.deleteById(id)); - }); - } - - Message delete = messageRepository.delete(deleteMessage); - return delete; - } - - private void validUser(UUID userId) { - if (!userRepository.existsById(userId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - } - - private void validChannel(UUID channelId) { - if (!channelRepository.channelExistById(channelId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); - } - } + public void delete(UUID messageID) { - private void validMessage(UUID messageId) { - messageRepository.findById(messageId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index b18406471..5029c198e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -1,7 +1,10 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.readstatus.ReadStatusDTO; +import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; @@ -9,11 +12,15 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ReadStatusService; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -22,84 +29,101 @@ public class BasicReadStatusService implements ReadStatusService { private final UserRepository userRepository; private final ChannelRepository channelRepository; private final ReadStatusRepository readStatusRepository; + private final ModelMapper modelMapper; + @Transactional @Override - public ReadStatus create(CreateReadStatusRequest request) { - // User와 Channel 검증하기 - validUser(request.userId()); - validChannel(request.channelId()); + public ReadStatusDTO create(CreateReadStatusRequest request) { + User user = userRepository.findById(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + Channel channel = channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); List readStatuses = readStatusRepository.findAllByUserId(request.userId()); boolean exists = readStatuses.stream() - .anyMatch(readStatus -> readStatus.getChannelId().equals(request.channelId())); + .anyMatch(readStatus -> readStatus.getChannel().getId().equals(request.channelId())); if (exists) { throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); } Instant lastReadAt = Instant.now(); - ReadStatus readStatus = new ReadStatus(request.userId(), request.channelId(), lastReadAt); + ReadStatus readStatus = ReadStatus.builder() + .user(user) + .channel(channel) + .lastReadAt(lastReadAt) + .build(); + readStatusRepository.save(readStatus); - return readStatus; + return modelMapper.map(readStatus, ReadStatusDTO.class); } + @Transactional(readOnly = true) @Override - public ReadStatus find(UUID id) { - return readStatusRepository.findById(id) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + public ReadStatusDTO find(UUID id) { + ReadStatus readStatus = readStatusRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); + + return modelMapper.map(readStatus, ReadStatusDTO.class); } + @Transactional(readOnly = true) @Override - public List findAllByUserId(UUID userID) { + public List findAllByUserId(UUID userID) { validUser(userID); - return readStatusRepository.findAllByUserId(userID); + List allByUserId = readStatusRepository.findAllByUserId(userID); + + return allByUserId.stream() + .map(readStatus -> modelMapper.map(readStatus, ReadStatusDTO.class)) + .collect(Collectors.toList()); } /* User가 채널에서 메시지를 읽은 시간을 업데이트 */ + @Transactional @Override - public List updateByChannelId(UUID channelId) { + public List updateByChannelId(UUID channelId) { validChannel(channelId); // 채널에 해당하는 ReadStatus 목록을 가져옴 List readStatuses = readStatusRepository.findAllByChannelId(channelId); // 모든 ReadStatus의 'lastReadTime'을 업데이트 - readStatuses.forEach(readStatus -> readStatus.updateLastReadTime(Instant.now())); - - // 모든 수정된 ReadStatus 저장 - readStatusRepository.saveAll(readStatuses); + readStatuses.forEach(readStatus -> readStatus.updateLastReadTime()); - return readStatuses; + return readStatuses.stream() + .map(readStatus -> modelMapper.map(readStatus, ReadStatusDTO.class)) + .collect(Collectors.toList()); } + @Transactional @Override - public ReadStatus update(UUID id) { + public ReadStatusDTO update(UUID id) { ReadStatus readStatus = readStatusRepository.findById(id) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - readStatus.updateLastReadTime(Instant.now()); + readStatus.updateLastReadTime(); readStatusRepository.save(readStatus); - return readStatus; + return modelMapper.map(readStatus, ReadStatusDTO.class); } - + @Transactional @Override public void delete(UUID id) { - ReadStatus readStatus = readStatusRepository.findById(id) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - readStatusRepository.delete(readStatus); + Optional.ofNullable(readStatusRepository.findById(id)) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)) + .ifPresent(readStatusRepository::delete); } private void validUser(UUID userId) { - userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + if (!userRepository.existsById(userId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } } private void validChannel(UUID channelId) { - channelRepository.findById(channelId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + if (!channelRepository.existsById(channelId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + } } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index d070750f0..cb63fff0c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -13,8 +13,11 @@ import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; import java.util.Optional; + import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; @@ -30,7 +33,9 @@ public class BasicUserService implements UserService { private final BinaryContentRepository binaryContentRepository; private final UserStatusRepository userStatusRepository; private final UserStatusService userStatusService; + private final ModelMapper modelMapper; + @Transactional @Override public UserDTO create(CreateUserRequest request, Optional binaryContentRequest) { @@ -38,7 +43,7 @@ public UserDTO create(CreateUserRequest request, throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); }); - userRepository.findByName(request.username()).ifPresent(x -> { + userRepository.findByUsername(request.username()).ifPresent(x -> { throw new ServiceException(ErrorCode.DUPLICATE_NAME); }); @@ -46,87 +51,102 @@ public UserDTO create(CreateUserRequest request, if (binaryContentRequest.isPresent()) { CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); - profile = new BinaryContent(contentRequest.bytes(), contentRequest.contentType(), - contentRequest.fileName()); + profile = BinaryContent.builder() + .bytes(contentRequest.bytes()) + .contentType(contentRequest.contentType()) + .fileName(contentRequest.fileName()) + .size(contentRequest.size()) + .build(); binaryContentRepository.save(profile); } - // 프로필이 없을 경우에도 null로 처리 - User createdUser = new User(request.username(), request.email(), request.password(), - profile != null ? profile.getId() : null, null); - userRepository.save(createdUser); + User createdUser = User.builder() + .username(request.username()) + .email(request.email()) + .password(request.password()) + .profile(profile) + .build(); Instant lastActiveAt = Instant.now(); - UserStatus userStatus = new UserStatus(createdUser.getId(), lastActiveAt); - createdUser.setUserStatusId(userStatus.getId()); + UserStatus userStatus = UserStatus.builder() + .user(createdUser) + .lastActiveAt(lastActiveAt) + .build(); + createdUser.setStatus(userStatus); - userStatusRepository.save(userStatus); + userRepository.save(createdUser); - return UserDTO.fromDomain(createdUser); + return modelMapper.map(createdUser, UserDTO.class); } + @Transactional(readOnly = true) @Override public UserDTO find(UUID userId) { User findUser = userRepository.findById(userId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); UserStatus status = userStatusRepository.findByUserId(findUser.getId()) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - return UserDTO.fromDomain(findUser); + return modelMapper.map(findUser, UserDTO.class); } + @Transactional(readOnly = true) @Override public List getOnlineUsers() { List onlineUserIds = userStatusRepository.findByIsOnlineTrue().stream() - .map(UserStatus::getUserId) + .map(userStatus -> userStatus.getUser().getId()) .toList(); return userRepository.findAllById(onlineUserIds).stream() - .map(UserDTO::fromDomain) + .map(user -> modelMapper.map(user, UserDTO.class)) .toList(); } + @Transactional(readOnly = true) @Override public List findAll() { return userRepository.findAll().stream() - .map(UserDTO::fromDomain) + .map(user -> modelMapper.map(user, UserDTO.class)) .collect(Collectors.toList()); } + @Transactional @Override - public User update(UUID userId, UpdateUserRequest updateUserRequest, + public UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, Optional binaryContentRequest) { + User findUser = userRepository.findById(userId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + findUser.updatePassword(updateUserRequest.oldPassword(), updateUserRequest.newPassword()); - if (binaryContentRequest.isPresent()) { - if (findUser.getProfileImageId() != null) { // 이미 프로필이 등록되어 있다면 기존 프로필은 삭제 - binaryContentRepository.deleteById(findUser.getProfileImageId()); + + binaryContentRequest.ifPresent(contentRequest -> { + BinaryContent newProfile = BinaryContent.builder() + .size(contentRequest.size()) + .bytes(contentRequest.bytes()) + .contentType(contentRequest.contentType()) + .fileName(contentRequest.fileName()) + .build(); + + binaryContentRepository.save(newProfile); + + if (findUser.getProfile() != null) { + binaryContentRepository.delete(findUser.getProfile()); } - CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); - BinaryContent profile = new BinaryContent(contentRequest.bytes(), - contentRequest.contentType(), - contentRequest.fileName()); + findUser.updateProfile(newProfile); - binaryContentRepository.save(profile); - findUser.updateProfile(findUser.getProfileImageId(), profile.getId()); - } - return findUser; + }); + + return modelMapper.map(findUser, UserDTO.class); } + @Transactional @Override - public UserDTO delete(UUID id) { + public void delete(UUID id) { User deleteUser = userRepository.findById(id) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - if (deleteUser.getProfileImageId() != null) { // 만약 프로필이 등록되어 있다면 해당 프로필도 같이 삭제 - binaryContentRepository.deleteById(deleteUser.getProfileImageId()); - } - userStatusRepository.deleteByUserId(deleteUser.getId()); // UserStatus 도 같이 삭제 - - userRepository.delete(id); - - return UserDTO.fromDomain(deleteUser); + userRepository.deleteById(id); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index bbf660c76..25d43ebd4 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -1,66 +1,93 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; import com.sprint.mission.discodeit.entity.UserStatus; -import com.sprint.mission.discodeit.dto.userstatus.CreateUserStatusRequest; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class BasicUserStatusService implements UserStatusService { private final UserStatusRepository userStatusRepository; private final UserRepository userRepository; + private final ModelMapper modelMapper; + @Transactional @Override - public UserStatus create(CreateUserStatusRequest request) { - validUser(request.userID()); + public UserStatusDTO create(UUID userId) { + validUser(userId); - userStatusRepository.findByUserId(request.userID()) + userStatusRepository.findByUserId(userId) .ifPresent(userStatus -> { throw new ServiceException(ErrorCode.ALREADY_EXIST_USERSTAUTS); }); - UserStatus userStatus = new UserStatus(request.userID(), request.lastActiveAt()); + UserStatusDTO userStatusDTO = UserStatusDTO.builder() + .userId(userId) + .lastActiveAt(Instant.now()) + .build(); + + UserStatus userStatus = modelMapper.map(userStatusDTO, UserStatus.class); userStatusRepository.save(userStatus); - return userStatus; + return userStatusDTO; } + @Transactional(readOnly = true) @Override - public UserStatus find(UUID id) { - UserStatus userStatus = userStatusRepository.findById(id).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - return userStatusRepository.save(userStatus); + public UserStatusDTO find(UUID id) { + UserStatus userStatus = userStatusRepository.findById(id) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + + return modelMapper.map(userStatus, UserStatusDTO.class); } + @Transactional(readOnly = true) @Override - public UserStatus findByUserId(UUID userID) { - UserStatus userStatus = userStatusRepository.findByUserId(userID).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - return userStatusRepository.save(userStatus); + public UserStatusDTO findByUserId(UUID userId) { + validUser(userId); + + UserStatus userStatus = userStatusRepository.findByUserId(userId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); + + return modelMapper.map(userStatus, UserStatusDTO.class); } + @Transactional(readOnly = true) @Override - public List findAll() { - return userStatusRepository.findAll(); + public List findAll() { + List userStatusList = userStatusRepository.findAll(); + + // UserStatus 리스트를 UserStatusDTO 리스트로 변환 + return userStatusList.stream() + .map(userStatus -> modelMapper.map(userStatus, UserStatusDTO.class)) + .collect(Collectors.toList()); } + + @Transactional @Override - public UserStatus updateByUserId(UUID userId) { + public UserStatusDTO updateByUserId(UUID userId) { validUser(userId); UserStatus userStatus = userStatusRepository.findByUserId(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - userStatus.update(Instant.now()); + userStatus.update(); userStatusRepository.save(userStatus); - return userStatus; + return modelMapper.map(userStatus, UserStatusDTO.class); } + @Transactional @Override public void delete(UUID id) { userStatusRepository.deleteById(id); From 0d42775699f073cd03b732a5814a33e84668133e Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 12 Mar 2025 10:15:56 +0900 Subject: [PATCH 091/115] =?UTF-8?q?Service=20=EA=B5=AC=ED=98=84=EC=B2=B4?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/discodeit/entity/Message.java | 5 ++ .../service/BinaryContentService.java | 10 +-- .../discodeit/service/MessageService.java | 13 ++- .../discodeit/service/ReadStatusService.java | 6 +- .../discodeit/service/UserService.java | 2 +- .../discodeit/service/UserStatusService.java | 6 +- .../basic/BasicBinaryContentService.java | 52 +++++++---- .../service/basic/BasicChannelService.java | 6 -- .../service/basic/BasicMessageService.java | 89 ++++++++++++++++--- .../service/basic/BasicReadStatusService.java | 12 +-- .../service/basic/BasicUserService.java | 6 +- .../service/basic/BasicUserStatusService.java | 8 +- src/main/resources/application.yml | 1 + 13 files changed, 149 insertions(+), 67 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 99eb9f157..d33aaa647 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -32,5 +32,10 @@ public class Message extends BaseUpdateEntity { inverseJoinColumns = @JoinColumn(name = "attachment_id") // `BinaryContent` 테이블 외래 키 ) @Builder.Default + @Cascade(org.hibernate.annotations.CascadeType.ALL) private List attachments; + + public void update(String newContent) { + this.content = newContent; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index cd6ff2842..f0cf702b8 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,18 +1,18 @@ package com.sprint.mission.discodeit.service; import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentCreateRequest; -import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; import java.io.IOException; import java.util.List; import java.util.UUID; public interface BinaryContentService { - BinaryContent create(BinaryContentCreateRequest request) throws IOException; + BinaryContentDTO create(BinaryContentCreateRequest request) throws IOException; - BinaryContent find(UUID binaryContentId); + BinaryContentDTO find(UUID binaryContentId); - List findAllByIdIn(List binaryContentIds); + List findAllByIdIn(List binaryContentIds); - void delete(UUID id); + void delete(UUID binaryContentId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 0948b1c22..a395f71d2 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,24 +1,23 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.dto.message.MessageDTO; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface MessageService { - Message create(CreateMessageRequest messageRequest, - List binaryContentRequests); + MessageDTO create(CreateMessageRequest messageRequest, + List binaryContentRequests); - Message find(UUID messageId); + MessageDTO find(UUID messageId); - List findAllByChannelId(UUID channelID); + List findAllByChannelId(UUID channelID); - Message update(UUID messageId, UpdateMessageRequest request; + MessageDTO update(UUID messageId, UpdateMessageRequest request); void delete(UUID messageID); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index 0f3ee7852..db84a9561 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -11,13 +11,13 @@ public interface ReadStatusService { ReadStatusDTO create(CreateReadStatusRequest request); - ReadStatusDTO find(UUID id); + ReadStatusDTO find(UUID readStatusId); List findAllByUserId(UUID userID); List updateByChannelId(UUID channelId); - ReadStatusDTO update(UUID id); + ReadStatusDTO update(UUID readStatusId); - void delete(UUID id); + void delete(UUID readStatusId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 3face69b3..4208294cc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -22,5 +22,5 @@ UserDTO create(CreateUserRequest request, UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, Optional binaryContentRequest); - void delete(UUID id); + void delete(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index 5e8c37d70..9c3068d25 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -8,13 +8,13 @@ public interface UserStatusService { UserStatusDTO create(UUID userId); - UserStatusDTO find(UUID id); + UserStatusDTO find(UUID userStatusId); - UserStatusDTO findByUserId(UUID userID); + UserStatusDTO findByUserId(UUID userId); List findAll(); UserStatusDTO updateByUserId(UUID userId); - void delete(UUID id); + void delete(UUID userStatusId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index eeb2aee79..064908635 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,14 +1,16 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.List; @@ -19,36 +21,48 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; + private final ModelMapper modelMapper; + @Transactional @Override - public BinaryContent create(BinaryContentCreateRequest request) throws IOException { + public BinaryContentDTO create(BinaryContentCreateRequest request) throws IOException { + String filename = request.fileName(); + byte[] bytes = request.bytes(); + String contentType = request.contentType(); + BinaryContent binaryContent = BinaryContent.builder() + .fileName(filename) + .contentType(contentType) + .bytes(bytes) + .size((long) bytes.length) + .build(); - if (file.isEmpty()) { - throw new IllegalArgumentException("파일이 비어 있습니다."); - } + binaryContentRepository.save(binaryContent); - String filename = file.getOriginalFilename(); - byte[] bytes = file.getBytes(); - String contentType = file.getContentType(); - - BinaryContent binaryContent = new BinaryContent(bytes, contentType, filename); - - return binaryContentRepository.save(binaryContent); + return modelMapper.map(binaryContent, BinaryContentDTO.class); } + @Transactional(readOnly = true) @Override - public BinaryContent find(UUID id) { - return binaryContentRepository.findById(id) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + public BinaryContentDTO find(UUID binaryContentId) { + BinaryContent binaryContent = binaryContentRepository.findById(binaryContentId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); + + return modelMapper.map(binaryContent, BinaryContentDTO.class); } + @Transactional(readOnly = true) @Override - public List findAllByIdIn(List uuidList) { - return binaryContentRepository.findAllIdIn(uuidList); + public List findAllByIdIn(List binaryContentIds) { + List binaryContents = binaryContentRepository.findAllIdIn(binaryContentIds); + + return binaryContents.stream() + .map(binaryContent -> modelMapper.map(binaryContent, BinaryContentDTO.class)) + .toList(); } + @Transactional @Override - public void delete(UUID id) { - binaryContentRepository.deleteById(id); + public void delete(UUID binaryContentId) { + binaryContentRepository.deleteById(binaryContentId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index f67f2c35e..15e9b9879 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -7,11 +7,9 @@ import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.service.MessageService; import com.sprint.mission.discodeit.util.type.ChannelType; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; @@ -19,18 +17,14 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.NoSuchElementException; import java.util.UUID; @Service @RequiredArgsConstructor public class BasicChannelService implements ChannelService { - private final MessageService messageService; - private final ChannelRepository channelRepository; private final ReadStatusRepository readStatusRepository; - private final MessageRepository messageRepository; private final UserRepository userRepository; private final ModelMapper modelMapper; diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index f2a7f58e9..30b57a381 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,10 +1,13 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.message.MessageDTO; import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -13,10 +16,11 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Optional; import java.util.UUID; @Service @@ -27,32 +31,97 @@ public class BasicMessageService implements MessageService { private final UserRepository userRepository; private final ChannelRepository channelRepository; private final BinaryContentRepository binaryContentRepository; + private final ModelMapper modelMapper; + @Transactional @Override - public Message create(CreateMessageRequest messageRequest, - List binaryContentRequest) { + public MessageDTO create(CreateMessageRequest messageRequest, + List binaryContentRequest) { + UUID authorId = messageRequest.userId(); + UUID channelId = messageRequest.channelId(); + User user = validAuthor(authorId); + Channel channel = validChannel(channelId); + + List attachments = binaryContentRequest.stream() + .map(attachmentRequest -> { + BinaryContent binaryContent = BinaryContent.builder() + .fileName(attachmentRequest.fileName()) + .size(attachmentRequest.size()) + .contentType(attachmentRequest.contentType()) + .bytes(attachmentRequest.bytes()) + .build(); + return binaryContentRepository.save(binaryContent); + }) + .toList(); + + Message message = Message.builder() + .content(messageRequest.content()) + .channel(channel) + .author(user) + .attachments(attachments) + .build(); + + messageRepository.save(message); + + return modelMapper.map(message, MessageDTO.class); } + @Transactional(readOnly = true) @Override - public Message find(UUID messageId) { - return null; + public MessageDTO find(UUID messageId) { + Message message = messageRepository.findById(messageId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + + return modelMapper.map(message, MessageDTO.class); } + @Transactional(readOnly = true) @Override - public List findAllByChannelId(UUID channelID) { + public List findAllByChannelId(UUID channelID) { + Channel channel = validChannel(channelID); + List messages = messageRepository.findByChannelId(channelID); + return messages.stream() + .map(message -> modelMapper.map(message,MessageDTO.class)) + .toList(); } - + @Transactional @Override - public Message update(UUID messageId, UpdateMessageRequest request) { + public MessageDTO update(UUID messageId, UpdateMessageRequest request) { + String newContent = request.newContent(); - } + Message message = messageRepository.findById(messageId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + + message.update(newContent); + return modelMapper.map(message, MessageDTO.class); + } + @Transactional @Override - public void delete(UUID messageID) { + public void delete(UUID messageId) { + + Message message = messageRepository.findById(messageId) + .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); + + messageRepository.deleteById(messageId); + } + + private User validAuthor(UUID authorId) { + if (!userRepository.existsById(authorId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + } + + return userRepository.findById(authorId).orElse(null); + } + private Channel validChannel(UUID channelId) { + if (!channelRepository.existsById(channelId)) { + throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + } + return channelRepository.findById(channelId).orElse(null); } } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 5029c198e..b02c06104 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -57,8 +57,8 @@ public ReadStatusDTO create(CreateReadStatusRequest request) { @Transactional(readOnly = true) @Override - public ReadStatusDTO find(UUID id) { - ReadStatus readStatus = readStatusRepository.findById(id) + public ReadStatusDTO find(UUID readStatusId) { + ReadStatus readStatus = readStatusRepository.findById(readStatusId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); return modelMapper.map(readStatus, ReadStatusDTO.class); @@ -96,8 +96,8 @@ public List updateByChannelId(UUID channelId) { @Transactional @Override - public ReadStatusDTO update(UUID id) { - ReadStatus readStatus = readStatusRepository.findById(id) + public ReadStatusDTO update(UUID readStatusId) { + ReadStatus readStatus = readStatusRepository.findById(readStatusId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); readStatus.updateLastReadTime(); @@ -109,8 +109,8 @@ public ReadStatusDTO update(UUID id) { @Transactional @Override - public void delete(UUID id) { - Optional.ofNullable(readStatusRepository.findById(id)) + public void delete(UUID readStatusId) { + Optional.ofNullable(readStatusRepository.findById(readStatusId)) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)) .ifPresent(readStatusRepository::delete); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index cb63fff0c..0abe7927e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -143,10 +143,10 @@ public UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, @Transactional @Override - public void delete(UUID id) { - User deleteUser = userRepository.findById(id) + public void delete(UUID userId) { + User deleteUser = userRepository.findById(userId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - userRepository.deleteById(id); + userRepository.deleteById(userId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index 25d43ebd4..8d9ddc40a 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -46,8 +46,8 @@ public UserStatusDTO create(UUID userId) { @Transactional(readOnly = true) @Override - public UserStatusDTO find(UUID id) { - UserStatus userStatus = userStatusRepository.findById(id) + public UserStatusDTO find(UUID userStatusId) { + UserStatus userStatus = userStatusRepository.findById(userStatusId) .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); return modelMapper.map(userStatus, UserStatusDTO.class); @@ -89,8 +89,8 @@ public UserStatusDTO updateByUserId(UUID userId) { @Transactional @Override - public void delete(UUID id) { - userStatusRepository.deleteById(id); + public void delete(UUID userStatusId) { + userStatusRepository.deleteById(userStatusId); } private void validUser(UUID userId) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff7978bec..1b9fc1880 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -15,6 +15,7 @@ logging: driver-class-name: org.postgresql.Driver jpa: + open-in-view: false database-platform: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update From 48f29a7ada332a59a3203daa6089a04f22da66cc Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 12 Mar 2025 13:39:20 +0900 Subject: [PATCH 092/115] =?UTF-8?q?Repository=20Query=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discodeit/DiscodeitApplication.java | 2 + .../mission/discodeit/entity/Message.java | 1 - .../sprint/mission/discodeit/entity/User.java | 2 +- .../mission/discodeit/entity/UserStatus.java | 2 +- .../repository/BinaryContentRepository.java | 7 +- .../repository/ChannelRepository.java | 2 +- .../repository/MessageRepository.java | 3 - .../repository/ReadStatusRepository.java | 4 +- .../discodeit/repository/UserRepository.java | 3 - .../repository/UserStatusRepository.java | 6 +- .../discodeit/service/UserService.java | 2 - .../service/basic/BasicUserService.java | 14 +- src/main/resources/application.yml | 16 +-- .../service/basic/BasicUserServiceTest.java | 136 ++++++++++++++++++ 14 files changed, 157 insertions(+), 43 deletions(-) create mode 100644 src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index b0d3b21a5..4ac4bbb23 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class DiscodeitApplication { public static void main(String[] args) { SpringApplication.run(DiscodeitApplication.class, args); diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index d33aaa647..9e0592899 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -31,7 +31,6 @@ public class Message extends BaseUpdateEntity { joinColumns = @JoinColumn(name = "message_id"), // `Message` 테이블 외래 키 inverseJoinColumns = @JoinColumn(name = "attachment_id") // `BinaryContent` 테이블 외래 키 ) - @Builder.Default @Cascade(org.hibernate.annotations.CascadeType.ALL) private List attachments; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 7c096e785..05e73d582 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -14,7 +14,7 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@ToString +@ToString(exclude = "status") public class User extends BaseUpdateEntity { @Column(nullable = false, unique = true) private String username; diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index 091877862..10364360a 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -14,7 +14,7 @@ @Getter @AllArgsConstructor @NoArgsConstructor -@ToString +@ToString(exclude = "user") public class UserStatus extends BaseUpdateEntity { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 @OneToOne @JoinColumn(name = "user_id") diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 4ca90e5e6..63b0600d0 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -2,11 +2,14 @@ import com.sprint.mission.discodeit.entity.BinaryContent; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; -import java.util.Optional; import java.util.UUID; public interface BinaryContentRepository extends JpaRepository { - List findAllIdIn(List uuidList); + @Query("SELECT b FROM BinaryContent b WHERE b.id IN :ids") + List findAllIdIn(@Param("ids") List ids); + } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index d1b6e9113..26aee0c7c 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -8,5 +8,5 @@ import java.util.UUID; public interface ChannelRepository extends JpaRepository { - boolean channelExistById(UUID channelId); + boolean existsById(UUID id); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index ab9ff4b31..c88d2610d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -11,7 +11,4 @@ public interface MessageRepository extends JpaRepository { List findByChannelId(UUID channelId); - - @Query("SELECT m FROM Message m WHERE m.channel.id = :channelId ORDER BY m.createdAt DESC") - Optional findLatestByChannelId(@Param("channelId") UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 31b73410e..3c1bd8e21 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -2,17 +2,17 @@ import com.sprint.mission.discodeit.entity.ReadStatus; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; import java.util.UUID; public interface ReadStatusRepository extends JpaRepository { - List saveAll(List readStatuses); List findAllByChannelId(UUID channelID); List findAllByUserId(UUID userID); - void deleteAll(List readStatuses); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index ebb856f76..b8095ee3d 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -3,7 +3,6 @@ import com.sprint.mission.discodeit.entity.User; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; import java.util.Optional; import java.util.UUID; @@ -14,6 +13,4 @@ public interface UserRepository extends JpaRepository { Optional findByEmail(String email); Optional findByUsername(String name); - - List findAllByIdIn(List userIds); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index 1b0300edb..6f21198ae 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -5,15 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.UUID; public interface UserStatusRepository extends JpaRepository { Optional findByUserId(UUID userId); - - @Query("SELECT u FROM UserStatus u WHERE u.lastActiveAt >= CURRENT_TIMESTAMP - 5") - List findByIsOnlineTrue(); - - void deleteByUserId(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 4208294cc..884bbfcd4 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -15,8 +15,6 @@ UserDTO create(CreateUserRequest request, UserDTO find(UUID userId); - List getOnlineUsers(); - List findAll(); UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 0abe7927e..a7d0afff6 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -75,6 +75,8 @@ public UserDTO create(CreateUserRequest request, .build(); createdUser.setStatus(userStatus); + userStatusRepository.save(userStatus); + userRepository.save(createdUser); return modelMapper.map(createdUser, UserDTO.class); @@ -90,18 +92,6 @@ public UserDTO find(UUID userId) { return modelMapper.map(findUser, UserDTO.class); } - @Transactional(readOnly = true) - @Override - public List getOnlineUsers() { - List onlineUserIds = userStatusRepository.findByIsOnlineTrue().stream() - .map(userStatus -> userStatus.getUser().getId()) - .toList(); - - return userRepository.findAllById(onlineUserIds).stream() - .map(user -> modelMapper.map(user, UserDTO.class)) - .toList(); - } - @Transactional(readOnly = true) @Override public List findAll() { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1b9fc1880..d74f37eaf 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,13 +1,4 @@ spring: - profiles: - active: file - -logging: - level: - org.springframework: info - com.sprint.mission.discodeit: debug - - datasource: url: jdbc:postgresql://localhost:5432/discodeit username: discodeit_user @@ -21,6 +12,11 @@ logging: ddl-auto: update show-sql: true +logging: + level: + org.springframework: info + com.sprint.mission.discodeit: debug + springdoc: swagger-ui: - path: /api-docs \ No newline at end of file + path: /api-docs diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java new file mode 100644 index 000000000..86c7a6984 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java @@ -0,0 +1,136 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; +import com.sprint.mission.discodeit.dto.user.CreateUserRequest; +import com.sprint.mission.discodeit.dto.user.UserDTO;; +import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.repository.UserStatusRepository; +import com.sprint.mission.discodeit.service.UserService; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@Log4j2 +class BasicUserServiceTest { + @Autowired + private UserService userService; + + @Autowired + private BinaryContentRepository binaryContentRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserStatusRepository userStatusRepository; + + @Test + @DisplayName("회원 생성 테스트") + @Transactional + void createUserTest() { + // given + CreateUserRequest createUserRequest = new CreateUserRequest("testUser01", "testUser00@naver.com", "Alasdfasdew1234!!"); + CreateBinaryContentRequest createBinaryContentRequest = new CreateBinaryContentRequest( + "example.txt", // fileName + "text/plain", // contentType + "Hello, world!".getBytes(), // bytes + 1024L // size + ); + + // when + UserDTO userDTO = userService.create(createUserRequest, Optional.of(createBinaryContentRequest)); + + // then + User user = userRepository.findByUsername("testUser01").orElseThrow(); + BinaryContent binaryContent = binaryContentRepository.findById(user.getProfile().getId()).orElseThrow(); + UserStatus userStatus = userStatusRepository.findByUserId(user.getId()).orElseThrow(); + + // 검증 + assertNotNull(user, "User should be saved"); + log.info("user : {}", user); + assertNotNull(binaryContent, "BinaryContent should be saved"); + log.info("binaryContent : {}", binaryContent); + assertNotNull(userStatus, "UserStatus should be saved"); + log.info("userStatus : {}", userStatus); + } + + @Test + @DisplayName("회원 조회 테스트") + @Transactional + void findUserTest() { + // given + CreateUserRequest createUserRequest = new CreateUserRequest("testUser02", "testUser02@naver.com", "Alasdfasdew1234!!"); + CreateBinaryContentRequest createBinaryContentRequest = new CreateBinaryContentRequest( + "example2.txt", // fileName + "text/plain", // contentType + "Hello, world 2!".getBytes(), // bytes + 2048L // size + ); + UserDTO createdUserDTO = userService.create(createUserRequest, Optional.of(createBinaryContentRequest)); + + // when + UserDTO foundUserDTO = userService.find(createdUserDTO.getId()); + + // then + assertNotNull(foundUserDTO, "User should be found"); + assertEquals(createdUserDTO.getId(), foundUserDTO.getId(), "User IDs should match"); + } + + @Test + @DisplayName("모든 회원 조회 테스트") + @Transactional + void findAllUsersTest() { + CreateUserRequest createUserRequest1 = new CreateUserRequest("testUser01", "testUser01@naver.com", "Password1234!"); + CreateUserRequest createUserRequest2 = new CreateUserRequest("testUser02", "testUser02@naver.com", "Password1234!"); + + CreateBinaryContentRequest createBinaryContentRequest1 = new CreateBinaryContentRequest( + "example1.txt", "text/plain", "Hello, world 1!".getBytes(), 1024L + ); + CreateBinaryContentRequest createBinaryContentRequest2 = new CreateBinaryContentRequest( + "example2.txt", "text/plain", "Hello, world 2!".getBytes(), 1024L + ); + + userService.create(createUserRequest1, Optional.of(createBinaryContentRequest1)); + userService.create(createUserRequest2, Optional.of(createBinaryContentRequest2)); + + List users = userService.findAll(); + + assertTrue(users.size() >= 2, "There should be at least 2 users"); + } + + + @Test + @DisplayName("회원 삭제 테스트") + @Transactional + void deleteUserTest() { + // given + CreateUserRequest createUserRequest = new CreateUserRequest("testUser06", "testUser06@naver.com", "Alasdfasdew1234!!"); + CreateBinaryContentRequest createBinaryContentRequest = new CreateBinaryContentRequest( + "example4.txt", // fileName + "text/plain", // contentType + "Hello, world 4!".getBytes(), // bytes + 4096L // size + ); + UserDTO createdUserDTO = userService.create(createUserRequest, Optional.of(createBinaryContentRequest)); + + // when + userService.delete(createdUserDTO.getId()); + + // then + assertThrows(ServiceException.class, () -> userService.find(createdUserDTO.getId()), "User should be deleted and not found"); + } +} \ No newline at end of file From 2f808c80b3c43a336bdb07edf8ec95b336b7f8d5 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 12 Mar 2025 23:56:20 +0900 Subject: [PATCH 093/115] =?UTF-8?q?Controller=20=EC=9A=94=EA=B5=AC=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../controller/BinaryContentController.java | 67 +- .../controller/ChannelController.java | 96 +- .../controller/MessageController.java | 113 +-- .../controller/ReadStatusController.java | 42 +- .../discodeit/controller/UserController.java | 157 +-- ...MultipartJackson2HttpMessageConverter.java | 34 + .../BinaryContentCreateRequest.java | 8 - .../dto/binarycontent/BinaryContentDTO.java | 3 - .../discodeit/dto/response/PageResponse.java | 4 + .../discodeit/entity/BinaryContent.java | 2 - .../mission/discodeit/entity/UserStatus.java | 2 + .../exception/MyExceptionHandler.java | 22 +- .../discodeit/mapper/MapperConfig.java | 2 +- .../service/BinaryContentService.java | 4 +- .../service/basic/BasicAuthService.java | 4 + .../basic/BasicBinaryContentService.java | 11 +- .../service/basic/BasicMessageService.java | 21 +- .../service/basic/BasicUserService.java | 19 +- .../storage/BinaryContentStorage.java | 13 + .../storage/LocalBinaryContentStorage.java | 106 ++ .../discodeit/swagger/SwaggerConfig.java | 6 +- src/main/resources/application.yml | 11 +- .../resources/static/assets/index-CRrRqFH4.js | 956 ------------------ .../static/assets/index-kQJbKSsj.css | 1 - src/main/resources/static/favicon.ico | Bin 1588 -> 0 bytes src/main/resources/static/index.html | 26 - src/main/resources/static/script.js | 110 -- src/main/resources/static/styles.css | 80 -- src/main/resources/static/user-list.html | 18 - 30 files changed, 450 insertions(+), 1490 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java create mode 100644 src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java delete mode 100644 src/main/resources/static/assets/index-CRrRqFH4.js delete mode 100644 src/main/resources/static/assets/index-kQJbKSsj.css delete mode 100644 src/main/resources/static/favicon.ico delete mode 100644 src/main/resources/static/index.html delete mode 100644 src/main/resources/static/script.js delete mode 100644 src/main/resources/static/styles.css delete mode 100644 src/main/resources/static/user-list.html diff --git a/build.gradle b/build.gradle index d0ca59923..356b03dad 100644 --- a/build.gradle +++ b/build.gradle @@ -28,9 +28,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-aop' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.5' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' implementation 'org.modelmapper:modelmapper:3.1.0' diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index e4c318460..6a1f8895f 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -1,14 +1,15 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; import com.sprint.mission.discodeit.service.BinaryContentService; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; -import java.io.IOException; import java.util.List; import java.util.UUID; @@ -16,45 +17,25 @@ @RequestMapping("/api/binaryContents") @RequiredArgsConstructor public class BinaryContentController { -// -// private final BinaryContentService binaryContentService; -// -// @PostMapping -// public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file) { -// try { -// BinaryContent binaryContent = binaryContentService.saveFile(file); -// return ResponseEntity.ok(binaryContent); -// } catch (IOException e) { -// throw new RuntimeException("파일 업로드 실패: " + e.getMessage()); -// } -// } -// -// @GetMapping("/view/{id}") -// public ResponseEntity viewFile(@PathVariable("id") UUID id) { -// BinaryContent binaryContent = binaryContentService.find(id); -// -// return ResponseEntity.ok() -// .contentType(MediaType.parseMediaType(binaryContent.getContentType())) // MIME 타입 지정 -// .body(binaryContent.getBytes()); // 파일 데이터 반환 -// } -// -// @GetMapping("{binaryContentIds}") -// public ResponseEntity> getFilesById( -// @PathVariable("binaryContentIds") List binaryContentIds) { -// List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); -// return ResponseEntity.ok(binaryContents); -// } -// -// @GetMapping("/{binaryContentId}") -// public ResponseEntity findFile( -// @PathVariable("binaryContentId") UUID binaryContentId) { -// BinaryContent binaryContent = binaryContentService.find(binaryContentId); -// return ResponseEntity.ok(binaryContent); -// } -// -// @GetMapping() -// public ResponseEntity> findAll() { -// List all = binaryContentService.findAll(); -// return ResponseEntity.ok(all); -// } + + private final BinaryContentService binaryContentService; + private final BinaryContentStorage binaryContentStorage; + + @GetMapping(value = "{binaryContentId}/download") + public ResponseEntity download(@PathVariable UUID binaryContentId) { + BinaryContentDTO binaryContentDTO = binaryContentService.find(binaryContentId); + return (ResponseEntity) binaryContentStorage.download(binaryContentDTO); + } + + @GetMapping("/{binaryContentId}") + public ResponseEntity findFile(@PathVariable("binaryContentId") UUID binaryContentId) { + BinaryContentDTO binaryContent = binaryContentService.find(binaryContentId); + return ResponseEntity.ok(binaryContent); + } + + @GetMapping() + public ResponseEntity> findAllByIdIn(@RequestParam("binaryContentIds") List binaryContentIds) { + List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); + return ResponseEntity.ok(binaryContents); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 17ce679e7..232b3d47d 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -1,62 +1,58 @@ package com.sprint.mission.discodeit.controller; +import com.sprint.mission.discodeit.dto.channel.ChannelDTO; +import com.sprint.mission.discodeit.dto.channel.CreateChannel; +import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; +import com.sprint.mission.discodeit.service.ChannelService; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.UUID; + @RestController @RequestMapping("/api/channels") @RequiredArgsConstructor public class ChannelController { -// -// private final ChannelService channelService; -// -// @PostMapping("/public") -// public ResponseEntity createPublicChannel( -// @RequestBody CreateChannel.PublicRequest request) { -// Channel publicChannel = channelService.createPublicChannel(request); -// return ResponseEntity.ok(publicChannel); -// } -// -// @PostMapping("/private") -// public ResponseEntity createPrivateChannel( -// @RequestBody CreateChannel.PrivateRequest request) { -// Channel privateChannel = channelService.createPrivateChannel(request); -// return ResponseEntity.ok(privateChannel); -// } -// -// @GetMapping -// public ResponseEntity> getAllChannels(@RequestParam("userId") UUID userId) { -// List allChannel = channelService.findAllPrivate(userId); -// return ResponseEntity -// .status(HttpStatus.OK) -// .body(allChannel); -// } -// -// @GetMapping("/public") -// public ResponseEntity> getAllPublicChannels() { -// List allPublic = channelService.findAllPublic(); -// return ResponseEntity.ok(allPublic); -// } -// -// // 채널 정보 수정은 Public channel 만 가능합니다. -// @PatchMapping("/{channelId}") -// public ResponseEntity updateChannel( -// @PathVariable("channelId") UUID channelId, -// @RequestBody UpdatePublicChannel request) { -// PublicChannel update = channelService.update(channelId, request); -// return ResponseEntity -// .status(HttpStatus.OK) -// .body(update); -// } -// -// @DeleteMapping("/{channelId}") -// public ResponseEntity deletePrivateChannel(@PathVariable("channelId") UUID channelId) { -// Channel removeChannel = channelService.delete(channelId); -// return ResponseEntity.ok( -// "Remove Private Channel ID: " + removeChannel.getId() + -// " delete complete!" -// ); -// } + + private final ChannelService channelService; + + @PostMapping("/public") + public ResponseEntity createPublicChannel( + @RequestBody CreateChannel.PublicRequest request) { + ChannelDTO publicChannel = channelService.createPublicChannel(request); + return ResponseEntity.ok(publicChannel); + } + + @PostMapping("/private") + public ResponseEntity createPrivateChannel( + @RequestBody CreateChannel.PrivateRequest request) { + ChannelDTO privateChannel = channelService.createPrivateChannel(request); + return ResponseEntity.ok(privateChannel); + } + + @GetMapping + public ResponseEntity> getAllChannels(@RequestParam("userId") UUID userId) { + List channels = channelService.findAllByUserId(userId); + return ResponseEntity.ok(channels); + } + + // 채널 정보 수정은 Public channel 만 가능합니다. + @PatchMapping("/{channelId}") + public ResponseEntity updateChannel( + @PathVariable("channelId") UUID channelId, + @RequestBody UpdatePublicChannel request) { + ChannelDTO update = channelService.update(channelId, request); + return ResponseEntity.ok(update); + } + + @DeleteMapping("/{channelId}") + public ResponseEntity deletePrivateChannel(@PathVariable("channelId") UUID channelId) { + channelService.delete(channelId); + return ResponseEntity.ok(HttpStatus.NO_CONTENT.toString()); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index f4f2561d3..a7095322e 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -1,11 +1,12 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.dto.message.MessageDTO; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.service.MessageService; import java.io.IOException; +import java.util.ArrayList; import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -19,64 +20,54 @@ @RequestMapping("/api/messages") @RequiredArgsConstructor public class MessageController { -// -// private final MessageService messageService; -// -// @PostMapping -// public ResponseEntity createMessage( -// @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, -// @RequestPart("file") -// MultipartFile file) { -// Optional fileRequest = Optional.empty(); -// if (file != null && !file.isEmpty()) { -// try { -// fileRequest = Optional.of(new CreateBinaryContentRequest( -// file.getOriginalFilename(), -// file.getContentType(), -// file.getBytes() -// )); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// } -// -// Message message = messageService.create(createMessageRequest, fileRequest); -// return ResponseEntity.ok(message); -// } -// -// @GetMapping -// public ResponseEntity> getAllByChannelId( -// @RequestParam("channelId") UUID channelId) { -// List messages = messageService.findAllByChannelId(channelId); -// return ResponseEntity.ok(messages); -// } -// -// @PatchMapping("/{messageId}") // 첨부자료를 더 올리거나, 내용을 수정하고 싶을 때 -// public ResponseEntity update(@PathVariable("messageId") UUID messageId, -// @RequestPart("messageRequest") UpdateMessageRequest messageRequest, -// @RequestPart("file") MultipartFile file) { -// Optional fileRequest = Optional.empty(); -// if (file != null && !file.isEmpty()) { -// try { -// fileRequest = Optional.of(new CreateBinaryContentRequest( -// file.getOriginalFilename(), -// file.getContentType(), -// file.getBytes() -// )); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// } -// Message message = messageService.updateMessageContent(messageId, messageRequest, fileRequest); -// return ResponseEntity.ok(message); -// } -// -// @DeleteMapping("/{messageId}") -// public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { -// Message message = messageService.deleteMessage(messageId); -// return ResponseEntity.ok( -// "메시지 ID: " + message.getId() + -// " 삭제가 완료되었습니다." -// ); -// } + + private final MessageService messageService; + + @PostMapping + public ResponseEntity create( + @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, + @RequestPart("file") + List attachments) { + List attachmentRequests = Optional.ofNullable(attachments) + .map(files -> files.stream() + .map(file -> { + try { + return new CreateBinaryContentRequest( + file.getOriginalFilename(), + file.getContentType(), + file.getBytes(), + file.getSize() + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + }) + .toList()) + .orElse(new ArrayList<>()); + + MessageDTO message = messageService.create(createMessageRequest, attachmentRequests); + return ResponseEntity.ok(message); + } + + @GetMapping + public ResponseEntity> getAllByChannelId( + @RequestParam("channelId") UUID channelId) { + List messages = messageService.findAllByChannelId(channelId); + return ResponseEntity.ok(messages); + } + + @PatchMapping("/{messageId}") + public ResponseEntity update(@PathVariable("messageId") UUID messageId, + @RequestPart("messageRequest") UpdateMessageRequest messageRequest) { + MessageDTO message = messageService.update(messageId, messageRequest); + return ResponseEntity.ok(message); + } + + @DeleteMapping("/{messageId}") + public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { + messageService.delete(messageId); + return ResponseEntity.ok( + "메시지 ID: 삭제가 완료되었습니다." + ); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index b613c9093..dba071df9 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.controller; +import com.sprint.mission.discodeit.dto.readstatus.ReadStatusDTO; import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.service.ReadStatusService; @@ -16,24 +17,25 @@ @RequestMapping("/api/readStatuses") @RequiredArgsConstructor public class ReadStatusController { -// -// private final ReadStatusService readStatusService; -// -// @GetMapping -// public ResponseEntity> getStatusesByUserId(@RequestParam("userId") UUID userID) { -// List allByUserId = readStatusService.findAllByUserId(userID); -// return ResponseEntity.ok(allByUserId); -// } -// -// @PostMapping -// public ResponseEntity createReadStatus(@RequestBody CreateReadStatusRequest request) { -// ReadStatus readStatus = readStatusService.create(request); -// return ResponseEntity.ok(readStatus); -// } -// -// @PatchMapping -// public ResponseEntity update(@PathParam("readStatusId") UUID readStatusId) { -// ReadStatus updateReadStatus = readStatusService.update(readStatusId); -// return ResponseEntity.ok(updateReadStatus); -// } + + private final ReadStatusService readStatusService; + @PostMapping + public ResponseEntity create(@RequestBody CreateReadStatusRequest request) { + ReadStatusDTO readStatus = readStatusService.create(request); + return ResponseEntity.ok(readStatus); + } + + @GetMapping + public ResponseEntity> findAllByUserId(@RequestParam("userId") UUID userId) { + List readStatuses = readStatusService.findAllByUserId(userId); + return ResponseEntity.ok(readStatuses); + } + + + + @PatchMapping(path = "{readStatusId}") + public ResponseEntity update(@PathParam("readStatusId") UUID readStatusId) { + ReadStatusDTO updateReadStatus = readStatusService.update(readStatusId); + return ResponseEntity.ok(updateReadStatus); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 01cce7aee..f802e1c6d 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -1,19 +1,21 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.user.CreateUserRequest; import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; +import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import java.io.IOException; import java.util.Optional; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import lombok.extern.log4j.Log4j2; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -24,77 +26,82 @@ @RestController @RequestMapping("/api/users") @RequiredArgsConstructor -@Slf4j +@Log4j2 public class UserController { -// -// private final UserService userService; -// private final UserStatusService userStatusService; -// -// @PostMapping -// public ResponseEntity createUser( -// @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, -// @RequestPart(value = "profile", required = false) MultipartFile profile) { -// -// Optional profileRequest = Optional.empty(); -// if (profile != null && !profile.isEmpty()) { -// try { -// profileRequest = Optional.of(new CreateBinaryContentRequest( -// profile.getOriginalFilename(), -// profile.getContentType(), -// profile.getBytes() -// )); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// } -// -// UserDTO createdUser = userService.create(userCreateRequest, profileRequest); -// log.info(createdUser.getName() + "님 환영합니다. 회원가입이 완료되었습니다."); -// return ResponseEntity -// .status(HttpStatus.CREATED) -// .body(createdUser); -// } -// -// @GetMapping -// public ResponseEntity> findAllUsers() { -// List all = userService.findAll(); -// return ResponseEntity.ok(all); -// } -// -// @PatchMapping("/{userId}") -// public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, -// @RequestPart("updateUserRequest") UpdateUserRequest updateUserRequest, -// @RequestPart(value = "profile", required = false) MultipartFile profile) { -// Optional profileRequest = Optional.empty(); -// if (profile != null && !profile.isEmpty()) { -// try { -// profileRequest = Optional.of(new CreateBinaryContentRequest( -// profile.getOriginalFilename(), -// profile.getContentType(), -// profile.getBytes() -// )); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// } -// User updateUser = userService.update(userId, updateUserRequest, profileRequest); -// log.info("회원 수정이 완료되었습니다"); -// return ResponseEntity.ok(updateUser); -// } -// -// @PatchMapping("/{userId}/userStatus") -// public ResponseEntity updateUserStatus(@PathVariable("userId") UUID userId) { -// UserStatus userStatus = userStatusService.updateByUserId(userId); -// return ResponseEntity.ok(userStatus); -// } -// -// @DeleteMapping -// public ResponseEntity deleteUser(@RequestParam("id") UUID id) { -// UserDTO delete = userService.delete(id); -// return ResponseEntity.ok( -// "Delete user ID: " + delete.getId() + -// " name: " + delete.getName() + -// " delete complete!" -// ); -// } + + private final UserService userService; + private final UserStatusService userStatusService; + + @Operation(summary = "Upload POST", description = "POST 방식으로 회원을 등록합니다") + @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) + public ResponseEntity createUser( + @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile) { + + Optional profileRequest = Optional.empty(); + if (profile != null && !profile.isEmpty()) { + try { + profileRequest = Optional.of(new CreateBinaryContentRequest( + profile.getOriginalFilename(), + profile.getContentType(), + profile.getBytes(), + profile.getSize() + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + UserDTO createdUser = userService.create(userCreateRequest, profileRequest); + + return ResponseEntity + .status(HttpStatus.CREATED) + .body(createdUser); + } + + @Operation(summary = "GET Users", description = "GET을 통해 전체 회원을 조회합니다") + @GetMapping + public ResponseEntity> findAllUsers() { + List all = userService.findAll(); + return ResponseEntity.ok(all); + } + + @Operation(summary = "Update Password", description = "회원의 비밀번호를 수정합니다") + @PatchMapping(value = "/{userId}", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) + public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, + @RequestPart("updateUserRequest") UpdateUserRequest updateUserRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile) { + Optional profileRequest = Optional.empty(); + if (profile != null && !profile.isEmpty()) { + try { + profileRequest = Optional.of(new CreateBinaryContentRequest( + profile.getOriginalFilename(), + profile.getContentType(), + profile.getBytes(), + profile.getSize() + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + UserDTO updateUser = userService.update(userId, updateUserRequest, profileRequest); + + return ResponseEntity.ok(updateUser); + } + + @PatchMapping(path = "{userId}/userStatus") + public ResponseEntity updateUserStatusByUserId(@PathVariable("userId") UUID userId) { + UserStatusDTO updatedUserStatus = userStatusService.updateByUserId(userId); + return ResponseEntity + .status(HttpStatus.OK) + .body(updatedUserStatus); + } + + @DeleteMapping + public ResponseEntity deleteUser(@RequestParam("id") UUID id) { + userService.delete(id); + return ResponseEntity + .status(HttpStatus.NO_CONTENT) + .build(); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java b/src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java new file mode 100644 index 000000000..e7de20d68 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java @@ -0,0 +1,34 @@ +package com.sprint.mission.discodeit.converter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Type; + +/* +application/octet-stream 문제 해결을 위해 custom converter 생성 + */ +@Component +public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter { + + public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) { + super(objectMapper, MediaType.APPLICATION_OCTET_STREAM); + } + + @Override + public boolean canWrite(Class clazz, MediaType mediaType) { + return false; + } + + @Override + public boolean canWrite(Type type, Class clazz, MediaType mediaType) { + return false; + } + + @Override + protected boolean canWrite(MediaType mediaType) { + return false; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java deleted file mode 100644 index d93f08126..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentCreateRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sprint.mission.discodeit.dto.binarycontent; - -public record BinaryContentCreateRequest( - String fileName, - String contentType, - byte[] bytes -) { -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java index 17739080b..0d65b9188 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java @@ -24,7 +24,4 @@ public class BinaryContentDTO { @NotEmpty private String contentType; - - @NotNull - private byte[] bytes; } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java new file mode 100644 index 000000000..ffba768aa --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java @@ -0,0 +1,4 @@ +package com.sprint.mission.discodeit.dto.response; + +public record PageResponse() { +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index 176337eb9..93b9ebd10 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -19,6 +19,4 @@ public class BinaryContent extends BaseEntity { private Long size; @Column(nullable = false) private String contentType; - @Column(nullable = false) - private byte[] bytes; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index 10364360a..df8df1806 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -4,12 +4,14 @@ import jakarta.persistence.Entity; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; import lombok.*; import java.time.Instant; import java.time.temporal.ChronoUnit; @Entity +@Table(name = "user_statuses") @Builder @Getter @AllArgsConstructor diff --git a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java index f165fc947..881d38f3e 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java @@ -27,23 +27,21 @@ public ResponseEntity handleServiceException(BaseException except @ResponseBody @ExceptionHandler(Exception.class) - public String exceptCommon(Exception ex) { + public ResponseEntity> exceptCommon(Exception ex) { log.error("---------------------------------------------"); - log.error(ex.getMessage()); + log.error(ex.getMessage(), ex); - StringBuilder buffer = new StringBuilder("
    "); + Map errorResponse = new HashMap<>(); + errorResponse.put("message", ex.getMessage()); + errorResponse.put("details", Arrays.stream(ex.getStackTrace()) + .map(StackTraceElement::toString) + .toArray()); + errorResponse.put("timestamp", System.currentTimeMillis()); - buffer.append("
  • " + ex.getMessage() + "
  • "); - - Arrays.stream(ex.getStackTrace()).forEach(stackTraceElement -> { - buffer.append("
  • " + stackTraceElement.toString() + "
  • "); - }); - - buffer.append("
"); - - return buffer.toString(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse); } + @ExceptionHandler(NoHandlerFoundException.class) public ResponseEntity notFound(NoHandlerFoundException ex) { log.error("404 Error: " + ex.getMessage()); diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java index 4a9e913aa..f59e0a504 100644 --- a/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java @@ -13,7 +13,7 @@ public ModelMapper getMapper() { modelMapper.getConfiguration() .setFieldMatchingEnabled(true) // 필드 이름이 같으면 자동 매핑 .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) // private 필드에도 접근 가능 - .setMatchingStrategy(MatchingStrategies.STRICT); // 엄격한 매칭 전략 사용 + .setMatchingStrategy(MatchingStrategies.LOOSE); return modelMapper; } diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index f0cf702b8..ea9680d09 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,14 +1,14 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentCreateRequest; import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import java.io.IOException; import java.util.List; import java.util.UUID; public interface BinaryContentService { - BinaryContentDTO create(BinaryContentCreateRequest request) throws IOException; + BinaryContentDTO create(CreateBinaryContentRequest request) throws IOException; BinaryContentDTO find(UUID binaryContentId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 89dd1f0b1..16fc2f382 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -6,6 +6,7 @@ import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.service.UserStatusService; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; @@ -16,6 +17,7 @@ public class BasicAuthService { private final UserRepository userRepository; private final ModelMapper modelMapper; + private final UserStatusService userStatusService; public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 User findUser = userRepository.findByUsername(request.username()) @@ -25,6 +27,8 @@ public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } + userStatusService.updateByUserId(findUser.getId()); + return modelMapper.map(findUser, UserDTO.class); // 비밀번호를 보여주지 않기 위해서 DTO 사용 } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index 064908635..b093d15fa 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,12 +1,13 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentCreateRequest; import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; @@ -22,21 +23,23 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; private final ModelMapper modelMapper; + private final BinaryContentStorage binaryContentStorage; @Transactional @Override - public BinaryContentDTO create(BinaryContentCreateRequest request) throws IOException { + public BinaryContentDTO create(CreateBinaryContentRequest request) throws IOException { String filename = request.fileName(); byte[] bytes = request.bytes(); String contentType = request.contentType(); BinaryContent binaryContent = BinaryContent.builder() .fileName(filename) .contentType(contentType) - .bytes(bytes) .size((long) bytes.length) .build(); - binaryContentRepository.save(binaryContent); + BinaryContent saveBinaryContent = binaryContentRepository.save(binaryContent); + + binaryContentStorage.put(saveBinaryContent.getId(), bytes); return modelMapper.map(binaryContent, BinaryContentDTO.class); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 30b57a381..e497bfcd0 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -15,6 +15,9 @@ import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; +import com.sprint.mission.discodeit.service.ReadStatusService; +import com.sprint.mission.discodeit.service.UserStatusService; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; @@ -27,6 +30,8 @@ @RequiredArgsConstructor public class BasicMessageService implements MessageService { + private final UserStatusService userStatusService; + private final BinaryContentStorage binaryContentStorage; private final MessageRepository messageRepository; private final UserRepository userRepository; private final ChannelRepository channelRepository; @@ -43,15 +48,21 @@ public MessageDTO create(CreateMessageRequest messageRequest, User user = validAuthor(authorId); Channel channel = validChannel(channelId); + userStatusService.updateByUserId(authorId); + List attachments = binaryContentRequest.stream() .map(attachmentRequest -> { BinaryContent binaryContent = BinaryContent.builder() .fileName(attachmentRequest.fileName()) .size(attachmentRequest.size()) .contentType(attachmentRequest.contentType()) - .bytes(attachmentRequest.bytes()) .build(); - return binaryContentRepository.save(binaryContent); + + BinaryContent save = binaryContentRepository.save(binaryContent); + + binaryContentStorage.put(save.getId(), attachmentRequest.bytes()); + + return save; }) .toList(); @@ -78,10 +89,10 @@ public MessageDTO find(UUID messageId) { @Transactional(readOnly = true) @Override - public List findAllByChannelId(UUID channelID) { - Channel channel = validChannel(channelID); + public List findAllByChannelId(UUID channelId) { + Channel channel = validChannel(channelId); - List messages = messageRepository.findByChannelId(channelID); + List messages = messageRepository.findByChannelId(channelId); return messages.stream() .map(message -> modelMapper.map(message,MessageDTO.class)) .toList(); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index a7d0afff6..9b2a1b853 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -10,10 +10,12 @@ import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; +import com.sprint.mission.discodeit.service.BinaryContentService; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; import java.util.Optional; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; @@ -34,6 +36,7 @@ public class BasicUserService implements UserService { private final UserStatusRepository userStatusRepository; private final UserStatusService userStatusService; private final ModelMapper modelMapper; + private final BinaryContentStorage binaryContentStorage; @Transactional @Override @@ -52,13 +55,14 @@ public UserDTO create(CreateUserRequest request, CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); profile = BinaryContent.builder() - .bytes(contentRequest.bytes()) .contentType(contentRequest.contentType()) .fileName(contentRequest.fileName()) .size(contentRequest.size()) .build(); - binaryContentRepository.save(profile); + BinaryContent save = binaryContentRepository.save(profile); + + binaryContentStorage.put(save.getId(), binaryContentRequest.get().bytes()); } User createdUser = User.builder() @@ -68,6 +72,8 @@ public UserDTO create(CreateUserRequest request, .profile(profile) .build(); + userRepository.save(createdUser); + Instant lastActiveAt = Instant.now(); UserStatus userStatus = UserStatus.builder() .user(createdUser) @@ -77,8 +83,6 @@ public UserDTO create(CreateUserRequest request, userStatusRepository.save(userStatus); - userRepository.save(createdUser); - return modelMapper.map(createdUser, UserDTO.class); } @@ -110,15 +114,18 @@ public UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, findUser.updatePassword(updateUserRequest.oldPassword(), updateUserRequest.newPassword()); + userStatusService.updateByUserId(findUser.getId()); + binaryContentRequest.ifPresent(contentRequest -> { BinaryContent newProfile = BinaryContent.builder() .size(contentRequest.size()) - .bytes(contentRequest.bytes()) .contentType(contentRequest.contentType()) .fileName(contentRequest.fileName()) .build(); - binaryContentRepository.save(newProfile); + BinaryContent save = binaryContentRepository.save(newProfile); + + binaryContentStorage.put(save.getId(), contentRequest.bytes()); if (findUser.getProfile() != null) { binaryContentRepository.delete(findUser.getProfile()); diff --git a/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java index c75315a64..863bc7491 100644 --- a/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java +++ b/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java @@ -1,4 +1,17 @@ package com.sprint.mission.discodeit.storage; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.io.InputStream; +import java.util.UUID; + +@Component public interface BinaryContentStorage { + UUID put(UUID binaryContentId, byte[] binaryContent); + + InputStream get(UUID binaryContentId); + + ResponseEntity download(BinaryContentDTO binaryContentDTO); } diff --git a/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java new file mode 100644 index 000000000..24340e3aa --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java @@ -0,0 +1,106 @@ +package com.sprint.mission.discodeit.storage; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.*; +import java.util.UUID; + +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import jakarta.annotation.PostConstruct; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Profile; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; + +@Profile("local") +@Component +@Log4j2 +public class LocalBinaryContentStorage implements BinaryContentStorage { + + @Value("${discodeit.storage.local.root-path}") + private Path root; + + @PostConstruct + public void init() throws IOException { + if (!Files.exists(root)) { + Files.createDirectories(root); + log.info("Created directory: " + root); + } + } + + @Override + public UUID put(UUID binaryContentId, byte[] binaryContent) { + Path targetPath = resolvePath(binaryContentId); + try { + Files.write(targetPath, binaryContent); + } catch (IOException e) { + throw new RuntimeException("Failed to save file: " + binaryContentId, e); + } + return binaryContentId; + } + + @Override + public InputStream get(UUID binaryContentId) { + Path targetPath = resolvePath(binaryContentId); + if (!Files.exists(targetPath)) { + throw new RuntimeException("File not found: " + binaryContentId); + } + try { + return Files.newInputStream(targetPath); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public ResponseEntity download(BinaryContentDTO binaryContentDTO) { + UUID binaryContentId = binaryContentDTO.getId(); + Path targetPath = resolvePath(binaryContentId); + + if (!Files.exists(targetPath)) { + return ResponseEntity.notFound().build(); + } + + try { + // InputStream을 try-with-resources로 안전하게 처리 + InputStream inputStream = Files.newInputStream(targetPath); + + StreamingResponseBody streamingResponseBody = outputStream -> { + byte[] buffer = new byte[1024]; + int bytesRead; + try { + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + } catch (IOException e) { + throw new RuntimeException("Error during streaming file", e); + } finally { + try { + inputStream.close(); // 스트림을 명시적으로 닫음 + } catch (IOException e) { + // 스트림을 닫는 중 발생한 오류는 무시하고 넘어감 + } + } + }; + + // 응답을 반환 + return ResponseEntity.ok() + .header("Content-Disposition", "attachment; filename=\"" + targetPath.getFileName().toString() + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(streamingResponseBody); + } catch (IOException e) { + throw new RuntimeException("Error reading file", e); + } + } + + + private Path resolvePath(UUID binaryContentId) { + if (binaryContentId == null) { + throw new IllegalArgumentException("binaryContentId cannot be null"); + } + return root.resolve(binaryContentId.toString()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java b/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java index d38226292..c8d9dcfed 100644 --- a/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.swagger; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.OpenAPI; @@ -7,6 +8,7 @@ import org.springframework.context.annotation.Configuration; @Configuration +@OpenAPIDefinition public class SwaggerConfig { @Bean @@ -15,8 +17,6 @@ public OpenAPI customOpenAPI() { .info(new Info() .title("디스코드 프로젝트 API") .description("디스코드와 비슷한 서비스를 제공하는 백엔드 API입니다") - .version("1.0") - .contact(new Contact() - .email("junnukim1007@gmail.com"))); + .version("1.0")); } } \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d74f37eaf..f3eab7188 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,7 @@ spring: + profiles: + active: local + datasource: url: jdbc:postgresql://localhost:5432/discodeit username: discodeit_user @@ -17,6 +20,8 @@ logging: org.springframework: info com.sprint.mission.discodeit: debug -springdoc: - swagger-ui: - path: /api-docs +discodeit: + storage: + local: + root-path: "C:\\upload" + diff --git a/src/main/resources/static/assets/index-CRrRqFH4.js b/src/main/resources/static/assets/index-CRrRqFH4.js deleted file mode 100644 index ffeaa39b4..000000000 --- a/src/main/resources/static/assets/index-CRrRqFH4.js +++ /dev/null @@ -1,956 +0,0 @@ -(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))u(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const p of d.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&u(p)}).observe(document,{childList:!0,subtree:!0});function s(c){const d={};return c.integrity&&(d.integrity=c.integrity),c.referrerPolicy&&(d.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?d.credentials="include":c.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function u(c){if(c.ep)return;c.ep=!0;const d=s(c);fetch(c.href,d)}})();function Qm(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var lu={exports:{}},ho={},uu={exports:{}},fe={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Wf;function qm(){if(Wf)return fe;Wf=1;var r=Symbol.for("react.element"),i=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),d=Symbol.for("react.provider"),p=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),E=Symbol.for("react.lazy"),j=Symbol.iterator;function O(S){return S===null||typeof S!="object"?null:(S=j&&S[j]||S["@@iterator"],typeof S=="function"?S:null)}var P={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},I=Object.assign,R={};function L(S,D,oe){this.props=S,this.context=D,this.refs=R,this.updater=oe||P}L.prototype.isReactComponent={},L.prototype.setState=function(S,D){if(typeof S!="object"&&typeof S!="function"&&S!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,S,D,"setState")},L.prototype.forceUpdate=function(S){this.updater.enqueueForceUpdate(this,S,"forceUpdate")};function V(){}V.prototype=L.prototype;function F(S,D,oe){this.props=S,this.context=D,this.refs=R,this.updater=oe||P}var W=F.prototype=new V;W.constructor=F,I(W,L.prototype),W.isPureReactComponent=!0;var K=Array.isArray,$=Object.prototype.hasOwnProperty,T={current:null},H={key:!0,ref:!0,__self:!0,__source:!0};function se(S,D,oe){var le,de={},ce=null,ve=null;if(D!=null)for(le in D.ref!==void 0&&(ve=D.ref),D.key!==void 0&&(ce=""+D.key),D)$.call(D,le)&&!H.hasOwnProperty(le)&&(de[le]=D[le]);var pe=arguments.length-2;if(pe===1)de.children=oe;else if(1>>1,D=Q[S];if(0>>1;Sc(de,q))cec(ve,de)?(Q[S]=ve,Q[ce]=q,S=ce):(Q[S]=de,Q[le]=q,S=le);else if(cec(ve,q))Q[S]=ve,Q[ce]=q,S=ce;else break e}}return ee}function c(Q,ee){var q=Q.sortIndex-ee.sortIndex;return q!==0?q:Q.id-ee.id}if(typeof performance=="object"&&typeof performance.now=="function"){var d=performance;r.unstable_now=function(){return d.now()}}else{var p=Date,m=p.now();r.unstable_now=function(){return p.now()-m}}var v=[],x=[],E=1,j=null,O=3,P=!1,I=!1,R=!1,L=typeof setTimeout=="function"?setTimeout:null,V=typeof clearTimeout=="function"?clearTimeout:null,F=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function W(Q){for(var ee=s(x);ee!==null;){if(ee.callback===null)u(x);else if(ee.startTime<=Q)u(x),ee.sortIndex=ee.expirationTime,i(v,ee);else break;ee=s(x)}}function K(Q){if(R=!1,W(Q),!I)if(s(v)!==null)I=!0,We($);else{var ee=s(x);ee!==null&&Se(K,ee.startTime-Q)}}function $(Q,ee){I=!1,R&&(R=!1,V(se),se=-1),P=!0;var q=O;try{for(W(ee),j=s(v);j!==null&&(!(j.expirationTime>ee)||Q&&!qt());){var S=j.callback;if(typeof S=="function"){j.callback=null,O=j.priorityLevel;var D=S(j.expirationTime<=ee);ee=r.unstable_now(),typeof D=="function"?j.callback=D:j===s(v)&&u(v),W(ee)}else u(v);j=s(v)}if(j!==null)var oe=!0;else{var le=s(x);le!==null&&Se(K,le.startTime-ee),oe=!1}return oe}finally{j=null,O=q,P=!1}}var T=!1,H=null,se=-1,Ve=5,At=-1;function qt(){return!(r.unstable_now()-AtQ||125S?(Q.sortIndex=q,i(x,Q),s(v)===null&&Q===s(x)&&(R?(V(se),se=-1):R=!0,Se(K,q-S))):(Q.sortIndex=D,i(v,Q),I||P||(I=!0,We($))),Q},r.unstable_shouldYield=qt,r.unstable_wrapCallback=function(Q){var ee=O;return function(){var q=O;O=ee;try{return Q.apply(this,arguments)}finally{O=q}}}}(fu)),fu}var Yf;function Km(){return Yf||(Yf=1,cu.exports=Ym()),cu.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Kf;function Xm(){if(Kf)return st;Kf=1;var r=Bu(),i=Km();function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),v=Object.prototype.hasOwnProperty,x=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,E={},j={};function O(e){return v.call(j,e)?!0:v.call(E,e)?!1:x.test(e)?j[e]=!0:(E[e]=!0,!1)}function P(e,t,n,o){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function I(e,t,n,o){if(t===null||typeof t>"u"||P(e,t,n,o))return!0;if(o)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function R(e,t,n,o,l,a,f){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=f}var L={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){L[e]=new R(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];L[t]=new R(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){L[e]=new R(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){L[e]=new R(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){L[e]=new R(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){L[e]=new R(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){L[e]=new R(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){L[e]=new R(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){L[e]=new R(e,5,!1,e.toLowerCase(),null,!1,!1)});var V=/[\-:]([a-z])/g;function F(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(V,F);L[t]=new R(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(V,F);L[t]=new R(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(V,F);L[t]=new R(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){L[e]=new R(e,1,!1,e.toLowerCase(),null,!1,!1)}),L.xlinkHref=new R("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){L[e]=new R(e,1,!1,e.toLowerCase(),null,!0,!0)});function W(e,t,n,o){var l=L.hasOwnProperty(t)?L[t]:null;(l!==null?l.type!==0:o||!(2h||l[f]!==a[h]){var y=` -`+l[f].replace(" at new "," at ");return e.displayName&&y.includes("")&&(y=y.replace("",e.displayName)),y}while(1<=f&&0<=h);break}}}finally{oe=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?D(e):""}function de(e){switch(e.tag){case 5:return D(e.type);case 16:return D("Lazy");case 13:return D("Suspense");case 19:return D("SuspenseList");case 0:case 2:case 15:return e=le(e.type,!1),e;case 11:return e=le(e.type.render,!1),e;case 1:return e=le(e.type,!0),e;default:return""}}function ce(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case H:return"Fragment";case T:return"Portal";case Ve:return"Profiler";case se:return"StrictMode";case Je:return"Suspense";case at:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case qt:return(e.displayName||"Context")+".Consumer";case At:return(e._context.displayName||"Context")+".Provider";case gt:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case yt:return t=e.displayName||null,t!==null?t:ce(e.type)||"Memo";case We:t=e._payload,e=e._init;try{return ce(e(t))}catch{}}return null}function ve(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ce(t);case 8:return t===se?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function pe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ge(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Be(e){var t=ge(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(f){o=""+f,a.call(this,f)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(f){o=""+f},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function bt(e){e._valueTracker||(e._valueTracker=Be(e))}function Rt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=ge(e)?e.checked?"true":"false":e.value),e=o,e!==n?(t.setValue(e),!0):!1}function Ao(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function hs(e,t){var n=t.checked;return q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Ku(e,t){var n=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;n=pe(t.value!=null?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Xu(e,t){t=t.checked,t!=null&&W(e,"checked",t,!1)}function ms(e,t){Xu(e,t);var n=pe(t.value),o=t.type;if(n!=null)o==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?gs(e,t.type,n):t.hasOwnProperty("defaultValue")&&gs(e,t.type,pe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Ju(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function gs(e,t,n){(t!=="number"||Ao(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var jr=Array.isArray;function Gn(e,t,n,o){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Ro.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ir(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var _r={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Kp=["Webkit","ms","Moz","O"];Object.keys(_r).forEach(function(e){Kp.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),_r[t]=_r[e]})});function oa(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||_r.hasOwnProperty(e)&&_r[e]?(""+t).trim():t+"px"}function ia(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var o=n.indexOf("--")===0,l=oa(n,t[n],o);n==="float"&&(n="cssFloat"),o?e.setProperty(n,l):e[n]=l}}var Xp=q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ws(e,t){if(t){if(Xp[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(s(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(s(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(t.style!=null&&typeof t.style!="object")throw Error(s(62))}}function xs(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ss=null;function ks(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Es=null,Yn=null,Kn=null;function sa(e){if(e=Jr(e)){if(typeof Es!="function")throw Error(s(280));var t=e.stateNode;t&&(t=Yo(t),Es(e.stateNode,e.type,t))}}function la(e){Yn?Kn?Kn.push(e):Kn=[e]:Yn=e}function ua(){if(Yn){var e=Yn,t=Kn;if(Kn=Yn=null,sa(e),t)for(e=0;e>>=0,e===0?32:31-(uh(e)/ah|0)|0}var No=64,Oo=4194304;function Lr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function To(e,t){var n=e.pendingLanes;if(n===0)return 0;var o=0,l=e.suspendedLanes,a=e.pingedLanes,f=n&268435455;if(f!==0){var h=f&~l;h!==0?o=Lr(h):(a&=f,a!==0&&(o=Lr(a)))}else f=n&~l,f!==0?o=Lr(f):a!==0&&(o=Lr(a));if(o===0)return 0;if(t!==0&&t!==o&&!(t&l)&&(l=o&-o,a=t&-t,l>=a||l===16&&(a&4194240)!==0))return t;if(o&4&&(o|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0n;n++)t.push(e);return t}function Dr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Pt(t),e[t]=n}function ph(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Vr),za=" ",Ma=!1;function Ua(e,t){switch(e){case"keyup":return $h.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Fa(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Zn=!1;function Vh(e,t){switch(e){case"compositionend":return Fa(t);case"keypress":return t.which!==32?null:(Ma=!0,za);case"textInput":return e=t.data,e===za&&Ma?null:e;default:return null}}function Wh(e,t){if(Zn)return e==="compositionend"||!$s&&Ua(e,t)?(e=_a(),Uo=Ds=an=null,Zn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=o}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=qa(n)}}function Ga(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ga(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ya(){for(var e=window,t=Ao();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ao(e.document)}return t}function Ws(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Zh(e){var t=Ya(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Ga(n.ownerDocument.documentElement,n)){if(o!==null&&Ws(n)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,a=Math.min(o.start,l);o=o.end===void 0?a:Math.min(o.end,l),!e.extend&&a>o&&(l=o,o=a,a=l),l=ba(n,a);var f=ba(n,o);l&&f&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==f.node||e.focusOffset!==f.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),a>o?(e.addRange(t),e.extend(f.node,f.offset)):(t.setEnd(f.node,f.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,er=null,Qs=null,br=null,qs=!1;function Ka(e,t,n){var o=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;qs||er==null||er!==Ao(o)||(o=er,"selectionStart"in o&&Ws(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),br&&qr(br,o)||(br=o,o=qo(Qs,"onSelect"),0ir||(e.current=ol[ir],ol[ir]=null,ir--)}function ke(e,t){ir++,ol[ir]=e.current,e.current=t}var pn={},Qe=dn(pn),tt=dn(!1),Pn=pn;function sr(e,t){var n=e.type.contextTypes;if(!n)return pn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var l={},a;for(a in n)l[a]=t[a];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function nt(e){return e=e.childContextTypes,e!=null}function Ko(){Ce(tt),Ce(Qe)}function fc(e,t,n){if(Qe.current!==pn)throw Error(s(168));ke(Qe,t),ke(tt,n)}function dc(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return n;o=o.getChildContext();for(var l in o)if(!(l in t))throw Error(s(108,ve(e)||"Unknown",l));return q({},n,o)}function Xo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||pn,Pn=Qe.current,ke(Qe,e),ke(tt,tt.current),!0}function pc(e,t,n){var o=e.stateNode;if(!o)throw Error(s(169));n?(e=dc(e,t,Pn),o.__reactInternalMemoizedMergedChildContext=e,Ce(tt),Ce(Qe),ke(Qe,e)):Ce(tt),ke(tt,n)}var Yt=null,Jo=!1,il=!1;function hc(e){Yt===null?Yt=[e]:Yt.push(e)}function fm(e){Jo=!0,hc(e)}function hn(){if(!il&&Yt!==null){il=!0;var e=0,t=xe;try{var n=Yt;for(xe=1;e>=f,l-=f,Kt=1<<32-Pt(t)+l|n<re?(Ue=ne,ne=null):Ue=ne.sibling;var ye=z(k,ne,C[re],B);if(ye===null){ne===null&&(ne=Ue);break}e&&ne&&ye.alternate===null&&t(k,ne),w=a(ye,w,re),te===null?Z=ye:te.sibling=ye,te=ye,ne=Ue}if(re===C.length)return n(k,ne),Re&&In(k,re),Z;if(ne===null){for(;rere?(Ue=ne,ne=null):Ue=ne.sibling;var En=z(k,ne,ye.value,B);if(En===null){ne===null&&(ne=Ue);break}e&&ne&&En.alternate===null&&t(k,ne),w=a(En,w,re),te===null?Z=En:te.sibling=En,te=En,ne=Ue}if(ye.done)return n(k,ne),Re&&In(k,re),Z;if(ne===null){for(;!ye.done;re++,ye=C.next())ye=U(k,ye.value,B),ye!==null&&(w=a(ye,w,re),te===null?Z=ye:te.sibling=ye,te=ye);return Re&&In(k,re),Z}for(ne=o(k,ne);!ye.done;re++,ye=C.next())ye=b(ne,k,re,ye.value,B),ye!==null&&(e&&ye.alternate!==null&&ne.delete(ye.key===null?re:ye.key),w=a(ye,w,re),te===null?Z=ye:te.sibling=ye,te=ye);return e&&ne.forEach(function(Wm){return t(k,Wm)}),Re&&In(k,re),Z}function Ne(k,w,C,B){if(typeof C=="object"&&C!==null&&C.type===H&&C.key===null&&(C=C.props.children),typeof C=="object"&&C!==null){switch(C.$$typeof){case $:e:{for(var Z=C.key,te=w;te!==null;){if(te.key===Z){if(Z=C.type,Z===H){if(te.tag===7){n(k,te.sibling),w=l(te,C.props.children),w.return=k,k=w;break e}}else if(te.elementType===Z||typeof Z=="object"&&Z!==null&&Z.$$typeof===We&&xc(Z)===te.type){n(k,te.sibling),w=l(te,C.props),w.ref=Zr(k,te,C),w.return=k,k=w;break e}n(k,te);break}else t(k,te);te=te.sibling}C.type===H?(w=Mn(C.props.children,k.mode,B,C.key),w.return=k,k=w):(B=Ri(C.type,C.key,C.props,null,k.mode,B),B.ref=Zr(k,w,C),B.return=k,k=B)}return f(k);case T:e:{for(te=C.key;w!==null;){if(w.key===te)if(w.tag===4&&w.stateNode.containerInfo===C.containerInfo&&w.stateNode.implementation===C.implementation){n(k,w.sibling),w=l(w,C.children||[]),w.return=k,k=w;break e}else{n(k,w);break}else t(k,w);w=w.sibling}w=nu(C,k.mode,B),w.return=k,k=w}return f(k);case We:return te=C._init,Ne(k,w,te(C._payload),B)}if(jr(C))return Y(k,w,C,B);if(ee(C))return X(k,w,C,B);ni(k,C)}return typeof C=="string"&&C!==""||typeof C=="number"?(C=""+C,w!==null&&w.tag===6?(n(k,w.sibling),w=l(w,C),w.return=k,k=w):(n(k,w),w=tu(C,k.mode,B),w.return=k,k=w),f(k)):n(k,w)}return Ne}var cr=Sc(!0),kc=Sc(!1),ri=dn(null),oi=null,fr=null,fl=null;function dl(){fl=fr=oi=null}function pl(e){var t=ri.current;Ce(ri),e._currentValue=t}function hl(e,t,n){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function dr(e,t){oi=e,fl=fr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(rt=!0),e.firstContext=null)}function xt(e){var t=e._currentValue;if(fl!==e)if(e={context:e,memoizedValue:t,next:null},fr===null){if(oi===null)throw Error(s(308));fr=e,oi.dependencies={lanes:0,firstContext:e}}else fr=fr.next=e;return t}var _n=null;function ml(e){_n===null?_n=[e]:_n.push(e)}function Ec(e,t,n,o){var l=t.interleaved;return l===null?(n.next=n,ml(t)):(n.next=l.next,l.next=n),t.interleaved=n,Jt(e,o)}function Jt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var mn=!1;function gl(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Cc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Zt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function gn(e,t,n){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,me&2){var l=o.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),o.pending=t,Jt(e,n)}return l=o.interleaved,l===null?(t.next=t,ml(o)):(t.next=l.next,l.next=t),o.interleaved=t,Jt(e,n)}function ii(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,_s(e,n)}}function Ac(e,t){var n=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,n===o)){var l=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var f={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};a===null?l=a=f:a=a.next=f,n=n.next}while(n!==null);a===null?l=a=t:a=a.next=t}else l=a=t;n={baseState:o.baseState,firstBaseUpdate:l,lastBaseUpdate:a,shared:o.shared,effects:o.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function si(e,t,n,o){var l=e.updateQueue;mn=!1;var a=l.firstBaseUpdate,f=l.lastBaseUpdate,h=l.shared.pending;if(h!==null){l.shared.pending=null;var y=h,A=y.next;y.next=null,f===null?a=A:f.next=A,f=y;var M=e.alternate;M!==null&&(M=M.updateQueue,h=M.lastBaseUpdate,h!==f&&(h===null?M.firstBaseUpdate=A:h.next=A,M.lastBaseUpdate=y))}if(a!==null){var U=l.baseState;f=0,M=A=y=null,h=a;do{var z=h.lane,b=h.eventTime;if((o&z)===z){M!==null&&(M=M.next={eventTime:b,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,next:null});e:{var Y=e,X=h;switch(z=t,b=n,X.tag){case 1:if(Y=X.payload,typeof Y=="function"){U=Y.call(b,U,z);break e}U=Y;break e;case 3:Y.flags=Y.flags&-65537|128;case 0:if(Y=X.payload,z=typeof Y=="function"?Y.call(b,U,z):Y,z==null)break e;U=q({},U,z);break e;case 2:mn=!0}}h.callback!==null&&h.lane!==0&&(e.flags|=64,z=l.effects,z===null?l.effects=[h]:z.push(h))}else b={eventTime:b,lane:z,tag:h.tag,payload:h.payload,callback:h.callback,next:null},M===null?(A=M=b,y=U):M=M.next=b,f|=z;if(h=h.next,h===null){if(h=l.shared.pending,h===null)break;z=h,h=z.next,z.next=null,l.lastBaseUpdate=z,l.shared.pending=null}}while(!0);if(M===null&&(y=U),l.baseState=y,l.firstBaseUpdate=A,l.lastBaseUpdate=M,t=l.shared.interleaved,t!==null){l=t;do f|=l.lane,l=l.next;while(l!==t)}else a===null&&(l.shared.lanes=0);Tn|=f,e.lanes=f,e.memoizedState=U}}function Rc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var o=Sl.transition;Sl.transition={};try{e(!1),t()}finally{xe=n,Sl.transition=o}}function Qc(){return St().memoizedState}function mm(e,t,n){var o=xn(e);if(n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},qc(e))bc(t,n);else if(n=Ec(e,t,n,o),n!==null){var l=et();Tt(n,e,o,l),Gc(n,t,o)}}function gm(e,t,n){var o=xn(e),l={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(qc(e))bc(t,l);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var f=t.lastRenderedState,h=a(f,n);if(l.hasEagerState=!0,l.eagerState=h,jt(h,f)){var y=t.interleaved;y===null?(l.next=l,ml(t)):(l.next=y.next,y.next=l),t.interleaved=l;return}}catch{}finally{}n=Ec(e,t,l,o),n!==null&&(l=et(),Tt(n,e,o,l),Gc(n,t,o))}}function qc(e){var t=e.alternate;return e===je||t!==null&&t===je}function bc(e,t){ro=ai=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Gc(e,t,n){if(n&4194240){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,_s(e,n)}}var di={readContext:xt,useCallback:qe,useContext:qe,useEffect:qe,useImperativeHandle:qe,useInsertionEffect:qe,useLayoutEffect:qe,useMemo:qe,useReducer:qe,useRef:qe,useState:qe,useDebugValue:qe,useDeferredValue:qe,useTransition:qe,useMutableSource:qe,useSyncExternalStore:qe,useId:qe,unstable_isNewReconciler:!1},ym={readContext:xt,useCallback:function(e,t){return Bt().memoizedState=[e,t===void 0?null:t],e},useContext:xt,useEffect:Mc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ci(4194308,4,Bc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ci(4194308,4,e,t)},useInsertionEffect:function(e,t){return ci(4,2,e,t)},useMemo:function(e,t){var n=Bt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=Bt();return t=n!==void 0?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=mm.bind(null,je,e),[o.memoizedState,e]},useRef:function(e){var t=Bt();return e={current:e},t.memoizedState=e},useState:Dc,useDebugValue:jl,useDeferredValue:function(e){return Bt().memoizedState=e},useTransition:function(){var e=Dc(!1),t=e[0];return e=hm.bind(null,e[1]),Bt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=je,l=Bt();if(Re){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),Me===null)throw Error(s(349));On&30||_c(o,t,n)}l.memoizedState=n;var a={value:n,getSnapshot:t};return l.queue=a,Mc(Oc.bind(null,o,a,e),[e]),o.flags|=2048,so(9,Nc.bind(null,o,a,n,t),void 0,null),n},useId:function(){var e=Bt(),t=Me.identifierPrefix;if(Re){var n=Xt,o=Kt;n=(o&~(1<<32-Pt(o)-1)).toString(32)+n,t=":"+t+"R"+n,n=oo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=f.createElement(n,{is:o.is}):(e=f.createElement(n),n==="select"&&(f=e,o.multiple?f.multiple=!0:o.size&&(f.size=o.size))):e=f.createElementNS(e,n),e[Ut]=t,e[Xr]=o,mf(e,t,!1,!1),t.stateNode=e;e:{switch(f=xs(n,o),n){case"dialog":Ee("cancel",e),Ee("close",e),l=o;break;case"iframe":case"object":case"embed":Ee("load",e),l=o;break;case"video":case"audio":for(l=0;lyr&&(t.flags|=128,o=!0,lo(a,!1),t.lanes=4194304)}else{if(!o)if(e=li(f),e!==null){if(t.flags|=128,o=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),lo(a,!0),a.tail===null&&a.tailMode==="hidden"&&!f.alternate&&!Re)return be(t),null}else 2*_e()-a.renderingStartTime>yr&&n!==1073741824&&(t.flags|=128,o=!0,lo(a,!1),t.lanes=4194304);a.isBackwards?(f.sibling=t.child,t.child=f):(n=a.last,n!==null?n.sibling=f:t.child=f,a.last=f)}return a.tail!==null?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=_e(),t.sibling=null,n=Pe.current,ke(Pe,o?n&1|2:n&1),t):(be(t),null);case 22:case 23:return Jl(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&t.mode&1?pt&1073741824&&(be(t),t.subtreeFlags&6&&(t.flags|=8192)):be(t),null;case 24:return null;case 25:return null}throw Error(s(156,t.tag))}function Am(e,t){switch(ll(t),t.tag){case 1:return nt(t.type)&&Ko(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return pr(),Ce(tt),Ce(Qe),xl(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return vl(t),null;case 13:if(Ce(Pe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));ar()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ce(Pe),null;case 4:return pr(),null;case 10:return pl(t.type._context),null;case 22:case 23:return Jl(),null;case 24:return null;default:return null}}var gi=!1,Ge=!1,Rm=typeof WeakSet=="function"?WeakSet:Set,G=null;function mr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(o){Ie(e,t,o)}else n.current=null}function Bl(e,t,n){try{n()}catch(o){Ie(e,t,o)}}var vf=!1;function Pm(e,t){if(Js=zo,e=Ya(),Ws(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var o=n.getSelection&&n.getSelection();if(o&&o.rangeCount!==0){n=o.anchorNode;var l=o.anchorOffset,a=o.focusNode;o=o.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break e}var f=0,h=-1,y=-1,A=0,M=0,U=e,z=null;t:for(;;){for(var b;U!==n||l!==0&&U.nodeType!==3||(h=f+l),U!==a||o!==0&&U.nodeType!==3||(y=f+o),U.nodeType===3&&(f+=U.nodeValue.length),(b=U.firstChild)!==null;)z=U,U=b;for(;;){if(U===e)break t;if(z===n&&++A===l&&(h=f),z===a&&++M===o&&(y=f),(b=U.nextSibling)!==null)break;U=z,z=U.parentNode}U=b}n=h===-1||y===-1?null:{start:h,end:y}}else n=null}n=n||{start:0,end:0}}else n=null;for(Zs={focusedElem:e,selectionRange:n},zo=!1,G=t;G!==null;)if(t=G,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,G=e;else for(;G!==null;){t=G;try{var Y=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(Y!==null){var X=Y.memoizedProps,Ne=Y.memoizedState,k=t.stateNode,w=k.getSnapshotBeforeUpdate(t.elementType===t.type?X:_t(t.type,X),Ne);k.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var C=t.stateNode.containerInfo;C.nodeType===1?C.textContent="":C.nodeType===9&&C.documentElement&&C.removeChild(C.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(s(163))}}catch(B){Ie(t,t.return,B)}if(e=t.sibling,e!==null){e.return=t.return,G=e;break}G=t.return}return Y=vf,vf=!1,Y}function uo(e,t,n){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var l=o=o.next;do{if((l.tag&e)===e){var a=l.destroy;l.destroy=void 0,a!==void 0&&Bl(t,n,a)}l=l.next}while(l!==o)}}function yi(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function $l(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function wf(e){var t=e.alternate;t!==null&&(e.alternate=null,wf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ut],delete t[Xr],delete t[rl],delete t[am],delete t[cm])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function xf(e){return e.tag===5||e.tag===3||e.tag===4}function Sf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||xf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Hl(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Go));else if(o!==4&&(e=e.child,e!==null))for(Hl(e,t,n),e=e.sibling;e!==null;)Hl(e,t,n),e=e.sibling}function Vl(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Vl(e,t,n),e=e.sibling;e!==null;)Vl(e,t,n),e=e.sibling}var $e=null,Nt=!1;function yn(e,t,n){for(n=n.child;n!==null;)kf(e,t,n),n=n.sibling}function kf(e,t,n){if(Mt&&typeof Mt.onCommitFiberUnmount=="function")try{Mt.onCommitFiberUnmount(_o,n)}catch{}switch(n.tag){case 5:Ge||mr(n,t);case 6:var o=$e,l=Nt;$e=null,yn(e,t,n),$e=o,Nt=l,$e!==null&&(Nt?(e=$e,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):$e.removeChild(n.stateNode));break;case 18:$e!==null&&(Nt?(e=$e,n=n.stateNode,e.nodeType===8?nl(e.parentNode,n):e.nodeType===1&&nl(e,n),Br(e)):nl($e,n.stateNode));break;case 4:o=$e,l=Nt,$e=n.stateNode.containerInfo,Nt=!0,yn(e,t,n),$e=o,Nt=l;break;case 0:case 11:case 14:case 15:if(!Ge&&(o=n.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){l=o=o.next;do{var a=l,f=a.destroy;a=a.tag,f!==void 0&&(a&2||a&4)&&Bl(n,t,f),l=l.next}while(l!==o)}yn(e,t,n);break;case 1:if(!Ge&&(mr(n,t),o=n.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(h){Ie(n,t,h)}yn(e,t,n);break;case 21:yn(e,t,n);break;case 22:n.mode&1?(Ge=(o=Ge)||n.memoizedState!==null,yn(e,t,n),Ge=o):yn(e,t,n);break;default:yn(e,t,n)}}function Ef(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Rm),t.forEach(function(o){var l=zm.bind(null,e,o);n.has(o)||(n.add(o),o.then(l,l))})}}function Ot(e,t){var n=t.deletions;if(n!==null)for(var o=0;ol&&(l=f),o&=~a}if(o=l,o=_e()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Im(o/1960))-o,10e?16:e,wn===null)var o=!1;else{if(e=wn,wn=null,ki=0,me&6)throw Error(s(331));var l=me;for(me|=4,G=e.current;G!==null;){var a=G,f=a.child;if(G.flags&16){var h=a.deletions;if(h!==null){for(var y=0;y_e()-ql?Dn(e,0):Ql|=n),it(e,t)}function zf(e,t){t===0&&(e.mode&1?(t=Oo,Oo<<=1,!(Oo&130023424)&&(Oo=4194304)):t=1);var n=et();e=Jt(e,t),e!==null&&(Dr(e,t,n),it(e,n))}function Dm(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),zf(e,n)}function zm(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(s(314))}o!==null&&o.delete(t),zf(e,n)}var Mf;Mf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||tt.current)rt=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return rt=!1,Em(e,t,n);rt=!!(e.flags&131072)}else rt=!1,Re&&t.flags&1048576&&mc(t,ei,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;mi(e,t),e=t.pendingProps;var l=sr(t,Qe.current);dr(t,n),l=El(null,t,o,e,l,n);var a=Cl();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,nt(o)?(a=!0,Xo(t)):a=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,gl(t),l.updater=pi,t.stateNode=l,l._reactInternals=t,_l(t,o,e,n),t=Ll(null,t,o,!0,a,n)):(t.tag=0,Re&&a&&sl(t),Ze(null,t,l,n),t=t.child),t;case 16:o=t.elementType;e:{switch(mi(e,t),e=t.pendingProps,l=o._init,o=l(o._payload),t.type=o,l=t.tag=Um(o),e=_t(o,e),l){case 0:t=Tl(null,t,o,e,n);break e;case 1:t=af(null,t,o,e,n);break e;case 11:t=rf(null,t,o,e,n);break e;case 14:t=of(null,t,o,_t(o.type,e),n);break e}throw Error(s(306,o,""))}return t;case 0:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),Tl(e,t,o,l,n);case 1:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),af(e,t,o,l,n);case 3:e:{if(cf(t),e===null)throw Error(s(387));o=t.pendingProps,a=t.memoizedState,l=a.element,Cc(e,t),si(t,o,null,n);var f=t.memoizedState;if(o=f.element,a.isDehydrated)if(a={element:o,isDehydrated:!1,cache:f.cache,pendingSuspenseBoundaries:f.pendingSuspenseBoundaries,transitions:f.transitions},t.updateQueue.baseState=a,t.memoizedState=a,t.flags&256){l=hr(Error(s(423)),t),t=ff(e,t,o,n,l);break e}else if(o!==l){l=hr(Error(s(424)),t),t=ff(e,t,o,n,l);break e}else for(dt=fn(t.stateNode.containerInfo.firstChild),ft=t,Re=!0,It=null,n=kc(t,null,o,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(ar(),o===l){t=en(e,t,n);break e}Ze(e,t,o,n)}t=t.child}return t;case 5:return Pc(t),e===null&&al(t),o=t.type,l=t.pendingProps,a=e!==null?e.memoizedProps:null,f=l.children,el(o,l)?f=null:a!==null&&el(o,a)&&(t.flags|=32),uf(e,t),Ze(e,t,f,n),t.child;case 6:return e===null&&al(t),null;case 13:return df(e,t,n);case 4:return yl(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=cr(t,null,o,n):Ze(e,t,o,n),t.child;case 11:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),rf(e,t,o,l,n);case 7:return Ze(e,t,t.pendingProps,n),t.child;case 8:return Ze(e,t,t.pendingProps.children,n),t.child;case 12:return Ze(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,l=t.pendingProps,a=t.memoizedProps,f=l.value,ke(ri,o._currentValue),o._currentValue=f,a!==null)if(jt(a.value,f)){if(a.children===l.children&&!tt.current){t=en(e,t,n);break e}}else for(a=t.child,a!==null&&(a.return=t);a!==null;){var h=a.dependencies;if(h!==null){f=a.child;for(var y=h.firstContext;y!==null;){if(y.context===o){if(a.tag===1){y=Zt(-1,n&-n),y.tag=2;var A=a.updateQueue;if(A!==null){A=A.shared;var M=A.pending;M===null?y.next=y:(y.next=M.next,M.next=y),A.pending=y}}a.lanes|=n,y=a.alternate,y!==null&&(y.lanes|=n),hl(a.return,n,t),h.lanes|=n;break}y=y.next}}else if(a.tag===10)f=a.type===t.type?null:a.child;else if(a.tag===18){if(f=a.return,f===null)throw Error(s(341));f.lanes|=n,h=f.alternate,h!==null&&(h.lanes|=n),hl(f,n,t),f=a.sibling}else f=a.child;if(f!==null)f.return=a;else for(f=a;f!==null;){if(f===t){f=null;break}if(a=f.sibling,a!==null){a.return=f.return,f=a;break}f=f.return}a=f}Ze(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,o=t.pendingProps.children,dr(t,n),l=xt(l),o=o(l),t.flags|=1,Ze(e,t,o,n),t.child;case 14:return o=t.type,l=_t(o,t.pendingProps),l=_t(o.type,l),of(e,t,o,l,n);case 15:return sf(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:_t(o,l),mi(e,t),t.tag=1,nt(o)?(e=!0,Xo(t)):e=!1,dr(t,n),Kc(t,o,l),_l(t,o,l,n),Ll(null,t,o,!0,e,n);case 19:return hf(e,t,n);case 22:return lf(e,t,n)}throw Error(s(156,t.tag))};function Uf(e,t){return ga(e,t)}function Mm(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Et(e,t,n,o){return new Mm(e,t,n,o)}function eu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Um(e){if(typeof e=="function")return eu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===gt)return 11;if(e===yt)return 14}return 2}function kn(e,t){var n=e.alternate;return n===null?(n=Et(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Ri(e,t,n,o,l,a){var f=2;if(o=e,typeof e=="function")eu(e)&&(f=1);else if(typeof e=="string")f=5;else e:switch(e){case H:return Mn(n.children,l,a,t);case se:f=8,l|=8;break;case Ve:return e=Et(12,n,t,l|2),e.elementType=Ve,e.lanes=a,e;case Je:return e=Et(13,n,t,l),e.elementType=Je,e.lanes=a,e;case at:return e=Et(19,n,t,l),e.elementType=at,e.lanes=a,e;case Se:return Pi(n,l,a,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case At:f=10;break e;case qt:f=9;break e;case gt:f=11;break e;case yt:f=14;break e;case We:f=16,o=null;break e}throw Error(s(130,e==null?e:typeof e,""))}return t=Et(f,n,t,l),t.elementType=e,t.type=o,t.lanes=a,t}function Mn(e,t,n,o){return e=Et(7,e,o,t),e.lanes=n,e}function Pi(e,t,n,o){return e=Et(22,e,o,t),e.elementType=Se,e.lanes=n,e.stateNode={isHidden:!1},e}function tu(e,t,n){return e=Et(6,e,null,t),e.lanes=n,e}function nu(e,t,n){return t=Et(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Fm(e,t,n,o,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Is(0),this.expirationTimes=Is(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Is(0),this.identifierPrefix=o,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function ru(e,t,n,o,l,a,f,h,y){return e=new Fm(e,t,n,h,y),t===1?(t=1,a===!0&&(t|=8)):t=0,a=Et(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},gl(a),e}function Bm(e,t,n){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),au.exports=Xm(),au.exports}var Jf;function Zm(){if(Jf)return Li;Jf=1;var r=Jm();return Li.createRoot=r.createRoot,Li.hydrateRoot=r.hydrateRoot,Li}var eg=Zm(),Ke=function(){return Ke=Object.assign||function(i){for(var s,u=1,c=arguments.length;u0?Fe(Ar,--Ct):0,kr--,Te===10&&(kr=1,rs--),Te}function Lt(){return Te=Ct2||Au(Te)>3?"":" "}function cg(r,i){for(;--i&&Lt()&&!(Te<48||Te>102||Te>57&&Te<65||Te>70&&Te<97););return is(r,Hi()+(i<6&&$n()==32&&Lt()==32))}function Ru(r){for(;Lt();)switch(Te){case r:return Ct;case 34:case 39:r!==34&&r!==39&&Ru(Te);break;case 40:r===41&&Ru(r);break;case 92:Lt();break}return Ct}function fg(r,i){for(;Lt()&&r+Te!==57;)if(r+Te===84&&$n()===47)break;return"/*"+is(i,Ct-1)+"*"+Hu(r===47?r:Lt())}function dg(r){for(;!Au($n());)Lt();return is(r,Ct)}function pg(r){return ug(Vi("",null,null,null,[""],r=lg(r),0,[0],r))}function Vi(r,i,s,u,c,d,p,m,v){for(var x=0,E=0,j=p,O=0,P=0,I=0,R=1,L=1,V=1,F=0,W="",K=c,$=d,T=u,H=W;L;)switch(I=F,F=Lt()){case 40:if(I!=108&&Fe(H,j-1)==58){$i(H+=ae(du(F),"&","&\f"),"&\f",Kd(x?m[x-1]:0))!=-1&&(V=-1);break}case 34:case 39:case 91:H+=du(F);break;case 9:case 10:case 13:case 32:H+=ag(I);break;case 92:H+=cg(Hi()-1,7);continue;case 47:switch($n()){case 42:case 47:go(hg(fg(Lt(),Hi()),i,s,v),v);break;default:H+="/"}break;case 123*R:m[x++]=Vt(H)*V;case 125*R:case 59:case 0:switch(F){case 0:case 125:L=0;case 59+E:V==-1&&(H=ae(H,/\f/g,"")),P>0&&Vt(H)-j&&go(P>32?td(H+";",u,s,j-1,v):td(ae(H," ","")+";",u,s,j-2,v),v);break;case 59:H+=";";default:if(go(T=ed(H,i,s,x,E,c,m,W,K=[],$=[],j,d),d),F===123)if(E===0)Vi(H,i,T,T,K,d,j,m,$);else switch(O===99&&Fe(H,3)===110?100:O){case 100:case 108:case 109:case 115:Vi(r,T,T,u&&go(ed(r,T,T,0,0,c,m,W,c,K=[],j,$),$),c,$,j,m,u?K:$);break;default:Vi(H,T,T,T,[""],$,0,m,$)}}x=E=P=0,R=V=1,W=H="",j=p;break;case 58:j=1+Vt(H),P=I;default:if(R<1){if(F==123)--R;else if(F==125&&R++==0&&sg()==125)continue}switch(H+=Hu(F),F*R){case 38:V=E>0?1:(H+="\f",-1);break;case 44:m[x++]=(Vt(H)-1)*V,V=1;break;case 64:$n()===45&&(H+=du(Lt())),O=$n(),E=j=Vt(W=H+=dg(Hi())),F++;break;case 45:I===45&&Vt(H)==2&&(R=0)}}return d}function ed(r,i,s,u,c,d,p,m,v,x,E,j){for(var O=c-1,P=c===0?d:[""],I=Jd(P),R=0,L=0,V=0;R0?P[F]+" "+W:ae(W,/&\f/g,P[F])))&&(v[V++]=K);return os(r,i,s,c===0?ns:m,v,x,E,j)}function hg(r,i,s,u){return os(r,i,s,Gd,Hu(ig()),Sr(r,2,-2),0,u)}function td(r,i,s,u,c){return os(r,i,s,$u,Sr(r,0,u),Sr(r,u+1,-1),u,c)}function ep(r,i,s){switch(rg(r,i)){case 5103:return we+"print-"+r+r;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return we+r+r;case 4789:return wo+r+r;case 5349:case 4246:case 4810:case 6968:case 2756:return we+r+wo+r+Ae+r+r;case 5936:switch(Fe(r,i+11)){case 114:return we+r+Ae+ae(r,/[svh]\w+-[tblr]{2}/,"tb")+r;case 108:return we+r+Ae+ae(r,/[svh]\w+-[tblr]{2}/,"tb-rl")+r;case 45:return we+r+Ae+ae(r,/[svh]\w+-[tblr]{2}/,"lr")+r}case 6828:case 4268:case 2903:return we+r+Ae+r+r;case 6165:return we+r+Ae+"flex-"+r+r;case 5187:return we+r+ae(r,/(\w+).+(:[^]+)/,we+"box-$1$2"+Ae+"flex-$1$2")+r;case 5443:return we+r+Ae+"flex-item-"+ae(r,/flex-|-self/g,"")+(nn(r,/flex-|baseline/)?"":Ae+"grid-row-"+ae(r,/flex-|-self/g,""))+r;case 4675:return we+r+Ae+"flex-line-pack"+ae(r,/align-content|flex-|-self/g,"")+r;case 5548:return we+r+Ae+ae(r,"shrink","negative")+r;case 5292:return we+r+Ae+ae(r,"basis","preferred-size")+r;case 6060:return we+"box-"+ae(r,"-grow","")+we+r+Ae+ae(r,"grow","positive")+r;case 4554:return we+ae(r,/([^-])(transform)/g,"$1"+we+"$2")+r;case 6187:return ae(ae(ae(r,/(zoom-|grab)/,we+"$1"),/(image-set)/,we+"$1"),r,"")+r;case 5495:case 3959:return ae(r,/(image-set\([^]*)/,we+"$1$`$1");case 4968:return ae(ae(r,/(.+:)(flex-)?(.*)/,we+"box-pack:$3"+Ae+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+we+r+r;case 4200:if(!nn(r,/flex-|baseline/))return Ae+"grid-column-align"+Sr(r,i)+r;break;case 2592:case 3360:return Ae+ae(r,"template-","")+r;case 4384:case 3616:return s&&s.some(function(u,c){return i=c,nn(u.props,/grid-\w+-end/)})?~$i(r+(s=s[i].value),"span",0)?r:Ae+ae(r,"-start","")+r+Ae+"grid-row-span:"+(~$i(s,"span",0)?nn(s,/\d+/):+nn(s,/\d+/)-+nn(r,/\d+/))+";":Ae+ae(r,"-start","")+r;case 4896:case 4128:return s&&s.some(function(u){return nn(u.props,/grid-\w+-start/)})?r:Ae+ae(ae(r,"-end","-span"),"span ","")+r;case 4095:case 3583:case 4068:case 2532:return ae(r,/(.+)-inline(.+)/,we+"$1$2")+r;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(Vt(r)-1-i>6)switch(Fe(r,i+1)){case 109:if(Fe(r,i+4)!==45)break;case 102:return ae(r,/(.+:)(.+)-([^]+)/,"$1"+we+"$2-$3$1"+wo+(Fe(r,i+3)==108?"$3":"$2-$3"))+r;case 115:return~$i(r,"stretch",0)?ep(ae(r,"stretch","fill-available"),i,s)+r:r}break;case 5152:case 5920:return ae(r,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(u,c,d,p,m,v,x){return Ae+c+":"+d+x+(p?Ae+c+"-span:"+(m?v:+v-+d)+x:"")+r});case 4949:if(Fe(r,i+6)===121)return ae(r,":",":"+we)+r;break;case 6444:switch(Fe(r,Fe(r,14)===45?18:11)){case 120:return ae(r,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+we+(Fe(r,14)===45?"inline-":"")+"box$3$1"+we+"$2$3$1"+Ae+"$2box$3")+r;case 100:return ae(r,":",":"+Ae)+r}break;case 5719:case 2647:case 2135:case 3927:case 2391:return ae(r,"scroll-","scroll-snap-")+r}return r}function Ki(r,i){for(var s="",u=0;u-1&&!r.return)switch(r.type){case $u:r.return=ep(r.value,r.length,s);return;case Yd:return Ki([Cn(r,{value:ae(r.value,"@","@"+we)})],u);case ns:if(r.length)return og(s=r.props,function(c){switch(nn(c,u=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":wr(Cn(r,{props:[ae(c,/:(read-\w+)/,":"+wo+"$1")]})),wr(Cn(r,{props:[c]})),Cu(r,{props:Zf(s,u)});break;case"::placeholder":wr(Cn(r,{props:[ae(c,/:(plac\w+)/,":"+we+"input-$1")]})),wr(Cn(r,{props:[ae(c,/:(plac\w+)/,":"+wo+"$1")]})),wr(Cn(r,{props:[ae(c,/:(plac\w+)/,Ae+"input-$1")]})),wr(Cn(r,{props:[c]})),Cu(r,{props:Zf(s,u)});break}return""})}}var wg={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},ht={},Er=typeof process<"u"&&ht!==void 0&&(ht.REACT_APP_SC_ATTR||ht.SC_ATTR)||"data-styled",tp="active",np="data-styled-version",ss="6.1.14",Vu=`/*!sc*/ -`,Xi=typeof window<"u"&&"HTMLElement"in window,xg=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&ht!==void 0&&ht.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&ht.REACT_APP_SC_DISABLE_SPEEDY!==""?ht.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&ht.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&ht!==void 0&&ht.SC_DISABLE_SPEEDY!==void 0&&ht.SC_DISABLE_SPEEDY!==""&&ht.SC_DISABLE_SPEEDY!=="false"&&ht.SC_DISABLE_SPEEDY),ls=Object.freeze([]),Cr=Object.freeze({});function Sg(r,i,s){return s===void 0&&(s=Cr),r.theme!==s.theme&&r.theme||i||s.theme}var rp=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),kg=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,Eg=/(^-|-$)/g;function nd(r){return r.replace(kg,"-").replace(Eg,"")}var Cg=/(a)(d)/gi,Di=52,rd=function(r){return String.fromCharCode(r+(r>25?39:97))};function Pu(r){var i,s="";for(i=Math.abs(r);i>Di;i=i/Di|0)s=rd(i%Di)+s;return(rd(i%Di)+s).replace(Cg,"$1-$2")}var pu,op=5381,xr=function(r,i){for(var s=i.length;s;)r=33*r^i.charCodeAt(--s);return r},ip=function(r){return xr(op,r)};function Ag(r){return Pu(ip(r)>>>0)}function Rg(r){return r.displayName||r.name||"Component"}function hu(r){return typeof r=="string"&&!0}var sp=typeof Symbol=="function"&&Symbol.for,lp=sp?Symbol.for("react.memo"):60115,Pg=sp?Symbol.for("react.forward_ref"):60112,jg={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Ig={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},up={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},_g=((pu={})[Pg]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},pu[lp]=up,pu);function od(r){return("type"in(i=r)&&i.type.$$typeof)===lp?up:"$$typeof"in r?_g[r.$$typeof]:jg;var i}var Ng=Object.defineProperty,Og=Object.getOwnPropertyNames,id=Object.getOwnPropertySymbols,Tg=Object.getOwnPropertyDescriptor,Lg=Object.getPrototypeOf,sd=Object.prototype;function ap(r,i,s){if(typeof i!="string"){if(sd){var u=Lg(i);u&&u!==sd&&ap(r,u,s)}var c=Og(i);id&&(c=c.concat(id(i)));for(var d=od(r),p=od(i),m=0;m0?" Args: ".concat(i.join(", ")):""))}var Dg=function(){function r(i){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=i}return r.prototype.indexOfGroup=function(i){for(var s=0,u=0;u=this.groupSizes.length){for(var u=this.groupSizes,c=u.length,d=c;i>=d;)if((d<<=1)<0)throw Qn(16,"".concat(i));this.groupSizes=new Uint32Array(d),this.groupSizes.set(u),this.length=d;for(var p=c;p=this.length||this.groupSizes[i]===0)return s;for(var u=this.groupSizes[i],c=this.indexOfGroup(i),d=c+u,p=c;p=0){var u=document.createTextNode(s);return this.element.insertBefore(u,this.nodes[i]||null),this.length++,!0}return!1},r.prototype.deleteRule=function(i){this.element.removeChild(this.nodes[i]),this.length--},r.prototype.getRule=function(i){return i0&&(L+="".concat(V,","))}),v+="".concat(I).concat(R,'{content:"').concat(L,'"}').concat(Vu)},E=0;E0?".".concat(i):O},E=v.slice();E.push(function(O){O.type===ns&&O.value.includes("&")&&(O.props[0]=O.props[0].replace(qg,s).replace(u,x))}),p.prefix&&E.push(vg),E.push(mg);var j=function(O,P,I,R){P===void 0&&(P=""),I===void 0&&(I=""),R===void 0&&(R="&"),i=R,s=P,u=new RegExp("\\".concat(s,"\\b"),"g");var L=O.replace(bg,""),V=pg(I||P?"".concat(I," ").concat(P," { ").concat(L," }"):L);p.namespace&&(V=dp(V,p.namespace));var F=[];return Ki(V,gg(E.concat(yg(function(W){return F.push(W)})))),F};return j.hash=v.length?v.reduce(function(O,P){return P.name||Qn(15),xr(O,P.name)},op).toString():"",j}var Yg=new fp,Iu=Gg(),pp=rn.createContext({shouldForwardProp:void 0,styleSheet:Yg,stylis:Iu});pp.Consumer;rn.createContext(void 0);function cd(){return ue.useContext(pp)}var Kg=function(){function r(i,s){var u=this;this.inject=function(c,d){d===void 0&&(d=Iu);var p=u.name+d.hash;c.hasNameForId(u.id,p)||c.insertRules(u.id,p,d(u.rules,p,"@keyframes"))},this.name=i,this.id="sc-keyframes-".concat(i),this.rules=s,Qu(this,function(){throw Qn(12,String(u.name))})}return r.prototype.getName=function(i){return i===void 0&&(i=Iu),this.name+i.hash},r}(),Xg=function(r){return r>="A"&&r<="Z"};function fd(r){for(var i="",s=0;s>>0);if(!s.hasNameForId(this.componentId,p)){var m=u(d,".".concat(p),void 0,this.componentId);s.insertRules(this.componentId,p,m)}c=Un(c,p),this.staticRulesId=p}else{for(var v=xr(this.baseHash,u.hash),x="",E=0;E>>0);s.hasNameForId(this.componentId,P)||s.insertRules(this.componentId,P,u(x,".".concat(P),void 0,this.componentId)),c=Un(c,P)}}return c},r}(),Zi=rn.createContext(void 0);Zi.Consumer;function ty(r){var i=rn.useContext(Zi),s=ue.useMemo(function(){return function(u,c){if(!u)throw Qn(14);if(Wn(u)){var d=u(c);return d}if(Array.isArray(u)||typeof u!="object")throw Qn(8);return c?Ke(Ke({},c),u):u}(r.theme,i)},[r.theme,i]);return r.children?rn.createElement(Zi.Provider,{value:s},r.children):null}var mu={};function ny(r,i,s){var u=Wu(r),c=r,d=!hu(r),p=i.attrs,m=p===void 0?ls:p,v=i.componentId,x=v===void 0?function(K,$){var T=typeof K!="string"?"sc":nd(K);mu[T]=(mu[T]||0)+1;var H="".concat(T,"-").concat(Ag(ss+T+mu[T]));return $?"".concat($,"-").concat(H):H}(i.displayName,i.parentComponentId):v,E=i.displayName,j=E===void 0?function(K){return hu(K)?"styled.".concat(K):"Styled(".concat(Rg(K),")")}(r):E,O=i.displayName&&i.componentId?"".concat(nd(i.displayName),"-").concat(i.componentId):i.componentId||x,P=u&&c.attrs?c.attrs.concat(m).filter(Boolean):m,I=i.shouldForwardProp;if(u&&c.shouldForwardProp){var R=c.shouldForwardProp;if(i.shouldForwardProp){var L=i.shouldForwardProp;I=function(K,$){return R(K,$)&&L(K,$)}}else I=R}var V=new ey(s,O,u?c.componentStyle:void 0);function F(K,$){return function(T,H,se){var Ve=T.attrs,At=T.componentStyle,qt=T.defaultProps,gt=T.foldedComponentIds,Je=T.styledComponentId,at=T.target,yt=rn.useContext(Zi),We=cd(),Se=T.shouldForwardProp||We.shouldForwardProp,Q=Sg(H,yt,qt)||Cr,ee=function(de,ce,ve){for(var pe,ge=Ke(Ke({},ce),{className:void 0,theme:ve}),Be=0;Ber.$hasUnread?r.theme.colors.text.primary:r.theme.colors.text.muted}; - font-weight: ${r=>r.$hasUnread?"600":"normal"}; - cursor: pointer; - background: ${r=>r.$isActive?r.theme.colors.background.hover:"transparent"}; - border-radius: 4px; - - &:hover { - background: ${r=>r.theme.colors.background.hover}; - color: ${r=>r.theme.colors.text.primary}; - } -`,hd=N.div` - margin-bottom: 8px; -`,Nu=N.div` - padding: 8px 16px; - display: flex; - align-items: center; - color: ${J.colors.text.muted}; - text-transform: uppercase; - font-size: 12px; - font-weight: 600; - cursor: pointer; - user-select: none; - - & > span:nth-child(2) { - flex: 1; - margin-right: auto; - } - - &:hover { - color: ${J.colors.text.primary}; - } -`,md=N.span` - margin-right: 4px; - font-size: 10px; - transition: transform 0.2s; - transform: rotate(${r=>r.$folded?"-90deg":"0deg"}); -`,gd=N.div` - display: ${r=>r.$folded?"none":"block"}; -`,yd=N(yp)` - height: ${r=>r.hasSubtext?"42px":"34px"}; -`,ly=N.div` - position: relative; - width: 32px; - height: 32px; - margin: 0 8px; - flex-shrink: 0; - min-width: 40px; - - img { - width: 32px; - height: 32px; - border-radius: 50%; - } -`,vd=N.div` - font-size: 16px; - line-height: 18px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: ${r=>r.$isActive||r.$hasUnread?r.theme.colors.text.primary:r.theme.colors.text.muted}; - font-weight: ${r=>r.$hasUnread?"600":"normal"}; -`,vp=N.div` - position: absolute; - bottom: 0; - right: 0; - width: 10px; - height: 10px; - border-radius: 50%; - background: ${r=>r.$online?J.colors.status.online:J.colors.status.offline}; - border: 2px solid ${J.colors.background.secondary}; - transform: translate(20%, 20%); -`;N(vp)` - border-color: ${J.colors.background.primary}; -`;const wd=N.button` - background: none; - border: none; - color: ${J.colors.text.muted}; - font-size: 18px; - padding: 0; - cursor: pointer; - width: 16px; - height: 16px; - display: flex; - align-items: center; - justify-content: center; - opacity: 0; - transition: opacity 0.2s, color 0.2s; - - ${Nu}:hover & { - opacity: 1; - } - - &:hover { - color: ${J.colors.text.primary}; - } -`,uy=N.div` - width: 40px; - min-width: 40px; - height: 24px; - margin: 0 8px; - flex-shrink: 0; - position: relative; -`,ay=N.div` - font-size: 12px; - line-height: 13px; - color: ${J.colors.text.muted}; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -`,xd=N.div` - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - justify-content: center; - gap: 2px; -`,cy=N.img` - width: 24px; - height: 24px; - border-radius: 50%; - border: 2px solid ${J.colors.background.secondary}; - position: absolute; -`;function fy(){return g.jsx(sy,{children:"채널 목록"})}const Sd=r=>{let i;const s=new Set,u=(x,E)=>{const j=typeof x=="function"?x(i):x;if(!Object.is(j,i)){const O=i;i=E??(typeof j!="object"||j===null)?j:Object.assign({},i,j),s.forEach(P=>P(i,O))}},c=()=>i,m={setState:u,getState:c,getInitialState:()=>v,subscribe:x=>(s.add(x),()=>s.delete(x))},v=i=r(u,c,m);return m},dy=r=>r?Sd(r):Sd,py=r=>r;function hy(r,i=py){const s=rn.useSyncExternalStore(r.subscribe,()=>i(r.getState()),()=>i(r.getInitialState()));return rn.useDebugValue(s),s}const kd=r=>{const i=dy(r),s=u=>hy(i,u);return Object.assign(s,i),s},bn=r=>r?kd(r):kd;function wp(r,i){return function(){return r.apply(i,arguments)}}const{toString:my}=Object.prototype,{getPrototypeOf:qu}=Object,us=(r=>i=>{const s=my.call(i);return r[s]||(r[s]=s.slice(8,-1).toLowerCase())})(Object.create(null)),zt=r=>(r=r.toLowerCase(),i=>us(i)===r),as=r=>i=>typeof i===r,{isArray:Rr}=Array,ko=as("undefined");function gy(r){return r!==null&&!ko(r)&&r.constructor!==null&&!ko(r.constructor)&&mt(r.constructor.isBuffer)&&r.constructor.isBuffer(r)}const xp=zt("ArrayBuffer");function yy(r){let i;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?i=ArrayBuffer.isView(r):i=r&&r.buffer&&xp(r.buffer),i}const vy=as("string"),mt=as("function"),Sp=as("number"),cs=r=>r!==null&&typeof r=="object",wy=r=>r===!0||r===!1,qi=r=>{if(us(r)!=="object")return!1;const i=qu(r);return(i===null||i===Object.prototype||Object.getPrototypeOf(i)===null)&&!(Symbol.toStringTag in r)&&!(Symbol.iterator in r)},xy=zt("Date"),Sy=zt("File"),ky=zt("Blob"),Ey=zt("FileList"),Cy=r=>cs(r)&&mt(r.pipe),Ay=r=>{let i;return r&&(typeof FormData=="function"&&r instanceof FormData||mt(r.append)&&((i=us(r))==="formdata"||i==="object"&&mt(r.toString)&&r.toString()==="[object FormData]"))},Ry=zt("URLSearchParams"),[Py,jy,Iy,_y]=["ReadableStream","Request","Response","Headers"].map(zt),Ny=r=>r.trim?r.trim():r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Eo(r,i,{allOwnKeys:s=!1}={}){if(r===null||typeof r>"u")return;let u,c;if(typeof r!="object"&&(r=[r]),Rr(r))for(u=0,c=r.length;u0;)if(c=s[u],i===c.toLowerCase())return c;return null}const Fn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Ep=r=>!ko(r)&&r!==Fn;function Ou(){const{caseless:r}=Ep(this)&&this||{},i={},s=(u,c)=>{const d=r&&kp(i,c)||c;qi(i[d])&&qi(u)?i[d]=Ou(i[d],u):qi(u)?i[d]=Ou({},u):Rr(u)?i[d]=u.slice():i[d]=u};for(let u=0,c=arguments.length;u(Eo(i,(c,d)=>{s&&mt(c)?r[d]=wp(c,s):r[d]=c},{allOwnKeys:u}),r),Ty=r=>(r.charCodeAt(0)===65279&&(r=r.slice(1)),r),Ly=(r,i,s,u)=>{r.prototype=Object.create(i.prototype,u),r.prototype.constructor=r,Object.defineProperty(r,"super",{value:i.prototype}),s&&Object.assign(r.prototype,s)},Dy=(r,i,s,u)=>{let c,d,p;const m={};if(i=i||{},r==null)return i;do{for(c=Object.getOwnPropertyNames(r),d=c.length;d-- >0;)p=c[d],(!u||u(p,r,i))&&!m[p]&&(i[p]=r[p],m[p]=!0);r=s!==!1&&qu(r)}while(r&&(!s||s(r,i))&&r!==Object.prototype);return i},zy=(r,i,s)=>{r=String(r),(s===void 0||s>r.length)&&(s=r.length),s-=i.length;const u=r.indexOf(i,s);return u!==-1&&u===s},My=r=>{if(!r)return null;if(Rr(r))return r;let i=r.length;if(!Sp(i))return null;const s=new Array(i);for(;i-- >0;)s[i]=r[i];return s},Uy=(r=>i=>r&&i instanceof r)(typeof Uint8Array<"u"&&qu(Uint8Array)),Fy=(r,i)=>{const u=(r&&r[Symbol.iterator]).call(r);let c;for(;(c=u.next())&&!c.done;){const d=c.value;i.call(r,d[0],d[1])}},By=(r,i)=>{let s;const u=[];for(;(s=r.exec(i))!==null;)u.push(s);return u},$y=zt("HTMLFormElement"),Hy=r=>r.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(s,u,c){return u.toUpperCase()+c}),Ed=(({hasOwnProperty:r})=>(i,s)=>r.call(i,s))(Object.prototype),Vy=zt("RegExp"),Cp=(r,i)=>{const s=Object.getOwnPropertyDescriptors(r),u={};Eo(s,(c,d)=>{let p;(p=i(c,d,r))!==!1&&(u[d]=p||c)}),Object.defineProperties(r,u)},Wy=r=>{Cp(r,(i,s)=>{if(mt(r)&&["arguments","caller","callee"].indexOf(s)!==-1)return!1;const u=r[s];if(mt(u)){if(i.enumerable=!1,"writable"in i){i.writable=!1;return}i.set||(i.set=()=>{throw Error("Can not rewrite read-only method '"+s+"'")})}})},Qy=(r,i)=>{const s={},u=c=>{c.forEach(d=>{s[d]=!0})};return Rr(r)?u(r):u(String(r).split(i)),s},qy=()=>{},by=(r,i)=>r!=null&&Number.isFinite(r=+r)?r:i,gu="abcdefghijklmnopqrstuvwxyz",Cd="0123456789",Ap={DIGIT:Cd,ALPHA:gu,ALPHA_DIGIT:gu+gu.toUpperCase()+Cd},Gy=(r=16,i=Ap.ALPHA_DIGIT)=>{let s="";const{length:u}=i;for(;r--;)s+=i[Math.random()*u|0];return s};function Yy(r){return!!(r&&mt(r.append)&&r[Symbol.toStringTag]==="FormData"&&r[Symbol.iterator])}const Ky=r=>{const i=new Array(10),s=(u,c)=>{if(cs(u)){if(i.indexOf(u)>=0)return;if(!("toJSON"in u)){i[c]=u;const d=Rr(u)?[]:{};return Eo(u,(p,m)=>{const v=s(p,c+1);!ko(v)&&(d[m]=v)}),i[c]=void 0,d}}return u};return s(r,0)},Xy=zt("AsyncFunction"),Jy=r=>r&&(cs(r)||mt(r))&&mt(r.then)&&mt(r.catch),Rp=((r,i)=>r?setImmediate:i?((s,u)=>(Fn.addEventListener("message",({source:c,data:d})=>{c===Fn&&d===s&&u.length&&u.shift()()},!1),c=>{u.push(c),Fn.postMessage(s,"*")}))(`axios@${Math.random()}`,[]):s=>setTimeout(s))(typeof setImmediate=="function",mt(Fn.postMessage)),Zy=typeof queueMicrotask<"u"?queueMicrotask.bind(Fn):typeof process<"u"&&process.nextTick||Rp,_={isArray:Rr,isArrayBuffer:xp,isBuffer:gy,isFormData:Ay,isArrayBufferView:yy,isString:vy,isNumber:Sp,isBoolean:wy,isObject:cs,isPlainObject:qi,isReadableStream:Py,isRequest:jy,isResponse:Iy,isHeaders:_y,isUndefined:ko,isDate:xy,isFile:Sy,isBlob:ky,isRegExp:Vy,isFunction:mt,isStream:Cy,isURLSearchParams:Ry,isTypedArray:Uy,isFileList:Ey,forEach:Eo,merge:Ou,extend:Oy,trim:Ny,stripBOM:Ty,inherits:Ly,toFlatObject:Dy,kindOf:us,kindOfTest:zt,endsWith:zy,toArray:My,forEachEntry:Fy,matchAll:By,isHTMLForm:$y,hasOwnProperty:Ed,hasOwnProp:Ed,reduceDescriptors:Cp,freezeMethods:Wy,toObjectSet:Qy,toCamelCase:Hy,noop:qy,toFiniteNumber:by,findKey:kp,global:Fn,isContextDefined:Ep,ALPHABET:Ap,generateString:Gy,isSpecCompliantForm:Yy,toJSONObject:Ky,isAsyncFn:Xy,isThenable:Jy,setImmediate:Rp,asap:Zy};function ie(r,i,s,u,c){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=r,this.name="AxiosError",i&&(this.code=i),s&&(this.config=s),u&&(this.request=u),c&&(this.response=c,this.status=c.status?c.status:null)}_.inherits(ie,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:_.toJSONObject(this.config),code:this.code,status:this.status}}});const Pp=ie.prototype,jp={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(r=>{jp[r]={value:r}});Object.defineProperties(ie,jp);Object.defineProperty(Pp,"isAxiosError",{value:!0});ie.from=(r,i,s,u,c,d)=>{const p=Object.create(Pp);return _.toFlatObject(r,p,function(v){return v!==Error.prototype},m=>m!=="isAxiosError"),ie.call(p,r.message,i,s,u,c),p.cause=r,p.name=r.name,d&&Object.assign(p,d),p};const e0=null;function Tu(r){return _.isPlainObject(r)||_.isArray(r)}function Ip(r){return _.endsWith(r,"[]")?r.slice(0,-2):r}function Ad(r,i,s){return r?r.concat(i).map(function(c,d){return c=Ip(c),!s&&d?"["+c+"]":c}).join(s?".":""):i}function t0(r){return _.isArray(r)&&!r.some(Tu)}const n0=_.toFlatObject(_,{},null,function(i){return/^is[A-Z]/.test(i)});function fs(r,i,s){if(!_.isObject(r))throw new TypeError("target must be an object");i=i||new FormData,s=_.toFlatObject(s,{metaTokens:!0,dots:!1,indexes:!1},!1,function(R,L){return!_.isUndefined(L[R])});const u=s.metaTokens,c=s.visitor||E,d=s.dots,p=s.indexes,v=(s.Blob||typeof Blob<"u"&&Blob)&&_.isSpecCompliantForm(i);if(!_.isFunction(c))throw new TypeError("visitor must be a function");function x(I){if(I===null)return"";if(_.isDate(I))return I.toISOString();if(!v&&_.isBlob(I))throw new ie("Blob is not supported. Use a Buffer instead.");return _.isArrayBuffer(I)||_.isTypedArray(I)?v&&typeof Blob=="function"?new Blob([I]):Buffer.from(I):I}function E(I,R,L){let V=I;if(I&&!L&&typeof I=="object"){if(_.endsWith(R,"{}"))R=u?R:R.slice(0,-2),I=JSON.stringify(I);else if(_.isArray(I)&&t0(I)||(_.isFileList(I)||_.endsWith(R,"[]"))&&(V=_.toArray(I)))return R=Ip(R),V.forEach(function(W,K){!(_.isUndefined(W)||W===null)&&i.append(p===!0?Ad([R],K,d):p===null?R:R+"[]",x(W))}),!1}return Tu(I)?!0:(i.append(Ad(L,R,d),x(I)),!1)}const j=[],O=Object.assign(n0,{defaultVisitor:E,convertValue:x,isVisitable:Tu});function P(I,R){if(!_.isUndefined(I)){if(j.indexOf(I)!==-1)throw Error("Circular reference detected in "+R.join("."));j.push(I),_.forEach(I,function(V,F){(!(_.isUndefined(V)||V===null)&&c.call(i,V,_.isString(F)?F.trim():F,R,O))===!0&&P(V,R?R.concat(F):[F])}),j.pop()}}if(!_.isObject(r))throw new TypeError("data must be an object");return P(r),i}function Rd(r){const i={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(r).replace(/[!'()~]|%20|%00/g,function(u){return i[u]})}function bu(r,i){this._pairs=[],r&&fs(r,this,i)}const _p=bu.prototype;_p.append=function(i,s){this._pairs.push([i,s])};_p.toString=function(i){const s=i?function(u){return i.call(this,u,Rd)}:Rd;return this._pairs.map(function(c){return s(c[0])+"="+s(c[1])},"").join("&")};function r0(r){return encodeURIComponent(r).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Np(r,i,s){if(!i)return r;const u=s&&s.encode||r0;_.isFunction(s)&&(s={serialize:s});const c=s&&s.serialize;let d;if(c?d=c(i,s):d=_.isURLSearchParams(i)?i.toString():new bu(i,s).toString(u),d){const p=r.indexOf("#");p!==-1&&(r=r.slice(0,p)),r+=(r.indexOf("?")===-1?"?":"&")+d}return r}class Pd{constructor(){this.handlers=[]}use(i,s,u){return this.handlers.push({fulfilled:i,rejected:s,synchronous:u?u.synchronous:!1,runWhen:u?u.runWhen:null}),this.handlers.length-1}eject(i){this.handlers[i]&&(this.handlers[i]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(i){_.forEach(this.handlers,function(u){u!==null&&i(u)})}}const Op={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},o0=typeof URLSearchParams<"u"?URLSearchParams:bu,i0=typeof FormData<"u"?FormData:null,s0=typeof Blob<"u"?Blob:null,l0={isBrowser:!0,classes:{URLSearchParams:o0,FormData:i0,Blob:s0},protocols:["http","https","file","blob","url","data"]},Gu=typeof window<"u"&&typeof document<"u",Lu=typeof navigator=="object"&&navigator||void 0,u0=Gu&&(!Lu||["ReactNative","NativeScript","NS"].indexOf(Lu.product)<0),a0=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",c0=Gu&&window.location.href||"http://localhost",f0=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Gu,hasStandardBrowserEnv:u0,hasStandardBrowserWebWorkerEnv:a0,navigator:Lu,origin:c0},Symbol.toStringTag,{value:"Module"})),Ye={...f0,...l0};function d0(r,i){return fs(r,new Ye.classes.URLSearchParams,Object.assign({visitor:function(s,u,c,d){return Ye.isNode&&_.isBuffer(s)?(this.append(u,s.toString("base64")),!1):d.defaultVisitor.apply(this,arguments)}},i))}function p0(r){return _.matchAll(/\w+|\[(\w*)]/g,r).map(i=>i[0]==="[]"?"":i[1]||i[0])}function h0(r){const i={},s=Object.keys(r);let u;const c=s.length;let d;for(u=0;u=s.length;return p=!p&&_.isArray(c)?c.length:p,v?(_.hasOwnProp(c,p)?c[p]=[c[p],u]:c[p]=u,!m):((!c[p]||!_.isObject(c[p]))&&(c[p]=[]),i(s,u,c[p],d)&&_.isArray(c[p])&&(c[p]=h0(c[p])),!m)}if(_.isFormData(r)&&_.isFunction(r.entries)){const s={};return _.forEachEntry(r,(u,c)=>{i(p0(u),c,s,0)}),s}return null}function m0(r,i,s){if(_.isString(r))try{return(i||JSON.parse)(r),_.trim(r)}catch(u){if(u.name!=="SyntaxError")throw u}return(0,JSON.stringify)(r)}const Co={transitional:Op,adapter:["xhr","http","fetch"],transformRequest:[function(i,s){const u=s.getContentType()||"",c=u.indexOf("application/json")>-1,d=_.isObject(i);if(d&&_.isHTMLForm(i)&&(i=new FormData(i)),_.isFormData(i))return c?JSON.stringify(Tp(i)):i;if(_.isArrayBuffer(i)||_.isBuffer(i)||_.isStream(i)||_.isFile(i)||_.isBlob(i)||_.isReadableStream(i))return i;if(_.isArrayBufferView(i))return i.buffer;if(_.isURLSearchParams(i))return s.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),i.toString();let m;if(d){if(u.indexOf("application/x-www-form-urlencoded")>-1)return d0(i,this.formSerializer).toString();if((m=_.isFileList(i))||u.indexOf("multipart/form-data")>-1){const v=this.env&&this.env.FormData;return fs(m?{"files[]":i}:i,v&&new v,this.formSerializer)}}return d||c?(s.setContentType("application/json",!1),m0(i)):i}],transformResponse:[function(i){const s=this.transitional||Co.transitional,u=s&&s.forcedJSONParsing,c=this.responseType==="json";if(_.isResponse(i)||_.isReadableStream(i))return i;if(i&&_.isString(i)&&(u&&!this.responseType||c)){const p=!(s&&s.silentJSONParsing)&&c;try{return JSON.parse(i)}catch(m){if(p)throw m.name==="SyntaxError"?ie.from(m,ie.ERR_BAD_RESPONSE,this,null,this.response):m}}return i}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ye.classes.FormData,Blob:Ye.classes.Blob},validateStatus:function(i){return i>=200&&i<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};_.forEach(["delete","get","head","post","put","patch"],r=>{Co.headers[r]={}});const g0=_.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),y0=r=>{const i={};let s,u,c;return r&&r.split(` -`).forEach(function(p){c=p.indexOf(":"),s=p.substring(0,c).trim().toLowerCase(),u=p.substring(c+1).trim(),!(!s||i[s]&&g0[s])&&(s==="set-cookie"?i[s]?i[s].push(u):i[s]=[u]:i[s]=i[s]?i[s]+", "+u:u)}),i},jd=Symbol("internals");function mo(r){return r&&String(r).trim().toLowerCase()}function bi(r){return r===!1||r==null?r:_.isArray(r)?r.map(bi):String(r)}function v0(r){const i=Object.create(null),s=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let u;for(;u=s.exec(r);)i[u[1]]=u[2];return i}const w0=r=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(r.trim());function yu(r,i,s,u,c){if(_.isFunction(u))return u.call(this,i,s);if(c&&(i=s),!!_.isString(i)){if(_.isString(u))return i.indexOf(u)!==-1;if(_.isRegExp(u))return u.test(i)}}function x0(r){return r.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(i,s,u)=>s.toUpperCase()+u)}function S0(r,i){const s=_.toCamelCase(" "+i);["get","set","has"].forEach(u=>{Object.defineProperty(r,u+s,{value:function(c,d,p){return this[u].call(this,i,c,d,p)},configurable:!0})})}class lt{constructor(i){i&&this.set(i)}set(i,s,u){const c=this;function d(m,v,x){const E=mo(v);if(!E)throw new Error("header name must be a non-empty string");const j=_.findKey(c,E);(!j||c[j]===void 0||x===!0||x===void 0&&c[j]!==!1)&&(c[j||v]=bi(m))}const p=(m,v)=>_.forEach(m,(x,E)=>d(x,E,v));if(_.isPlainObject(i)||i instanceof this.constructor)p(i,s);else if(_.isString(i)&&(i=i.trim())&&!w0(i))p(y0(i),s);else if(_.isHeaders(i))for(const[m,v]of i.entries())d(v,m,u);else i!=null&&d(s,i,u);return this}get(i,s){if(i=mo(i),i){const u=_.findKey(this,i);if(u){const c=this[u];if(!s)return c;if(s===!0)return v0(c);if(_.isFunction(s))return s.call(this,c,u);if(_.isRegExp(s))return s.exec(c);throw new TypeError("parser must be boolean|regexp|function")}}}has(i,s){if(i=mo(i),i){const u=_.findKey(this,i);return!!(u&&this[u]!==void 0&&(!s||yu(this,this[u],u,s)))}return!1}delete(i,s){const u=this;let c=!1;function d(p){if(p=mo(p),p){const m=_.findKey(u,p);m&&(!s||yu(u,u[m],m,s))&&(delete u[m],c=!0)}}return _.isArray(i)?i.forEach(d):d(i),c}clear(i){const s=Object.keys(this);let u=s.length,c=!1;for(;u--;){const d=s[u];(!i||yu(this,this[d],d,i,!0))&&(delete this[d],c=!0)}return c}normalize(i){const s=this,u={};return _.forEach(this,(c,d)=>{const p=_.findKey(u,d);if(p){s[p]=bi(c),delete s[d];return}const m=i?x0(d):String(d).trim();m!==d&&delete s[d],s[m]=bi(c),u[m]=!0}),this}concat(...i){return this.constructor.concat(this,...i)}toJSON(i){const s=Object.create(null);return _.forEach(this,(u,c)=>{u!=null&&u!==!1&&(s[c]=i&&_.isArray(u)?u.join(", "):u)}),s}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([i,s])=>i+": "+s).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(i){return i instanceof this?i:new this(i)}static concat(i,...s){const u=new this(i);return s.forEach(c=>u.set(c)),u}static accessor(i){const u=(this[jd]=this[jd]={accessors:{}}).accessors,c=this.prototype;function d(p){const m=mo(p);u[m]||(S0(c,p),u[m]=!0)}return _.isArray(i)?i.forEach(d):d(i),this}}lt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);_.reduceDescriptors(lt.prototype,({value:r},i)=>{let s=i[0].toUpperCase()+i.slice(1);return{get:()=>r,set(u){this[s]=u}}});_.freezeMethods(lt);function vu(r,i){const s=this||Co,u=i||s,c=lt.from(u.headers);let d=u.data;return _.forEach(r,function(m){d=m.call(s,d,c.normalize(),i?i.status:void 0)}),c.normalize(),d}function Lp(r){return!!(r&&r.__CANCEL__)}function Pr(r,i,s){ie.call(this,r??"canceled",ie.ERR_CANCELED,i,s),this.name="CanceledError"}_.inherits(Pr,ie,{__CANCEL__:!0});function Dp(r,i,s){const u=s.config.validateStatus;!s.status||!u||u(s.status)?r(s):i(new ie("Request failed with status code "+s.status,[ie.ERR_BAD_REQUEST,ie.ERR_BAD_RESPONSE][Math.floor(s.status/100)-4],s.config,s.request,s))}function k0(r){const i=/^([-+\w]{1,25})(:?\/\/|:)/.exec(r);return i&&i[1]||""}function E0(r,i){r=r||10;const s=new Array(r),u=new Array(r);let c=0,d=0,p;return i=i!==void 0?i:1e3,function(v){const x=Date.now(),E=u[d];p||(p=x),s[c]=v,u[c]=x;let j=d,O=0;for(;j!==c;)O+=s[j++],j=j%r;if(c=(c+1)%r,c===d&&(d=(d+1)%r),x-p{s=E,c=null,d&&(clearTimeout(d),d=null),r.apply(null,x)};return[(...x)=>{const E=Date.now(),j=E-s;j>=u?p(x,E):(c=x,d||(d=setTimeout(()=>{d=null,p(c)},u-j)))},()=>c&&p(c)]}const es=(r,i,s=3)=>{let u=0;const c=E0(50,250);return C0(d=>{const p=d.loaded,m=d.lengthComputable?d.total:void 0,v=p-u,x=c(v),E=p<=m;u=p;const j={loaded:p,total:m,progress:m?p/m:void 0,bytes:v,rate:x||void 0,estimated:x&&m&&E?(m-p)/x:void 0,event:d,lengthComputable:m!=null,[i?"download":"upload"]:!0};r(j)},s)},Id=(r,i)=>{const s=r!=null;return[u=>i[0]({lengthComputable:s,total:r,loaded:u}),i[1]]},_d=r=>(...i)=>_.asap(()=>r(...i)),A0=Ye.hasStandardBrowserEnv?((r,i)=>s=>(s=new URL(s,Ye.origin),r.protocol===s.protocol&&r.host===s.host&&(i||r.port===s.port)))(new URL(Ye.origin),Ye.navigator&&/(msie|trident)/i.test(Ye.navigator.userAgent)):()=>!0,R0=Ye.hasStandardBrowserEnv?{write(r,i,s,u,c,d){const p=[r+"="+encodeURIComponent(i)];_.isNumber(s)&&p.push("expires="+new Date(s).toGMTString()),_.isString(u)&&p.push("path="+u),_.isString(c)&&p.push("domain="+c),d===!0&&p.push("secure"),document.cookie=p.join("; ")},read(r){const i=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return i?decodeURIComponent(i[3]):null},remove(r){this.write(r,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function P0(r){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(r)}function j0(r,i){return i?r.replace(/\/?\/$/,"")+"/"+i.replace(/^\/+/,""):r}function zp(r,i){return r&&!P0(i)?j0(r,i):i}const Nd=r=>r instanceof lt?{...r}:r;function qn(r,i){i=i||{};const s={};function u(x,E,j,O){return _.isPlainObject(x)&&_.isPlainObject(E)?_.merge.call({caseless:O},x,E):_.isPlainObject(E)?_.merge({},E):_.isArray(E)?E.slice():E}function c(x,E,j,O){if(_.isUndefined(E)){if(!_.isUndefined(x))return u(void 0,x,j,O)}else return u(x,E,j,O)}function d(x,E){if(!_.isUndefined(E))return u(void 0,E)}function p(x,E){if(_.isUndefined(E)){if(!_.isUndefined(x))return u(void 0,x)}else return u(void 0,E)}function m(x,E,j){if(j in i)return u(x,E);if(j in r)return u(void 0,x)}const v={url:d,method:d,data:d,baseURL:p,transformRequest:p,transformResponse:p,paramsSerializer:p,timeout:p,timeoutMessage:p,withCredentials:p,withXSRFToken:p,adapter:p,responseType:p,xsrfCookieName:p,xsrfHeaderName:p,onUploadProgress:p,onDownloadProgress:p,decompress:p,maxContentLength:p,maxBodyLength:p,beforeRedirect:p,transport:p,httpAgent:p,httpsAgent:p,cancelToken:p,socketPath:p,responseEncoding:p,validateStatus:m,headers:(x,E,j)=>c(Nd(x),Nd(E),j,!0)};return _.forEach(Object.keys(Object.assign({},r,i)),function(E){const j=v[E]||c,O=j(r[E],i[E],E);_.isUndefined(O)&&j!==m||(s[E]=O)}),s}const Mp=r=>{const i=qn({},r);let{data:s,withXSRFToken:u,xsrfHeaderName:c,xsrfCookieName:d,headers:p,auth:m}=i;i.headers=p=lt.from(p),i.url=Np(zp(i.baseURL,i.url),r.params,r.paramsSerializer),m&&p.set("Authorization","Basic "+btoa((m.username||"")+":"+(m.password?unescape(encodeURIComponent(m.password)):"")));let v;if(_.isFormData(s)){if(Ye.hasStandardBrowserEnv||Ye.hasStandardBrowserWebWorkerEnv)p.setContentType(void 0);else if((v=p.getContentType())!==!1){const[x,...E]=v?v.split(";").map(j=>j.trim()).filter(Boolean):[];p.setContentType([x||"multipart/form-data",...E].join("; "))}}if(Ye.hasStandardBrowserEnv&&(u&&_.isFunction(u)&&(u=u(i)),u||u!==!1&&A0(i.url))){const x=c&&d&&R0.read(d);x&&p.set(c,x)}return i},I0=typeof XMLHttpRequest<"u",_0=I0&&function(r){return new Promise(function(s,u){const c=Mp(r);let d=c.data;const p=lt.from(c.headers).normalize();let{responseType:m,onUploadProgress:v,onDownloadProgress:x}=c,E,j,O,P,I;function R(){P&&P(),I&&I(),c.cancelToken&&c.cancelToken.unsubscribe(E),c.signal&&c.signal.removeEventListener("abort",E)}let L=new XMLHttpRequest;L.open(c.method.toUpperCase(),c.url,!0),L.timeout=c.timeout;function V(){if(!L)return;const W=lt.from("getAllResponseHeaders"in L&&L.getAllResponseHeaders()),$={data:!m||m==="text"||m==="json"?L.responseText:L.response,status:L.status,statusText:L.statusText,headers:W,config:r,request:L};Dp(function(H){s(H),R()},function(H){u(H),R()},$),L=null}"onloadend"in L?L.onloadend=V:L.onreadystatechange=function(){!L||L.readyState!==4||L.status===0&&!(L.responseURL&&L.responseURL.indexOf("file:")===0)||setTimeout(V)},L.onabort=function(){L&&(u(new ie("Request aborted",ie.ECONNABORTED,r,L)),L=null)},L.onerror=function(){u(new ie("Network Error",ie.ERR_NETWORK,r,L)),L=null},L.ontimeout=function(){let K=c.timeout?"timeout of "+c.timeout+"ms exceeded":"timeout exceeded";const $=c.transitional||Op;c.timeoutErrorMessage&&(K=c.timeoutErrorMessage),u(new ie(K,$.clarifyTimeoutError?ie.ETIMEDOUT:ie.ECONNABORTED,r,L)),L=null},d===void 0&&p.setContentType(null),"setRequestHeader"in L&&_.forEach(p.toJSON(),function(K,$){L.setRequestHeader($,K)}),_.isUndefined(c.withCredentials)||(L.withCredentials=!!c.withCredentials),m&&m!=="json"&&(L.responseType=c.responseType),x&&([O,I]=es(x,!0),L.addEventListener("progress",O)),v&&L.upload&&([j,P]=es(v),L.upload.addEventListener("progress",j),L.upload.addEventListener("loadend",P)),(c.cancelToken||c.signal)&&(E=W=>{L&&(u(!W||W.type?new Pr(null,r,L):W),L.abort(),L=null)},c.cancelToken&&c.cancelToken.subscribe(E),c.signal&&(c.signal.aborted?E():c.signal.addEventListener("abort",E)));const F=k0(c.url);if(F&&Ye.protocols.indexOf(F)===-1){u(new ie("Unsupported protocol "+F+":",ie.ERR_BAD_REQUEST,r));return}L.send(d||null)})},N0=(r,i)=>{const{length:s}=r=r?r.filter(Boolean):[];if(i||s){let u=new AbortController,c;const d=function(x){if(!c){c=!0,m();const E=x instanceof Error?x:this.reason;u.abort(E instanceof ie?E:new Pr(E instanceof Error?E.message:E))}};let p=i&&setTimeout(()=>{p=null,d(new ie(`timeout ${i} of ms exceeded`,ie.ETIMEDOUT))},i);const m=()=>{r&&(p&&clearTimeout(p),p=null,r.forEach(x=>{x.unsubscribe?x.unsubscribe(d):x.removeEventListener("abort",d)}),r=null)};r.forEach(x=>x.addEventListener("abort",d));const{signal:v}=u;return v.unsubscribe=()=>_.asap(m),v}},O0=function*(r,i){let s=r.byteLength;if(s{const c=T0(r,i);let d=0,p,m=v=>{p||(p=!0,u&&u(v))};return new ReadableStream({async pull(v){try{const{done:x,value:E}=await c.next();if(x){m(),v.close();return}let j=E.byteLength;if(s){let O=d+=j;s(O)}v.enqueue(new Uint8Array(E))}catch(x){throw m(x),x}},cancel(v){return m(v),c.return()}},{highWaterMark:2})},ds=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Up=ds&&typeof ReadableStream=="function",D0=ds&&(typeof TextEncoder=="function"?(r=>i=>r.encode(i))(new TextEncoder):async r=>new Uint8Array(await new Response(r).arrayBuffer())),Fp=(r,...i)=>{try{return!!r(...i)}catch{return!1}},z0=Up&&Fp(()=>{let r=!1;const i=new Request(Ye.origin,{body:new ReadableStream,method:"POST",get duplex(){return r=!0,"half"}}).headers.has("Content-Type");return r&&!i}),Td=64*1024,Du=Up&&Fp(()=>_.isReadableStream(new Response("").body)),ts={stream:Du&&(r=>r.body)};ds&&(r=>{["text","arrayBuffer","blob","formData","stream"].forEach(i=>{!ts[i]&&(ts[i]=_.isFunction(r[i])?s=>s[i]():(s,u)=>{throw new ie(`Response type '${i}' is not supported`,ie.ERR_NOT_SUPPORT,u)})})})(new Response);const M0=async r=>{if(r==null)return 0;if(_.isBlob(r))return r.size;if(_.isSpecCompliantForm(r))return(await new Request(Ye.origin,{method:"POST",body:r}).arrayBuffer()).byteLength;if(_.isArrayBufferView(r)||_.isArrayBuffer(r))return r.byteLength;if(_.isURLSearchParams(r)&&(r=r+""),_.isString(r))return(await D0(r)).byteLength},U0=async(r,i)=>{const s=_.toFiniteNumber(r.getContentLength());return s??M0(i)},F0=ds&&(async r=>{let{url:i,method:s,data:u,signal:c,cancelToken:d,timeout:p,onDownloadProgress:m,onUploadProgress:v,responseType:x,headers:E,withCredentials:j="same-origin",fetchOptions:O}=Mp(r);x=x?(x+"").toLowerCase():"text";let P=N0([c,d&&d.toAbortSignal()],p),I;const R=P&&P.unsubscribe&&(()=>{P.unsubscribe()});let L;try{if(v&&z0&&s!=="get"&&s!=="head"&&(L=await U0(E,u))!==0){let $=new Request(i,{method:"POST",body:u,duplex:"half"}),T;if(_.isFormData(u)&&(T=$.headers.get("content-type"))&&E.setContentType(T),$.body){const[H,se]=Id(L,es(_d(v)));u=Od($.body,Td,H,se)}}_.isString(j)||(j=j?"include":"omit");const V="credentials"in Request.prototype;I=new Request(i,{...O,signal:P,method:s.toUpperCase(),headers:E.normalize().toJSON(),body:u,duplex:"half",credentials:V?j:void 0});let F=await fetch(I);const W=Du&&(x==="stream"||x==="response");if(Du&&(m||W&&R)){const $={};["status","statusText","headers"].forEach(Ve=>{$[Ve]=F[Ve]});const T=_.toFiniteNumber(F.headers.get("content-length")),[H,se]=m&&Id(T,es(_d(m),!0))||[];F=new Response(Od(F.body,Td,H,()=>{se&&se(),R&&R()}),$)}x=x||"text";let K=await ts[_.findKey(ts,x)||"text"](F,r);return!W&&R&&R(),await new Promise(($,T)=>{Dp($,T,{data:K,headers:lt.from(F.headers),status:F.status,statusText:F.statusText,config:r,request:I})})}catch(V){throw R&&R(),V&&V.name==="TypeError"&&/fetch/i.test(V.message)?Object.assign(new ie("Network Error",ie.ERR_NETWORK,r,I),{cause:V.cause||V}):ie.from(V,V&&V.code,r,I)}}),zu={http:e0,xhr:_0,fetch:F0};_.forEach(zu,(r,i)=>{if(r){try{Object.defineProperty(r,"name",{value:i})}catch{}Object.defineProperty(r,"adapterName",{value:i})}});const Ld=r=>`- ${r}`,B0=r=>_.isFunction(r)||r===null||r===!1,Bp={getAdapter:r=>{r=_.isArray(r)?r:[r];const{length:i}=r;let s,u;const c={};for(let d=0;d`adapter ${m} `+(v===!1?"is not supported by the environment":"is not available in the build"));let p=i?d.length>1?`since : -`+d.map(Ld).join(` -`):" "+Ld(d[0]):"as no adapter specified";throw new ie("There is no suitable adapter to dispatch the request "+p,"ERR_NOT_SUPPORT")}return u},adapters:zu};function wu(r){if(r.cancelToken&&r.cancelToken.throwIfRequested(),r.signal&&r.signal.aborted)throw new Pr(null,r)}function Dd(r){return wu(r),r.headers=lt.from(r.headers),r.data=vu.call(r,r.transformRequest),["post","put","patch"].indexOf(r.method)!==-1&&r.headers.setContentType("application/x-www-form-urlencoded",!1),Bp.getAdapter(r.adapter||Co.adapter)(r).then(function(u){return wu(r),u.data=vu.call(r,r.transformResponse,u),u.headers=lt.from(u.headers),u},function(u){return Lp(u)||(wu(r),u&&u.response&&(u.response.data=vu.call(r,r.transformResponse,u.response),u.response.headers=lt.from(u.response.headers))),Promise.reject(u)})}const $p="1.7.9",ps={};["object","boolean","number","function","string","symbol"].forEach((r,i)=>{ps[r]=function(u){return typeof u===r||"a"+(i<1?"n ":" ")+r}});const zd={};ps.transitional=function(i,s,u){function c(d,p){return"[Axios v"+$p+"] Transitional option '"+d+"'"+p+(u?". "+u:"")}return(d,p,m)=>{if(i===!1)throw new ie(c(p," has been removed"+(s?" in "+s:"")),ie.ERR_DEPRECATED);return s&&!zd[p]&&(zd[p]=!0,console.warn(c(p," has been deprecated since v"+s+" and will be removed in the near future"))),i?i(d,p,m):!0}};ps.spelling=function(i){return(s,u)=>(console.warn(`${u} is likely a misspelling of ${i}`),!0)};function $0(r,i,s){if(typeof r!="object")throw new ie("options must be an object",ie.ERR_BAD_OPTION_VALUE);const u=Object.keys(r);let c=u.length;for(;c-- >0;){const d=u[c],p=i[d];if(p){const m=r[d],v=m===void 0||p(m,d,r);if(v!==!0)throw new ie("option "+d+" must be "+v,ie.ERR_BAD_OPTION_VALUE);continue}if(s!==!0)throw new ie("Unknown option "+d,ie.ERR_BAD_OPTION)}}const Gi={assertOptions:$0,validators:ps},Ht=Gi.validators;class Vn{constructor(i){this.defaults=i,this.interceptors={request:new Pd,response:new Pd}}async request(i,s){try{return await this._request(i,s)}catch(u){if(u instanceof Error){let c={};Error.captureStackTrace?Error.captureStackTrace(c):c=new Error;const d=c.stack?c.stack.replace(/^.+\n/,""):"";try{u.stack?d&&!String(u.stack).endsWith(d.replace(/^.+\n.+\n/,""))&&(u.stack+=` -`+d):u.stack=d}catch{}}throw u}}_request(i,s){typeof i=="string"?(s=s||{},s.url=i):s=i||{},s=qn(this.defaults,s);const{transitional:u,paramsSerializer:c,headers:d}=s;u!==void 0&&Gi.assertOptions(u,{silentJSONParsing:Ht.transitional(Ht.boolean),forcedJSONParsing:Ht.transitional(Ht.boolean),clarifyTimeoutError:Ht.transitional(Ht.boolean)},!1),c!=null&&(_.isFunction(c)?s.paramsSerializer={serialize:c}:Gi.assertOptions(c,{encode:Ht.function,serialize:Ht.function},!0)),Gi.assertOptions(s,{baseUrl:Ht.spelling("baseURL"),withXsrfToken:Ht.spelling("withXSRFToken")},!0),s.method=(s.method||this.defaults.method||"get").toLowerCase();let p=d&&_.merge(d.common,d[s.method]);d&&_.forEach(["delete","get","head","post","put","patch","common"],I=>{delete d[I]}),s.headers=lt.concat(p,d);const m=[];let v=!0;this.interceptors.request.forEach(function(R){typeof R.runWhen=="function"&&R.runWhen(s)===!1||(v=v&&R.synchronous,m.unshift(R.fulfilled,R.rejected))});const x=[];this.interceptors.response.forEach(function(R){x.push(R.fulfilled,R.rejected)});let E,j=0,O;if(!v){const I=[Dd.bind(this),void 0];for(I.unshift.apply(I,m),I.push.apply(I,x),O=I.length,E=Promise.resolve(s);j{if(!u._listeners)return;let d=u._listeners.length;for(;d-- >0;)u._listeners[d](c);u._listeners=null}),this.promise.then=c=>{let d;const p=new Promise(m=>{u.subscribe(m),d=m}).then(c);return p.cancel=function(){u.unsubscribe(d)},p},i(function(d,p,m){u.reason||(u.reason=new Pr(d,p,m),s(u.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(i){if(this.reason){i(this.reason);return}this._listeners?this._listeners.push(i):this._listeners=[i]}unsubscribe(i){if(!this._listeners)return;const s=this._listeners.indexOf(i);s!==-1&&this._listeners.splice(s,1)}toAbortSignal(){const i=new AbortController,s=u=>{i.abort(u)};return this.subscribe(s),i.signal.unsubscribe=()=>this.unsubscribe(s),i.signal}static source(){let i;return{token:new Yu(function(c){i=c}),cancel:i}}}function H0(r){return function(s){return r.apply(null,s)}}function V0(r){return _.isObject(r)&&r.isAxiosError===!0}const Mu={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Mu).forEach(([r,i])=>{Mu[i]=r});function Hp(r){const i=new Vn(r),s=wp(Vn.prototype.request,i);return _.extend(s,Vn.prototype,i,{allOwnKeys:!0}),_.extend(s,i,null,{allOwnKeys:!0}),s.create=function(c){return Hp(qn(r,c))},s}const he=Hp(Co);he.Axios=Vn;he.CanceledError=Pr;he.CancelToken=Yu;he.isCancel=Lp;he.VERSION=$p;he.toFormData=fs;he.AxiosError=ie;he.Cancel=he.CanceledError;he.all=function(i){return Promise.all(i)};he.spread=H0;he.isAxiosError=V0;he.mergeConfig=qn;he.AxiosHeaders=lt;he.formToJSON=r=>Tp(_.isHTMLForm(r)?new FormData(r):r);he.getAdapter=Bp.getAdapter;he.HttpStatusCode=Mu;he.default=he;const Xe={apiBaseUrl:"/api"},Dt=bn(r=>({users:[],fetchUsers:async()=>{try{const i=await he.get(`${Xe.apiBaseUrl}/users`);r({users:i.data})}catch(i){console.error("사용자 목록 조회 실패:",i)}},updateUserStatus:async i=>{try{await he.patch(`${Xe.apiBaseUrl}/users/${i}/userStatus`,{newLastActiveAt:new Date().toISOString()})}catch(s){console.error("사용자 상태 업데이트 실패:",s)}}})),Wt=bn(r=>({profileImages:{},fetchProfileImage:async i=>{try{const s=await he.get(`${Xe.apiBaseUrl}/binaryContents/${i}`),u=s.data.bytes,d=`data:${s.data.contentType};base64,${u}`;return r(p=>({profileImages:{...p.profileImages,[i]:d}})),d}catch(s){return console.error("프로필 이미지 로딩 실패:",s),null}}}));function Vp(r,i){let s;try{s=r()}catch{return}return{getItem:c=>{var d;const p=v=>v===null?null:JSON.parse(v,void 0),m=(d=s.getItem(c))!=null?d:null;return m instanceof Promise?m.then(p):p(m)},setItem:(c,d)=>s.setItem(c,JSON.stringify(d,void 0)),removeItem:c=>s.removeItem(c)}}const Uu=r=>i=>{try{const s=r(i);return s instanceof Promise?s:{then(u){return Uu(u)(s)},catch(u){return this}}}catch(s){return{then(u){return this},catch(u){return Uu(u)(s)}}}},W0=(r,i)=>(s,u,c)=>{let d={storage:Vp(()=>localStorage),partialize:R=>R,version:0,merge:(R,L)=>({...L,...R}),...i},p=!1;const m=new Set,v=new Set;let x=d.storage;if(!x)return r((...R)=>{console.warn(`[zustand persist middleware] Unable to update item '${d.name}', the given storage is currently unavailable.`),s(...R)},u,c);const E=()=>{const R=d.partialize({...u()});return x.setItem(d.name,{state:R,version:d.version})},j=c.setState;c.setState=(R,L)=>{j(R,L),E()};const O=r((...R)=>{s(...R),E()},u,c);c.getInitialState=()=>O;let P;const I=()=>{var R,L;if(!x)return;p=!1,m.forEach(F=>{var W;return F((W=u())!=null?W:O)});const V=((L=d.onRehydrateStorage)==null?void 0:L.call(d,(R=u())!=null?R:O))||void 0;return Uu(x.getItem.bind(x))(d.name).then(F=>{if(F)if(typeof F.version=="number"&&F.version!==d.version){if(d.migrate){const W=d.migrate(F.state,F.version);return W instanceof Promise?W.then(K=>[!0,K]):[!0,W]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,F.state];return[!1,void 0]}).then(F=>{var W;const[K,$]=F;if(P=d.merge($,(W=u())!=null?W:O),s(P,!0),K)return E()}).then(()=>{V==null||V(P,void 0),P=u(),p=!0,v.forEach(F=>F(P))}).catch(F=>{V==null||V(void 0,F)})};return c.persist={setOptions:R=>{d={...d,...R},R.storage&&(x=R.storage)},clearStorage:()=>{x==null||x.removeItem(d.name)},getOptions:()=>d,rehydrate:()=>I(),hasHydrated:()=>p,onHydrate:R=>(m.add(R),()=>{m.delete(R)}),onFinishHydration:R=>(v.add(R),()=>{v.delete(R)})},d.skipHydration||I(),P||O},Q0=W0,ut=bn(Q0(r=>({currentUserId:null,setCurrentUser:i=>r({currentUserId:i.id}),logout:()=>{const i=ut.getState().currentUserId;i&&Dt.getState().updateUserStatus(i),r({currentUserId:null})},updateUser:async(i,s)=>{try{const u=await he.patch(`${Xe.apiBaseUrl}/users/${i}`,s,{headers:{"Content-Type":"multipart/form-data"}});return await Dt.getState().fetchUsers(),u.data}catch(u){throw console.error("사용자 정보 수정 실패:",u),u}}}),{name:"user-storage",storage:Vp(()=>sessionStorage)})),Qt="data:image/png;base64,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";function Md({channel:r,isActive:i,onClick:s,hasUnread:u}){const c=ut(x=>x.currentUserId),d=Dt(x=>x.users),p=Wt(x=>x.profileImages);if(r.type==="PUBLIC")return g.jsxs(yp,{$isActive:i,onClick:s,$hasUnread:u,children:["# ",r.name]});const m=r.participantIds.map(x=>d.find(E=>E.id===x)).filter(Boolean);if(m.length>2){const x=m.filter(E=>E.id!==c).map(E=>E.username).join(", ");return g.jsxs(yd,{$isActive:i,onClick:s,children:[g.jsx(uy,{children:m.filter(E=>E.id!==c).slice(0,2).map((E,j)=>g.jsx(cy,{src:E.profileId?p[E.profileId]:Qt,style:{position:"absolute",left:j*16,zIndex:2-j}},E.id))}),g.jsxs(xd,{children:[g.jsx(vd,{$hasUnread:u,children:x}),g.jsxs(ay,{children:["멤버 ",m.length,"명"]})]})]})}const v=m.filter(x=>x.id!==c)[0];return g.jsxs(yd,{$isActive:i,onClick:s,children:[g.jsxs(ly,{children:[g.jsx("img",{src:v.profileId?p[v.profileId]:Qt,alt:"profile"}),g.jsx(vp,{$online:v.online})]}),g.jsx(xd,{children:g.jsx(vd,{$hasUnread:u,children:v.username})})]})}function q0({isOpen:r,onClose:i,user:s,onSubmit:u}){const[c,d]=ue.useState(s.username),[p,m]=ue.useState(s.email),[v,x]=ue.useState(""),[E,j]=ue.useState(null),[O,P]=ue.useState(""),[I,R]=ue.useState(null),L=Wt(T=>T.profileImages),V=Wt(T=>T.fetchProfileImage),F=ut(T=>T.logout);ue.useEffect(()=>{s.profileId&&!L[s.profileId]&&V(s.profileId)},[s.profileId,L,V]);const W=()=>{d(s.username),m(s.email),x(""),j(null),R(null),P(""),i()},K=T=>{const H=T.target.files[0];if(H){j(H);const se=new FileReader;se.onloadend=()=>{R(se.result)},se.readAsDataURL(H)}},$=async T=>{T.preventDefault(),P("");try{const H=new FormData,se={};c!==s.username&&(se.newUsername=c),p!==s.email&&(se.newEmail=p),v&&(se.newPassword=v),(Object.keys(se).length>0||E)&&(H.append("userUpdateRequest",new Blob([JSON.stringify(se)],{type:"application/json"})),E&&H.append("profile",E),await u(H)),i()}catch{P("사용자 정보 수정에 실패했습니다.")}};return r?g.jsx(b0,{children:g.jsxs(G0,{children:[g.jsx("h2",{children:"프로필 수정"}),g.jsxs("form",{onSubmit:$,children:[g.jsxs(Mi,{children:[g.jsx(Ui,{children:"프로필 이미지"}),g.jsxs(K0,{children:[g.jsx(X0,{src:I||L[s.profileId]||Qt,alt:"profile"}),g.jsx(J0,{type:"file",accept:"image/*",onChange:K,id:"profile-image"}),g.jsx(Z0,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),g.jsxs(Mi,{children:[g.jsxs(Ui,{children:["사용자명 ",g.jsx(Fd,{children:"*"})]}),g.jsx(xu,{type:"text",value:c,onChange:T=>d(T.target.value),required:!0})]}),g.jsxs(Mi,{children:[g.jsxs(Ui,{children:["이메일 ",g.jsx(Fd,{children:"*"})]}),g.jsx(xu,{type:"email",value:p,onChange:T=>m(T.target.value),required:!0})]}),g.jsxs(Mi,{children:[g.jsx(Ui,{children:"새 비밀번호"}),g.jsx(xu,{type:"password",placeholder:"변경하지 않으려면 비워두세요",value:v,onChange:T=>x(T.target.value)})]}),O&&g.jsx(Y0,{children:O}),g.jsxs(ev,{children:[g.jsx(Ud,{type:"button",onClick:W,$secondary:!0,children:"취소"}),g.jsx(Ud,{type:"submit",children:"저장"})]})]}),g.jsx(tv,{onClick:F,children:"로그아웃"})]})}):null}const b0=N.div` - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; -`,G0=N.div` - background: ${({theme:r})=>r.colors.background.secondary}; - padding: 32px; - border-radius: 5px; - width: 100%; - max-width: 480px; - - h2 { - color: ${({theme:r})=>r.colors.text.primary}; - margin-bottom: 24px; - text-align: center; - font-size: 24px; - } -`,xu=N.input` - width: 100%; - padding: 10px; - margin-bottom: 10px; - border: none; - border-radius: 4px; - background: ${({theme:r})=>r.colors.background.input}; - color: ${({theme:r})=>r.colors.text.primary}; - - &::placeholder { - color: ${({theme:r})=>r.colors.text.muted}; - } - - &:focus { - outline: none; - box-shadow: 0 0 0 2px ${({theme:r})=>r.colors.brand.primary}; - } -`,Ud=N.button` - width: 100%; - padding: 10px; - border: none; - border-radius: 4px; - background: ${({$secondary:r,theme:i})=>r?"transparent":i.colors.brand.primary}; - color: ${({theme:r})=>r.colors.text.primary}; - cursor: pointer; - font-weight: 500; - - &:hover { - background: ${({$secondary:r,theme:i})=>r?i.colors.background.hover:i.colors.brand.hover}; - } -`,Y0=N.div` - color: ${({theme:r})=>r.colors.status.error}; - font-size: 14px; - margin-bottom: 10px; -`,K0=N.div` - display: flex; - flex-direction: column; - align-items: center; - margin-bottom: 20px; -`,X0=N.img` - width: 100px; - height: 100px; - border-radius: 50%; - margin-bottom: 10px; - object-fit: cover; -`,J0=N.input` - display: none; -`,Z0=N.label` - color: ${({theme:r})=>r.colors.brand.primary}; - cursor: pointer; - font-size: 14px; - - &:hover { - text-decoration: underline; - } -`,ev=N.div` - display: flex; - gap: 10px; - margin-top: 20px; -`,tv=N.button` - width: 100%; - padding: 10px; - margin-top: 16px; - border: none; - border-radius: 4px; - background: transparent; - color: ${({theme:r})=>r.colors.status.error}; - cursor: pointer; - font-weight: 500; - - &:hover { - background: ${({theme:r})=>r.colors.status.error}20; - } -`,Mi=N.div` - margin-bottom: 20px; -`,Ui=N.label` - display: block; - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 12px; - font-weight: 700; - margin-bottom: 8px; -`,Fd=N.span` - color: ${({theme:r})=>r.colors.status.error}; -`,Wp=N.div` - position: absolute; - bottom: -3px; - right: -3px; - width: 16px; - height: 16px; - border-radius: 50%; - background: ${r=>r.$online?J.colors.status.online:J.colors.status.offline}; - border: 4px solid ${r=>r.$background||J.colors.background.secondary}; -`,nv=N.div` - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.5rem 0.75rem; - background-color: ${({theme:r})=>r.colors.background.tertiary}; - width: 100%; - height: 52px; -`,rv=N.div` - position: relative; - width: 32px; - height: 32px; - flex-shrink: 0; -`,ov=N.img` - width: 100%; - height: 100%; - border-radius: 50%; - object-fit: cover; -`,iv=N.div` - flex: 1; - min-width: 0; - display: flex; - flex-direction: column; - justify-content: center; -`,sv=N.div` - font-weight: 500; - color: ${({theme:r})=>r.colors.text.primary}; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-size: 0.875rem; - line-height: 1.2; -`,lv=N.div` - font-size: 0.75rem; - color: ${({theme:r})=>r.colors.text.secondary}; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - line-height: 1.2; -`,uv=N.div` - display: flex; - align-items: center; - flex-shrink: 0; -`,av=N.button` - background: none; - border: none; - padding: 0.25rem; - cursor: pointer; - color: ${({theme:r})=>r.colors.text.secondary}; - font-size: 18px; - - &:hover { - color: ${({theme:r})=>r.colors.text.primary}; - } -`;function cv({user:r}){const[i,s]=ue.useState(!1);ut(m=>m.logout);const u=ut(m=>m.updateUser),c=Wt(m=>m.profileImages),d=Wt(m=>m.fetchProfileImage);ue.useEffect(()=>{r.profileId&&!c[r.profileId]&&d(r.profileId)},[r.profileId,c,d]);const p=async m=>{await u(r.id,m)};return g.jsxs(g.Fragment,{children:[g.jsxs(nv,{children:[g.jsxs(rv,{children:[g.jsx(ov,{src:c[r.profileId]||Qt}),g.jsx(Wp,{$online:r.online,$background:J.colors.background.tertiary})]}),g.jsxs(iv,{children:[g.jsx(sv,{children:r.username}),g.jsx(lv,{children:r.email})]}),g.jsx(uv,{children:g.jsx(av,{onClick:()=>s(!0),children:"⚙️"})})]}),g.jsx(q0,{isOpen:i,onClose:()=>s(!1),user:r,onSubmit:p})]})}const fv=N.div` - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.85); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; -`,dv=N.div` - background: ${J.colors.background.primary}; - border-radius: 4px; - width: 440px; - max-width: 90%; -`,pv=N.div` - padding: 16px; - display: flex; - justify-content: space-between; - align-items: center; -`,hv=N.h2` - color: ${J.colors.text.primary}; - font-size: 20px; - font-weight: 600; - margin: 0; -`,mv=N.div` - padding: 0 16px 16px; -`,gv=N.form` - display: flex; - flex-direction: column; - gap: 16px; -`,Su=N.div` - display: flex; - flex-direction: column; - gap: 8px; -`,ku=N.label` - color: ${J.colors.text.primary}; - font-size: 12px; - font-weight: 600; - text-transform: uppercase; -`,yv=N.p` - color: ${J.colors.text.muted}; - font-size: 14px; - margin: -4px 0 0; -`,Fu=N.input` - padding: 10px; - background: ${J.colors.background.tertiary}; - border: none; - border-radius: 3px; - color: ${J.colors.text.primary}; - font-size: 16px; - - &:focus { - outline: none; - box-shadow: 0 0 0 2px ${J.colors.status.online}; - } - - &::placeholder { - color: ${J.colors.text.muted}; - } -`,vv=N.button` - margin-top: 8px; - padding: 12px; - background: ${J.colors.status.online}; - color: white; - border: none; - border-radius: 3px; - font-size: 14px; - font-weight: 500; - cursor: pointer; - transition: background 0.2s; - - &:hover { - background: #3ca374; - } -`,wv=N.button` - background: none; - border: none; - color: ${J.colors.text.muted}; - font-size: 24px; - cursor: pointer; - padding: 4px; - line-height: 1; - - &:hover { - color: ${J.colors.text.primary}; - } -`,xv=N(Fu)` - margin-bottom: 8px; -`,Sv=N.div` - max-height: 300px; - overflow-y: auto; - background: ${J.colors.background.tertiary}; - border-radius: 4px; -`,kv=N.div` - display: flex; - align-items: center; - padding: 8px 12px; - cursor: pointer; - transition: background 0.2s; - - &:hover { - background: ${J.colors.background.hover}; - } - - & + & { - border-top: 1px solid ${J.colors.border.primary}; - } -`,Ev=N.input` - margin-right: 12px; - width: 16px; - height: 16px; - cursor: pointer; -`,Bd=N.img` - width: 32px; - height: 32px; - border-radius: 50%; - margin-right: 12px; -`,Cv=N.div` - flex: 1; - min-width: 0; -`,Av=N.div` - color: ${J.colors.text.primary}; - font-size: 14px; - font-weight: 500; -`,Rv=N.div` - color: ${J.colors.text.muted}; - font-size: 12px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -`,Pv=N.div` - padding: 16px; - text-align: center; - color: ${J.colors.text.muted}; -`,jv=N.div` - color: ${J.colors.status.error}; - font-size: 14px; - padding: 8px 0; - text-align: center; - background-color: ${({theme:r})=>r.colors.background.tertiary}; - border-radius: 4px; - margin-bottom: 8px; -`,Bn=bn((r,i)=>({channels:[],pollingInterval:null,fetchChannels:async s=>{try{const u=await he.get(`${Xe.apiBaseUrl}/channels`,{params:{userId:s}});return r({channels:u.data}),u.data}catch(u){console.error("채널 목록 조회 실패:",u)}},startPolling:s=>{i().pollingInterval&&clearInterval(i().pollingInterval);const u=setInterval(()=>{i().fetchChannels(s)},3e3);r({pollingInterval:u})},stopPolling:()=>{i().pollingInterval&&(clearInterval(i().pollingInterval),r({pollingInterval:null}))},createPublicChannel:async s=>{try{const u=await he.post(`${Xe.apiBaseUrl}/channels/public`,s),c={...u.data,participantIds:[],lastMessageAt:u.data.createdAt};return r(d=>({channels:[...d.channels,c]})),c}catch(u){throw console.error("공개 채널 생성 실패:",u),u}},createPrivateChannel:async s=>{try{const u=await he.post(`${Xe.apiBaseUrl}/channels/private`,{participantIds:s}),c={...u.data,participantIds:s,lastMessageAt:u.data.createdAt};return r(d=>({channels:[...d.channels,c]})),c}catch(u){throw console.error("비공개 채널 생성 실패:",u),u}}}));function Iv({isOpen:r,type:i,onClose:s,onCreateSuccess:u}){const[c,d]=ue.useState({name:"",description:""}),[p,m]=ue.useState(""),[v,x]=ue.useState([]),[E,j]=ue.useState(""),O=Dt($=>$.users),P=Wt($=>$.profileImages),I=ut($=>$.currentUserId),R=ue.useMemo(()=>O.filter($=>$.id!==I).filter($=>$.username.toLowerCase().includes(p.toLowerCase())||$.email.toLowerCase().includes(p.toLowerCase())),[p,O]),L=Bn($=>$.createPublicChannel),V=Bn($=>$.createPrivateChannel),F=$=>{const{name:T,value:H}=$.target;d(se=>({...se,[T]:H}))},W=$=>{x(T=>T.includes($)?T.filter(H=>H!==$):[...T,$])},K=async $=>{var T,H;$.preventDefault(),j("");try{if(i==="PUBLIC"){if(!c.name.trim()){j("채널 이름을 입력해주세요.");return}await L({name:c.name,description:c.description})}else{if(v.length===0){j("대화 상대를 선택해주세요.");return}const se=[...v,I];await V(se)}u()}catch(se){console.error("채널 생성 실패:",se),j(((H=(T=se.response)==null?void 0:T.data)==null?void 0:H.message)||"채널 생성에 실패했습니다. 다시 시도해주세요.")}};return r?g.jsx(fv,{onClick:s,children:g.jsxs(dv,{onClick:$=>$.stopPropagation(),children:[g.jsxs(pv,{children:[g.jsx(hv,{children:i==="PUBLIC"?"채널 만들기":"개인 메시지 시작하기"}),g.jsx(wv,{onClick:s,children:"×"})]}),g.jsx(mv,{children:g.jsxs(gv,{onSubmit:K,children:[E&&g.jsx(jv,{children:E}),i==="PUBLIC"?g.jsxs(g.Fragment,{children:[g.jsxs(Su,{children:[g.jsx(ku,{children:"채널 이름"}),g.jsx(Fu,{name:"name",value:c.name,onChange:F,placeholder:"새로운-채널",required:!0})]}),g.jsxs(Su,{children:[g.jsx(ku,{children:"채널 설명"}),g.jsx(yv,{children:"이 채널의 주제를 설명해주세요."}),g.jsx(Fu,{name:"description",value:c.description,onChange:F,placeholder:"채널 설명을 입력하세요"})]})]}):g.jsxs(Su,{children:[g.jsx(ku,{children:"사용자 검색"}),g.jsx(xv,{type:"text",value:p,onChange:$=>m($.target.value),placeholder:"사용자명 또는 이메일로 검색"}),g.jsx(Sv,{children:R.length>0?R.map($=>g.jsxs(kv,{children:[g.jsx(Ev,{type:"checkbox",checked:v.includes($.id),onChange:()=>W($.id)}),$.profileId?g.jsx(Bd,{src:P[$.profileId]}):g.jsx(Bd,{src:Qt}),g.jsxs(Cv,{children:[g.jsx(Av,{children:$.username}),g.jsx(Rv,{children:$.email})]})]},$.id)):g.jsx(Pv,{children:"검색 결과가 없습니다."})})]}),g.jsx(vv,{type:"submit",children:i==="PUBLIC"?"채널 만들기":"대화 시작하기"})]})})]})}):null}const yo=bn((r,i)=>({readStatuses:{},fetchReadStatuses:async()=>{try{const s=ut.getState().currentUserId;if(!s)return;const c=(await he.get(`${Xe.apiBaseUrl}/readStatuses`,{params:{userId:s}})).data.reduce((d,p)=>(d[p.channelId]={id:p.id,lastReadAt:p.lastReadAt},d),{});r({readStatuses:c})}catch(s){console.error("읽음 상태 조회 실패:",s)}},updateReadStatus:async s=>{try{const u=ut.getState().currentUserId;if(!u)return;const c=i().readStatuses[s];let d;c?d=await he.patch(`${Xe.apiBaseUrl}/readStatuses/${c.id}`,{newLastReadAt:new Date().toISOString()}):d=await he.post(`${Xe.apiBaseUrl}/readStatuses`,{userId:u,channelId:s,lastReadAt:new Date().toISOString()}),r(p=>({readStatuses:{...p.readStatuses,[s]:{id:d.data.id,lastReadAt:d.data.lastReadAt}}}))}catch(u){console.error("읽음 상태 업데이트 실패:",u)}},hasUnreadMessages:(s,u)=>{const c=i().readStatuses[s],d=c==null?void 0:c.lastReadAt;return!d||new Date(u)>new Date(d)}}));function _v({currentUser:r,activeChannel:i,onChannelSelect:s}){var K,$;const[u,c]=ue.useState({PUBLIC:!1,PRIVATE:!1}),[d,p]=ue.useState({isOpen:!1,type:null}),m=Bn(T=>T.channels),v=Bn(T=>T.fetchChannels),x=Bn(T=>T.startPolling),E=Bn(T=>T.stopPolling);yo(T=>T.readStatuses);const j=yo(T=>T.fetchReadStatuses),O=yo(T=>T.updateReadStatus),P=yo(T=>T.hasUnreadMessages);ue.useEffect(()=>{if(r)return v(r.id),j(),x(r.id),()=>{E()}},[r,v,j,x,E]);const I=T=>{c(H=>({...H,[T]:!H[T]}))},R=(T,H)=>{H.stopPropagation(),p({isOpen:!0,type:T})},L=()=>{p({isOpen:!1,type:null})},V=async T=>{try{await v(r.id),L()}catch(H){console.error("채널 생성 실패:",H)}},F=T=>{s(T),O(T.id)},W=m.reduce((T,H)=>(T[H.type]||(T[H.type]=[]),T[H.type].push(H),T),{});return g.jsxs(oy,{children:[g.jsx(fy,{}),g.jsxs(iy,{children:[g.jsxs(hd,{children:[g.jsxs(Nu,{onClick:()=>I("PUBLIC"),children:[g.jsx(md,{$folded:u.PUBLIC,children:"▼"}),g.jsx("span",{children:"일반 채널"}),g.jsx(wd,{onClick:T=>R("PUBLIC",T),children:"+"})]}),g.jsx(gd,{$folded:u.PUBLIC,children:(K=W.PUBLIC)==null?void 0:K.map(T=>g.jsx(Md,{channel:T,isActive:(i==null?void 0:i.id)===T.id,hasUnread:P(T.id,T.lastMessageAt),onClick:()=>F(T)},T.id))})]}),g.jsxs(hd,{children:[g.jsxs(Nu,{onClick:()=>I("PRIVATE"),children:[g.jsx(md,{$folded:u.PRIVATE,children:"▼"}),g.jsx("span",{children:"개인 메시지"}),g.jsx(wd,{onClick:T=>R("PRIVATE",T),children:"+"})]}),g.jsx(gd,{$folded:u.PRIVATE,children:($=W.PRIVATE)==null?void 0:$.map(T=>g.jsx(Md,{channel:T,isActive:(i==null?void 0:i.id)===T.id,hasUnread:P(T.id,T.lastMessageAt),onClick:()=>F(T)},T.id))})]})]}),g.jsx(Nv,{children:g.jsx(cv,{user:r})}),g.jsx(Iv,{isOpen:d.isOpen,type:d.type,onClose:L,onCreateSuccess:V})]})}const Nv=N.div` - margin-top: auto; - border-top: 1px solid ${({theme:r})=>r.colors.border.primary}; - background-color: ${({theme:r})=>r.colors.background.tertiary}; -`,Ov=N.div` - flex: 1; - display: flex; - flex-direction: column; - background: ${({theme:r})=>r.colors.background.primary}; -`,Tv=N.div` - display: flex; - flex-direction: column; - height: 100%; - background: ${({theme:r})=>r.colors.background.primary}; -`,Lv=N(Tv)` - justify-content: center; - align-items: center; - flex: 1; - padding: 0 20px; -`,Dv=N.div` - text-align: center; - max-width: 400px; - padding: 20px; - margin-bottom: 80px; -`,zv=N.div` - font-size: 48px; - margin-bottom: 16px; - animation: wave 2s infinite; - transform-origin: 70% 70%; - - @keyframes wave { - 0% { transform: rotate(0deg); } - 10% { transform: rotate(14deg); } - 20% { transform: rotate(-8deg); } - 30% { transform: rotate(14deg); } - 40% { transform: rotate(-4deg); } - 50% { transform: rotate(10deg); } - 60% { transform: rotate(0deg); } - 100% { transform: rotate(0deg); } - } -`,Mv=N.h2` - color: ${({theme:r})=>r.colors.text.primary}; - font-size: 28px; - font-weight: 700; - margin-bottom: 16px; -`,Uv=N.p` - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 16px; - line-height: 1.6; - word-break: keep-all; -`,$d=N.div` - height: 48px; - padding: 0 16px; - background: ${J.colors.background.primary}; - border-bottom: 1px solid ${J.colors.border.primary}; - display: flex; - align-items: center; -`,Hd=N.div` - display: flex; - align-items: center; - gap: 8px; - height: 100%; -`,Fv=N.div` - display: flex; - align-items: center; - gap: 12px; - height: 100%; -`,Bv=N.div` - position: relative; - width: 24px; - height: 24px; - flex-shrink: 0; -`,Vd=N.img` - width: 24px; - height: 24px; - border-radius: 50%; -`,$v=N.div` - position: relative; - width: 40px; - height: 24px; - flex-shrink: 0; -`,Hv=N.div` - position: absolute; - bottom: -2px; - right: -2px; - width: 14px; - height: 14px; - border-radius: 50%; - background: ${r=>r.online?J.colors.status.online:J.colors.status.offline}; - border: 3px solid ${J.colors.background.secondary}; -`,Vv=N(Hv)` - border-color: ${J.colors.background.primary}; - bottom: -3px; - right: -3px; -`,Wv=N.div` - font-size: 12px; - color: ${J.colors.text.muted}; - line-height: 13px; -`,Wd=N.div` - font-weight: bold; - color: ${J.colors.text.primary}; - line-height: 20px; - font-size: 16px; -`,Qv=N.div` - flex: 1; - display: flex; - flex-direction: column-reverse; - overflow-y: auto; -`,qv=N.div` - padding: 16px; - display: flex; - flex-direction: column; -`,bv=N.div` - margin-bottom: 16px; - display: flex; - align-items: flex-start; -`,Gv=N.div` - position: relative; - margin-right: 16px; - flex-shrink: 0; -`,Yv=N.img` - width: 40px; - height: 40px; - border-radius: 50%; -`,Kv=N.div` - display: flex; - align-items: center; - margin-bottom: 4px; -`,Xv=N.span` - font-weight: bold; - color: ${J.colors.text.primary}; - margin-right: 8px; -`,Jv=N.span` - font-size: 0.75rem; - color: ${J.colors.text.muted}; -`,Zv=N.div` - color: ${J.colors.text.secondary}; - margin-top: 4px; -`,e1=N.form` - display: flex; - align-items: center; - gap: 8px; - padding: 16px; - background: ${({theme:r})=>r.colors.background.secondary}; -`,t1=N.textarea` - flex: 1; - padding: 12px; - background: ${({theme:r})=>r.colors.background.tertiary}; - border: none; - border-radius: 4px; - color: ${({theme:r})=>r.colors.text.primary}; - font-size: 14px; - resize: none; - min-height: 44px; - max-height: 144px; - - &:focus { - outline: none; - } - - &::placeholder { - color: ${({theme:r})=>r.colors.text.muted}; - } -`,n1=N.button` - background: none; - border: none; - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 24px; - cursor: pointer; - padding: 4px 8px; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - color: ${({theme:r})=>r.colors.text.primary}; - } -`;N.div` - flex: 1; - display: flex; - align-items: center; - justify-content: center; - color: ${J.colors.text.muted}; - font-size: 16px; - font-weight: 500; - padding: 20px; - text-align: center; -`;const Qd=N.div` - display: flex; - flex-wrap: wrap; - gap: 8px; - margin-top: 8px; - width: 100%; -`,r1=N.a` - display: block; - border-radius: 4px; - overflow: hidden; - max-width: 300px; - - img { - width: 100%; - height: auto; - display: block; - } -`,o1=N.a` - display: flex; - align-items: center; - gap: 12px; - padding: 12px; - background: ${({theme:r})=>r.colors.background.tertiary}; - border-radius: 8px; - text-decoration: none; - width: fit-content; - - &:hover { - background: ${({theme:r})=>r.colors.background.hover}; - } -`,i1=N.div` - width: 40px; - height: 40px; - display: flex; - align-items: center; - justify-content: center; - font-size: 40px; - color: #0B93F6; -`,s1=N.div` - display: flex; - flex-direction: column; - gap: 2px; -`,l1=N.span` - font-size: 14px; - color: #0B93F6; - font-weight: 500; -`,u1=N.span` - font-size: 13px; - color: ${({theme:r})=>r.colors.text.muted}; -`,a1=N.div` - display: flex; - flex-wrap: wrap; - gap: 8px; - padding: 8px 0; -`,Qp=N.div` - position: relative; - display: flex; - align-items: center; - gap: 8px; - padding: 8px 12px; - background: ${({theme:r})=>r.colors.background.tertiary}; - border-radius: 4px; - max-width: 300px; -`,c1=N(Qp)` - padding: 0; - overflow: hidden; - width: 200px; - height: 120px; - - img { - width: 100%; - height: 100%; - object-fit: cover; - } -`,f1=N.div` - color: #0B93F6; - font-size: 20px; -`,d1=N.div` - font-size: 13px; - color: ${({theme:r})=>r.colors.text.primary}; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -`,qd=N.button` - position: absolute; - top: -6px; - right: -6px; - width: 20px; - height: 20px; - border-radius: 50%; - background: ${({theme:r})=>r.colors.background.secondary}; - border: none; - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 16px; - line-height: 1; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - padding: 0; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - - &:hover { - color: ${({theme:r})=>r.colors.text.primary}; - } -`,vo=bn((r,i)=>({messages:[],pollingIntervals:{},lastMessageId:null,fetchMessages:async s=>{try{const u=await he.get(`${Xe.apiBaseUrl}/messages`,{params:{channelId:s}}),c=u.data[u.data.length-1],d=(c==null?void 0:c.id)!==i().lastMessageId;return r({messages:u.data,lastMessageId:c==null?void 0:c.id}),d}catch(u){return console.error("메시지 목록 조회 실패:",u),!1}},startPolling:s=>{const u=i();u.pollingIntervals[s]&&clearTimeout(u.pollingIntervals[s]);let c=300;const d=3e3;r(m=>({pollingIntervals:{...m.pollingIntervals,[s]:!0}}));const p=async()=>{const m=i();if(!m.pollingIntervals[s])return;if(await m.fetchMessages(s)?c=300:c=Math.min(c*1.5,d),i().pollingIntervals[s]){const x=setTimeout(p,c);r(E=>({pollingIntervals:{...E.pollingIntervals,[s]:x}}))}};p()},stopPolling:s=>{const{pollingIntervals:u}=i();if(u[s]){const c=u[s];typeof c=="number"&&clearTimeout(c),r(d=>{const p={...d.pollingIntervals};return delete p[s],{pollingIntervals:p}})}},createMessage:async s=>{try{const u=new FormData;u.append("messageCreateRequest",new Blob([JSON.stringify({content:s.content,channelId:s.channelId,authorId:s.authorId})],{type:"application/json"})),s.attachments&&s.attachments.forEach(p=>{u.append("attachments",p)});const c=await he.post(`${Xe.apiBaseUrl}/messages`,u,{headers:{"Content-Type":"multipart/form-data"}}),d=yo.getState().updateReadStatus;return await d(s.channelId),r(p=>({messages:[...p.messages,c.data]})),c.data}catch(u){throw console.error("메시지 생성 실패:",u),u}}})),p1=bn((r,i)=>({attachments:{},fetchAttachment:async s=>{if(i().attachments[s])return i().attachments[s];try{const u=await he.get(`${Xe.apiBaseUrl}/binaryContents/${s}`),{bytes:c,contentType:d,fileName:p,size:m}=u.data,x={url:`data:${d};base64,${c}`,contentType:d,originalName:p,size:m};return r(E=>({attachments:{...E.attachments,[s]:x}})),x}catch(u){return console.error("첨부파일 정보 조회 실패:",u),null}}})),h1=r=>r<1024?r+" B":r<1024*1024?(r/1024).toFixed(2)+" KB":r<1024*1024*1024?(r/(1024*1024)).toFixed(2)+" MB":(r/(1024*1024*1024)).toFixed(2)+" GB";function m1({channel:r}){const i=vo(P=>P.messages),s=vo(P=>P.fetchMessages),u=vo(P=>P.startPolling),c=vo(P=>P.stopPolling),d=Wt(P=>P.profileImages),p=Dt(P=>P.users),{attachments:m,fetchAttachment:v}=p1();ue.useEffect(()=>{if(r!=null&&r.id)return s(r.id),u(r.id),()=>{c(r.id)}},[r==null?void 0:r.id,s,u,c]),ue.useEffect(()=>{i.forEach(P=>{var I;(I=P.attachmentIds)==null||I.forEach(R=>{m[R]||v(R)})})},[i,m,v]);const x=async(P,I)=>{try{const R=await he.get(`${Xe.apiBaseUrl}/binaryContents/${P}`,{responseType:"blob"}),L=new Blob([R.data],{type:R.headers["content-type"]}),V=window.URL.createObjectURL(L),F=document.createElement("a");F.href=V,F.download=I,F.style.display="none",document.body.appendChild(F);try{const K=await(await window.showSaveFilePicker({suggestedName:I,types:[{description:"Files",accept:{"*/*":[".txt",".pdf",".doc",".docx",".xls",".xlsx",".jpg",".jpeg",".png",".gif"]}}]})).createWritable();await K.write(L),await K.close()}catch(W){W.name!=="AbortError"&&F.click()}document.body.removeChild(F),window.URL.revokeObjectURL(V)}catch(R){console.error("파일 다운로드 실패:",R)}},E=P=>P!=null&&P.length?P.map(I=>{const R=m[I];return R?R.contentType.startsWith("image/")?g.jsx(Qd,{children:g.jsx(r1,{href:"#",onClick:V=>{V.preventDefault(),x(I,R.originalName)},children:g.jsx("img",{src:R.url,alt:R.originalName})})},I):g.jsx(Qd,{children:g.jsxs(o1,{href:"#",onClick:V=>{V.preventDefault(),x(I,R.originalName)},children:[g.jsx(i1,{children:g.jsxs("svg",{width:"40",height:"40",viewBox:"0 0 40 40",fill:"none",children:[g.jsx("path",{d:"M8 3C8 1.89543 8.89543 1 10 1H22L32 11V37C32 38.1046 31.1046 39 30 39H10C8.89543 39 8 38.1046 8 37V3Z",fill:"#0B93F6",fillOpacity:"0.1"}),g.jsx("path",{d:"M22 1L32 11H24C22.8954 11 22 10.1046 22 9V1Z",fill:"#0B93F6",fillOpacity:"0.3"}),g.jsx("path",{d:"M13 19H27M13 25H27M13 31H27",stroke:"#0B93F6",strokeWidth:"2",strokeLinecap:"round"})]})}),g.jsxs(s1,{children:[g.jsx(l1,{children:R.originalName}),g.jsx(u1,{children:h1(R.size)})]})]})},I):null}):null,j=P=>new Date(P).toLocaleTimeString(),O=[...i].sort((P,I)=>P.createdAt.localeCompare(I.createdAt));return g.jsx(Qv,{children:g.jsx(qv,{children:O.map(P=>{const I=p.find(R=>R.id===P.authorId);return g.jsxs(bv,{children:[g.jsx(Gv,{children:g.jsx(Yv,{src:I&&I.profileId?d[I.profileId]:Qt,alt:I&&I.username||"알 수 없음"})}),g.jsxs("div",{children:[g.jsxs(Kv,{children:[g.jsx(Xv,{children:I&&I.username||"알 수 없음"}),g.jsx(Jv,{children:j(P.createdAt)})]}),g.jsx(Zv,{children:P.content}),E(P.attachmentIds)]})]},P.id)})})})}function g1({channel:r}){const[i,s]=ue.useState(""),[u,c]=ue.useState([]),d=vo(O=>O.createMessage),p=ut(O=>O.currentUserId),m=async O=>{if(O.preventDefault(),!(!i.trim()&&u.length===0))try{await d({content:i.trim(),channelId:r.id,authorId:p,attachments:u}),s(""),c([])}catch(P){console.error("메시지 전송 실패:",P)}},v=O=>{const P=Array.from(O.target.files);c(I=>[...I,...P]),O.target.value=""},x=O=>{c(P=>P.filter((I,R)=>R!==O))},E=O=>{O.key==="Enter"&&!O.shiftKey&&(O.preventDefault(),m(O))},j=(O,P)=>O.type.startsWith("image/")?g.jsxs(c1,{children:[g.jsx("img",{src:URL.createObjectURL(O),alt:O.name}),g.jsx(qd,{onClick:()=>x(P),children:"×"})]},P):g.jsxs(Qp,{children:[g.jsx(f1,{children:"📎"}),g.jsx(d1,{children:O.name}),g.jsx(qd,{onClick:()=>x(P),children:"×"})]},P);return ue.useEffect(()=>()=>{u.forEach(O=>{O.type.startsWith("image/")&&URL.revokeObjectURL(O)})},[u]),r?g.jsxs(g.Fragment,{children:[u.length>0&&g.jsx(a1,{children:u.map((O,P)=>j(O,P))}),g.jsxs(e1,{onSubmit:m,children:[g.jsxs(n1,{as:"label",children:["+",g.jsx("input",{type:"file",multiple:!0,onChange:v,style:{display:"none"}})]}),g.jsx(t1,{value:i,onChange:O=>s(O.target.value),onKeyPress:E,placeholder:r.type==="PUBLIC"?`#${r.name}에 메시지 보내기`:"메시지 보내기"})]})]}):null}function y1({channel:r}){const i=ut(v=>v.currentUserId),s=Dt(v=>v.users),u=Wt(v=>v.profileImages);if(!r)return null;if(r.type==="PUBLIC")return g.jsx($d,{children:g.jsx(Hd,{children:g.jsxs(Wd,{children:["# ",r.name]})})});const c=r.participantIds.map(v=>s.find(x=>x.id===v)).filter(Boolean),d=c.filter(v=>v.id!==i),p=c.length>2,m=c.filter(v=>v.id!==i).map(v=>v.username).join(", ");return g.jsx($d,{children:g.jsx(Hd,{children:g.jsxs(Fv,{children:[p?g.jsx($v,{children:d.slice(0,2).map((v,x)=>g.jsx(Vd,{src:v.profileId?u[v.profileId]:Qt,style:{position:"absolute",left:x*16,zIndex:2-x}},v.id))}):g.jsxs(Bv,{children:[g.jsx(Vd,{src:d[0].profileId?u[d[0].profileId]:Qt}),g.jsx(Vv,{online:d[0].online})]}),g.jsxs("div",{children:[g.jsx(Wd,{children:m}),p&&g.jsxs(Wv,{children:["멤버 ",c.length,"명"]})]})]})})})}function v1({channel:r}){return r?g.jsxs(Ov,{children:[g.jsx(y1,{channel:r}),g.jsx(m1,{channel:r}),g.jsx(g1,{channel:r})]}):g.jsx(Lv,{children:g.jsxs(Dv,{children:[g.jsx(zv,{children:"👋"}),g.jsx(Mv,{children:"채널을 선택해주세요"}),g.jsxs(Uv,{children:["왼쪽의 채널 목록에서 채널을 선택하여",g.jsx("br",{}),"대화를 시작하세요."]})]})})}const w1=N.div` - width: 240px; - background: ${J.colors.background.secondary}; - border-left: 1px solid ${J.colors.border.primary}; -`,x1=N.div` - padding: 16px; - font-size: 14px; - font-weight: bold; - color: ${J.colors.text.muted}; - text-transform: uppercase; -`,S1=N.div` - padding: 8px 16px; - display: flex; - align-items: center; - color: ${J.colors.text.muted}; -`,k1=N.div` - position: relative; - width: 32px; - height: 32px; - margin-right: 12px; -`,bd=N.img` - width: 100%; - height: 100%; - border-radius: 50%; -`,E1=N.div` - display: flex; - align-items: center; -`;N.div` - width: 8px; - height: 8px; - border-radius: 50%; - margin-right: 8px; - background: ${r=>J.colors.status[r.status]}; -`;function C1({member:r}){const i=Wt(u=>u.profileImages),s=Wt(u=>u.fetchProfileImage);return ue.useEffect(()=>{r.profileId&&!i[r.profileId]&&s(r.profileId)},[r.profileId,i,s]),g.jsxs(S1,{children:[g.jsxs(k1,{children:[i[r.profileId]?g.jsx(bd,{src:i[r.profileId]}):g.jsx(bd,{src:Qt}),g.jsx(Wp,{$online:r.online})]}),g.jsx(E1,{children:r.username})]})}function A1(){const r=Dt(c=>c.users),i=Dt(c=>c.fetchUsers),s=ut(c=>c.currentUserId);ue.useEffect(()=>{i()},[i]);const u=[...r].sort((c,d)=>c.id===s?-1:d.id===s?1:c.online&&!d.online?-1:!c.online&&d.online?1:c.username.localeCompare(d.username));return g.jsxs(w1,{children:[g.jsxs(x1,{children:["멤버 목록 - ",r.length]}),u.map(c=>g.jsx(C1,{member:c},c.id))]})}const qp=N.div` - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; -`,bp=N.div` - background: ${J.colors.background.primary}; - padding: 32px; - border-radius: 8px; - width: 440px; - - h2 { - color: ${J.colors.text.primary}; - margin-bottom: 24px; - font-size: 24px; - font-weight: bold; - } - - form { - display: flex; - flex-direction: column; - gap: 16px; - } -`,xo=N.input` - width: 100%; - padding: 10px; - border-radius: 4px; - background: ${J.colors.background.input}; - border: none; - color: ${J.colors.text.primary}; - font-size: 16px; - - &::placeholder { - color: ${J.colors.text.muted}; - } - - &:focus { - outline: none; - } -`,Gp=N.button` - width: 100%; - padding: 12px; - border-radius: 4px; - background: ${J.colors.brand.primary}; - color: white; - font-size: 16px; - font-weight: 500; - border: none; - cursor: pointer; - transition: background-color 0.2s; - - &:hover { - background: ${J.colors.brand.hover}; - } -`,Yp=N.div` - color: ${J.colors.status.error}; - font-size: 14px; - text-align: center; -`,R1=N.p` - text-align: center; - margin-top: 16px; - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 14px; -`,P1=N.span` - color: ${({theme:r})=>r.colors.brand.primary}; - cursor: pointer; - - &:hover { - text-decoration: underline; - } -`;function j1({isOpen:r,onClose:i}){const[s,u]=ue.useState(""),[c,d]=ue.useState(""),[p,m]=ue.useState(""),[v,x]=ue.useState(null),[E,j]=ue.useState(null),[O,P]=ue.useState(""),I=ut(V=>V.setCurrentUser),R=V=>{const F=V.target.files[0];if(F){x(F);const W=new FileReader;W.onloadend=()=>{j(W.result)},W.readAsDataURL(F)}},L=async V=>{V.preventDefault(),P("");try{const F=new FormData;F.append("userCreateRequest",new Blob([JSON.stringify({email:s,username:c,password:p})],{type:"application/json"})),v&&F.append("profile",v);const W=await he.post(`${Xe.apiBaseUrl}/users`,F);I(W.data),i()}catch{P("회원가입에 실패했습니다.")}};return r?g.jsx(qp,{children:g.jsxs(bp,{children:[g.jsx("h2",{children:"계정 만들기"}),g.jsxs("form",{onSubmit:L,children:[g.jsxs(Fi,{children:[g.jsxs(Bi,{children:["이메일 ",g.jsx(Eu,{children:"*"})]}),g.jsx(xo,{type:"email",value:s,onChange:V=>u(V.target.value),required:!0})]}),g.jsxs(Fi,{children:[g.jsxs(Bi,{children:["사용자명 ",g.jsx(Eu,{children:"*"})]}),g.jsx(xo,{type:"text",value:c,onChange:V=>d(V.target.value),required:!0})]}),g.jsxs(Fi,{children:[g.jsxs(Bi,{children:["비밀번호 ",g.jsx(Eu,{children:"*"})]}),g.jsx(xo,{type:"password",value:p,onChange:V=>m(V.target.value),required:!0})]}),g.jsxs(Fi,{children:[g.jsx(Bi,{children:"프로필 이미지"}),g.jsxs(I1,{children:[g.jsx(_1,{src:E||Qt,alt:"profile"}),g.jsx(N1,{type:"file",accept:"image/*",onChange:R,id:"profile-image"}),g.jsx(O1,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),O&&g.jsx(Yp,{children:O}),g.jsx(Gp,{type:"submit",children:"계속하기"}),g.jsx(L1,{onClick:i,children:"이미 계정이 있으신가요?"})]})]})}):null}const Fi=N.div` - margin-bottom: 20px; -`,Bi=N.label` - display: block; - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 12px; - font-weight: 700; - margin-bottom: 8px; -`,Eu=N.span` - color: ${({theme:r})=>r.colors.status.error}; -`,I1=N.div` - display: flex; - flex-direction: column; - align-items: center; - margin: 10px 0; -`,_1=N.img` - width: 80px; - height: 80px; - border-radius: 50%; - margin-bottom: 10px; - object-fit: cover; -`,N1=N.input` - display: none; -`,O1=N.label` - color: ${({theme:r})=>r.colors.brand.primary}; - cursor: pointer; - font-size: 14px; - - &:hover { - text-decoration: underline; - } -`;N.p` - color: ${({theme:r})=>r.colors.text.muted}; - font-size: 12px; - margin-top: 16px; - text-align: center; -`;const T1=N.span` - color: ${({theme:r})=>r.colors.brand.primary}; - cursor: pointer; - - &:hover { - text-decoration: underline; - } -`,L1=N(T1)` - display: block; - text-align: center; - margin-top: 16px; -`,D1=({isOpen:r,onClose:i})=>{const[s,u]=ue.useState(""),[c,d]=ue.useState(""),[p,m]=ue.useState(""),[v,x]=ue.useState(!1),E=ut(P=>P.setCurrentUser),{fetchUsers:j}=Dt(),O=async()=>{var P;try{const I=await he.post(`${Xe.apiBaseUrl}/auth/login`,{username:s,password:c});I.status===200&&(await j(),E(I.data),m(""),i())}catch(I){console.error("로그인 에러:",I),((P=I.response)==null?void 0:P.status)===401?m("아이디 또는 비밀번호가 올바르지 않습니다."):m("로그인에 실패했습니다.")}};return r?g.jsxs(g.Fragment,{children:[g.jsx(qp,{children:g.jsxs(bp,{children:[g.jsx("h2",{children:"돌아오신 것을 환영해요!"}),g.jsxs("form",{onSubmit:P=>{P.preventDefault(),O()},children:[g.jsx(xo,{type:"text",placeholder:"사용자 이름",value:s,onChange:P=>u(P.target.value)}),g.jsx(xo,{type:"password",placeholder:"비밀번호",value:c,onChange:P=>d(P.target.value)}),p&&g.jsx(Yp,{children:p}),g.jsx(Gp,{type:"submit",children:"로그인"})]}),g.jsxs(R1,{children:["계정이 필요한가요? ",g.jsx(P1,{onClick:()=>x(!0),children:"가입하기"})]})]})}),g.jsx(j1,{isOpen:v,onClose:()=>x(!1)})]}):null};function z1(){const r=ut(v=>v.currentUserId),i=Dt(v=>v.users),{fetchUsers:s,updateUserStatus:u}=Dt(),[c,d]=ue.useState(null),p=Bn(v=>v.channels),m=r?i.find(v=>v.id===r):null;return ue.useEffect(()=>{let v;if(r){s(),u(r),v=setInterval(()=>{u(r)},3e4);const x=setInterval(()=>{s()},6e4);return()=>{clearInterval(v),clearInterval(x)}}},[r,s,u]),g.jsx(ty,{theme:J,children:m?g.jsxs(M1,{children:[g.jsx(_v,{channels:p,currentUser:m,activeChannel:c,onChannelSelect:d}),g.jsx(v1,{channel:c}),g.jsx(A1,{})]}):g.jsx(D1,{isOpen:!0,onClose:()=>{}})})}const M1=N.div` - display: flex; - height: 100vh; - width: 100vw; - position: relative; -`;eg.createRoot(document.getElementById("root")).render(g.jsx(ue.StrictMode,{children:g.jsx(z1,{})})); diff --git a/src/main/resources/static/assets/index-kQJbKSsj.css b/src/main/resources/static/assets/index-kQJbKSsj.css deleted file mode 100644 index 096eb4112..000000000 --- a/src/main/resources/static/assets/index-kQJbKSsj.css +++ /dev/null @@ -1 +0,0 @@ -:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}} diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico deleted file mode 100644 index 479bed6a3da0a8dbdd08a51d81b30e4d4fabae89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!Dv>Mu*Du8ycRt4Yw>0&$ytddU zdTHwA$vlU)7;*ZQn^d>r9eiw}SEV3v&DP3PpZVm?c2D=&D? zJg+7dT;x9cg;(mDqrovi2QemjySudY+_R1aaySb-B8!2p69!>MhFNnYfC{QST^vI! zPM@6=9?WDY()wLtM|S>=KoQ44K~Zk4us5=<8xs!eeY>~&=ly4!jD%AXj+wvro>aU~ zrMO$=?`j4U&ZyW$Je*!Zo0>H2RZVqmn^V&mZ(9Dkv!~|IuDF1RBN|EPJE zX3ok)rzF<3&vZKWEj4ag73&t}uJvVk^<~M;*V0n54#8@&v!WGjE_hAaeAZEF z$~V4aF>{^dUc7o%=f8f9m%*2vzjfI@vJ2Z97)VU5x-s2*r@e{H>FEn3A3Dr3G&8U| z)>wFiQO&|Yl6}UkXAQ>%q$jNWac-tTL*)AEyto|onkmnmcJLf?71w_<>4WODmBMxF zwGM7``txcQgT`x>(tH-DrT2Kg=4LzpNv>|+a@TgYDZ`5^$KJVb`K=%k^tRpoxP|4? zwXb!O5~dXYKYt*j(YSx+#_rP{TNcK=40T|)+k3s|?t||EQTgwGgs{E0Y+(QPL&Wx4 zMP23By&sn`zn7oCQQLp%-(Axm|M=5-u;TlFiTn5B^PWnb%fAPV8r2flh?11Vl2ohY zqEsNoU}Ruqple{LYiJr`U}|M-Vr62aZD3$!V6dZTmJ5o8-29Zxv`X9>PU+TH>UWRL)v7?M$%n`C9>lAm0fo0?Z*WfcHaTFhX${Qqu! zG&Nv5t*kOqGt)Cl7z{0q_!){?fojB&%z>&2&rB)F04ce=Mv()kL=s7fZ)R?4No7GQ z1K3si1$pWAo5K9i%<&BYs$wuSHMcY{Gc&O;(${(hEL0izk<1CstV(4taB`Zm$nFhL zDhx>~G{}=7Ei)$-=zaa%ypo*!bp5o%vdrZCykdPs#ORw@rkW)uCz=~4Cz={1nkQNs oC7PHSBpVtgnwc6|q*&+yb?5=zccWrGsMu%lboFyt=akR{0N~++#sB~S diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html deleted file mode 100644 index 66e849757..000000000 --- a/src/main/resources/static/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Discodeit - - - - - -
- - diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js deleted file mode 100644 index 804027e10..000000000 --- a/src/main/resources/static/script.js +++ /dev/null @@ -1,110 +0,0 @@ -// API endpoints -const API_BASE_URL = '/api'; -const ENDPOINTS = { - USERS: `${API_BASE_URL}/users`, - USER_STATUS: `${API_BASE_URL}/userStatuses`, - BINARY_CONTENT: `${API_BASE_URL}/binaryContents/check` -}; - -// Initialize the application -document.addEventListener('DOMContentLoaded', () => { - fetchAndRenderUsers(); -}); - -async function fetchAndRenderUsers() { - try { - // 사용자 데이터 가져오기 - const usersResponse = await fetch(ENDPOINTS.USERS); - if (!usersResponse.ok) { - throw new Error(`Failed to fetch users: ${usersResponse.status}`); - } - const users = await usersResponse.json(); - console.log("Users fetched:", users); - - // 사용자 상태 데이터 가져오기 - const userStatusesResponse = await fetch(ENDPOINTS.USER_STATUS); - if (!userStatusesResponse.ok) { - throw new Error( - `Failed to fetch userStatuses: ${userStatusesResponse.status}`); - } - const userStatuses = await userStatusesResponse.json(); - console.log("User statuses fetched:", userStatuses); - - // 프로필 데이터 가져오기 - const profileResponse = await fetch(ENDPOINTS.BINARY_CONTENT); - if (!profileResponse.ok) { - throw new Error(`Failed to fetch profiles: ${profileResponse.status}`); - } - const profiles = await profileResponse.json(); - console.log("Profiles fetched:", profiles); - - // 사용자 목록 렌더링 - renderUserList(users, userStatuses, profiles); - } catch (error) { - console.error('Error fetching users or user statuses:', error); - } -} - -// 사용자 목록 렌더링 -async function renderUserList(users, userStatuses, profiles) { - const userListElement = document.getElementById('userList'); - if (!userListElement) { - console.error("Error: userList element not found"); - return; - } - - userListElement.innerHTML = ''; // 기존 내용 삭제 - - // 사용자 상태 맵 생성 (ID를 문자열로 변환) - const userStatusMap = new Map(); - userStatuses.forEach(status => { - userStatusMap.set(String(status.id), status); - }); - console.log("User Status Map:", userStatusMap); - - // 프로필 맵 생성 (id → URL 매핑) - const profileMap = new Map(); - profiles.forEach(profile => { - profileMap.set(profile.id, `/api/binaryContents/view/${profile.id}`); - }); - console.log("Profile Map:", profileMap); - - // 사용자 목록 렌더링 - for (const user of users) { - console.log(`User ${user.name} userStatusId:`, user.userStatusId); - console.log("User Status Map has userStatusId:", - userStatusMap.has(String(user.userStatusId))); - - // 사용자 상태 가져오기 - const userStatus = userStatusMap.get(String(user.userStatusId)); - console.log(`User ${user.name} status:`, userStatus); - console.log(`User ${user.name} online value:`, - userStatus ? userStatus.online : "N/A"); - - const isOnline = userStatus ? userStatus.online : false; // 기본값: 오프라인 - - // 프로필 이미지 URL 가져오기 - console.log(`User ${user.name} profileId:`, user.profileImageId); - console.log("Profile Map has profileId:", - profileMap.has(user.profileImageId)); - - const profileUrl = profileMap.get(user.profileImageId) - || '/default-avatar.png'; - console.log(`Final profileUrl for ${user.name}:`, profileUrl); - - const userElement = document.createElement('div'); - userElement.className = 'user-item'; - userElement.innerHTML = ` - ${user.name} - -
- ${isOnline ? '온라인' : '오프라인'} -
- `; - - userListElement.appendChild(userElement); - } -} diff --git a/src/main/resources/static/styles.css b/src/main/resources/static/styles.css deleted file mode 100644 index b45f4e704..000000000 --- a/src/main/resources/static/styles.css +++ /dev/null @@ -1,80 +0,0 @@ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body { - font-family: Arial, sans-serif; - background-color: #f5f5f5; -} - -.container { - max-width: 800px; - margin: 0 auto; - padding: 20px; -} - -h1 { - text-align: center; - margin-bottom: 30px; - color: #333; -} - -.user-list { - background-color: white; - border-radius: 8px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -.user-item { - display: flex; - align-items: center; - padding: 20px; - border-bottom: 1px solid #eee; -} - -.user-item:last-child { - border-bottom: none; -} - -.user-avatar { - width: 60px; - height: 60px; - border-radius: 50%; - margin-right: 20px; - object-fit: cover; -} - -.user-info { - flex-grow: 1; -} - -.user-name { - font-size: 18px; - font-weight: bold; - color: #333; - margin-bottom: 5px; -} - -.user-email { - font-size: 14px; - color: #666; -} - -.status-badge { - padding: 6px 12px; - border-radius: 20px; - font-size: 14px; - font-weight: bold; -} - -.online { - background-color: #4CAF50; - color: white; -} - -.offline { - background-color: #9e9e9e; - color: white; -} \ No newline at end of file diff --git a/src/main/resources/static/user-list.html b/src/main/resources/static/user-list.html deleted file mode 100644 index f3acfdb59..000000000 --- a/src/main/resources/static/user-list.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - 사용자 목록 - - - -
-

사용자 목록

-
- -
-
- - - \ No newline at end of file From de43eb2d48aaffa34ff2d67ad2bd729488f6a300 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 13 Mar 2025 09:22:53 +0900 Subject: [PATCH 094/115] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BinaryContentController.java | 2 +- .../controller/MessageController.java | 16 ++++++---- .../discodeit/dto/message/MessageDTO.java | 4 +++ .../discodeit/dto/response/PageResponse.java | 10 ++++++- .../mission/discodeit/entity/Message.java | 4 +++ .../discodeit/mapper/MapperConfig.java | 17 +++++++++-- .../discodeit/mapper/PageResponseMapper.java | 30 +++++++++++++++++++ .../repository/MessageRepository.java | 4 ++- .../discodeit/service/MessageService.java | 3 +- .../service/basic/BasicMessageService.java | 19 ++++++++---- .../storage/LocalBinaryContentStorage.java | 5 +--- 11 files changed, 92 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 6a1f8895f..04eb61a41 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -21,7 +21,7 @@ public class BinaryContentController { private final BinaryContentService binaryContentService; private final BinaryContentStorage binaryContentStorage; - @GetMapping(value = "{binaryContentId}/download") + @GetMapping(value = "{binaryContentId}/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) public ResponseEntity download(@PathVariable UUID binaryContentId) { BinaryContentDTO binaryContentDTO = binaryContentService.find(binaryContentId); return (ResponseEntity) binaryContentStorage.download(binaryContentDTO); diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index a7095322e..e411033b7 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -4,11 +4,14 @@ import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; +import com.sprint.mission.discodeit.dto.response.PageResponse; import com.sprint.mission.discodeit.service.MessageService; import java.io.IOException; import java.util.ArrayList; import java.util.Optional; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -23,7 +26,7 @@ public class MessageController { private final MessageService messageService; - @PostMapping + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity create( @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, @RequestPart("file") @@ -50,13 +53,14 @@ public ResponseEntity create( } @GetMapping - public ResponseEntity> getAllByChannelId( - @RequestParam("channelId") UUID channelId) { - List messages = messageService.findAllByChannelId(channelId); + public ResponseEntity> getAllByChannelId( + @RequestParam("channelId") UUID channelId, + @RequestParam(value = "page", defaultValue = "0") int page) { + PageResponse messages = messageService.findAllByChannelId(channelId, page); return ResponseEntity.ok(messages); } - @PatchMapping("/{messageId}") + @PatchMapping(value = "/{messageId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity update(@PathVariable("messageId") UUID messageId, @RequestPart("messageRequest") UpdateMessageRequest messageRequest) { MessageDTO message = messageService.update(messageId, messageRequest); @@ -67,7 +71,7 @@ public ResponseEntity update(@PathVariable("messageId") UUID message public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { messageService.delete(messageId); return ResponseEntity.ok( - "메시지 ID: 삭제가 완료되었습니다." + "메시지 삭제가 완료되었습니다." ); } } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java index a8881830b..6701d7a9a 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java @@ -1,5 +1,6 @@ package com.sprint.mission.discodeit.dto.message; +import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; import com.sprint.mission.discodeit.dto.user.UserDTO; import lombok.AllArgsConstructor; import lombok.Builder; @@ -7,6 +8,7 @@ import lombok.NoArgsConstructor; import java.time.Instant; +import java.util.List; import java.util.UUID; @Data @@ -25,4 +27,6 @@ public class MessageDTO { private UUID channelId; private UserDTO author; + + private List attachments; } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java index ffba768aa..fb270baa1 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java @@ -1,4 +1,12 @@ package com.sprint.mission.discodeit.dto.response; -public record PageResponse() { +import java.util.List; + +public record PageResponse( + List content, + int number, + int size, + boolean hasNext, + Long totalElements +) { } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 9e0592899..3a7f24f80 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -2,6 +2,7 @@ import java.util.*; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; @@ -20,9 +21,11 @@ public class Message extends BaseUpdateEntity { @ManyToOne(cascade = CascadeType.ALL) @NotNull + @JsonIgnore private Channel channel; @ManyToOne + @JsonIgnore private User author; @ManyToMany @@ -32,6 +35,7 @@ public class Message extends BaseUpdateEntity { inverseJoinColumns = @JoinColumn(name = "attachment_id") // `BinaryContent` 테이블 외래 키 ) @Cascade(org.hibernate.annotations.CascadeType.ALL) + @JsonIgnore private List attachments; public void update(String newContent) { diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java index f59e0a504..c2fbd2d58 100644 --- a/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java @@ -1,9 +1,16 @@ package com.sprint.mission.discodeit.mapper; +import com.sprint.mission.discodeit.dto.response.PageResponse; +import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; +import com.sprint.mission.discodeit.entity.UserStatus; +import org.modelmapper.Converter; import org.modelmapper.ModelMapper; import org.modelmapper.convention.MatchingStrategies; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.Slice; + +import java.util.UUID; @Configuration public class MapperConfig { @@ -13,8 +20,14 @@ public ModelMapper getMapper() { modelMapper.getConfiguration() .setFieldMatchingEnabled(true) // 필드 이름이 같으면 자동 매핑 .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) // private 필드에도 접근 가능 - .setMatchingStrategy(MatchingStrategies.LOOSE); - + .setMatchingStrategy(MatchingStrategies.STRICT); + + Converter userToUserIdConverter = ctx -> ctx.getSource().getUser().getId(); + + modelMapper.typeMap(UserStatus.class, UserStatusDTO.class) + .addMappings(mapper -> mapper.using(userToUserIdConverter).map(src -> src, UserStatusDTO::setUserId)); + + return modelMapper; } } diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java new file mode 100644 index 000000000..56278e860 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java @@ -0,0 +1,30 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.response.PageResponse; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Component; + +import java.util.List; + +@RequiredArgsConstructor +@Component +public class PageResponseMapper { + private final ModelMapper modelMapper; + + public PageResponse fromPage(Page page) { + List content = page.getContent().stream() + .map(item -> modelMapper.map(item, (Class) item.getClass())) + .toList(); + + return new PageResponse<>( + content, + page.getNumber(), + page.getSize(), + page.hasNext(), + page.getTotalElements() + ); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index c88d2610d..47eb39878 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,6 +1,8 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.Message; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -10,5 +12,5 @@ import java.util.UUID; public interface MessageRepository extends JpaRepository { - List findByChannelId(UUID channelId); + Page findByChannelId(UUID channelId, Pageable pageable); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index a395f71d2..6fc5ca278 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; +import com.sprint.mission.discodeit.dto.response.PageResponse; import java.util.List; import java.util.UUID; @@ -15,7 +16,7 @@ MessageDTO create(CreateMessageRequest messageRequest, MessageDTO find(UUID messageId); - List findAllByChannelId(UUID channelID); + PageResponse findAllByChannelId(UUID channelId, int page); MessageDTO update(UUID messageId, UpdateMessageRequest request); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index e497bfcd0..71269f2e3 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,6 +1,7 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.dto.message.MessageDTO; +import com.sprint.mission.discodeit.dto.response.PageResponse; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; @@ -10,16 +11,20 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.ReadStatusService; import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.storage.BinaryContentStorage; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +42,7 @@ public class BasicMessageService implements MessageService { private final ChannelRepository channelRepository; private final BinaryContentRepository binaryContentRepository; private final ModelMapper modelMapper; + private final PageResponseMapper pageResponseMapper; @Transactional @Override @@ -89,13 +95,14 @@ public MessageDTO find(UUID messageId) { @Transactional(readOnly = true) @Override - public List findAllByChannelId(UUID channelId) { + public PageResponse findAllByChannelId(UUID channelId, int page) { Channel channel = validChannel(channelId); - List messages = messageRepository.findByChannelId(channelId); - return messages.stream() - .map(message -> modelMapper.map(message,MessageDTO.class)) - .toList(); + Pageable pageable = PageRequest.of(page, 50, Sort.by(Sort.Order.desc("createdAt"))); + + Page messagePage = messageRepository.findByChannelId(channelId, pageable); + + return pageResponseMapper.fromPage(messagePage); } @Transactional diff --git a/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java index 24340e3aa..85ecb1dc9 100644 --- a/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java +++ b/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java @@ -65,7 +65,6 @@ public ResponseEntity download(BinaryContentDTO binaryCon } try { - // InputStream을 try-with-resources로 안전하게 처리 InputStream inputStream = Files.newInputStream(targetPath); StreamingResponseBody streamingResponseBody = outputStream -> { @@ -79,14 +78,12 @@ public ResponseEntity download(BinaryContentDTO binaryCon throw new RuntimeException("Error during streaming file", e); } finally { try { - inputStream.close(); // 스트림을 명시적으로 닫음 + inputStream.close(); } catch (IOException e) { - // 스트림을 닫는 중 발생한 오류는 무시하고 넘어감 } } }; - // 응답을 반환 return ResponseEntity.ok() .header("Content-Disposition", "attachment; filename=\"" + targetPath.getFileName().toString() + "\"") .contentType(MediaType.APPLICATION_OCTET_STREAM) From 002d8f019747034a35b08830fda9d9f80ec14ba5 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 13 Mar 2025 09:29:36 +0900 Subject: [PATCH 095/115] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sprint/mission/discodeit/entity/ReadStatus.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java index ddbca57dd..1ea1c8f49 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -18,9 +18,11 @@ public class ReadStatus extends BaseUpdateEntity { // 사용자가 채널 별 @ManyToOne @JoinColumn(unique = true) private User user; + @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(unique = true) private Channel channel; + @Column(nullable = false) private Instant lastReadAt; From 33b2706744c98bd1c13bb15ba828d518cb9efd86 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 14 Mar 2025 14:44:10 +0900 Subject: [PATCH 096/115] =?UTF-8?q?:recycle:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MessageController.java | 39 ++++++------ .../discodeit/controller/UserController.java | 36 +++++------ .../sprint/mission/discodeit/entity/User.java | 59 ++++++++++--------- 3 files changed, 68 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index e411033b7..98cddfa92 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -31,22 +30,22 @@ public ResponseEntity create( @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, @RequestPart("file") List attachments) { - List attachmentRequests = Optional.ofNullable(attachments) - .map(files -> files.stream() - .map(file -> { - try { - return new CreateBinaryContentRequest( - file.getOriginalFilename(), - file.getContentType(), - file.getBytes(), - file.getSize() - ); - } catch (IOException e) { - throw new RuntimeException(e); - } - }) - .toList()) - .orElse(new ArrayList<>()); + List attachmentRequests = Optional.ofNullable(attachments) + .map(files -> files.stream() + .map(file -> { + try { + return new CreateBinaryContentRequest( + file.getOriginalFilename(), + file.getContentType(), + file.getBytes(), + file.getSize() + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + }) + .toList()) + .orElse(new ArrayList<>()); MessageDTO message = messageService.create(createMessageRequest, attachmentRequests); return ResponseEntity.ok(message); @@ -70,8 +69,8 @@ public ResponseEntity update(@PathVariable("messageId") UUID message @DeleteMapping("/{messageId}") public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { messageService.delete(messageId); - return ResponseEntity.ok( - "메시지 삭제가 완료되었습니다." - ); + return ResponseEntity.ok( + "메시지 삭제가 완료되었습니다." + ); } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index f802e1c6d..bdb51798c 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -5,7 +5,6 @@ import com.sprint.mission.discodeit.dto.user.CreateUserRequest; import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; import io.swagger.v3.oas.annotations.Operation; @@ -35,17 +34,17 @@ public class UserController { @Operation(summary = "Upload POST", description = "POST 방식으로 회원을 등록합니다") @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) public ResponseEntity createUser( - @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, - @RequestPart(value = "profile", required = false) MultipartFile profile) { + @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile) { Optional profileRequest = Optional.empty(); if (profile != null && !profile.isEmpty()) { try { profileRequest = Optional.of(new CreateBinaryContentRequest( - profile.getOriginalFilename(), - profile.getContentType(), - profile.getBytes(), - profile.getSize() + profile.getOriginalFilename(), + profile.getContentType(), + profile.getBytes(), + profile.getSize() )); } catch (IOException e) { throw new RuntimeException(e); @@ -55,8 +54,8 @@ public ResponseEntity createUser( UserDTO createdUser = userService.create(userCreateRequest, profileRequest); return ResponseEntity - .status(HttpStatus.CREATED) - .body(createdUser); + .status(HttpStatus.CREATED) + .body(createdUser); } @Operation(summary = "GET Users", description = "GET을 통해 전체 회원을 조회합니다") @@ -75,10 +74,10 @@ public ResponseEntity updatePassword(@RequestParam("userId") UUID userI if (profile != null && !profile.isEmpty()) { try { profileRequest = Optional.of(new CreateBinaryContentRequest( - profile.getOriginalFilename(), - profile.getContentType(), - profile.getBytes(), - profile.getSize() + profile.getOriginalFilename(), + profile.getContentType(), + profile.getBytes(), + profile.getSize() )); } catch (IOException e) { throw new RuntimeException(e); @@ -90,18 +89,19 @@ public ResponseEntity updatePassword(@RequestParam("userId") UUID userI } @PatchMapping(path = "{userId}/userStatus") - public ResponseEntity updateUserStatusByUserId(@PathVariable("userId") UUID userId) { + public ResponseEntity updateUserStatusByUserId( + @PathVariable("userId") UUID userId) { UserStatusDTO updatedUserStatus = userStatusService.updateByUserId(userId); return ResponseEntity - .status(HttpStatus.OK) - .body(updatedUserStatus); + .status(HttpStatus.OK) + .body(updatedUserStatus); } @DeleteMapping public ResponseEntity deleteUser(@RequestParam("id") UUID id) { userService.delete(id); return ResponseEntity - .status(HttpStatus.NO_CONTENT) - .build(); + .status(HttpStatus.NO_CONTENT) + .build(); } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 05e73d582..7c8a2612b 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -7,6 +7,8 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.Email; import lombok.*; +import org.hibernate.envers.Audited; +import static org.hibernate.envers.RelationTargetAuditMode.NOT_AUDITED; @Entity @Table(name = "users") @@ -16,43 +18,44 @@ @NoArgsConstructor @ToString(exclude = "status") public class User extends BaseUpdateEntity { - @Column(nullable = false, unique = true) - private String username; - @Column(nullable = false, unique = true) - private String email; + @Column(nullable = false, unique = true) + private String username; - @Column(nullable = false) - private String password; + @Column(nullable = false, unique = true) + private String email; - @OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true) - @JoinColumn(name = "profile_id") - private BinaryContent profile; + @Column(nullable = false) + private String password; - @OneToOne(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true) - private UserStatus status; + @OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true) + @JoinColumn(name = "profile_id") + private BinaryContent profile; - public void setStatus(UserStatus status) { - this.status = status; - } - - public void updatePassword(String oldPassword, String newPassword) { - if (newPassword.equals(this.password)) { - throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); - } + @OneToOne(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true) + private UserStatus status; - if (!oldPassword.equals(this.password)) { - throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); - } + public void setStatus(UserStatus status) { + this.status = status; + } - if (newPassword.equals(oldPassword)) { - throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); - } + public void updatePassword(String oldPassword, String newPassword) { + if (newPassword.equals(this.password)) { + throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); + } - this.password = newPassword; + if (!oldPassword.equals(this.password)) { + throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } - public void updateProfile(BinaryContent profile) { - this.profile = profile; + if (newPassword.equals(oldPassword)) { + throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); } + + this.password = newPassword; + } + + public void updateProfile(BinaryContent profile) { + this.profile = profile; + } } \ No newline at end of file From b79afe03ad9ee97312891ebc56e1eaa8bf88cffb Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 27 Mar 2025 14:52:47 +0900 Subject: [PATCH 097/115] =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/pull-request-template.md | 20 -- .gitignore | 13 +- HELP.md | 6 +- README.md | 3 +- build.gradle | 23 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 188 +++++++++--------- .../discodeit/DiscodeitApplication.java | 11 +- .../discodeit/controller/AuthController.java | 41 ++-- .../controller/BinaryContentController.java | 63 +++--- .../controller/ChannelController.java | 85 ++++---- .../controller/MessageController.java | 101 ++++++---- .../controller/ReadStatusController.java | 62 +++--- .../discodeit/controller/UserController.java | 148 +++++++------- .../controller/UserStatusController.java | 24 --- ...MultipartJackson2HttpMessageConverter.java | 34 ---- .../dto/binarycontent/BinaryContentDTO.java | 27 --- .../CreateBinaryContentRequest.java | 10 - .../discodeit/dto/channel/ChannelDTO.java | 32 --- .../discodeit/dto/channel/CreateChannel.java | 28 --- .../dto/channel/UpdatePublicChannel.java | 7 - .../discodeit/dto/login/LoginRequest.java | 8 - .../dto/message/CreateMessageRequest.java | 8 - .../discodeit/dto/message/MessageDTO.java | 32 --- .../dto/message/UpdateMessageRequest.java | 5 - .../readstatus/CreateReadStatusRequest.java | 8 - .../dto/readstatus/ReadStatusDTO.java | 25 --- .../discodeit/dto/response/PageResponse.java | 11 +- .../discodeit/dto/user/CreateUserRequest.java | 17 -- .../discodeit/dto/user/UpdateUserRequest.java | 5 - .../mission/discodeit/dto/user/UserDTO.java | 27 --- .../dto/userstatus/UserStatusDTO.java | 24 --- .../discodeit/entity/BinaryContent.java | 23 ++- .../mission/discodeit/entity/Channel.java | 34 +++- .../mission/discodeit/entity/Message.java | 69 ++++--- .../mission/discodeit/entity/ReadStatus.java | 59 ++++-- .../sprint/mission/discodeit/entity/User.java | 82 ++++---- .../mission/discodeit/entity/UserStatus.java | 50 +++-- .../discodeit/entity/base/BaseEntity.java | 32 ++- .../entity/base/BaseUpdateEntity.java | 19 -- .../discodeit/exception/BaseException.java | 15 -- .../discodeit/exception/ErrorCode.java | 41 ---- .../discodeit/exception/ErrorResponse.java | 24 --- .../exception/MyExceptionHandler.java | 77 ------- .../discodeit/exception/ServiceException.java | 13 -- .../discodeit/mapper/BinaryContentMapper.java | 11 + .../discodeit/mapper/ChannelMapper.java | 48 +++++ .../discodeit/mapper/MapperConfig.java | 33 --- .../discodeit/mapper/MessageMapper.java | 13 ++ .../discodeit/mapper/PageResponseMapper.java | 42 ++-- .../discodeit/mapper/ReadStatusMapper.java | 14 ++ .../mission/discodeit/mapper/UserMapper.java | 13 ++ .../discodeit/mapper/UserStatusMapper.java | 13 ++ .../repository/BinaryContentRepository.java | 8 +- .../repository/ChannelRepository.java | 8 +- .../repository/MessageRepository.java | 28 ++- .../repository/ReadStatusRepository.java | 19 +- .../discodeit/repository/UserRepository.java | 16 +- .../repository/UserStatusRepository.java | 10 +- .../service/BinaryContentService.java | 15 +- .../discodeit/service/ChannelService.java | 19 +- .../discodeit/service/MessageService.java | 23 ++- .../discodeit/service/ReadStatusService.java | 17 +- .../discodeit/service/UserService.java | 20 +- .../discodeit/service/UserStatusService.java | 18 +- .../service/basic/BasicAuthService.java | 39 ++-- .../basic/BasicBinaryContentService.java | 66 +++--- .../service/basic/BasicChannelService.java | 115 ++++++----- .../service/basic/BasicMessageService.java | 167 +++++++--------- .../service/basic/BasicReadStatusService.java | 132 +++++------- .../service/basic/BasicUserService.java | 182 ++++++++--------- .../service/basic/BasicUserStatusService.java | 166 ++++++++-------- .../storage/BinaryContentStorage.java | 14 +- .../storage/LocalBinaryContentStorage.java | 103 ---------- .../discodeit/swagger/SwaggerConfig.java | 22 -- .../discodeit/util/type/ChannelType.java | 5 - src/main/resources/application.yml | 27 --- .../static/assets/index-kQJbKSsj.css | 1 + src/main/resources/static/favicon.ico | Bin 0 -> 1588 bytes src/main/resources/static/index.html | 26 +++ .../discodeit/DiscodeitApplicationTests.java | 1 - .../repository/UserRepositoryTest.java | 25 --- .../service/basic/BasicUserServiceTest.java | 136 ------------- 83 files changed, 1292 insertions(+), 1959 deletions(-) delete mode 100644 .github/pull-request-template.md delete mode 100644 src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/exception/BaseException.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/BinaryContentMapper.java create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/ChannelMapper.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/MessageMapper.java create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/ReadStatusMapper.java create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/UserMapper.java create mode 100644 src/main/java/com/sprint/mission/discodeit/mapper/UserStatusMapper.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java delete mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/static/assets/index-kQJbKSsj.css create mode 100644 src/main/resources/static/favicon.ico create mode 100644 src/main/resources/static/index.html delete mode 100644 src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java delete mode 100644 src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java diff --git a/.github/pull-request-template.md b/.github/pull-request-template.md deleted file mode 100644 index 8b17f79e9..000000000 --- a/.github/pull-request-template.md +++ /dev/null @@ -1,20 +0,0 @@ -## 요구사항 - -### 기본 -- [x] 기본 항목 1 -- [ ] 기본 항목 2 - -### 심화 -- [ ] 심화 항목 1 -- [ ] 심화 항목 2 - -## 주요 변경사항 -- -- - -## 스크린샷 -![image](이미지url) - -## 멘토에게 -- 셀프 코드 리뷰를 통해 질문 이어가겠습니다. -- \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8ec73278f..b2b7bf3d7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,6 @@ build/ ### IntelliJ IDEA ### .idea -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ *.iws *.iml *.ipr @@ -40,4 +36,11 @@ bin/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store + +### Discodeit ### +.discodeit + +### 숨김 파일 ### +.* +!.gitignore \ No newline at end of file diff --git a/HELP.md b/HELP.md index 2bf68ada2..42c5f0023 100644 --- a/HELP.md +++ b/HELP.md @@ -4,9 +4,9 @@ For further reference, please consider the following sections: * [Official Gradle documentation](https://docs.gradle.org) -* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.2/gradle-plugin) -* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.2/gradle-plugin/packaging-oci-image.html) -* [Spring Web](https://docs.spring.io/spring-boot/3.4.2/reference/web/servlet.html) +* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin) +* [Create an OCI image](https://docs.spring.io/spring-boot/3.4.0/gradle-plugin/packaging-oci-image.html) +* [Spring Web](https://docs.spring.io/spring-boot/3.4.0/reference/web/servlet.html) ### Guides The following guides illustrate how to use some features concretely: diff --git a/README.md b/README.md index 81a8535d9..815bede54 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# Spring 백엔드 트랙 1기 스프린트 미션 제출 리포지토리 \ No newline at end of file +# 0-spring-mission +스프린트 미션 모범 답안 리포지토리입니다. diff --git a/build.gradle b/build.gradle index 356b03dad..afb282369 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.1' - id 'io.spring.dependency-management' version '1.1.7' + id 'org.springframework.boot' version '3.4.0' + id 'io.spring.dependency-management' version '1.1.6' } group = 'com.sprint.mission' @@ -24,23 +24,18 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-aop' - implementation group: 'org.postgresql', name: 'postgresql', version: '42.7.5' - - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' - - implementation 'org.modelmapper:modelmapper:3.1.0' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + runtimeOnly 'org.postgresql:postgresql' compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok:1.18.30' + annotationProcessor 'org.projectlombok:lombok' + implementation 'org.mapstruct:mapstruct:1.6.3' + annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3' + testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - - testCompileOnly 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e18bc253b..e2847c820 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 9b42019c7..9d21a2183 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,94 +1,94 @@ -@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 -@rem SPDX-License-Identifier: Apache-2.0 -@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. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -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 +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@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. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 4ac4bbb23..8f61230d4 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -2,12 +2,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication -@EnableJpaAuditing public class DiscodeitApplication { - public static void main(String[] args) { - SpringApplication.run(DiscodeitApplication.class, args); - } -} \ No newline at end of file + + public static void main(String[] args) { + SpringApplication.run(DiscodeitApplication.class, args); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java index f0f9b0fd7..ac2149e37 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -1,30 +1,29 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.dto.login.LoginRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.service.basic.BasicAuthService; +import com.sprint.mission.discodeit.controller.api.AuthApi; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.LoginRequest; +import com.sprint.mission.discodeit.service.AuthService; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.UUID; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +@RequiredArgsConstructor @RestController @RequestMapping("/api/auth") -@RequiredArgsConstructor -@Slf4j -public class AuthController { -// -// private final BasicAuthService authService; -// -// @PostMapping("/login") -// public ResponseEntity login(@RequestBody LoginRequest request) { -// UserDTO login = authService.login(request); -// log.info(request.username() + "님 환영합니다~. 로그인이 완료되었습니다"); -// return ResponseEntity -// .status(HttpStatus.OK) -// .body(login); -// } +public class AuthController implements AuthApi { + + private final AuthService authService; + + @PostMapping(path = "login") + public ResponseEntity login(@RequestBody LoginRequest loginRequest) { + UserDto user = authService.login(loginRequest); + return ResponseEntity + .status(HttpStatus.OK) + .body(user); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java index 04eb61a41..664e38ec4 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/BinaryContentController.java @@ -1,41 +1,50 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; +import com.sprint.mission.discodeit.controller.api.BinaryContentApi; +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; import com.sprint.mission.discodeit.service.BinaryContentService; import com.sprint.mission.discodeit.storage.BinaryContentStorage; -import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; - import java.util.List; import java.util.UUID; +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.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +@RequiredArgsConstructor @RestController @RequestMapping("/api/binaryContents") -@RequiredArgsConstructor -public class BinaryContentController { +public class BinaryContentController implements BinaryContentApi { - private final BinaryContentService binaryContentService; - private final BinaryContentStorage binaryContentStorage; + private final BinaryContentService binaryContentService; + private final BinaryContentStorage binaryContentStorage; - @GetMapping(value = "{binaryContentId}/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) - public ResponseEntity download(@PathVariable UUID binaryContentId) { - BinaryContentDTO binaryContentDTO = binaryContentService.find(binaryContentId); - return (ResponseEntity) binaryContentStorage.download(binaryContentDTO); - } + @GetMapping(path = "{binaryContentId}") + public ResponseEntity find( + @PathVariable("binaryContentId") UUID binaryContentId) { + BinaryContentDto binaryContent = binaryContentService.find(binaryContentId); + return ResponseEntity + .status(HttpStatus.OK) + .body(binaryContent); + } - @GetMapping("/{binaryContentId}") - public ResponseEntity findFile(@PathVariable("binaryContentId") UUID binaryContentId) { - BinaryContentDTO binaryContent = binaryContentService.find(binaryContentId); - return ResponseEntity.ok(binaryContent); - } + @GetMapping + public ResponseEntity> findAllByIdIn( + @RequestParam("binaryContentIds") List binaryContentIds) { + List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); + return ResponseEntity + .status(HttpStatus.OK) + .body(binaryContents); + } - @GetMapping() - public ResponseEntity> findAllByIdIn(@RequestParam("binaryContentIds") List binaryContentIds) { - List binaryContents = binaryContentService.findAllByIdIn(binaryContentIds); - return ResponseEntity.ok(binaryContents); - } + @GetMapping(path = "{binaryContentId}/download") + public ResponseEntity download( + @PathVariable("binaryContentId") UUID binaryContentId) { + BinaryContentDto binaryContentDto = binaryContentService.find(binaryContentId); + return binaryContentStorage.download(binaryContentDto); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index 232b3d47d..ab3e2d7ed 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -1,58 +1,71 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; -import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; +import com.sprint.mission.discodeit.controller.api.ChannelApi; +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; import com.sprint.mission.discodeit.service.ChannelService; +import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; - import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.UUID; - +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +@RequiredArgsConstructor @RestController @RequestMapping("/api/channels") -@RequiredArgsConstructor -public class ChannelController { +public class ChannelController implements ChannelApi { private final ChannelService channelService; - @PostMapping("/public") - public ResponseEntity createPublicChannel( - @RequestBody CreateChannel.PublicRequest request) { - ChannelDTO publicChannel = channelService.createPublicChannel(request); - return ResponseEntity.ok(publicChannel); + @PostMapping(path = "public") + public ResponseEntity create(@RequestBody PublicChannelCreateRequest request) { + ChannelDto createdChannel = channelService.create(request); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(createdChannel); } - @PostMapping("/private") - public ResponseEntity createPrivateChannel( - @RequestBody CreateChannel.PrivateRequest request) { - ChannelDTO privateChannel = channelService.createPrivateChannel(request); - return ResponseEntity.ok(privateChannel); + @PostMapping(path = "private") + public ResponseEntity create(@RequestBody PrivateChannelCreateRequest request) { + ChannelDto createdChannel = channelService.create(request); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(createdChannel); } - @GetMapping - public ResponseEntity> getAllChannels(@RequestParam("userId") UUID userId) { - List channels = channelService.findAllByUserId(userId); - return ResponseEntity.ok(channels); + @PatchMapping(path = "{channelId}") + public ResponseEntity update(@PathVariable("channelId") UUID channelId, + @RequestBody PublicChannelUpdateRequest request) { + ChannelDto updatedChannel = channelService.update(channelId, request); + return ResponseEntity + .status(HttpStatus.OK) + .body(updatedChannel); } - // 채널 정보 수정은 Public channel 만 가능합니다. - @PatchMapping("/{channelId}") - public ResponseEntity updateChannel( - @PathVariable("channelId") UUID channelId, - @RequestBody UpdatePublicChannel request) { - ChannelDTO update = channelService.update(channelId, request); - return ResponseEntity.ok(update); + @DeleteMapping(path = "{channelId}") + public ResponseEntity delete(@PathVariable("channelId") UUID channelId) { + channelService.delete(channelId); + return ResponseEntity + .status(HttpStatus.NO_CONTENT) + .build(); } - @DeleteMapping("/{channelId}") - public ResponseEntity deletePrivateChannel(@PathVariable("channelId") UUID channelId) { - channelService.delete(channelId); - return ResponseEntity.ok(HttpStatus.NO_CONTENT.toString()); + @GetMapping + public ResponseEntity> findAll(@RequestParam("userId") UUID userId) { + List channels = channelService.findAllByUserId(userId); + return ResponseEntity + .status(HttpStatus.OK) + .body(channels); } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index 98cddfa92..d8974366d 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -1,44 +1,57 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.dto.message.MessageDTO; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; -import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; +import com.sprint.mission.discodeit.controller.api.MessageApi; +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.dto.response.PageResponse; import com.sprint.mission.discodeit.service.MessageService; import java.io.IOException; +import java.time.Instant; import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import java.util.UUID; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.UUID; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +@RequiredArgsConstructor @RestController @RequestMapping("/api/messages") -@RequiredArgsConstructor -public class MessageController { +public class MessageController implements MessageApi { private final MessageService messageService; @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public ResponseEntity create( - @RequestPart("createMessageRequest") CreateMessageRequest createMessageRequest, - @RequestPart("file") - List attachments) { - List attachmentRequests = Optional.ofNullable(attachments) + public ResponseEntity create( + @RequestPart("messageCreateRequest") MessageCreateRequest messageCreateRequest, + @RequestPart(value = "attachments", required = false) List attachments + ) { + List attachmentRequests = Optional.ofNullable(attachments) .map(files -> files.stream() .map(file -> { try { - return new CreateBinaryContentRequest( + return new BinaryContentCreateRequest( file.getOriginalFilename(), file.getContentType(), - file.getBytes(), - file.getSize() + file.getBytes() ); } catch (IOException e) { throw new RuntimeException(e); @@ -46,31 +59,43 @@ public ResponseEntity create( }) .toList()) .orElse(new ArrayList<>()); - - MessageDTO message = messageService.create(createMessageRequest, attachmentRequests); - return ResponseEntity.ok(message); + MessageDto createdMessage = messageService.create(messageCreateRequest, attachmentRequests); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(createdMessage); } - @GetMapping - public ResponseEntity> getAllByChannelId( - @RequestParam("channelId") UUID channelId, - @RequestParam(value = "page", defaultValue = "0") int page) { - PageResponse messages = messageService.findAllByChannelId(channelId, page); - return ResponseEntity.ok(messages); + @PatchMapping(path = "{messageId}") + public ResponseEntity update(@PathVariable("messageId") UUID messageId, + @RequestBody MessageUpdateRequest request) { + MessageDto updatedMessage = messageService.update(messageId, request); + return ResponseEntity + .status(HttpStatus.OK) + .body(updatedMessage); } - @PatchMapping(value = "/{messageId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public ResponseEntity update(@PathVariable("messageId") UUID messageId, - @RequestPart("messageRequest") UpdateMessageRequest messageRequest) { - MessageDTO message = messageService.update(messageId, messageRequest); - return ResponseEntity.ok(message); + @DeleteMapping(path = "{messageId}") + public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { + messageService.delete(messageId); + return ResponseEntity + .status(HttpStatus.NO_CONTENT) + .build(); } - @DeleteMapping("/{messageId}") - public ResponseEntity delete(@PathVariable("messageId") UUID messageId) { - messageService.delete(messageId); - return ResponseEntity.ok( - "메시지 삭제가 완료되었습니다." - ); + @GetMapping + public ResponseEntity> findAllByChannelId( + @RequestParam("channelId") UUID channelId, + @RequestParam(value = "cursor", required = false) Instant cursor, + @PageableDefault( + size = 50, + page = 0, + sort = "createdAt", + direction = Direction.DESC + ) Pageable pageable) { + PageResponse messages = messageService.findAllByChannelId(channelId, cursor, + pageable); + return ResponseEntity + .status(HttpStatus.OK) + .body(messages); } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index dba071df9..4235d7c89 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -1,41 +1,53 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.dto.readstatus.ReadStatusDTO; -import com.sprint.mission.discodeit.entity.ReadStatus; -import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; +import com.sprint.mission.discodeit.controller.api.ReadStatusApi; +import com.sprint.mission.discodeit.dto.data.ReadStatusDto; +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; import com.sprint.mission.discodeit.service.ReadStatusService; -import jakarta.websocket.server.PathParam; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - import java.util.List; import java.util.UUID; +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.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; -// ReadStatus가 생성되었는지 확인하기 위한 API +@RequiredArgsConstructor @RestController @RequestMapping("/api/readStatuses") -@RequiredArgsConstructor -public class ReadStatusController { +public class ReadStatusController implements ReadStatusApi { private final ReadStatusService readStatusService; - @PostMapping - public ResponseEntity create(@RequestBody CreateReadStatusRequest request) { - ReadStatusDTO readStatus = readStatusService.create(request); - return ResponseEntity.ok(readStatus); - } - @GetMapping - public ResponseEntity> findAllByUserId(@RequestParam("userId") UUID userId) { - List readStatuses = readStatusService.findAllByUserId(userId); - return ResponseEntity.ok(readStatuses); + @PostMapping + public ResponseEntity create(@RequestBody ReadStatusCreateRequest request) { + ReadStatusDto createdReadStatus = readStatusService.create(request); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(createdReadStatus); } - - @PatchMapping(path = "{readStatusId}") - public ResponseEntity update(@PathParam("readStatusId") UUID readStatusId) { - ReadStatusDTO updateReadStatus = readStatusService.update(readStatusId); - return ResponseEntity.ok(updateReadStatus); + public ResponseEntity update(@PathVariable("readStatusId") UUID readStatusId, + @RequestBody ReadStatusUpdateRequest request) { + ReadStatusDto updatedReadStatus = readStatusService.update(readStatusId, request); + return ResponseEntity + .status(HttpStatus.OK) + .body(updatedReadStatus); + } + + @GetMapping + public ResponseEntity> findAllByUserId(@RequestParam("userId") UUID userId) { + List readStatuses = readStatusService.findAllByUserId(userId); + return ResponseEntity + .status(HttpStatus.OK) + .body(readStatuses); } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index bdb51798c..c2b59fed1 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -1,107 +1,115 @@ package com.sprint.mission.discodeit.controller; -import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UpdateUserRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; +import com.sprint.mission.discodeit.controller.api.UserApi; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.data.UserStatusDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; -import io.swagger.v3.oas.annotations.Operation; -import jakarta.validation.Valid; import java.io.IOException; +import java.util.List; import java.util.Optional; +import java.util.UUID; import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.UUID; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +@RequiredArgsConstructor @RestController @RequestMapping("/api/users") -@RequiredArgsConstructor -@Log4j2 -public class UserController { +public class UserController implements UserApi { private final UserService userService; private final UserStatusService userStatusService; - @Operation(summary = "Upload POST", description = "POST 방식으로 회원을 등록합니다") @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) - public ResponseEntity createUser( - @Valid @RequestPart("userCreateRequest") CreateUserRequest userCreateRequest, - @RequestPart(value = "profile", required = false) MultipartFile profile) { - - Optional profileRequest = Optional.empty(); - if (profile != null && !profile.isEmpty()) { - try { - profileRequest = Optional.of(new CreateBinaryContentRequest( - profile.getOriginalFilename(), - profile.getContentType(), - profile.getBytes(), - profile.getSize() - )); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - UserDTO createdUser = userService.create(userCreateRequest, profileRequest); - + @Override + public ResponseEntity create( + @RequestPart("userCreateRequest") UserCreateRequest userCreateRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile + ) { + Optional profileRequest = Optional.ofNullable(profile) + .flatMap(this::resolveProfileRequest); + UserDto createdUser = userService.create(userCreateRequest, profileRequest); return ResponseEntity .status(HttpStatus.CREATED) .body(createdUser); } - @Operation(summary = "GET Users", description = "GET을 통해 전체 회원을 조회합니다") - @GetMapping - public ResponseEntity> findAllUsers() { - List all = userService.findAll(); - return ResponseEntity.ok(all); + @PatchMapping( + path = "{userId}", + consumes = {MediaType.MULTIPART_FORM_DATA_VALUE} + ) + @Override + public ResponseEntity update( + @PathVariable("userId") UUID userId, + @RequestPart("userUpdateRequest") UserUpdateRequest userUpdateRequest, + @RequestPart(value = "profile", required = false) MultipartFile profile + ) { + Optional profileRequest = Optional.ofNullable(profile) + .flatMap(this::resolveProfileRequest); + UserDto updatedUser = userService.update(userId, userUpdateRequest, profileRequest); + return ResponseEntity + .status(HttpStatus.OK) + .body(updatedUser); } - @Operation(summary = "Update Password", description = "회원의 비밀번호를 수정합니다") - @PatchMapping(value = "/{userId}", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) - public ResponseEntity updatePassword(@RequestParam("userId") UUID userId, - @RequestPart("updateUserRequest") UpdateUserRequest updateUserRequest, - @RequestPart(value = "profile", required = false) MultipartFile profile) { - Optional profileRequest = Optional.empty(); - if (profile != null && !profile.isEmpty()) { - try { - profileRequest = Optional.of(new CreateBinaryContentRequest( - profile.getOriginalFilename(), - profile.getContentType(), - profile.getBytes(), - profile.getSize() - )); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - UserDTO updateUser = userService.update(userId, updateUserRequest, profileRequest); + @DeleteMapping(path = "{userId}") + @Override + public ResponseEntity delete(@PathVariable("userId") UUID userId) { + userService.delete(userId); + return ResponseEntity + .status(HttpStatus.NO_CONTENT) + .build(); + } - return ResponseEntity.ok(updateUser); + @GetMapping + @Override + public ResponseEntity> findAll() { + List users = userService.findAll(); + return ResponseEntity + .status(HttpStatus.OK) + .body(users); } @PatchMapping(path = "{userId}/userStatus") - public ResponseEntity updateUserStatusByUserId( - @PathVariable("userId") UUID userId) { - UserStatusDTO updatedUserStatus = userStatusService.updateByUserId(userId); + @Override + public ResponseEntity updateUserStatusByUserId(@PathVariable("userId") UUID userId, + @RequestBody UserStatusUpdateRequest request) { + UserStatusDto updatedUserStatus = userStatusService.updateByUserId(userId, request); return ResponseEntity .status(HttpStatus.OK) .body(updatedUserStatus); } - @DeleteMapping - public ResponseEntity deleteUser(@RequestParam("id") UUID id) { - userService.delete(id); - return ResponseEntity - .status(HttpStatus.NO_CONTENT) - .build(); + private Optional resolveProfileRequest(MultipartFile profileFile) { + if (profileFile.isEmpty()) { + return Optional.empty(); + } else { + try { + BinaryContentCreateRequest binaryContentCreateRequest = new BinaryContentCreateRequest( + profileFile.getOriginalFilename(), + profileFile.getContentType(), + profileFile.getBytes() + ); + return Optional.of(binaryContentCreateRequest); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } } diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java deleted file mode 100644 index 4f447b3fb..000000000 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserStatusController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sprint.mission.discodeit.controller; - -import com.sprint.mission.discodeit.entity.UserStatus; -import com.sprint.mission.discodeit.service.UserStatusService; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -// UserStatus가 제대로 생성되었는지 확인하는 API -@RestController -@RequestMapping("/api/userStatuses") -@RequiredArgsConstructor -public class UserStatusController { - -// private final UserStatusService userStatusService; -// -// @GetMapping -// public ResponseEntity> getAll() { -// List all = userStatusService.findAll(); -// return ResponseEntity.ok(all); -// } -} diff --git a/src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java b/src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java deleted file mode 100644 index e7de20d68..000000000 --- a/src/main/java/com/sprint/mission/discodeit/converter/MultipartJackson2HttpMessageConverter.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sprint.mission.discodeit.converter; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; -import org.springframework.stereotype.Component; - -import java.lang.reflect.Type; - -/* -application/octet-stream 문제 해결을 위해 custom converter 생성 - */ -@Component -public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter { - - public MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) { - super(objectMapper, MediaType.APPLICATION_OCTET_STREAM); - } - - @Override - public boolean canWrite(Class clazz, MediaType mediaType) { - return false; - } - - @Override - public boolean canWrite(Type type, Class clazz, MediaType mediaType) { - return false; - } - - @Override - protected boolean canWrite(MediaType mediaType) { - return false; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java deleted file mode 100644 index 0d65b9188..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/BinaryContentDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sprint.mission.discodeit.dto.binarycontent; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class BinaryContentDTO { - private UUID id; - - @NotEmpty - private String fileName; - - @NotNull - private Long size; - - @NotEmpty - private String contentType; -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java deleted file mode 100644 index 75bc1ee52..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/binarycontent/CreateBinaryContentRequest.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sprint.mission.discodeit.dto.binarycontent; - -public record CreateBinaryContentRequest( - String fileName, - String contentType, - byte[] bytes, - Long size -) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java deleted file mode 100644 index 071ef4f40..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/ChannelDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sprint.mission.discodeit.dto.channel; - -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.util.type.ChannelType; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.Instant; -import java.util.List; -import java.util.UUID; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ChannelDTO { - private UUID id; - - @NotNull - private ChannelType type; - - private String name; - - private String description; - - private List participants; - - private Instant lastMessageAt; -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java deleted file mode 100644 index 16bd3d8c8..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/CreateChannel.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sprint.mission.discodeit.dto.channel; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; -import java.util.UUID; - -public class CreateChannel { - - @Getter - @AllArgsConstructor - @NoArgsConstructor - public static class PrivateRequest { - - private List participantIds; - } - - @Getter - @AllArgsConstructor - @NoArgsConstructor - public static class PublicRequest { - - private String name; - private String description; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java b/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java deleted file mode 100644 index c8610d4b4..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/channel/UpdatePublicChannel.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sprint.mission.discodeit.dto.channel; - -import java.util.UUID; - -public record UpdatePublicChannel(String name, String description) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java deleted file mode 100644 index bb5e7dbce..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/login/LoginRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sprint.mission.discodeit.dto.login; - -public record LoginRequest( - String username, - String password -) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java deleted file mode 100644 index 2a8c9ae6a..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/CreateMessageRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sprint.mission.discodeit.dto.message; - -import java.util.UUID; - -public record CreateMessageRequest(UUID userId, String content, - UUID channelId) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java deleted file mode 100644 index 6701d7a9a..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/MessageDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sprint.mission.discodeit.dto.message; - -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.Instant; -import java.util.List; -import java.util.UUID; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class MessageDTO { - private UUID id; - - private Instant createdAt; - - private Instant updatedAt; - - private String content; - - private UUID channelId; - - private UserDTO author; - - private List attachments; -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java deleted file mode 100644 index c596f9b2b..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/message/UpdateMessageRequest.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.dto.message; - -public record UpdateMessageRequest(String newContent) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java deleted file mode 100644 index 229381f43..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/CreateReadStatusRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sprint.mission.discodeit.dto.readstatus; - -import java.time.Instant; -import java.util.UUID; - -public record CreateReadStatusRequest(UUID userId, UUID channelId) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java deleted file mode 100644 index a383d6cd5..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/readstatus/ReadStatusDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sprint.mission.discodeit.dto.readstatus; - -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.Instant; -import java.util.UUID; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ReadStatusDTO { - private UUID id; - - private UUID userId; - - private UUID channelId; - - @NotNull - private Instant lastReadAt; -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java b/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java index fb270baa1..181d532d7 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/response/PageResponse.java @@ -3,10 +3,11 @@ import java.util.List; public record PageResponse( - List content, - int number, - int size, - boolean hasNext, - Long totalElements + List content, + Object nextCursor, + int size, + boolean hasNext, + Long totalElements ) { + } diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java deleted file mode 100644 index bc9358a63..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/CreateUserRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; - -public record CreateUserRequest( - @NotNull - String username, - @NotBlank(message = "이메일은 필수 입력값입니다.") - @Email - String email, - @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") - String password) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java deleted file mode 100644 index 417501b8c..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UpdateUserRequest.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -public record UpdateUserRequest(String oldPassword, String newPassword) { - -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java deleted file mode 100644 index cd41b8454..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/user/UserDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sprint.mission.discodeit.dto.user; - -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotEmpty; -import lombok.*; - -import java.util.UUID; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class UserDTO { - private UUID id; - - @NotEmpty - private String username; - - @Email - @NotEmpty - private String email; - - private BinaryContentDTO profile; - - private Boolean online; -} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java b/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java deleted file mode 100644 index 94a8d48e0..000000000 --- a/src/main/java/com/sprint/mission/discodeit/dto/userstatus/UserStatusDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sprint.mission.discodeit.dto.userstatus; - -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.Instant; -import java.util.UUID; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class UserStatusDTO { - private UUID id; - - @NotNull - private UUID userId; - - @NotNull - private Instant lastActiveAt; -} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java index 93b9ebd10..88a096848 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/BinaryContent.java @@ -1,22 +1,29 @@ package com.sprint.mission.discodeit.entity; import com.sprint.mission.discodeit.entity.base.BaseEntity; -import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; -import lombok.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Table(name = "binary_contents") -@NoArgsConstructor -@AllArgsConstructor @Getter -@Builder -@ToString +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class BinaryContent extends BaseEntity { + @Column(nullable = false) private String fileName; @Column(nullable = false) private Long size; - @Column(nullable = false) + @Column(length = 100, nullable = false) private String contentType; + + public BinaryContent(String fileName, Long size, String contentType) { + this.fileName = fileName; + this.size = size; + this.contentType = contentType; + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java index 9b12c534a..101b737bd 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Channel.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Channel.java @@ -1,27 +1,41 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; -import com.sprint.mission.discodeit.util.type.ChannelType; -import jakarta.persistence.*; -import lombok.*; +import com.sprint.mission.discodeit.entity.base.BaseUpdatableEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Table(name = "channels") -@NoArgsConstructor -@AllArgsConstructor -@Builder @Getter -@ToString -public class Channel extends BaseUpdateEntity { +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Channel extends BaseUpdatableEntity { @Enumerated(EnumType.STRING) @Column(nullable = false) private ChannelType type; + @Column(length = 100) private String name; + @Column(length = 500) private String description; - public void update(String name, String description) { + public Channel(ChannelType type, String name, String description) { + this.type = type; this.name = name; this.description = description; } + + public void update(String newName, String newDescription) { + if (newName != null && !newName.equals(this.name)) { + this.name = newName; + } + if (newDescription != null && !newDescription.equals(this.description)) { + this.description = newDescription; + } + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/Message.java b/src/main/java/com/sprint/mission/discodeit/entity/Message.java index 3a7f24f80..7fe8865ea 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/Message.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/Message.java @@ -1,44 +1,55 @@ package com.sprint.mission.discodeit.entity; -import java.util.*; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; -import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; -import lombok.*; -import org.hibernate.annotations.Cascade; +import com.sprint.mission.discodeit.entity.base.BaseUpdatableEntity; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import java.util.ArrayList; +import java.util.List; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.BatchSize; @Entity @Table(name = "messages") @Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ToString(exclude = {"author", "channel"}) -public class Message extends BaseUpdateEntity { - private String content; +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Message extends BaseUpdatableEntity { - @ManyToOne(cascade = CascadeType.ALL) - @NotNull - @JsonIgnore + @Column(columnDefinition = "text", nullable = false) + private String content; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "channel_id", columnDefinition = "uuid") private Channel channel; - - @ManyToOne - @JsonIgnore + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "author_id", columnDefinition = "uuid") private User author; - - @ManyToMany + @BatchSize(size = 100) + @OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.ALL) @JoinTable( - name = "message_attachments", // 중간 테이블 이름 - joinColumns = @JoinColumn(name = "message_id"), // `Message` 테이블 외래 키 - inverseJoinColumns = @JoinColumn(name = "attachment_id") // `BinaryContent` 테이블 외래 키 + name = "message_attachments", + joinColumns = @JoinColumn(name = "message_id"), + inverseJoinColumns = @JoinColumn(name = "attachment_id") ) - @Cascade(org.hibernate.annotations.CascadeType.ALL) - @JsonIgnore - private List attachments; + private List attachments = new ArrayList<>(); + + public Message(String content, Channel channel, User author, List attachments) { + this.channel = channel; + this.content = content; + this.author = author; + this.attachments = attachments; + } public void update(String newContent) { - this.content = newContent; + if (newContent != null && !newContent.equals(this.content)) { + this.content = newContent; + } } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java index 1ea1c8f49..d51448b96 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/ReadStatus.java @@ -1,32 +1,47 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; -import jakarta.persistence.*; - -import lombok.*; - +import com.sprint.mission.discodeit.entity.base.BaseUpdatableEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import java.time.Instant; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity -@Table(name = "read_statuses") -@Builder +@Table( + name = "read_statuses", + uniqueConstraints = { + @UniqueConstraint(columnNames = {"user_id", "channel_id"}) + } +) @Getter -@AllArgsConstructor -@NoArgsConstructor -@ToString(exclude = {"user", "channel"}) -public class ReadStatus extends BaseUpdateEntity { // 사용자가 채널 별 마지막 메시지를 읽은 시간을 표현하는 도메인 모델 - @ManyToOne - @JoinColumn(unique = true) - private User user; +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ReadStatus extends BaseUpdatableEntity { - @ManyToOne(cascade = CascadeType.ALL) - @JoinColumn(unique = true) - private Channel channel; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "user_id", columnDefinition = "uuid") + private User user; + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "channel_id", columnDefinition = "uuid") + private Channel channel; + @Column(columnDefinition = "timestamp with time zone", nullable = false) + private Instant lastReadAt; - @Column(nullable = false) - private Instant lastReadAt; + public ReadStatus(User user, Channel channel, Instant lastReadAt) { + this.user = user; + this.channel = channel; + this.lastReadAt = lastReadAt; + } - public void updateLastReadTime() { - this.lastReadAt = Instant.now(); + public void update(Instant newLastReadAt) { + if (newLastReadAt != null && !newLastReadAt.equals(this.lastReadAt)) { + this.lastReadAt = newLastReadAt; } -} + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/entity/User.java b/src/main/java/com/sprint/mission/discodeit/entity/User.java index 7c8a2612b..7961aaecc 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/User.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/User.java @@ -1,61 +1,59 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; -import jakarta.persistence.*; -import jakarta.validation.Valid; -import jakarta.validation.constraints.Email; -import lombok.*; -import org.hibernate.envers.Audited; -import static org.hibernate.envers.RelationTargetAuditMode.NOT_AUDITED; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import com.sprint.mission.discodeit.entity.base.BaseUpdatableEntity; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity @Table(name = "users") -@Builder @Getter -@AllArgsConstructor -@NoArgsConstructor -@ToString(exclude = "status") -public class User extends BaseUpdateEntity { +@NoArgsConstructor(access = AccessLevel.PROTECTED) // JPA를 위한 기본 생성자 +public class User extends BaseUpdatableEntity { - @Column(nullable = false, unique = true) + @Column(length = 50, nullable = false, unique = true) private String username; - - @Column(nullable = false, unique = true) + @Column(length = 100, nullable = false, unique = true) private String email; - - @Column(nullable = false) + @Column(length = 60, nullable = false) private String password; - - @OneToOne(cascade = {CascadeType.ALL}, orphanRemoval = true) - @JoinColumn(name = "profile_id") + @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + @JoinColumn(name = "profile_id", columnDefinition = "uuid") private BinaryContent profile; - - @OneToOne(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true) + @JsonManagedReference + @Setter(AccessLevel.PROTECTED) + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private UserStatus status; - public void setStatus(UserStatus status) { - this.status = status; + public User(String username, String email, String password, BinaryContent profile) { + this.username = username; + this.email = email; + this.password = password; + this.profile = profile; } - public void updatePassword(String oldPassword, String newPassword) { - if (newPassword.equals(this.password)) { - throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); + public void update(String newUsername, String newEmail, String newPassword, + BinaryContent newProfile) { + if (newUsername != null && !newUsername.equals(this.username)) { + this.username = newUsername; } - - if (!oldPassword.equals(this.password)) { - throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); + if (newEmail != null && !newEmail.equals(this.email)) { + this.email = newEmail; } - - if (newPassword.equals(oldPassword)) { - throw new ServiceException(ErrorCode.SAME_AS_OLD_PASSWORD); + if (newPassword != null && !newPassword.equals(this.password)) { + this.password = newPassword; + } + if (newProfile != null) { + this.profile = newProfile; } - - this.password = newPassword; - } - - public void updateProfile(BinaryContent profile) { - this.profile = profile; } -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java index df8df1806..9726f73c7 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/UserStatus.java @@ -1,30 +1,50 @@ package com.sprint.mission.discodeit.entity; -import com.sprint.mission.discodeit.entity.base.BaseUpdateEntity; +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.sprint.mission.discodeit.entity.base.BaseUpdatableEntity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import lombok.*; - +import java.time.Duration; import java.time.Instant; -import java.time.temporal.ChronoUnit; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Table(name = "user_statuses") -@Builder @Getter -@AllArgsConstructor -@NoArgsConstructor -@ToString(exclude = "user") -public class UserStatus extends BaseUpdateEntity { // 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델 - @OneToOne - @JoinColumn(name = "user_id") - private User user; +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserStatus extends BaseUpdatableEntity { + + @JsonBackReference + @OneToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "user_id", nullable = false, unique = true) + private User user; + @Column(columnDefinition = "timestamp with time zone", nullable = false) + private Instant lastActiveAt; - private Instant lastActiveAt; + public UserStatus(User user, Instant lastActiveAt) { + setUser(user); + this.lastActiveAt = lastActiveAt; + } - public void update() { - this.lastActiveAt = Instant.now(); + public void update(Instant lastActiveAt) { + if (lastActiveAt != null && !lastActiveAt.equals(this.lastActiveAt)) { + this.lastActiveAt = lastActiveAt; } + } + + public Boolean isOnline() { + Instant instantFiveMinutesAgo = Instant.now().minus(Duration.ofMinutes(5)); + return lastActiveAt.isAfter(instantFiveMinutesAgo); + } + + protected void setUser(User user) { + this.user = user; + user.setStatus(this); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java index 7d267c513..f28210164 100644 --- a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java +++ b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseEntity.java @@ -1,21 +1,31 @@ package com.sprint.mission.discodeit.entity.base; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import java.time.Instant; +import java.util.UUID; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.Instant; -import java.util.UUID; - +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) @MappedSuperclass @EntityListeners(AuditingEntityListener.class) -@Getter public abstract class BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; - @CreatedDate - @Column(name = "createdAt", updatable = false, nullable = false) - private Instant createdAt; + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + @Column(columnDefinition = "uuid", updatable = false, nullable = false) + private UUID id; + + @CreatedDate + @Column(columnDefinition = "timestamp with time zone", updatable = false, nullable = false) + private Instant createdAt; } diff --git a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java deleted file mode 100644 index ac6ec2715..000000000 --- a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdateEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sprint.mission.discodeit.entity.base; - -import jakarta.persistence.Column; -import jakarta.persistence.EntityListeners; -import jakarta.persistence.MappedSuperclass; -import lombok.Getter; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import java.time.Instant; - -@MappedSuperclass -@EntityListeners(AuditingEntityListener.class) -@Getter -public abstract class BaseUpdateEntity extends BaseEntity { - @LastModifiedDate - @Column(name = "updatedAt") - private Instant updatedAt; -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/exception/BaseException.java b/src/main/java/com/sprint/mission/discodeit/exception/BaseException.java deleted file mode 100644 index 45f4932b8..000000000 --- a/src/main/java/com/sprint/mission/discodeit/exception/BaseException.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sprint.mission.discodeit.exception; - -import lombok.Getter; -import org.springframework.http.HttpStatus; - -@Getter -public class BaseException extends RuntimeException { - - private final HttpStatus status; - - public BaseException(HttpStatus status, String message) { - super(message); - this.status = status; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java deleted file mode 100644 index 3033f25f8..000000000 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.sprint.mission.discodeit.exception; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.springframework.http.HttpStatus; - -@Getter -@AllArgsConstructor -public enum ErrorCode { - EMPTY_CONTENT(HttpStatus.BAD_REQUEST, "내용을 입력해주세요"), - - CANNOT_FOUND_MESSAGE(HttpStatus.NOT_FOUND, "보낸 메시지가 없습니다"), - CANNOT_FOUND_CHANNEL(HttpStatus.NOT_FOUND, "해당 채널을 찾을 수가 없습니다."), - CANNOT_FOUND_USER(HttpStatus.NOT_FOUND, "해당하는 회원을 찾을 수 없습니다"), - CANNOT_FOUND_PROFILE(HttpStatus.NOT_FOUND, "해당하는 프로필 데이터를 찾을 수 없습니다"), - CANNOT_FOUND_USERSTATUS(HttpStatus.NOT_FOUND, "해당하는 사용자의 상태 정보를 찾을 수 없습니다"), - CANNOT_FOUND_READSTATUS(HttpStatus.NOT_FOUND, "해당하는 Read Status 정보를 찾을 수 없습니다"), - CANNOT_FOUND_ATTACHMENT(HttpStatus.NOT_FOUND, "해당하는 첨부자료를 찾을 수 없습니다"), - - DUPLICATE_NAME(HttpStatus.CONFLICT, "이미 등록된 사용자 이름입니다."), - DUPLICATE_EMAIL(HttpStatus.CONFLICT, "이미 등록된 이메일 입니다."), - DUPLICATE_CHANNEL(HttpStatus.CONFLICT, "이미 존재하는 채널 이름 입니다."), - - ALREADY_EXIST_READSTATUS(HttpStatus.CONFLICT, "이미 저장된 Read Status 입니다."), - ALREADY_EXIST_USERSTAUTS(HttpStatus.CONFLICT, "이미 저장된 User Status 입니다."), - - INVALID_WRITER(HttpStatus.BAD_REQUEST, "작성자가 올바르지 않습니다"), - INVALID_PROFILE(HttpStatus.BAD_REQUEST, "기존 프로필과 동일한 프로필입니다"), - - MESSAGE_EDIT_NOT_ALLOWED(HttpStatus.FORBIDDEN, "메시지 수정은 작성자 본인만 가능합니다"), - PASSWORD_EDIT_NOT_ALLOWED(HttpStatus.FORBIDDEN, "이전 비밀번호와 일치하지 않습니다"), - - PASSWORD_MISMATCH(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다"), - USERNAME_MISMATCH(HttpStatus.UNAUTHORIZED, "이름이 일치하지 않습니다"), - CHANNEL_TYPE_MISMATCH(HttpStatus.BAD_REQUEST, "채널 타입이 일치하지 않습니다"), - - SAME_AS_OLD_PASSWORD(HttpStatus.BAD_REQUEST, "이전 비밀번호와 동일한 비밀번호입니다"), - CANNOT_MODIFY_PRIVATE_CHANNEL(HttpStatus.BAD_REQUEST, "Private 채널은 수정할 수 없습니다"); - private final HttpStatus status; - private final String description; -} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java deleted file mode 100644 index e0ea29b0b..000000000 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sprint.mission.discodeit.exception; - -import java.time.LocalDateTime; -import lombok.Getter; -import org.springframework.http.HttpStatus; - -@Getter -public class ErrorResponse { - - private final int status; - - private final String error; - - private final String message; - - private final LocalDateTime timestamp; - - public ErrorResponse(HttpStatus status, String message) { - this.status = status.value(); - this.error = status.getReasonPhrase(); - this.message = message; - this.timestamp = LocalDateTime.now(); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java deleted file mode 100644 index 881d38f3e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/exception/MyExceptionHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.sprint.mission.discodeit.exception; - -import lombok.extern.log4j.Log4j2; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.NoHandlerFoundException; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -@Log4j2 -@RestControllerAdvice -public class MyExceptionHandler { - - @ExceptionHandler(BaseException.class) - public ResponseEntity handleServiceException(BaseException exception) { - ErrorResponse response = new ErrorResponse(exception.getStatus(), exception.getMessage()); - return new ResponseEntity<>(response, exception.getStatus()); - } - - @ResponseBody - @ExceptionHandler(Exception.class) - public ResponseEntity> exceptCommon(Exception ex) { - log.error("---------------------------------------------"); - log.error(ex.getMessage(), ex); - - Map errorResponse = new HashMap<>(); - errorResponse.put("message", ex.getMessage()); - errorResponse.put("details", Arrays.stream(ex.getStackTrace()) - .map(StackTraceElement::toString) - .toArray()); - errorResponse.put("timestamp", System.currentTimeMillis()); - - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse); - } - - - @ExceptionHandler(NoHandlerFoundException.class) - public ResponseEntity notFound(NoHandlerFoundException ex) { - log.error("404 Error: " + ex.getMessage()); - return new ResponseEntity<>("404", HttpStatus.NOT_FOUND); - } - - // 객체 바인딩 예외 처리 - @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) { - log.error("Validation error: ", ex); - Map errors = new HashMap<>(); - - ex.getBindingResult().getFieldErrors().forEach(error -> { - errors.put(error.getField(), error.getDefaultMessage()); - }); - - return ResponseEntity.badRequest().body(errors); - } - - // 데이터 무결성이 위반되었을 때 - @ExceptionHandler(DataIntegrityViolationException.class) - @ResponseStatus(HttpStatus.EXPECTATION_FAILED) - public ResponseEntity> handelFKException(Exception e) { - log.error(e); - - Map errorMap = new HashMap<>(); - - errorMap.put("time", "" + System.currentTimeMillis()); - errorMap.put("msg", "constraint fails"); - return ResponseEntity.badRequest().body(errorMap); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java deleted file mode 100644 index f32cbd709..000000000 --- a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit.exception; - -import lombok.Getter; -import org.springframework.http.HttpStatus; - -@Getter -public class ServiceException extends BaseException { - - public ServiceException(ErrorCode errorCode) { - super(errorCode.getStatus(), errorCode.getDescription()); - } -} - diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/BinaryContentMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/BinaryContentMapper.java new file mode 100644 index 000000000..d3ea1f137 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/BinaryContentMapper.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; +import com.sprint.mission.discodeit.entity.BinaryContent; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring") +public interface BinaryContentMapper { + + BinaryContentDto toDto(BinaryContent binaryContent); +} diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/ChannelMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/ChannelMapper.java new file mode 100644 index 000000000..f39a5809c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/ChannelMapper.java @@ -0,0 +1,48 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.springframework.beans.factory.annotation.Autowired; + +@Mapper(componentModel = "spring", uses = {UserMapper.class}) +public abstract class ChannelMapper { + + @Autowired + private MessageRepository messageRepository; + @Autowired + private ReadStatusRepository readStatusRepository; + @Autowired + private UserMapper userMapper; + + @Mapping(target = "participants", expression = "java(resolveParticipants(channel))") + @Mapping(target = "lastMessageAt", expression = "java(resolveLastMessageAt(channel))") + abstract public ChannelDto toDto(Channel channel); + + protected Instant resolveLastMessageAt(Channel channel) { + return messageRepository.findLastMessageAtByChannelId( + channel.getId()) + .orElse(Instant.MIN); + } + + protected List resolveParticipants(Channel channel) { + List participants = new ArrayList<>(); + if (channel.getType().equals(ChannelType.PRIVATE)) { + readStatusRepository.findAllByChannelIdWithUser(channel.getId()) + .stream() + .map(ReadStatus::getUser) + .map(userMapper::toDto) + .forEach(participants::add); + } + return participants; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java b/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java deleted file mode 100644 index c2fbd2d58..000000000 --- a/src/main/java/com/sprint/mission/discodeit/mapper/MapperConfig.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sprint.mission.discodeit.mapper; - -import com.sprint.mission.discodeit.dto.response.PageResponse; -import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; -import com.sprint.mission.discodeit.entity.UserStatus; -import org.modelmapper.Converter; -import org.modelmapper.ModelMapper; -import org.modelmapper.convention.MatchingStrategies; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.domain.Slice; - -import java.util.UUID; - -@Configuration -public class MapperConfig { - @Bean - public ModelMapper getMapper() { - ModelMapper modelMapper = new ModelMapper(); - modelMapper.getConfiguration() - .setFieldMatchingEnabled(true) // 필드 이름이 같으면 자동 매핑 - .setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE) // private 필드에도 접근 가능 - .setMatchingStrategy(MatchingStrategies.STRICT); - - Converter userToUserIdConverter = ctx -> ctx.getSource().getUser().getId(); - - modelMapper.typeMap(UserStatus.class, UserStatusDTO.class) - .addMappings(mapper -> mapper.using(userToUserIdConverter).map(src -> src, UserStatusDTO::setUserId)); - - - return modelMapper; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/MessageMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/MessageMapper.java new file mode 100644 index 000000000..e0301ac08 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/MessageMapper.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.entity.Message; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring", uses = {BinaryContentMapper.class, UserMapper.class}) +public interface MessageMapper { + + @Mapping(target = "channelId", source = "channel.id") + MessageDto toDto(Message message); +} diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java index 56278e860..108a9b59d 100644 --- a/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java +++ b/src/main/java/com/sprint/mission/discodeit/mapper/PageResponseMapper.java @@ -1,30 +1,30 @@ package com.sprint.mission.discodeit.mapper; import com.sprint.mission.discodeit.dto.response.PageResponse; -import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; +import org.mapstruct.Mapper; import org.springframework.data.domain.Page; import org.springframework.data.domain.Slice; -import org.springframework.stereotype.Component; -import java.util.List; +@Mapper(componentModel = "spring") +public interface PageResponseMapper { -@RequiredArgsConstructor -@Component -public class PageResponseMapper { - private final ModelMapper modelMapper; + default PageResponse fromSlice(Slice slice, Object nextCursor) { + return new PageResponse<>( + slice.getContent(), + nextCursor, + slice.getSize(), + slice.hasNext(), + null + ); + } - public PageResponse fromPage(Page page) { - List content = page.getContent().stream() - .map(item -> modelMapper.map(item, (Class) item.getClass())) - .toList(); - - return new PageResponse<>( - content, - page.getNumber(), - page.getSize(), - page.hasNext(), - page.getTotalElements() - ); - } + default PageResponse fromPage(Page page, Object nextCursor) { + return new PageResponse<>( + page.getContent(), + nextCursor, + page.getSize(), + page.hasNext(), + page.getTotalElements() + ); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/ReadStatusMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/ReadStatusMapper.java new file mode 100644 index 000000000..af9b85279 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/ReadStatusMapper.java @@ -0,0 +1,14 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.data.ReadStatusDto; +import com.sprint.mission.discodeit.entity.ReadStatus; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface ReadStatusMapper { + + @Mapping(target = "userId", source = "user.id") + @Mapping(target = "channelId", source = "channel.id") + ReadStatusDto toDto(ReadStatus readStatus); +} diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/UserMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/UserMapper.java new file mode 100644 index 000000000..c040a2edb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/UserMapper.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.entity.User; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring", uses = {BinaryContentMapper.class, UserStatusMapper.class}) +public interface UserMapper { + + @Mapping(target = "online", expression = "java(user.getStatus().isOnline())") + UserDto toDto(User user); +} diff --git a/src/main/java/com/sprint/mission/discodeit/mapper/UserStatusMapper.java b/src/main/java/com/sprint/mission/discodeit/mapper/UserStatusMapper.java new file mode 100644 index 000000000..202e56a18 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/mapper/UserStatusMapper.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.mapper; + +import com.sprint.mission.discodeit.dto.data.UserStatusDto; +import com.sprint.mission.discodeit.entity.UserStatus; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface UserStatusMapper { + + @Mapping(target = "userId", source = "user.id") + UserStatusDto toDto(UserStatus userStatus); +} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java index 63b0600d0..cbd8c79cf 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/BinaryContentRepository.java @@ -1,15 +1,9 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.BinaryContent; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; public interface BinaryContentRepository extends JpaRepository { - @Query("SELECT b FROM BinaryContent b WHERE b.id IN :ids") - List findAllIdIn(@Param("ids") List ids); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java index 26aee0c7c..e4b1fd235 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ChannelRepository.java @@ -1,12 +1,12 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.Channel; -import org.springframework.data.jpa.repository.JpaRepository; - +import com.sprint.mission.discodeit.entity.ChannelType; import java.util.List; -import java.util.Optional; import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; public interface ChannelRepository extends JpaRepository { - boolean existsById(UUID id); + + List findAllByTypeOrIdIn(ChannelType type, List ids); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 47eb39878..ac649b75f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -1,16 +1,32 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.Message; -import org.springframework.data.domain.Page; +import java.time.Instant; +import java.util.Optional; +import java.util.UUID; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - public interface MessageRepository extends JpaRepository { - Page findByChannelId(UUID channelId, Pageable pageable); + + @Query("SELECT m FROM Message m " + + "LEFT JOIN FETCH m.author a " + + "JOIN FETCH a.status " + + "LEFT JOIN FETCH a.profile " + + "WHERE m.channel.id=:channelId AND m.createdAt < :createdAt") + Slice findAllByChannelIdWithAuthor(@Param("channelId") UUID channelId, + @Param("createdAt") Instant createdAt, + Pageable pageable); + + + @Query("SELECT m.createdAt " + + "FROM Message m " + + "WHERE m.channel.id = :channelId " + + "ORDER BY m.createdAt DESC LIMIT 1") + Optional findLastMessageAtByChannelId(@Param("channelId") UUID channelId); + + void deleteAllByChannelId(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index 3c1bd8e21..f1d469af1 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -1,18 +1,25 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.ReadStatus; +import java.util.List; +import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - public interface ReadStatusRepository extends JpaRepository { - List findAllByChannelId(UUID channelID); - List findAllByUserId(UUID userID); + List findAllByUserId(UUID userId); + + @Query("SELECT r FROM ReadStatus r " + + "JOIN FETCH r.user u " + + "JOIN FETCH u.status " + + "LEFT JOIN FETCH u.profile " + + "WHERE r.channel.id = :channelId") + List findAllByChannelIdWithUser(@Param("channelId") UUID channelId); + + Boolean existsByUserIdAndChannelId(UUID userId, UUID channelId); + void deleteAllByChannelId(UUID channelId); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index b8095ee3d..f7103705f 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -1,16 +1,22 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.User; -import org.springframework.data.jpa.repository.JpaRepository; - +import java.util.List; import java.util.Optional; import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface UserRepository extends JpaRepository { - boolean existsById(UUID userId); + Optional findByUsername(String username); + + boolean existsByEmail(String email); - Optional findByEmail(String email); + boolean existsByUsername(String username); - Optional findByUsername(String name); + @Query("SELECT u FROM User u " + + "LEFT JOIN FETCH u.profile " + + "JOIN FETCH u.status") + List findAllWithProfileAndStatus(); } diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java index 6f21198ae..46102abf5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserStatusRepository.java @@ -1,15 +1,11 @@ package com.sprint.mission.discodeit.repository; -import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import java.util.Collection; -import java.util.List; import java.util.Optional; import java.util.UUID; +import org.springframework.data.jpa.repository.JpaRepository; public interface UserStatusRepository extends JpaRepository { - Optional findByUserId(UUID userId); + + Optional findByUserId(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java index ea9680d09..23836a446 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/BinaryContentService.java @@ -1,18 +1,17 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; - -import java.io.IOException; +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; import java.util.List; import java.util.UUID; public interface BinaryContentService { - BinaryContentDTO create(CreateBinaryContentRequest request) throws IOException; - BinaryContentDTO find(UUID binaryContentId); + BinaryContentDto create(BinaryContentCreateRequest request); + + BinaryContentDto find(UUID binaryContentId); - List findAllByIdIn(List binaryContentIds); + List findAllByIdIn(List binaryContentIds); - void delete(UUID binaryContentId); + void delete(UUID binaryContentId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java index fb9601faa..a082c9ff9 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ChannelService.java @@ -1,24 +1,23 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; -import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; - +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; import java.util.List; import java.util.UUID; public interface ChannelService { - ChannelDTO createPublicChannel(CreateChannel.PublicRequest request); + ChannelDto create(PublicChannelCreateRequest request); - ChannelDTO createPrivateChannel(CreateChannel.PrivateRequest request); + ChannelDto create(PrivateChannelCreateRequest request); - ChannelDTO find(UUID channelId); + ChannelDto find(UUID channelId); - List findAllByUserId(UUID userId); + List findAllByUserId(UUID userId); - ChannelDTO update(UUID channelId, UpdatePublicChannel request); + ChannelDto update(UUID channelId, PublicChannelUpdateRequest request); void delete(UUID channelId); - } \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java index 6fc5ca278..8ac5ee924 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/MessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/MessageService.java @@ -1,24 +1,25 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.dto.message.MessageDTO; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; -import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.dto.response.PageResponse; - +import java.time.Instant; import java.util.List; import java.util.UUID; +import org.springframework.data.domain.Pageable; public interface MessageService { - MessageDTO create(CreateMessageRequest messageRequest, - List binaryContentRequests); + MessageDto create(MessageCreateRequest messageCreateRequest, + List binaryContentCreateRequests); - MessageDTO find(UUID messageId); + MessageDto find(UUID messageId); - PageResponse findAllByChannelId(UUID channelId, int page); + PageResponse findAllByChannelId(UUID channelId, Instant createdAt, Pageable pageable); - MessageDTO update(UUID messageId, UpdateMessageRequest request); + MessageDto update(UUID messageId, MessageUpdateRequest request); - void delete(UUID messageID); + void delete(UUID messageId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java index db84a9561..8b0c80a31 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/ReadStatusService.java @@ -1,23 +1,20 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.dto.readstatus.ReadStatusDTO; -import com.sprint.mission.discodeit.entity.ReadStatus; -import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; - +import com.sprint.mission.discodeit.dto.data.ReadStatusDto; +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; import java.util.List; import java.util.UUID; public interface ReadStatusService { - ReadStatusDTO create(CreateReadStatusRequest request); - - ReadStatusDTO find(UUID readStatusId); + ReadStatusDto create(ReadStatusCreateRequest request); - List findAllByUserId(UUID userID); + ReadStatusDto find(UUID readStatusId); - List updateByChannelId(UUID channelId); + List findAllByUserId(UUID userId); - ReadStatusDTO update(UUID readStatusId); + ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request); void delete(UUID readStatusId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserService.java b/src/main/java/com/sprint/mission/discodeit/service/UserService.java index 884bbfcd4..444118780 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserService.java @@ -1,24 +1,24 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.user.*; - +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import java.util.List; import java.util.Optional; import java.util.UUID; public interface UserService { - UserDTO create(CreateUserRequest request, - Optional binaryContentRequest); + UserDto create(UserCreateRequest userCreateRequest, + Optional profileCreateRequest); - UserDTO find(UUID userId); + UserDto find(UUID userId); - List findAll(); + List findAll(); - UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, - Optional binaryContentRequest); + UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, + Optional profileCreateRequest); void delete(UUID userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java index 9c3068d25..3c5c55e6e 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/UserStatusService.java @@ -1,20 +1,22 @@ package com.sprint.mission.discodeit.service; -import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; - +import com.sprint.mission.discodeit.dto.data.UserStatusDto; +import com.sprint.mission.discodeit.dto.request.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; import java.util.List; import java.util.UUID; public interface UserStatusService { - UserStatusDTO create(UUID userId); - UserStatusDTO find(UUID userStatusId); + UserStatusDto create(UserStatusCreateRequest request); + + UserStatusDto find(UUID userStatusId); - UserStatusDTO findByUserId(UUID userId); + List findAll(); - List findAll(); + UserStatusDto update(UUID userStatusId, UserStatusUpdateRequest request); - UserStatusDTO updateByUserId(UUID userId); + UserStatusDto updateByUserId(UUID userId, UserStatusUpdateRequest request); - void delete(UUID userStatusId); + void delete(UUID userStatusId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 16fc2f382..c8ac278de 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -1,34 +1,37 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.LoginRequest; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.dto.login.LoginRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.service.UserStatusService; +import com.sprint.mission.discodeit.service.AuthService; +import java.util.NoSuchElementException; import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -@Service @RequiredArgsConstructor -public class BasicAuthService { +@Service +public class BasicAuthService implements AuthService { private final UserRepository userRepository; - private final ModelMapper modelMapper; - private final UserStatusService userStatusService; + private final UserMapper userMapper; - public UserDTO login(LoginRequest request) { // 요청으로 name과 password가 들어온 상황 - User findUser = userRepository.findByUsername(request.username()) - .orElseThrow(() -> new ServiceException(ErrorCode.USERNAME_MISMATCH)); + @Transactional(readOnly = true) + @Override + public UserDto login(LoginRequest loginRequest) { + String username = loginRequest.username(); + String password = loginRequest.password(); - if (!findUser.getPassword().equals(request.password())) { // 비밀번호가 일치하지 않으면 에러 발생 - throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); - } + User user = userRepository.findByUsername(username) + .orElseThrow( + () -> new NoSuchElementException("User with username " + username + " not found")); - userStatusService.updateByUserId(findUser.getId()); + if (!user.getPassword().equals(password)) { + throw new IllegalArgumentException("Wrong password"); + } - return modelMapper.map(findUser, UserDTO.class); // 비밀번호를 보여주지 않기 위해서 DTO 사용 + return userMapper.toDto(user); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index b093d15fa..a8dcf767c 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -1,71 +1,65 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; import com.sprint.mission.discodeit.entity.BinaryContent; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.BinaryContentMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; import com.sprint.mission.discodeit.storage.BinaryContentStorage; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.IOException; -import java.util.List; -import java.util.UUID; - -@Service @RequiredArgsConstructor +@Service public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; - private final ModelMapper modelMapper; + private final BinaryContentMapper binaryContentMapper; private final BinaryContentStorage binaryContentStorage; @Transactional @Override - public BinaryContentDTO create(CreateBinaryContentRequest request) throws IOException { - String filename = request.fileName(); + public BinaryContentDto create(BinaryContentCreateRequest request) { + String fileName = request.fileName(); byte[] bytes = request.bytes(); String contentType = request.contentType(); - BinaryContent binaryContent = BinaryContent.builder() - .fileName(filename) - .contentType(contentType) - .size((long) bytes.length) - .build(); - - BinaryContent saveBinaryContent = binaryContentRepository.save(binaryContent); - - binaryContentStorage.put(saveBinaryContent.getId(), bytes); + BinaryContent binaryContent = new BinaryContent( + fileName, + (long) bytes.length, + contentType + ); + binaryContentRepository.save(binaryContent); + binaryContentStorage.put(binaryContent.getId(), bytes); - return modelMapper.map(binaryContent, BinaryContentDTO.class); + return binaryContentMapper.toDto(binaryContent); } - @Transactional(readOnly = true) @Override - public BinaryContentDTO find(UUID binaryContentId) { - BinaryContent binaryContent = binaryContentRepository.findById(binaryContentId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE)); - - return modelMapper.map(binaryContent, BinaryContentDTO.class); + public BinaryContentDto find(UUID binaryContentId) { + return binaryContentRepository.findById(binaryContentId) + .map(binaryContentMapper::toDto) + .orElseThrow(() -> new NoSuchElementException( + "BinaryContent with id " + binaryContentId + " not found")); } - @Transactional(readOnly = true) @Override - public List findAllByIdIn(List binaryContentIds) { - List binaryContents = binaryContentRepository.findAllIdIn(binaryContentIds); - - return binaryContents.stream() - .map(binaryContent -> modelMapper.map(binaryContent, BinaryContentDTO.class)) - .toList(); + public List findAllByIdIn(List binaryContentIds) { + return binaryContentRepository.findAllById(binaryContentIds).stream() + .map(binaryContentMapper::toDto) + .toList(); } @Transactional @Override public void delete(UUID binaryContentId) { + if (!binaryContentRepository.existsById(binaryContentId)) { + throw new NoSuchElementException("BinaryContent with id " + binaryContentId + " not found"); + } binaryContentRepository.deleteById(binaryContentId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 15e9b9879..04e5a50f2 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -1,112 +1,109 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.dto.channel.ChannelDTO; -import com.sprint.mission.discodeit.dto.channel.UpdatePublicChannel; -import com.sprint.mission.discodeit.entity.*; -import com.sprint.mission.discodeit.dto.channel.CreateChannel; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.mapper.ChannelMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; -import com.sprint.mission.discodeit.util.type.ChannelType; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.UUID; import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - -@Service @RequiredArgsConstructor +@Service public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; + // private final ReadStatusRepository readStatusRepository; + private final MessageRepository messageRepository; private final UserRepository userRepository; - private final ModelMapper modelMapper; + private final ChannelMapper channelMapper; @Transactional @Override - public ChannelDTO createPublicChannel(CreateChannel.PublicRequest request) { - Channel channel = Channel.builder() - .type(ChannelType.PUBLIC) - .name(request.getName()) - .description(request.getDescription()) - .build(); + public ChannelDto create(PublicChannelCreateRequest request) { + String name = request.name(); + String description = request.description(); + Channel channel = new Channel(ChannelType.PUBLIC, name, description); channelRepository.save(channel); - - return modelMapper.map(channel, ChannelDTO.class); + return channelMapper.toDto(channel); } @Transactional @Override - public ChannelDTO createPrivateChannel(CreateChannel.PrivateRequest request) { + public ChannelDto create(PrivateChannelCreateRequest request) { Channel channel = new Channel(ChannelType.PRIVATE, null, null); - Channel createdChannel = channelRepository.save(channel); - - List readStatuses = request.getParticipantIds().stream() - .map(userId -> { - User user = userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - return new ReadStatus(user, createdChannel, createdChannel.getCreatedAt()); - }) - .toList(); + channelRepository.save(channel); + List readStatuses = userRepository.findAllById(request.participantIds()).stream() + .map(user -> new ReadStatus(user, channel, channel.getCreatedAt())) + .toList(); readStatusRepository.saveAll(readStatuses); - return modelMapper.map(createdChannel, ChannelDTO.class); + return channelMapper.toDto(channel); } @Transactional(readOnly = true) @Override - public ChannelDTO find(UUID channelId) { - Channel channel = channelRepository.findById(channelId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - return modelMapper.map(channel, ChannelDTO.class); + public ChannelDto find(UUID channelId) { + return channelRepository.findById(channelId) + .map(channelMapper::toDto) + .orElseThrow( + () -> new NoSuchElementException("Channel with id " + channelId + " not found")); } @Transactional(readOnly = true) @Override - public List findAllByUserId(UUID userId) { + public List findAllByUserId(UUID userId) { List mySubscribedChannelIds = readStatusRepository.findAllByUserId(userId).stream() - .map(readStatus -> readStatus.getChannel().getId()) - .toList(); - - List list = channelRepository.findAll().stream() - .filter(channel -> - channel.getType().equals(ChannelType.PUBLIC) - || mySubscribedChannelIds.contains(channel.getId()) - ) - .toList(); - - return list.stream().map(channel -> modelMapper.map(channel, ChannelDTO.class)).toList(); + .map(ReadStatus::getChannel) + .map(Channel::getId) + .toList(); + + return channelRepository.findAllByTypeOrIdIn(ChannelType.PUBLIC, mySubscribedChannelIds) + .stream() + .map(channelMapper::toDto) + .toList(); } @Transactional @Override - public ChannelDTO update(UUID channelId, UpdatePublicChannel request) { + public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { + String newName = request.newName(); + String newDescription = request.newDescription(); Channel channel = channelRepository.findById(channelId) - .orElseThrow( - () -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + .orElseThrow( + () -> new NoSuchElementException("Channel with id " + channelId + " not found")); if (channel.getType().equals(ChannelType.PRIVATE)) { - throw new ServiceException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); + throw new IllegalArgumentException("Private channel cannot be updated"); } - channel.update(request.name(), request.description()); - - return modelMapper.map(channel, ChannelDTO.class); + channel.update(newName, newDescription); + return channelMapper.toDto(channel); } @Transactional @Override public void delete(UUID channelId) { - Channel channel = channelRepository.findById(channelId) - .orElseThrow( - () -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); + if (!channelRepository.existsById(channelId)) { + throw new NoSuchElementException("Channel with id " + channelId + " not found"); + } + + messageRepository.deleteAllByChannelId(channelId); + readStatusRepository.deleteAllByChannelId(channelId); - channelRepository.delete(channel); + channelRepository.deleteById(channelId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 71269f2e3..d874d76da 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -1,145 +1,132 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.dto.message.MessageDTO; +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.dto.response.PageResponse; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.message.CreateMessageRequest; -import com.sprint.mission.discodeit.dto.message.UpdateMessageRequest; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.MessageMapper; import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.MessageService; -import com.sprint.mission.discodeit.service.UserStatusService; import com.sprint.mission.discodeit.storage.BinaryContentStorage; +import java.time.Instant; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.UUID; import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; - -@Service @RequiredArgsConstructor +@Service public class BasicMessageService implements MessageService { - private final UserStatusService userStatusService; - private final BinaryContentStorage binaryContentStorage; private final MessageRepository messageRepository; - private final UserRepository userRepository; + // private final ChannelRepository channelRepository; + private final UserRepository userRepository; + private final MessageMapper messageMapper; + private final BinaryContentStorage binaryContentStorage; private final BinaryContentRepository binaryContentRepository; - private final ModelMapper modelMapper; private final PageResponseMapper pageResponseMapper; @Transactional @Override - public MessageDTO create(CreateMessageRequest messageRequest, - List binaryContentRequest) { - UUID authorId = messageRequest.userId(); - UUID channelId = messageRequest.channelId(); - - User user = validAuthor(authorId); - Channel channel = validChannel(channelId); - - userStatusService.updateByUserId(authorId); - - List attachments = binaryContentRequest.stream() - .map(attachmentRequest -> { - BinaryContent binaryContent = BinaryContent.builder() - .fileName(attachmentRequest.fileName()) - .size(attachmentRequest.size()) - .contentType(attachmentRequest.contentType()) - .build(); - - BinaryContent save = binaryContentRepository.save(binaryContent); - - binaryContentStorage.put(save.getId(), attachmentRequest.bytes()); - - return save; - }) - .toList(); - - Message message = Message.builder() - .content(messageRequest.content()) - .channel(channel) - .author(user) - .attachments(attachments) - .build(); + public MessageDto create(MessageCreateRequest messageCreateRequest, + List binaryContentCreateRequests) { + UUID channelId = messageCreateRequest.channelId(); + UUID authorId = messageCreateRequest.authorId(); + + Channel channel = channelRepository.findById(channelId) + .orElseThrow( + () -> new NoSuchElementException("Channel with id " + channelId + " does not exist")); + User author = userRepository.findById(authorId) + .orElseThrow( + () -> new NoSuchElementException("Author with id " + authorId + " does not exist") + ); + + List attachments = binaryContentCreateRequests.stream() + .map(attachmentRequest -> { + String fileName = attachmentRequest.fileName(); + String contentType = attachmentRequest.contentType(); + byte[] bytes = attachmentRequest.bytes(); + + BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length, + contentType); + binaryContentRepository.save(binaryContent); + binaryContentStorage.put(binaryContent.getId(), bytes); + return binaryContent; + }) + .toList(); + + String content = messageCreateRequest.content(); + Message message = new Message( + content, + channel, + author, + attachments + ); messageRepository.save(message); - - return modelMapper.map(message, MessageDTO.class); + return messageMapper.toDto(message); } @Transactional(readOnly = true) @Override - public MessageDTO find(UUID messageId) { - Message message = messageRepository.findById(messageId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - - return modelMapper.map(message, MessageDTO.class); + public MessageDto find(UUID messageId) { + return messageRepository.findById(messageId) + .map(messageMapper::toDto) + .orElseThrow( + () -> new NoSuchElementException("Message with id " + messageId + " not found")); } @Transactional(readOnly = true) @Override - public PageResponse findAllByChannelId(UUID channelId, int page) { - Channel channel = validChannel(channelId); - - Pageable pageable = PageRequest.of(page, 50, Sort.by(Sort.Order.desc("createdAt"))); - - Page messagePage = messageRepository.findByChannelId(channelId, pageable); + public PageResponse findAllByChannelId(UUID channelId, Instant createAt, + Pageable pageable) { + Slice slice = messageRepository.findAllByChannelIdWithAuthor(channelId, + Optional.ofNullable(createAt).orElse(Instant.now()), + pageable) + .map(messageMapper::toDto); + + Instant nextCursor = null; + if (!slice.getContent().isEmpty()) { + nextCursor = slice.getContent().get(slice.getContent().size() - 1) + .createdAt(); + } - return pageResponseMapper.fromPage(messagePage); + return pageResponseMapper.fromSlice(slice, nextCursor); } @Transactional @Override - public MessageDTO update(UUID messageId, UpdateMessageRequest request) { + public MessageDto update(UUID messageId, MessageUpdateRequest request) { String newContent = request.newContent(); - Message message = messageRepository.findById(messageId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - + .orElseThrow( + () -> new NoSuchElementException("Message with id " + messageId + " not found")); message.update(newContent); - - return modelMapper.map(message, MessageDTO.class); + return messageMapper.toDto(message); } @Transactional @Override public void delete(UUID messageId) { - - Message message = messageRepository.findById(messageId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE)); - - messageRepository.deleteById(messageId); - } - - private User validAuthor(UUID authorId) { - if (!userRepository.existsById(authorId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + if (!messageRepository.existsById(messageId)) { + throw new NoSuchElementException("Message with id " + messageId + " not found"); } - return userRepository.findById(authorId).orElse(null); - } - - private Channel validChannel(UUID channelId) { - if (!channelRepository.existsById(channelId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); - } - return channelRepository.findById(channelId).orElse(null); + messageRepository.deleteById(messageId); } -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index b02c06104..8c52802ba 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -1,129 +1,91 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.dto.readstatus.ReadStatusDTO; +import com.sprint.mission.discodeit.dto.data.ReadStatusDto; +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.ReadStatus; -import com.sprint.mission.discodeit.dto.readstatus.CreateReadStatusRequest; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.ReadStatusMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ReadStatusService; -import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import java.time.Instant; import java.util.List; -import java.util.Optional; +import java.util.NoSuchElementException; import java.util.UUID; -import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -@Service @RequiredArgsConstructor +@Service public class BasicReadStatusService implements ReadStatusService { + private final ReadStatusRepository readStatusRepository; private final UserRepository userRepository; private final ChannelRepository channelRepository; - private final ReadStatusRepository readStatusRepository; - private final ModelMapper modelMapper; + private final ReadStatusMapper readStatusMapper; @Transactional @Override - public ReadStatusDTO create(CreateReadStatusRequest request) { - User user = userRepository.findById(request.userId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - Channel channel = channelRepository.findById(request.channelId()).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL)); - - List readStatuses = readStatusRepository.findAllByUserId(request.userId()); - boolean exists = readStatuses.stream() - .anyMatch(readStatus -> readStatus.getChannel().getId().equals(request.channelId())); - if (exists) { - throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); + public ReadStatusDto create(ReadStatusCreateRequest request) { + UUID userId = request.userId(); + UUID channelId = request.channelId(); + + User user = userRepository.findById(userId) + .orElseThrow( + () -> new NoSuchElementException("User with id " + userId + " does not exist")); + Channel channel = channelRepository.findById(channelId) + .orElseThrow( + () -> new NoSuchElementException("Channel with id " + channelId + " does not exist") + ); + + if (readStatusRepository.existsByUserIdAndChannelId(user.getId(), channel.getId())) { + throw new IllegalArgumentException( + "ReadStatus with userId " + userId + " and channelId " + channelId + " already exists"); } - Instant lastReadAt = Instant.now(); - ReadStatus readStatus = ReadStatus.builder() - .user(user) - .channel(channel) - .lastReadAt(lastReadAt) - .build(); - + Instant lastReadAt = request.lastReadAt(); + ReadStatus readStatus = new ReadStatus(user, channel, lastReadAt); readStatusRepository.save(readStatus); - return modelMapper.map(readStatus, ReadStatusDTO.class); - } - @Transactional(readOnly = true) - @Override - public ReadStatusDTO find(UUID readStatusId) { - ReadStatus readStatus = readStatusRepository.findById(readStatusId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - - return modelMapper.map(readStatus, ReadStatusDTO.class); + return readStatusMapper.toDto(readStatus); } - @Transactional(readOnly = true) @Override - public List findAllByUserId(UUID userID) { - validUser(userID); - List allByUserId = readStatusRepository.findAllByUserId(userID); - - return allByUserId.stream() - .map(readStatus -> modelMapper.map(readStatus, ReadStatusDTO.class)) - .collect(Collectors.toList()); + public ReadStatusDto find(UUID readStatusId) { + return readStatusRepository.findById(readStatusId) + .map(readStatusMapper::toDto) + .orElseThrow( + () -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found")); } - /* - User가 채널에서 메시지를 읽은 시간을 업데이트 - */ - @Transactional @Override - public List updateByChannelId(UUID channelId) { - validChannel(channelId); - - // 채널에 해당하는 ReadStatus 목록을 가져옴 - List readStatuses = readStatusRepository.findAllByChannelId(channelId); - - // 모든 ReadStatus의 'lastReadTime'을 업데이트 - readStatuses.forEach(readStatus -> readStatus.updateLastReadTime()); - - return readStatuses.stream() - .map(readStatus -> modelMapper.map(readStatus, ReadStatusDTO.class)) - .collect(Collectors.toList()); + public List findAllByUserId(UUID userId) { + return readStatusRepository.findAllByUserId(userId).stream() + .map(readStatusMapper::toDto) + .toList(); } @Transactional @Override - public ReadStatusDTO update(UUID readStatusId) { + public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) { + Instant newLastReadAt = request.newLastReadAt(); ReadStatus readStatus = readStatusRepository.findById(readStatusId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)); - - readStatus.updateLastReadTime(); - - readStatusRepository.save(readStatus); - - return modelMapper.map(readStatus, ReadStatusDTO.class); + .orElseThrow( + () -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found")); + readStatus.update(newLastReadAt); + return readStatusMapper.toDto(readStatus); } @Transactional @Override public void delete(UUID readStatusId) { - Optional.ofNullable(readStatusRepository.findById(readStatusId)) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS)) - .ifPresent(readStatusRepository::delete); - } - - private void validUser(UUID userId) { - if (!userRepository.existsById(userId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); - } - } - - private void validChannel(UUID channelId) { - if (!channelRepository.existsById(channelId)) { - throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + if (!readStatusRepository.existsById(readStatusId)) { + throw new NoSuchElementException("ReadStatus with id " + readStatusId + " not found"); } + readStatusRepository.deleteById(readStatusId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 9b2a1b853..91f6f278d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -1,148 +1,130 @@ package com.sprint.mission.discodeit.service.basic; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.user.*; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; -import com.sprint.mission.discodeit.service.BinaryContentService; import com.sprint.mission.discodeit.service.UserService; -import com.sprint.mission.discodeit.service.UserStatusService; -import java.util.Optional; - import com.sprint.mission.discodeit.storage.BinaryContentStorage; -import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - - import java.time.Instant; import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; import java.util.UUID; -import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -@Service @RequiredArgsConstructor +@Service public class BasicUserService implements UserService { private final UserRepository userRepository; - private final BinaryContentRepository binaryContentRepository; private final UserStatusRepository userStatusRepository; - private final UserStatusService userStatusService; - private final ModelMapper modelMapper; + private final UserMapper userMapper; + private final BinaryContentRepository binaryContentRepository; private final BinaryContentStorage binaryContentStorage; @Transactional @Override - public UserDTO create(CreateUserRequest request, - Optional binaryContentRequest) { - userRepository.findByEmail(request.email()).ifPresent(x -> { - throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); - }); - - userRepository.findByUsername(request.username()).ifPresent(x -> { - throw new ServiceException(ErrorCode.DUPLICATE_NAME); - }); - - BinaryContent profile = null; - if (binaryContentRequest.isPresent()) { - CreateBinaryContentRequest contentRequest = binaryContentRequest.get(); + public UserDto create(UserCreateRequest userCreateRequest, + Optional optionalProfileCreateRequest) { + String username = userCreateRequest.username(); + String email = userCreateRequest.email(); - profile = BinaryContent.builder() - .contentType(contentRequest.contentType()) - .fileName(contentRequest.fileName()) - .size(contentRequest.size()) - .build(); - - BinaryContent save = binaryContentRepository.save(profile); - - binaryContentStorage.put(save.getId(), binaryContentRequest.get().bytes()); + if (userRepository.existsByEmail(email)) { + throw new IllegalArgumentException("User with email " + email + " already exists"); + } + if (userRepository.existsByUsername(username)) { + throw new IllegalArgumentException("User with username " + username + " already exists"); } - User createdUser = User.builder() - .username(request.username()) - .email(request.email()) - .password(request.password()) - .profile(profile) - .build(); - - userRepository.save(createdUser); - - Instant lastActiveAt = Instant.now(); - UserStatus userStatus = UserStatus.builder() - .user(createdUser) - .lastActiveAt(lastActiveAt) - .build(); - createdUser.setStatus(userStatus); - - userStatusRepository.save(userStatus); - - return modelMapper.map(createdUser, UserDTO.class); + BinaryContent nullableProfile = optionalProfileCreateRequest + .map(profileRequest -> { + String fileName = profileRequest.fileName(); + String contentType = profileRequest.contentType(); + byte[] bytes = profileRequest.bytes(); + BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length, + contentType); + binaryContentRepository.save(binaryContent); + binaryContentStorage.put(binaryContent.getId(), bytes); + return binaryContent; + }) + .orElse(null); + String password = userCreateRequest.password(); + + User user = new User(username, email, password, nullableProfile); + Instant now = Instant.now(); + UserStatus userStatus = new UserStatus(user, now); + + userRepository.save(user); + return userMapper.toDto(user); } - @Transactional(readOnly = true) @Override - public UserDTO find(UUID userId) { - User findUser = userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - UserStatus status = userStatusRepository.findByUserId(findUser.getId()) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - return modelMapper.map(findUser, UserDTO.class); + public UserDto find(UUID userId) { + return userRepository.findById(userId) + .map(userMapper::toDto) + .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found")); } - @Transactional(readOnly = true) @Override - public List findAll() { - return userRepository.findAll().stream() - .map(user -> modelMapper.map(user, UserDTO.class)) - .collect(Collectors.toList()); + public List findAll() { + return userRepository.findAllWithProfileAndStatus() + .stream() + .map(userMapper::toDto) + .toList(); } @Transactional @Override - public UserDTO update(UUID userId, UpdateUserRequest updateUserRequest, - Optional binaryContentRequest) { - - User findUser = userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); - - findUser.updatePassword(updateUserRequest.oldPassword(), updateUserRequest.newPassword()); - - userStatusService.updateByUserId(findUser.getId()); - - binaryContentRequest.ifPresent(contentRequest -> { - BinaryContent newProfile = BinaryContent.builder() - .size(contentRequest.size()) - .contentType(contentRequest.contentType()) - .fileName(contentRequest.fileName()) - .build(); - - BinaryContent save = binaryContentRepository.save(newProfile); - - binaryContentStorage.put(save.getId(), contentRequest.bytes()); + public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, + Optional optionalProfileCreateRequest) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found")); + + String newUsername = userUpdateRequest.newUsername(); + String newEmail = userUpdateRequest.newEmail(); + if (userRepository.existsByEmail(newEmail)) { + throw new IllegalArgumentException("User with email " + newEmail + " already exists"); + } + if (userRepository.existsByUsername(newUsername)) { + throw new IllegalArgumentException("User with username " + newUsername + " already exists"); + } - if (findUser.getProfile() != null) { - binaryContentRepository.delete(findUser.getProfile()); - } + BinaryContent nullableProfile = optionalProfileCreateRequest + .map(profileRequest -> { - findUser.updateProfile(newProfile); + String fileName = profileRequest.fileName(); + String contentType = profileRequest.contentType(); + byte[] bytes = profileRequest.bytes(); + BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length, + contentType); + binaryContentRepository.save(binaryContent); + binaryContentStorage.put(binaryContent.getId(), bytes); + return binaryContent; + }) + .orElse(null); - }); + String newPassword = userUpdateRequest.newPassword(); + user.update(newUsername, newEmail, newPassword, nullableProfile); - return modelMapper.map(findUser, UserDTO.class); + return userMapper.toDto(user); } @Transactional @Override public void delete(UUID userId) { - User deleteUser = userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + if (userRepository.existsById(userId)) { + throw new NoSuchElementException("User with id " + userId + " not found"); + } userRepository.deleteById(userId); } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index 8d9ddc40a..4528aa08d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -1,100 +1,96 @@ package com.sprint.mission.discodeit.service.basic; -import com.sprint.mission.discodeit.dto.userstatus.UserStatusDTO; +import com.sprint.mission.discodeit.dto.data.UserStatusDto; +import com.sprint.mission.discodeit.dto.request.UserStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; -import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.UserStatusMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserStatusService; -import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - import java.time.Instant; import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; import java.util.UUID; -import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -@Service @RequiredArgsConstructor +@Service public class BasicUserStatusService implements UserStatusService { - private final UserStatusRepository userStatusRepository; - private final UserRepository userRepository; - private final ModelMapper modelMapper; - - @Transactional - @Override - public UserStatusDTO create(UUID userId) { - validUser(userId); - - userStatusRepository.findByUserId(userId) - .ifPresent(userStatus -> { - throw new ServiceException(ErrorCode.ALREADY_EXIST_USERSTAUTS); - }); - - UserStatusDTO userStatusDTO = UserStatusDTO.builder() - .userId(userId) - .lastActiveAt(Instant.now()) - .build(); - - UserStatus userStatus = modelMapper.map(userStatusDTO, UserStatus.class); - userStatusRepository.save(userStatus); - return userStatusDTO; - } - - @Transactional(readOnly = true) - @Override - public UserStatusDTO find(UUID userStatusId) { - UserStatus userStatus = userStatusRepository.findById(userStatusId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - - return modelMapper.map(userStatus, UserStatusDTO.class); - } - - @Transactional(readOnly = true) - @Override - public UserStatusDTO findByUserId(UUID userId) { - validUser(userId); - - UserStatus userStatus = userStatusRepository.findByUserId(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - - return modelMapper.map(userStatus, UserStatusDTO.class); - } - - @Transactional(readOnly = true) - @Override - public List findAll() { - List userStatusList = userStatusRepository.findAll(); - - // UserStatus 리스트를 UserStatusDTO 리스트로 변환 - return userStatusList.stream() - .map(userStatus -> modelMapper.map(userStatus, UserStatusDTO.class)) - .collect(Collectors.toList()); - } - - - @Transactional - @Override - public UserStatusDTO updateByUserId(UUID userId) { - validUser(userId); - - UserStatus userStatus = userStatusRepository.findByUserId(userId).orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS)); - userStatus.update(); - userStatusRepository.save(userStatus); - return modelMapper.map(userStatus, UserStatusDTO.class); - } - - @Transactional - @Override - public void delete(UUID userStatusId) { - userStatusRepository.deleteById(userStatusId); - } - private void validUser(UUID userId) { - userRepository.findById(userId) - .orElseThrow(() -> new ServiceException(ErrorCode.CANNOT_FOUND_USER)); + private final UserStatusRepository userStatusRepository; + private final UserRepository userRepository; + private final UserStatusMapper userStatusMapper; + + @Transactional + @Override + public UserStatusDto create(UserStatusCreateRequest request) { + UUID userId = request.userId(); + + User user = userRepository.findById(userId) + .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found")); + Optional.ofNullable(user.getStatus()) + .ifPresent(status -> { + throw new IllegalArgumentException("UserStatus with id " + userId + " already exists"); + }); + + Instant lastActiveAt = request.lastActiveAt(); + UserStatus userStatus = new UserStatus(user, lastActiveAt); + userStatusRepository.save(userStatus); + return userStatusMapper.toDto(userStatus); + } + + @Override + public UserStatusDto find(UUID userStatusId) { + return userStatusRepository.findById(userStatusId) + .map(userStatusMapper::toDto) + .orElseThrow( + () -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found")); + } + + @Override + public List findAll() { + return userStatusRepository.findAll().stream() + .map(userStatusMapper::toDto) + .toList(); + } + + @Transactional + @Override + public UserStatusDto update(UUID userStatusId, UserStatusUpdateRequest request) { + Instant newLastActiveAt = request.newLastActiveAt(); + + UserStatus userStatus = userStatusRepository.findById(userStatusId) + .orElseThrow( + () -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found")); + userStatus.update(newLastActiveAt); + + return userStatusMapper.toDto(userStatus); + } + + @Transactional + @Override + public UserStatusDto updateByUserId(UUID userId, UserStatusUpdateRequest request) { + Instant newLastActiveAt = request.newLastActiveAt(); + + UserStatus userStatus = userStatusRepository.findByUserId(userId) + .orElseThrow( + () -> new NoSuchElementException("UserStatus with userId " + userId + " not found")); + userStatus.update(newLastActiveAt); + + return userStatusMapper.toDto(userStatus); + } + + @Transactional + @Override + public void delete(UUID userStatusId) { + if (!userStatusRepository.existsById(userStatusId)) { + throw new NoSuchElementException("UserStatus with id " + userStatusId + " not found"); } + userStatusRepository.deleteById(userStatusId); + } } diff --git a/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java index 863bc7491..f00216c40 100644 --- a/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java +++ b/src/main/java/com/sprint/mission/discodeit/storage/BinaryContentStorage.java @@ -1,17 +1,15 @@ package com.sprint.mission.discodeit.storage; -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; - +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; import java.io.InputStream; import java.util.UUID; +import org.springframework.http.ResponseEntity; -@Component public interface BinaryContentStorage { - UUID put(UUID binaryContentId, byte[] binaryContent); - InputStream get(UUID binaryContentId); + UUID put(UUID binaryContentId, byte[] bytes); + + InputStream get(UUID binaryContentId); - ResponseEntity download(BinaryContentDTO binaryContentDTO); + ResponseEntity download(BinaryContentDto metaData); } diff --git a/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java deleted file mode 100644 index 85ecb1dc9..000000000 --- a/src/main/java/com/sprint/mission/discodeit/storage/LocalBinaryContentStorage.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.sprint.mission.discodeit.storage; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.*; -import java.util.UUID; - -import com.sprint.mission.discodeit.dto.binarycontent.BinaryContentDTO; -import jakarta.annotation.PostConstruct; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody; - -@Profile("local") -@Component -@Log4j2 -public class LocalBinaryContentStorage implements BinaryContentStorage { - - @Value("${discodeit.storage.local.root-path}") - private Path root; - - @PostConstruct - public void init() throws IOException { - if (!Files.exists(root)) { - Files.createDirectories(root); - log.info("Created directory: " + root); - } - } - - @Override - public UUID put(UUID binaryContentId, byte[] binaryContent) { - Path targetPath = resolvePath(binaryContentId); - try { - Files.write(targetPath, binaryContent); - } catch (IOException e) { - throw new RuntimeException("Failed to save file: " + binaryContentId, e); - } - return binaryContentId; - } - - @Override - public InputStream get(UUID binaryContentId) { - Path targetPath = resolvePath(binaryContentId); - if (!Files.exists(targetPath)) { - throw new RuntimeException("File not found: " + binaryContentId); - } - try { - return Files.newInputStream(targetPath); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public ResponseEntity download(BinaryContentDTO binaryContentDTO) { - UUID binaryContentId = binaryContentDTO.getId(); - Path targetPath = resolvePath(binaryContentId); - - if (!Files.exists(targetPath)) { - return ResponseEntity.notFound().build(); - } - - try { - InputStream inputStream = Files.newInputStream(targetPath); - - StreamingResponseBody streamingResponseBody = outputStream -> { - byte[] buffer = new byte[1024]; - int bytesRead; - try { - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - } catch (IOException e) { - throw new RuntimeException("Error during streaming file", e); - } finally { - try { - inputStream.close(); - } catch (IOException e) { - } - } - }; - - return ResponseEntity.ok() - .header("Content-Disposition", "attachment; filename=\"" + targetPath.getFileName().toString() + "\"") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(streamingResponseBody); - } catch (IOException e) { - throw new RuntimeException("Error reading file", e); - } - } - - - private Path resolvePath(UUID binaryContentId) { - if (binaryContentId == null) { - throw new IllegalArgumentException("binaryContentId cannot be null"); - } - return root.resolve(binaryContentId.toString()); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java b/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java deleted file mode 100644 index c8d9dcfed..000000000 --- a/src/main/java/com/sprint/mission/discodeit/swagger/SwaggerConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.sprint.mission.discodeit.swagger; - -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.OpenAPI; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@OpenAPIDefinition -public class SwaggerConfig { - - @Bean - public OpenAPI customOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("디스코드 프로젝트 API") - .description("디스코드와 비슷한 서비스를 제공하는 백엔드 API입니다") - .version("1.0")); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java deleted file mode 100644 index 7d6a7790e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/util/type/ChannelType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.sprint.mission.discodeit.util.type; - -public enum ChannelType { - PUBLIC, PRIVATE -} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index f3eab7188..000000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,27 +0,0 @@ -spring: - profiles: - active: local - - datasource: - url: jdbc:postgresql://localhost:5432/discodeit - username: discodeit_user - password: discodeit1234 - driver-class-name: org.postgresql.Driver - - jpa: - open-in-view: false - database-platform: org.hibernate.dialect.PostgreSQLDialect - hibernate: - ddl-auto: update - show-sql: true - -logging: - level: - org.springframework: info - com.sprint.mission.discodeit: debug - -discodeit: - storage: - local: - root-path: "C:\\upload" - diff --git a/src/main/resources/static/assets/index-kQJbKSsj.css b/src/main/resources/static/assets/index-kQJbKSsj.css new file mode 100644 index 000000000..096eb4112 --- /dev/null +++ b/src/main/resources/static/assets/index-kQJbKSsj.css @@ -0,0 +1 @@ +:root{font-family:Inter,system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}} diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..479bed6a3da0a8dbdd08a51d81b30e4d4fabae89 GIT binary patch literal 1588 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!Dv>Mu*Du8ycRt4Yw>0&$ytddU zdTHwA$vlU)7;*ZQn^d>r9eiw}SEV3v&DP3PpZVm?c2D=&D? zJg+7dT;x9cg;(mDqrovi2QemjySudY+_R1aaySb-B8!2p69!>MhFNnYfC{QST^vI! zPM@6=9?WDY()wLtM|S>=KoQ44K~Zk4us5=<8xs!eeY>~&=ly4!jD%AXj+wvro>aU~ zrMO$=?`j4U&ZyW$Je*!Zo0>H2RZVqmn^V&mZ(9Dkv!~|IuDF1RBN|EPJE zX3ok)rzF<3&vZKWEj4ag73&t}uJvVk^<~M;*V0n54#8@&v!WGjE_hAaeAZEF z$~V4aF>{^dUc7o%=f8f9m%*2vzjfI@vJ2Z97)VU5x-s2*r@e{H>FEn3A3Dr3G&8U| z)>wFiQO&|Yl6}UkXAQ>%q$jNWac-tTL*)AEyto|onkmnmcJLf?71w_<>4WODmBMxF zwGM7``txcQgT`x>(tH-DrT2Kg=4LzpNv>|+a@TgYDZ`5^$KJVb`K=%k^tRpoxP|4? zwXb!O5~dXYKYt*j(YSx+#_rP{TNcK=40T|)+k3s|?t||EQTgwGgs{E0Y+(QPL&Wx4 zMP23By&sn`zn7oCQQLp%-(Axm|M=5-u;TlFiTn5B^PWnb%fAPV8r2flh?11Vl2ohY zqEsNoU}Ruqple{LYiJr`U}|M-Vr62aZD3$!V6dZTmJ5o8-29Zxv`X9>PU+TH>UWRL)v7?M$%n`C9>lAm0fo0?Z*WfcHaTFhX${Qqu! zG&Nv5t*kOqGt)Cl7z{0q_!){?fojB&%z>&2&rB)F04ce=Mv()kL=s7fZ)R?4No7GQ z1K3si1$pWAo5K9i%<&BYs$wuSHMcY{Gc&O;(${(hEL0izk<1CstV(4taB`Zm$nFhL zDhx>~G{}=7Ei)$-=zaa%ypo*!bp5o%vdrZCykdPs#ORw@rkW)uCz=~4Cz={1nkQNs oC7PHSBpVtgnwc6|q*&+yb?5=zccWrGsMu%lboFyt=akR{0N~++#sB~S literal 0 HcmV?d00001 diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 000000000..3ba308ec1 --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,26 @@ + + + + + + Discodeit + + + + + +
+ + diff --git a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java index 6190b2ee5..3a987a214 100644 --- a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java +++ b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java @@ -6,7 +6,6 @@ @SpringBootTest class DiscodeitApplicationTests { - @Test void contextLoads() { } diff --git a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java deleted file mode 100644 index a73e46461..000000000 --- a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sprint.mission.discodeit.repository; - -import com.sprint.mission.discodeit.entity.User; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -class UserRepositoryTest { - @Autowired - UserRepository userRepository; - - @Test - void userSave() { - User user = User.builder() - .username("user00") - .email("user00@gmail.com") - .password("Abcdefgh1234!!") - .profile(null) - .build(); - userRepository.save(user); - } -} \ No newline at end of file diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java deleted file mode 100644 index 86c7a6984..000000000 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.sprint.mission.discodeit.service.basic; - -import com.sprint.mission.discodeit.dto.binarycontent.CreateBinaryContentRequest; -import com.sprint.mission.discodeit.dto.user.CreateUserRequest; -import com.sprint.mission.discodeit.dto.user.UserDTO;; -import com.sprint.mission.discodeit.entity.BinaryContent; -import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.entity.UserStatus; -import com.sprint.mission.discodeit.exception.ServiceException; -import com.sprint.mission.discodeit.repository.BinaryContentRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.UserStatusRepository; -import com.sprint.mission.discodeit.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -@Log4j2 -class BasicUserServiceTest { - @Autowired - private UserService userService; - - @Autowired - private BinaryContentRepository binaryContentRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserStatusRepository userStatusRepository; - - @Test - @DisplayName("회원 생성 테스트") - @Transactional - void createUserTest() { - // given - CreateUserRequest createUserRequest = new CreateUserRequest("testUser01", "testUser00@naver.com", "Alasdfasdew1234!!"); - CreateBinaryContentRequest createBinaryContentRequest = new CreateBinaryContentRequest( - "example.txt", // fileName - "text/plain", // contentType - "Hello, world!".getBytes(), // bytes - 1024L // size - ); - - // when - UserDTO userDTO = userService.create(createUserRequest, Optional.of(createBinaryContentRequest)); - - // then - User user = userRepository.findByUsername("testUser01").orElseThrow(); - BinaryContent binaryContent = binaryContentRepository.findById(user.getProfile().getId()).orElseThrow(); - UserStatus userStatus = userStatusRepository.findByUserId(user.getId()).orElseThrow(); - - // 검증 - assertNotNull(user, "User should be saved"); - log.info("user : {}", user); - assertNotNull(binaryContent, "BinaryContent should be saved"); - log.info("binaryContent : {}", binaryContent); - assertNotNull(userStatus, "UserStatus should be saved"); - log.info("userStatus : {}", userStatus); - } - - @Test - @DisplayName("회원 조회 테스트") - @Transactional - void findUserTest() { - // given - CreateUserRequest createUserRequest = new CreateUserRequest("testUser02", "testUser02@naver.com", "Alasdfasdew1234!!"); - CreateBinaryContentRequest createBinaryContentRequest = new CreateBinaryContentRequest( - "example2.txt", // fileName - "text/plain", // contentType - "Hello, world 2!".getBytes(), // bytes - 2048L // size - ); - UserDTO createdUserDTO = userService.create(createUserRequest, Optional.of(createBinaryContentRequest)); - - // when - UserDTO foundUserDTO = userService.find(createdUserDTO.getId()); - - // then - assertNotNull(foundUserDTO, "User should be found"); - assertEquals(createdUserDTO.getId(), foundUserDTO.getId(), "User IDs should match"); - } - - @Test - @DisplayName("모든 회원 조회 테스트") - @Transactional - void findAllUsersTest() { - CreateUserRequest createUserRequest1 = new CreateUserRequest("testUser01", "testUser01@naver.com", "Password1234!"); - CreateUserRequest createUserRequest2 = new CreateUserRequest("testUser02", "testUser02@naver.com", "Password1234!"); - - CreateBinaryContentRequest createBinaryContentRequest1 = new CreateBinaryContentRequest( - "example1.txt", "text/plain", "Hello, world 1!".getBytes(), 1024L - ); - CreateBinaryContentRequest createBinaryContentRequest2 = new CreateBinaryContentRequest( - "example2.txt", "text/plain", "Hello, world 2!".getBytes(), 1024L - ); - - userService.create(createUserRequest1, Optional.of(createBinaryContentRequest1)); - userService.create(createUserRequest2, Optional.of(createBinaryContentRequest2)); - - List users = userService.findAll(); - - assertTrue(users.size() >= 2, "There should be at least 2 users"); - } - - - @Test - @DisplayName("회원 삭제 테스트") - @Transactional - void deleteUserTest() { - // given - CreateUserRequest createUserRequest = new CreateUserRequest("testUser06", "testUser06@naver.com", "Alasdfasdew1234!!"); - CreateBinaryContentRequest createBinaryContentRequest = new CreateBinaryContentRequest( - "example4.txt", // fileName - "text/plain", // contentType - "Hello, world 4!".getBytes(), // bytes - 4096L // size - ); - UserDTO createdUserDTO = userService.create(createUserRequest, Optional.of(createBinaryContentRequest)); - - // when - userService.delete(createdUserDTO.getId()); - - // then - assertThrows(ServiceException.class, () -> userService.find(createdUserDTO.getId()), "User should be deleted and not found"); - } -} \ No newline at end of file From 2fa71338747a757ba99c13d39d3e8ccfdc2c40aa Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 27 Mar 2025 15:02:20 +0900 Subject: [PATCH 098/115] =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mission/discodeit/config/AppConfig.java | 10 + .../discodeit/config/SwaggerConfig.java | 25 + .../discodeit/controller/api/AuthApi.java | 36 + .../controller/api/BinaryContentApi.java | 57 + .../discodeit/controller/api/ChannelApi.java | 89 ++ .../discodeit/controller/api/MessageApi.java | 90 ++ .../controller/api/ReadStatusApi.java | 67 ++ .../discodeit/controller/api/UserApi.java | 109 ++ .../discodeit/dto/data/BinaryContentDto.java | 12 + .../discodeit/dto/data/ChannelDto.java | 17 + .../discodeit/dto/data/MessageDto.java | 17 + .../discodeit/dto/data/ReadStatusDto.java | 13 + .../mission/discodeit/dto/data/UserDto.java | 13 + .../discodeit/dto/data/UserStatusDto.java | 11 + .../request/BinaryContentCreateRequest.java | 9 + .../discodeit/dto/request/LoginRequest.java | 8 + .../dto/request/MessageCreateRequest.java | 11 + .../dto/request/MessageUpdateRequest.java | 7 + .../request/PrivateChannelCreateRequest.java | 10 + .../request/PublicChannelCreateRequest.java | 8 + .../request/PublicChannelUpdateRequest.java | 8 + .../dto/request/ReadStatusCreateRequest.java | 12 + .../dto/request/ReadStatusUpdateRequest.java | 9 + .../dto/request/UserCreateRequest.java | 9 + .../dto/request/UserStatusCreateRequest.java | 11 + .../dto/request/UserStatusUpdateRequest.java | 9 + .../dto/request/UserUpdateRequest.java | 9 + .../mission/discodeit/entity/ChannelType.java | 6 + .../entity/base/BaseUpdatableEntity.java | 19 + .../exception/GlobalExceptionHandler.java | 35 + .../discodeit/service/AuthService.java | 9 + .../local/LocalBinaryContentStorage.java | 89 ++ src/main/resources/application.yaml | 32 + src/main/resources/fe_bundle_1.2.3.zip | Bin 0 -> 95493 bytes src/main/resources/schema.sql | 126 ++ .../resources/static/assets/index-BdLer33P.js | 1015 +++++++++++++++++ 36 files changed, 2017 insertions(+) create mode 100644 src/main/java/com/sprint/mission/discodeit/config/AppConfig.java create mode 100644 src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java create mode 100644 src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/BinaryContentDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/MessageDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/ReadStatusDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/data/UserStatusDto.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java create mode 100644 src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdatableEntity.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/sprint/mission/discodeit/service/AuthService.java create mode 100644 src/main/java/com/sprint/mission/discodeit/storage/local/LocalBinaryContentStorage.java create mode 100644 src/main/resources/application.yaml create mode 100644 src/main/resources/fe_bundle_1.2.3.zip create mode 100644 src/main/resources/schema.sql create mode 100644 src/main/resources/static/assets/index-BdLer33P.js diff --git a/src/main/java/com/sprint/mission/discodeit/config/AppConfig.java b/src/main/java/com/sprint/mission/discodeit/config/AppConfig.java new file mode 100644 index 000000000..96010621f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/AppConfig.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@Configuration +@EnableJpaAuditing +public class AppConfig { + +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java b/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java new file mode 100644 index 000000000..15a777199 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/SwaggerConfig.java @@ -0,0 +1,25 @@ +package com.sprint.mission.discodeit.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.servers.Server; +import java.util.List; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("Discodeit API 문서") + .description("Discodeit 프로젝트의 Swagger API 문서입니다.") + .version("1.2") + ) + .servers(List.of( + new Server().url("http://localhost:8080").description("로컬 서버") + )); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java new file mode 100644 index 000000000..ee9ce79f9 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/api/AuthApi.java @@ -0,0 +1,36 @@ +package com.sprint.mission.discodeit.controller.api; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.LoginRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.ResponseEntity; + +@Tag(name = "Auth", description = "인증 API") +public interface AuthApi { + + @Operation(summary = "로그인") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "로그인 성공", + content = @Content(schema = @Schema(implementation = UserDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "사용자를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "User with username {username} not found")) + ), + @ApiResponse( + responseCode = "400", description = "비밀번호가 일치하지 않음", + content = @Content(examples = @ExampleObject(value = "Wrong password")) + ) + }) + ResponseEntity login( + @Parameter(description = "로그인 정보") LoginRequest loginRequest + ); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java new file mode 100644 index 000000000..883ab8a88 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/api/BinaryContentApi.java @@ -0,0 +1,57 @@ +package com.sprint.mission.discodeit.controller.api; + +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import java.util.UUID; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; + +@Tag(name = "BinaryContent", description = "첨부 파일 API") +public interface BinaryContentApi { + + @Operation(summary = "첨부 파일 조회") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "첨부 파일 조회 성공", + content = @Content(schema = @Schema(implementation = BinaryContentDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "첨부 파일을 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "BinaryContent with id {binaryContentId} not found")) + ) + }) + ResponseEntity find( + @Parameter(description = "조회할 첨부 파일 ID") UUID binaryContentId + ); + + @Operation(summary = "여러 첨부 파일 조회") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "첨부 파일 목록 조회 성공", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = BinaryContentDto.class))) + ) + }) + ResponseEntity> findAllByIdIn( + @Parameter(description = "조회할 첨부 파일 ID 목록") List binaryContentIds + ); + + @Operation(summary = "파일 다운로드") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "파일 다운로드 성공", + content = @Content(schema = @Schema(implementation = Resource.class)) + ) + }) + ResponseEntity download( + @Parameter(description = "다운로드할 파일 ID") UUID binaryContentId + ); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java new file mode 100644 index 000000000..af8c7afc7 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/api/ChannelApi.java @@ -0,0 +1,89 @@ +package com.sprint.mission.discodeit.controller.api; + +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import java.util.UUID; +import org.springframework.http.ResponseEntity; + +@Tag(name = "Channel", description = "Channel API") +public interface ChannelApi { + + @Operation(summary = "Public Channel 생성") + @ApiResponses(value = { + @ApiResponse( + responseCode = "201", description = "Public Channel이 성공적으로 생성됨", + content = @Content(schema = @Schema(implementation = ChannelDto.class)) + ) + }) + ResponseEntity create( + @Parameter(description = "Public Channel 생성 정보") PublicChannelCreateRequest request + ); + + @Operation(summary = "Private Channel 생성") + @ApiResponses(value = { + @ApiResponse( + responseCode = "201", description = "Private Channel이 성공적으로 생성됨", + content = @Content(schema = @Schema(implementation = ChannelDto.class)) + ) + }) + ResponseEntity create( + @Parameter(description = "Private Channel 생성 정보") PrivateChannelCreateRequest request + ); + + @Operation(summary = "Channel 정보 수정") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "Channel 정보가 성공적으로 수정됨", + content = @Content(schema = @Schema(implementation = ChannelDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "Channel을 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "Channel with id {channelId} not found")) + ), + @ApiResponse( + responseCode = "400", description = "Private Channel은 수정할 수 없음", + content = @Content(examples = @ExampleObject(value = "Private channel cannot be updated")) + ) + }) + ResponseEntity update( + @Parameter(description = "수정할 Channel ID") UUID channelId, + @Parameter(description = "수정할 Channel 정보") PublicChannelUpdateRequest request + ); + + @Operation(summary = "Channel 삭제") + @ApiResponses(value = { + @ApiResponse( + responseCode = "204", description = "Channel이 성공적으로 삭제됨" + ), + @ApiResponse( + responseCode = "404", description = "Channel을 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "Channel with id {channelId} not found")) + ) + }) + ResponseEntity delete( + @Parameter(description = "삭제할 Channel ID") UUID channelId + ); + + @Operation(summary = "User가 참여 중인 Channel 목록 조회") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "Channel 목록 조회 성공", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ChannelDto.class))) + ) + }) + ResponseEntity> findAll( + @Parameter(description = "조회할 User ID") UUID userId + ); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java new file mode 100644 index 000000000..c9a7aebbd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/api/MessageApi.java @@ -0,0 +1,90 @@ +package com.sprint.mission.discodeit.controller.api; + +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; +import com.sprint.mission.discodeit.dto.response.PageResponse; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.time.Instant; +import java.util.List; +import java.util.UUID; +import org.springframework.data.domain.Pageable; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "Message", description = "Message API") +public interface MessageApi { + + @Operation(summary = "Message 생성") + @ApiResponses(value = { + @ApiResponse( + responseCode = "201", description = "Message가 성공적으로 생성됨", + content = @Content(schema = @Schema(implementation = MessageDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "Channel 또는 User를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "Channel | Author with id {channelId | authorId} not found")) + ), + }) + ResponseEntity create( + @Parameter( + description = "Message 생성 정보", + content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE) + ) MessageCreateRequest messageCreateRequest, + @Parameter( + description = "Message 첨부 파일들", + content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE) + ) List attachments + ); + + @Operation(summary = "Message 내용 수정") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "Message가 성공적으로 수정됨", + content = @Content(schema = @Schema(implementation = MessageDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "Message를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "Message with id {messageId} not found")) + ), + }) + ResponseEntity update( + @Parameter(description = "수정할 Message ID") UUID messageId, + @Parameter(description = "수정할 Message 내용") MessageUpdateRequest request + ); + + @Operation(summary = "Message 삭제") + @ApiResponses(value = { + @ApiResponse( + responseCode = "204", description = "Message가 성공적으로 삭제됨" + ), + @ApiResponse( + responseCode = "404", description = "Message를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "Message with id {messageId} not found")) + ), + }) + ResponseEntity delete( + @Parameter(description = "삭제할 Message ID") UUID messageId + ); + + @Operation(summary = "Channel의 Message 목록 조회") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "Message 목록 조회 성공", + content = @Content(schema = @Schema(implementation = PageResponse.class)) + ) + }) + ResponseEntity> findAllByChannelId( + @Parameter(description = "조회할 Channel ID") UUID channelId, + @Parameter(description = "페이징 커서 정보") Instant cursor, + @Parameter(description = "페이징 정보", example = "{\"size\": 50, \"sort\": \"createdAt,desc\"}") Pageable pageable + ); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java new file mode 100644 index 000000000..eb08b359f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/api/ReadStatusApi.java @@ -0,0 +1,67 @@ +package com.sprint.mission.discodeit.controller.api; + +import com.sprint.mission.discodeit.dto.data.ReadStatusDto; +import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; +import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import java.util.UUID; +import org.springframework.http.ResponseEntity; + +@Tag(name = "ReadStatus", description = "Message 읽음 상태 API") +public interface ReadStatusApi { + + @Operation(summary = "Message 읽음 상태 생성") + @ApiResponses(value = { + @ApiResponse( + responseCode = "201", description = "Message 읽음 상태가 성공적으로 생성됨", + content = @Content(schema = @Schema(implementation = ReadStatusDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "Channel 또는 User를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "Channel | User with id {channelId | userId} not found")) + ), + @ApiResponse( + responseCode = "400", description = "이미 읽음 상태가 존재함", + content = @Content(examples = @ExampleObject(value = "ReadStatus with userId {userId} and channelId {channelId} already exists")) + ) + }) + ResponseEntity create( + @Parameter(description = "Message 읽음 상태 생성 정보") ReadStatusCreateRequest request + ); + + @Operation(summary = "Message 읽음 상태 수정") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "Message 읽음 상태가 성공적으로 수정됨", + content = @Content(schema = @Schema(implementation = ReadStatusDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "Message 읽음 상태를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "ReadStatus with id {readStatusId} not found")) + ) + }) + ResponseEntity update( + @Parameter(description = "수정할 읽음 상태 ID") UUID readStatusId, + @Parameter(description = "수정할 읽음 상태 정보") ReadStatusUpdateRequest request + ); + + @Operation(summary = "User의 Message 읽음 상태 목록 조회") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "Message 읽음 상태 목록 조회 성공", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ReadStatusDto.class))) + ) + }) + ResponseEntity> findAllByUserId( + @Parameter(description = "조회할 User ID") UUID userId + ); +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java b/src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java new file mode 100644 index 000000000..9d40bc1ce --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/controller/api/UserApi.java @@ -0,0 +1,109 @@ +package com.sprint.mission.discodeit.controller.api; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.data.UserStatusDto; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import java.util.UUID; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "User", description = "User API") +public interface UserApi { + + @Operation(summary = "User 등록") + @ApiResponses(value = { + @ApiResponse( + responseCode = "201", description = "User가 성공적으로 생성됨", + content = @Content(schema = @Schema(implementation = UserDto.class)) + ), + @ApiResponse( + responseCode = "400", description = "같은 email 또는 username를 사용하는 User가 이미 존재함", + content = @Content(examples = @ExampleObject(value = "User with email {email} already exists")) + ), + }) + ResponseEntity create( + @Parameter( + description = "User 생성 정보", + content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE) + ) UserCreateRequest userCreateRequest, + @Parameter( + description = "User 프로필 이미지", + content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE) + ) MultipartFile profile + ); + + @Operation(summary = "User 정보 수정") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "User 정보가 성공적으로 수정됨", + content = @Content(schema = @Schema(implementation = UserDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "User를 찾을 수 없음", + content = @Content(examples = @ExampleObject("User with id {userId} not found")) + ), + @ApiResponse( + responseCode = "400", description = "같은 email 또는 username를 사용하는 User가 이미 존재함", + content = @Content(examples = @ExampleObject("user with email {newEmail} already exists")) + ) + }) + ResponseEntity update( + @Parameter(description = "수정할 User ID") UUID userId, + @Parameter(description = "수정할 User 정보") UserUpdateRequest userUpdateRequest, + @Parameter(description = "수정할 User 프로필 이미지") MultipartFile profile + ); + + @Operation(summary = "User 삭제") + @ApiResponses(value = { + @ApiResponse( + responseCode = "204", + description = "User가 성공적으로 삭제됨" + ), + @ApiResponse( + responseCode = "404", + description = "User를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "User with id {id} not found")) + ) + }) + ResponseEntity delete( + @Parameter(description = "삭제할 User ID") UUID userId + ); + + @Operation(summary = "전체 User 목록 조회") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "User 목록 조회 성공", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = UserDto.class))) + ) + }) + ResponseEntity> findAll(); + + @Operation(summary = "User 온라인 상태 업데이트") + @ApiResponses(value = { + @ApiResponse( + responseCode = "200", description = "User 온라인 상태가 성공적으로 업데이트됨", + content = @Content(schema = @Schema(implementation = UserStatusDto.class)) + ), + @ApiResponse( + responseCode = "404", description = "해당 User의 UserStatus를 찾을 수 없음", + content = @Content(examples = @ExampleObject(value = "UserStatus with userId {userId} not found")) + ) + }) + ResponseEntity updateUserStatusByUserId( + @Parameter(description = "상태를 변경할 User ID") UUID userId, + @Parameter(description = "변경할 User 온라인 상태 정보") UserStatusUpdateRequest request + ); +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/BinaryContentDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/BinaryContentDto.java new file mode 100644 index 000000000..d44aee484 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/BinaryContentDto.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.data; + +import java.util.UUID; + +public record BinaryContentDto( + UUID id, + String fileName, + Long size, + String contentType +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java new file mode 100644 index 000000000..cf9b99080 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/ChannelDto.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.dto.data; + +import com.sprint.mission.discodeit.entity.ChannelType; +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public record ChannelDto( + UUID id, + ChannelType type, + String name, + String description, + List participants, + Instant lastMessageAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/MessageDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/MessageDto.java new file mode 100644 index 000000000..6bcaa0907 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/MessageDto.java @@ -0,0 +1,17 @@ +package com.sprint.mission.discodeit.dto.data; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +public record MessageDto( + UUID id, + Instant createdAt, + Instant updatedAt, + String content, + UUID channelId, + UserDto author, + List attachments +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/ReadStatusDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/ReadStatusDto.java new file mode 100644 index 000000000..1d0bc2c12 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/ReadStatusDto.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto.data; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusDto( + UUID id, + UUID userId, + UUID channelId, + Instant lastReadAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java new file mode 100644 index 000000000..aa696a69f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/UserDto.java @@ -0,0 +1,13 @@ +package com.sprint.mission.discodeit.dto.data; + +import java.util.UUID; + +public record UserDto( + UUID id, + String username, + String email, + BinaryContentDto profile, + Boolean online +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/data/UserStatusDto.java b/src/main/java/com/sprint/mission/discodeit/dto/data/UserStatusDto.java new file mode 100644 index 000000000..87ee9d000 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/data/UserStatusDto.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.data; + +import java.time.Instant; +import java.util.UUID; + +public record UserStatusDto( + UUID id, + UUID userId, + Instant lastActiveAt) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java new file mode 100644 index 000000000..d86eb9898 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/BinaryContentCreateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request; + +public record BinaryContentCreateRequest( + String fileName, + String contentType, + byte[] bytes +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java new file mode 100644 index 000000000..51ca9e620 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record LoginRequest( + String username, + String password +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java new file mode 100644 index 000000000..0f65742b1 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.util.UUID; + +public record MessageCreateRequest( + String content, + UUID channelId, + UUID authorId +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java new file mode 100644 index 000000000..d786b1e8c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageUpdateRequest.java @@ -0,0 +1,7 @@ +package com.sprint.mission.discodeit.dto.request; + +public record MessageUpdateRequest( + String newContent +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java new file mode 100644 index 000000000..7edd4e823 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PrivateChannelCreateRequest.java @@ -0,0 +1,10 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.util.List; +import java.util.UUID; + +public record PrivateChannelCreateRequest( + List participantIds +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java new file mode 100644 index 000000000..48e26327a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record PublicChannelCreateRequest( + String name, + String description +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java new file mode 100644 index 000000000..d6e515410 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelUpdateRequest.java @@ -0,0 +1,8 @@ +package com.sprint.mission.discodeit.dto.request; + +public record PublicChannelUpdateRequest( + String newName, + String newDescription +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java new file mode 100644 index 000000000..046a48808 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; +import java.util.UUID; + +public record ReadStatusCreateRequest( + UUID userId, + UUID channelId, + Instant lastReadAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java new file mode 100644 index 000000000..16b0c27ce --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; + +public record ReadStatusUpdateRequest( + Instant newLastReadAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java new file mode 100644 index 000000000..e10e0ec57 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request; + +public record UserCreateRequest( + String username, + String email, + String password +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java new file mode 100644 index 000000000..71c92abba --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; +import java.util.UUID; + +public record UserStatusCreateRequest( + UUID userId, + Instant lastActiveAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java new file mode 100644 index 000000000..c69b2610f --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request; + +import java.time.Instant; + +public record UserStatusUpdateRequest( + Instant newLastActiveAt +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java new file mode 100644 index 000000000..1e14e2cbd --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.dto.request; + +public record UserUpdateRequest( + String newUsername, + String newEmail, + String newPassword +) { + +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java new file mode 100644 index 000000000..4fca37721 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/ChannelType.java @@ -0,0 +1,6 @@ +package com.sprint.mission.discodeit.entity; + +public enum ChannelType { + PUBLIC, + PRIVATE, +} diff --git a/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdatableEntity.java b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdatableEntity.java new file mode 100644 index 000000000..57d1d3169 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/entity/base/BaseUpdatableEntity.java @@ -0,0 +1,19 @@ +package com.sprint.mission.discodeit.entity.base; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import java.time.Instant; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.LastModifiedDate; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@MappedSuperclass +public abstract class BaseUpdatableEntity extends BaseEntity { + + @LastModifiedDate + @Column(columnDefinition = "timestamp with time zone") + private Instant updatedAt; +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java new file mode 100644 index 000000000..513caead2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java @@ -0,0 +1,35 @@ +package com.sprint.mission.discodeit.exception; + +import java.util.NoSuchElementException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleException(IllegalArgumentException e) { + e.printStackTrace(); + return ResponseEntity + .status(HttpStatus.BAD_REQUEST) + .body(e.getMessage()); + } + + @ExceptionHandler(NoSuchElementException.class) + public ResponseEntity handleException(NoSuchElementException e) { + e.printStackTrace(); + return ResponseEntity + .status(HttpStatus.NOT_FOUND) + .body(e.getMessage()); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception e) { + e.printStackTrace(); + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(e.getMessage()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/AuthService.java b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java new file mode 100644 index 000000000..a1caf1d2d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/service/AuthService.java @@ -0,0 +1,9 @@ +package com.sprint.mission.discodeit.service; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.LoginRequest; + +public interface AuthService { + + UserDto login(LoginRequest loginRequest); +} diff --git a/src/main/java/com/sprint/mission/discodeit/storage/local/LocalBinaryContentStorage.java b/src/main/java/com/sprint/mission/discodeit/storage/local/LocalBinaryContentStorage.java new file mode 100644 index 000000000..8922903c0 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/storage/local/LocalBinaryContentStorage.java @@ -0,0 +1,89 @@ +package com.sprint.mission.discodeit.storage.local; + +import com.sprint.mission.discodeit.dto.data.BinaryContentDto; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; +import jakarta.annotation.PostConstruct; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.NoSuchElementException; +import java.util.UUID; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +@ConditionalOnProperty(name = "discodeit.storage.type", havingValue = "local") +@Component +public class LocalBinaryContentStorage implements BinaryContentStorage { + + private final Path root; + + public LocalBinaryContentStorage( + @Value("${discodeit.storage.local.root-path}") Path root + ) { + this.root = root; + } + + @PostConstruct + public void init() { + if (!Files.exists(root)) { + try { + Files.createDirectories(root); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + } + + public UUID put(UUID binaryContentId, byte[] bytes) { + Path filePath = resolvePath(binaryContentId); + if (Files.exists(filePath)) { + throw new IllegalArgumentException("File with key " + binaryContentId + " already exists"); + } + try (OutputStream outputStream = Files.newOutputStream(filePath)) { + outputStream.write(bytes); + } catch (IOException e) { + throw new RuntimeException(e); + } + return binaryContentId; + } + + public InputStream get(UUID binaryContentId) { + Path filePath = resolvePath(binaryContentId); + if (Files.notExists(filePath)) { + throw new NoSuchElementException("File with key " + binaryContentId + " does not exist"); + } + try { + return Files.newInputStream(filePath); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private Path resolvePath(UUID key) { + return root.resolve(key.toString()); + } + + @Override + public ResponseEntity download(BinaryContentDto metaData) { + InputStream inputStream = get(metaData.id()); + Resource resource = new InputStreamResource(inputStream); + + return ResponseEntity + .status(HttpStatus.OK) + .header(HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename=\"" + metaData.fileName() + "\"") + .header(HttpHeaders.CONTENT_TYPE, metaData.contentType()) + .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(metaData.size())) + .body(resource); + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 000000000..0c9d365e9 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,32 @@ +spring: + application: + name: discodeit + servlet: + multipart: + maxFileSize: 10MB # 파일 하나의 최대 크기 + maxRequestSize: 30MB # 한 번에 최대 업로드 가능 용량 + datasource: + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:5432/discodeit + username: discodeit_user + password: discodeit1234 + jpa: + hibernate: + ddl-auto: validate + properties: + hibernate: + format_sql: true + # default_batch_fetch_size: 100 + open-in-view: false + + +logging: + level: + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace + +discodeit: + storage: + type: local + local: + root-path: .discodeit/storage diff --git a/src/main/resources/fe_bundle_1.2.3.zip b/src/main/resources/fe_bundle_1.2.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..852a0869c0058982bcd14d2879e20e95e78927c2 GIT binary patch literal 95493 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�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 |HJx!8ETT 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 BOw#}W literal 0 HcmV?d00001 diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 000000000..c658649cd --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,126 @@ +-- 테이블 +-- User +CREATE TABLE users +( + id uuid PRIMARY KEY, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone, + username varchar(50) UNIQUE NOT NULL, + email varchar(100) UNIQUE NOT NULL, + password varchar(60) NOT NULL, + profile_id uuid +); + +-- BinaryContent +CREATE TABLE binary_contents +( + id uuid PRIMARY KEY, + created_at timestamp with time zone NOT NULL, + file_name varchar(255) NOT NULL, + size bigint NOT NULL, + content_type varchar(100) NOT NULL +-- ,bytes bytea NOT NULL +); + +-- UserStatus +CREATE TABLE user_statuses +( + id uuid PRIMARY KEY, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone, + user_id uuid UNIQUE NOT NULL, + last_active_at timestamp with time zone NOT NULL +); + +-- Channel +CREATE TABLE channels +( + id uuid PRIMARY KEY, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone, + name varchar(100), + description varchar(500), + type varchar(10) NOT NULL +); + +-- Message +CREATE TABLE messages +( + id uuid PRIMARY KEY, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone, + content text, + channel_id uuid NOT NULL, + author_id uuid +); + +-- Message.attachments +CREATE TABLE message_attachments +( + message_id uuid, + attachment_id uuid, + PRIMARY KEY (message_id, attachment_id) +); + +-- ReadStatus +CREATE TABLE read_statuses +( + id uuid PRIMARY KEY, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone, + user_id uuid NOT NULL, + channel_id uuid NOT NULL, + last_read_at timestamp with time zone NOT NULL, + UNIQUE (user_id, channel_id) +); + + +-- 제약 조건 +-- User (1) -> BinaryContent (1) +ALTER TABLE users + ADD CONSTRAINT fk_user_binary_content + FOREIGN KEY (profile_id) + REFERENCES binary_contents (id) + ON DELETE SET NULL; + +-- UserStatus (1) -> User (1) +ALTER TABLE user_statuses + ADD CONSTRAINT fk_user_status_user + FOREIGN KEY (user_id) + REFERENCES users (id) + ON DELETE CASCADE; + +-- Message (N) -> Channel (1) +ALTER TABLE messages + ADD CONSTRAINT fk_message_channel + FOREIGN KEY (channel_id) + REFERENCES channels (id) + ON DELETE CASCADE; + +-- Message (N) -> Author (1) +ALTER TABLE messages + ADD CONSTRAINT fk_message_user + FOREIGN KEY (author_id) + REFERENCES users (id) + ON DELETE SET NULL; + +-- MessageAttachment (1) -> BinaryContent (1) +ALTER TABLE message_attachments + ADD CONSTRAINT fk_message_attachment_binary_content + FOREIGN KEY (attachment_id) + REFERENCES binary_contents (id) + ON DELETE CASCADE; + +-- ReadStatus (N) -> User (1) +ALTER TABLE read_statuses + ADD CONSTRAINT fk_read_status_user + FOREIGN KEY (user_id) + REFERENCES users (id) + ON DELETE CASCADE; + +-- ReadStatus (N) -> User (1) +ALTER TABLE read_statuses + ADD CONSTRAINT fk_read_status_channel + FOREIGN KEY (channel_id) + REFERENCES channels (id) + ON DELETE CASCADE; \ No newline at end of file diff --git a/src/main/resources/static/assets/index-BdLer33P.js b/src/main/resources/static/assets/index-BdLer33P.js new file mode 100644 index 000000000..397601bcf --- /dev/null +++ b/src/main/resources/static/assets/index-BdLer33P.js @@ -0,0 +1,1015 @@ +var og=Object.defineProperty;var ig=(r,i,s)=>i in r?og(r,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):r[i]=s;var ed=(r,i,s)=>ig(r,typeof i!="symbol"?i+"":i,s);(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))l(c);new MutationObserver(c=>{for(const f of c)if(f.type==="childList")for(const p of f.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&l(p)}).observe(document,{childList:!0,subtree:!0});function s(c){const f={};return c.integrity&&(f.integrity=c.integrity),c.referrerPolicy&&(f.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?f.credentials="include":c.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function l(c){if(c.ep)return;c.ep=!0;const f=s(c);fetch(c.href,f)}})();function sg(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var mu={exports:{}},yo={},gu={exports:{}},fe={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var td;function lg(){if(td)return fe;td=1;var r=Symbol.for("react.element"),i=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),p=Symbol.for("react.context"),g=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),A=Symbol.iterator;function T(E){return E===null||typeof E!="object"?null:(E=A&&E[A]||E["@@iterator"],typeof E=="function"?E:null)}var I={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},R=Object.assign,C={};function N(E,D,se){this.props=E,this.context=D,this.refs=C,this.updater=se||I}N.prototype.isReactComponent={},N.prototype.setState=function(E,D){if(typeof E!="object"&&typeof E!="function"&&E!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,E,D,"setState")},N.prototype.forceUpdate=function(E){this.updater.enqueueForceUpdate(this,E,"forceUpdate")};function b(){}b.prototype=N.prototype;function U(E,D,se){this.props=E,this.context=D,this.refs=C,this.updater=se||I}var V=U.prototype=new b;V.constructor=U,R(V,N.prototype),V.isPureReactComponent=!0;var Q=Array.isArray,$=Object.prototype.hasOwnProperty,L={current:null},B={key:!0,ref:!0,__self:!0,__source:!0};function ie(E,D,se){var ue,de={},ce=null,ve=null;if(D!=null)for(ue in D.ref!==void 0&&(ve=D.ref),D.key!==void 0&&(ce=""+D.key),D)$.call(D,ue)&&!B.hasOwnProperty(ue)&&(de[ue]=D[ue]);var pe=arguments.length-2;if(pe===1)de.children=se;else if(1>>1,D=W[E];if(0>>1;Ec(de,Y))cec(ve,de)?(W[E]=ve,W[ce]=Y,E=ce):(W[E]=de,W[ue]=Y,E=ue);else if(cec(ve,Y))W[E]=ve,W[ce]=Y,E=ce;else break e}}return Z}function c(W,Z){var Y=W.sortIndex-Z.sortIndex;return Y!==0?Y:W.id-Z.id}if(typeof performance=="object"&&typeof performance.now=="function"){var f=performance;r.unstable_now=function(){return f.now()}}else{var p=Date,g=p.now();r.unstable_now=function(){return p.now()-g}}var x=[],v=[],S=1,A=null,T=3,I=!1,R=!1,C=!1,N=typeof setTimeout=="function"?setTimeout:null,b=typeof clearTimeout=="function"?clearTimeout:null,U=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function V(W){for(var Z=s(v);Z!==null;){if(Z.callback===null)l(v);else if(Z.startTime<=W)l(v),Z.sortIndex=Z.expirationTime,i(x,Z);else break;Z=s(v)}}function Q(W){if(C=!1,V(W),!R)if(s(x)!==null)R=!0,Ve($);else{var Z=s(v);Z!==null&&Se(Q,Z.startTime-W)}}function $(W,Z){R=!1,C&&(C=!1,b(ie),ie=-1),I=!0;var Y=T;try{for(V(Z),A=s(x);A!==null&&(!(A.expirationTime>Z)||W&&!Wt());){var E=A.callback;if(typeof E=="function"){A.callback=null,T=A.priorityLevel;var D=E(A.expirationTime<=Z);Z=r.unstable_now(),typeof D=="function"?A.callback=D:A===s(x)&&l(x),V(Z)}else l(x);A=s(x)}if(A!==null)var se=!0;else{var ue=s(v);ue!==null&&Se(Q,ue.startTime-Z),se=!1}return se}finally{A=null,T=Y,I=!1}}var L=!1,B=null,ie=-1,ye=5,Je=-1;function Wt(){return!(r.unstable_now()-JeW||125E?(W.sortIndex=Y,i(v,W),s(x)===null&&W===s(v)&&(C?(b(ie),ie=-1):C=!0,Se(Q,Y-E))):(W.sortIndex=D,i(x,W),R||I||(R=!0,Ve($))),W},r.unstable_shouldYield=Wt,r.unstable_wrapCallback=function(W){var Z=T;return function(){var Y=T;T=Z;try{return W.apply(this,arguments)}finally{T=Y}}}}(wu)),wu}var sd;function fg(){return sd||(sd=1,vu.exports=cg()),vu.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var ld;function dg(){if(ld)return lt;ld=1;var r=Ku(),i=fg();function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),x=Object.prototype.hasOwnProperty,v=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,S={},A={};function T(e){return x.call(A,e)?!0:x.call(S,e)?!1:v.test(e)?A[e]=!0:(S[e]=!0,!1)}function I(e,t,n,o){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function R(e,t,n,o){if(t===null||typeof t>"u"||I(e,t,n,o))return!0;if(o)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function C(e,t,n,o,u,a,d){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=u,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=d}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new C(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];N[t]=new C(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new C(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new C(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){N[e]=new C(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new C(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new C(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new C(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new C(e,5,!1,e.toLowerCase(),null,!1,!1)});var b=/[\-:]([a-z])/g;function U(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(b,U);N[t]=new C(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(b,U);N[t]=new C(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(b,U);N[t]=new C(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new C(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new C("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new C(e,1,!1,e.toLowerCase(),null,!0,!0)});function V(e,t,n,o){var u=N.hasOwnProperty(t)?N[t]:null;(u!==null?u.type!==0:o||!(2m||u[d]!==a[m]){var y=` +`+u[d].replace(" at new "," at ");return e.displayName&&y.includes("")&&(y=y.replace("",e.displayName)),y}while(1<=d&&0<=m);break}}}finally{se=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?D(e):""}function de(e){switch(e.tag){case 5:return D(e.type);case 16:return D("Lazy");case 13:return D("Suspense");case 19:return D("SuspenseList");case 0:case 2:case 15:return e=ue(e.type,!1),e;case 11:return e=ue(e.type.render,!1),e;case 1:return e=ue(e.type,!0),e;default:return""}}function ce(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case B:return"Fragment";case L:return"Portal";case ye:return"Profiler";case ie:return"StrictMode";case Ze:return"Suspense";case at:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Wt:return(e.displayName||"Context")+".Consumer";case Je:return(e._context.displayName||"Context")+".Provider";case vt:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case wt:return t=e.displayName||null,t!==null?t:ce(e.type)||"Memo";case Ve:t=e._payload,e=e._init;try{return ce(e(t))}catch{}}return null}function ve(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ce(t);case 8:return t===ie?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function pe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function me(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function $e(e){var t=me(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var u=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return u.call(this)},set:function(d){o=""+d,a.call(this,d)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(d){o=""+d},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Yt(e){e._valueTracker||(e._valueTracker=$e(e))}function Rt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=me(e)?e.checked?"true":"false":e.value),e=o,e!==n?(t.setValue(e),!0):!1}function No(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Es(e,t){var n=t.checked;return Y({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function sa(e,t){var n=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;n=pe(t.value!=null?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function la(e,t){t=t.checked,t!=null&&V(e,"checked",t,!1)}function Cs(e,t){la(e,t);var n=pe(t.value),o=t.type;if(n!=null)o==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ks(e,t.type,n):t.hasOwnProperty("defaultValue")&&ks(e,t.type,pe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ua(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function ks(e,t,n){(t!=="number"||No(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Ir=Array.isArray;function qn(e,t,n,o){if(e=e.options,t){t={};for(var u=0;u"+t.valueOf().toString()+"",t=Oo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Nr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Or={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ah=["Webkit","ms","Moz","O"];Object.keys(Or).forEach(function(e){ah.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Or[t]=Or[e]})});function ha(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Or.hasOwnProperty(e)&&Or[e]?(""+t).trim():t+"px"}function ma(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var o=n.indexOf("--")===0,u=ha(n,t[n],o);n==="float"&&(n="cssFloat"),o?e.setProperty(n,u):e[n]=u}}var ch=Y({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Rs(e,t){if(t){if(ch[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(s(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(s(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(t.style!=null&&typeof t.style!="object")throw Error(s(62))}}function Ps(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var _s=null;function Ts(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Is=null,Qn=null,Gn=null;function ga(e){if(e=to(e)){if(typeof Is!="function")throw Error(s(280));var t=e.stateNode;t&&(t=ni(t),Is(e.stateNode,e.type,t))}}function ya(e){Qn?Gn?Gn.push(e):Gn=[e]:Qn=e}function va(){if(Qn){var e=Qn,t=Gn;if(Gn=Qn=null,ga(e),t)for(e=0;e>>=0,e===0?32:31-(Sh(e)/Eh|0)|0}var Uo=64,Fo=4194304;function zr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Bo(e,t){var n=e.pendingLanes;if(n===0)return 0;var o=0,u=e.suspendedLanes,a=e.pingedLanes,d=n&268435455;if(d!==0){var m=d&~u;m!==0?o=zr(m):(a&=d,a!==0&&(o=zr(a)))}else d=n&~u,d!==0?o=zr(d):a!==0&&(o=zr(a));if(o===0)return 0;if(t!==0&&t!==o&&!(t&u)&&(u=o&-o,a=t&-t,u>=a||u===16&&(a&4194240)!==0))return t;if(o&4&&(o|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0n;n++)t.push(e);return t}function Ur(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Pt(t),e[t]=n}function Ah(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Yr),Ya=" ",qa=!1;function Qa(e,t){switch(e){case"keyup":return em.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ga(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Jn=!1;function nm(e,t){switch(e){case"compositionend":return Ga(t);case"keypress":return t.which!==32?null:(qa=!0,Ya);case"textInput":return e=t.data,e===Ya&&qa?null:e;default:return null}}function rm(e,t){if(Jn)return e==="compositionend"||!Gs&&Qa(e,t)?(e=Ba(),Wo=bs=an=null,Jn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=o}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=nc(n)}}function oc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?oc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ic(){for(var e=window,t=No();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=No(e.document)}return t}function Js(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function dm(e){var t=ic(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&oc(n.ownerDocument.documentElement,n)){if(o!==null&&Js(n)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var u=n.textContent.length,a=Math.min(o.start,u);o=o.end===void 0?a:Math.min(o.end,u),!e.extend&&a>o&&(u=o,o=a,a=u),u=rc(n,a);var d=rc(n,o);u&&d&&(e.rangeCount!==1||e.anchorNode!==u.node||e.anchorOffset!==u.offset||e.focusNode!==d.node||e.focusOffset!==d.offset)&&(t=t.createRange(),t.setStart(u.node,u.offset),e.removeAllRanges(),a>o?(e.addRange(t),e.extend(d.node,d.offset)):(t.setEnd(d.node,d.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Zn=null,Zs=null,Kr=null,el=!1;function sc(e,t,n){var o=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;el||Zn==null||Zn!==No(o)||(o=Zn,"selectionStart"in o&&Js(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Kr&&Gr(Kr,o)||(Kr=o,o=Zo(Zs,"onSelect"),0or||(e.current=dl[or],dl[or]=null,or--)}function Ee(e,t){or++,dl[or]=e.current,e.current=t}var pn={},We=dn(pn),nt=dn(!1),Rn=pn;function ir(e,t){var n=e.type.contextTypes;if(!n)return pn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var u={},a;for(a in n)u[a]=t[a];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=u),u}function rt(e){return e=e.childContextTypes,e!=null}function ri(){ke(nt),ke(We)}function Sc(e,t,n){if(We.current!==pn)throw Error(s(168));Ee(We,t),Ee(nt,n)}function Ec(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return n;o=o.getChildContext();for(var u in o)if(!(u in t))throw Error(s(108,ve(e)||"Unknown",u));return Y({},n,o)}function oi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||pn,Rn=We.current,Ee(We,e),Ee(nt,nt.current),!0}function Cc(e,t,n){var o=e.stateNode;if(!o)throw Error(s(169));n?(e=Ec(e,t,Rn),o.__reactInternalMemoizedMergedChildContext=e,ke(nt),ke(We),Ee(We,e)):ke(nt),Ee(nt,n)}var Qt=null,ii=!1,pl=!1;function kc(e){Qt===null?Qt=[e]:Qt.push(e)}function km(e){ii=!0,kc(e)}function hn(){if(!pl&&Qt!==null){pl=!0;var e=0,t=xe;try{var n=Qt;for(xe=1;e>=d,u-=d,Gt=1<<32-Pt(t)+u|n<re?(Fe=ne,ne=null):Fe=ne.sibling;var ge=M(k,ne,j[re],H);if(ge===null){ne===null&&(ne=Fe);break}e&&ne&&ge.alternate===null&&t(k,ne),w=a(ge,w,re),te===null?J=ge:te.sibling=ge,te=ge,ne=Fe}if(re===j.length)return n(k,ne),Ae&&_n(k,re),J;if(ne===null){for(;rere?(Fe=ne,ne=null):Fe=ne.sibling;var Cn=M(k,ne,ge.value,H);if(Cn===null){ne===null&&(ne=Fe);break}e&&ne&&Cn.alternate===null&&t(k,ne),w=a(Cn,w,re),te===null?J=Cn:te.sibling=Cn,te=Cn,ne=Fe}if(ge.done)return n(k,ne),Ae&&_n(k,re),J;if(ne===null){for(;!ge.done;re++,ge=j.next())ge=F(k,ge.value,H),ge!==null&&(w=a(ge,w,re),te===null?J=ge:te.sibling=ge,te=ge);return Ae&&_n(k,re),J}for(ne=o(k,ne);!ge.done;re++,ge=j.next())ge=q(ne,k,re,ge.value,H),ge!==null&&(e&&ge.alternate!==null&&ne.delete(ge.key===null?re:ge.key),w=a(ge,w,re),te===null?J=ge:te.sibling=ge,te=ge);return e&&ne.forEach(function(rg){return t(k,rg)}),Ae&&_n(k,re),J}function Ie(k,w,j,H){if(typeof j=="object"&&j!==null&&j.type===B&&j.key===null&&(j=j.props.children),typeof j=="object"&&j!==null){switch(j.$$typeof){case $:e:{for(var J=j.key,te=w;te!==null;){if(te.key===J){if(J=j.type,J===B){if(te.tag===7){n(k,te.sibling),w=u(te,j.props.children),w.return=k,k=w;break e}}else if(te.elementType===J||typeof J=="object"&&J!==null&&J.$$typeof===Ve&&Tc(J)===te.type){n(k,te.sibling),w=u(te,j.props),w.ref=no(k,te,j),w.return=k,k=w;break e}n(k,te);break}else t(k,te);te=te.sibling}j.type===B?(w=zn(j.props.children,k.mode,H,j.key),w.return=k,k=w):(H=Oi(j.type,j.key,j.props,null,k.mode,H),H.ref=no(k,w,j),H.return=k,k=H)}return d(k);case L:e:{for(te=j.key;w!==null;){if(w.key===te)if(w.tag===4&&w.stateNode.containerInfo===j.containerInfo&&w.stateNode.implementation===j.implementation){n(k,w.sibling),w=u(w,j.children||[]),w.return=k,k=w;break e}else{n(k,w);break}else t(k,w);w=w.sibling}w=cu(j,k.mode,H),w.return=k,k=w}return d(k);case Ve:return te=j._init,Ie(k,w,te(j._payload),H)}if(Ir(j))return K(k,w,j,H);if(Z(j))return X(k,w,j,H);ai(k,j)}return typeof j=="string"&&j!==""||typeof j=="number"?(j=""+j,w!==null&&w.tag===6?(n(k,w.sibling),w=u(w,j),w.return=k,k=w):(n(k,w),w=au(j,k.mode,H),w.return=k,k=w),d(k)):n(k,w)}return Ie}var ar=Ic(!0),Nc=Ic(!1),ci=dn(null),fi=null,cr=null,wl=null;function xl(){wl=cr=fi=null}function Sl(e){var t=ci.current;ke(ci),e._currentValue=t}function El(e,t,n){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function fr(e,t){fi=e,wl=cr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(ot=!0),e.firstContext=null)}function Et(e){var t=e._currentValue;if(wl!==e)if(e={context:e,memoizedValue:t,next:null},cr===null){if(fi===null)throw Error(s(308));cr=e,fi.dependencies={lanes:0,firstContext:e}}else cr=cr.next=e;return t}var Tn=null;function Cl(e){Tn===null?Tn=[e]:Tn.push(e)}function Oc(e,t,n,o){var u=t.interleaved;return u===null?(n.next=n,Cl(t)):(n.next=u.next,u.next=n),t.interleaved=n,Xt(e,o)}function Xt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var mn=!1;function kl(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Lc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Jt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function gn(e,t,n){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,he&2){var u=o.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),o.pending=t,Xt(e,n)}return u=o.interleaved,u===null?(t.next=t,Cl(o)):(t.next=u.next,u.next=t),o.interleaved=t,Xt(e,n)}function di(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,Us(e,n)}}function Dc(e,t){var n=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,n===o)){var u=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var d={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};a===null?u=a=d:a=a.next=d,n=n.next}while(n!==null);a===null?u=a=t:a=a.next=t}else u=a=t;n={baseState:o.baseState,firstBaseUpdate:u,lastBaseUpdate:a,shared:o.shared,effects:o.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function pi(e,t,n,o){var u=e.updateQueue;mn=!1;var a=u.firstBaseUpdate,d=u.lastBaseUpdate,m=u.shared.pending;if(m!==null){u.shared.pending=null;var y=m,P=y.next;y.next=null,d===null?a=P:d.next=P,d=y;var z=e.alternate;z!==null&&(z=z.updateQueue,m=z.lastBaseUpdate,m!==d&&(m===null?z.firstBaseUpdate=P:m.next=P,z.lastBaseUpdate=y))}if(a!==null){var F=u.baseState;d=0,z=P=y=null,m=a;do{var M=m.lane,q=m.eventTime;if((o&M)===M){z!==null&&(z=z.next={eventTime:q,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var K=e,X=m;switch(M=t,q=n,X.tag){case 1:if(K=X.payload,typeof K=="function"){F=K.call(q,F,M);break e}F=K;break e;case 3:K.flags=K.flags&-65537|128;case 0:if(K=X.payload,M=typeof K=="function"?K.call(q,F,M):K,M==null)break e;F=Y({},F,M);break e;case 2:mn=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,M=u.effects,M===null?u.effects=[m]:M.push(m))}else q={eventTime:q,lane:M,tag:m.tag,payload:m.payload,callback:m.callback,next:null},z===null?(P=z=q,y=F):z=z.next=q,d|=M;if(m=m.next,m===null){if(m=u.shared.pending,m===null)break;M=m,m=M.next,M.next=null,u.lastBaseUpdate=M,u.shared.pending=null}}while(!0);if(z===null&&(y=F),u.baseState=y,u.firstBaseUpdate=P,u.lastBaseUpdate=z,t=u.shared.interleaved,t!==null){u=t;do d|=u.lane,u=u.next;while(u!==t)}else a===null&&(u.shared.lanes=0);On|=d,e.lanes=d,e.memoizedState=F}}function Mc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var o=_l.transition;_l.transition={};try{e(!1),t()}finally{xe=n,_l.transition=o}}function tf(){return Ct().memoizedState}function Pm(e,t,n){var o=xn(e);if(n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},nf(e))rf(t,n);else if(n=Oc(e,t,n,o),n!==null){var u=tt();Lt(n,e,o,u),of(n,t,o)}}function _m(e,t,n){var o=xn(e),u={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(nf(e))rf(t,u);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var d=t.lastRenderedState,m=a(d,n);if(u.hasEagerState=!0,u.eagerState=m,_t(m,d)){var y=t.interleaved;y===null?(u.next=u,Cl(t)):(u.next=y.next,y.next=u),t.interleaved=u;return}}catch{}finally{}n=Oc(e,t,u,o),n!==null&&(u=tt(),Lt(n,e,o,u),of(n,t,o))}}function nf(e){var t=e.alternate;return e===Pe||t!==null&&t===Pe}function rf(e,t){so=gi=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function of(e,t,n){if(n&4194240){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,Us(e,n)}}var wi={readContext:Et,useCallback:Ye,useContext:Ye,useEffect:Ye,useImperativeHandle:Ye,useInsertionEffect:Ye,useLayoutEffect:Ye,useMemo:Ye,useReducer:Ye,useRef:Ye,useState:Ye,useDebugValue:Ye,useDeferredValue:Ye,useTransition:Ye,useMutableSource:Ye,useSyncExternalStore:Ye,useId:Ye,unstable_isNewReconciler:!1},Tm={readContext:Et,useCallback:function(e,t){return $t().memoizedState=[e,t===void 0?null:t],e},useContext:Et,useEffect:qc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,yi(4194308,4,Kc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return yi(4194308,4,e,t)},useInsertionEffect:function(e,t){return yi(4,2,e,t)},useMemo:function(e,t){var n=$t();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=$t();return t=n!==void 0?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=Pm.bind(null,Pe,e),[o.memoizedState,e]},useRef:function(e){var t=$t();return e={current:e},t.memoizedState=e},useState:Wc,useDebugValue:Ml,useDeferredValue:function(e){return $t().memoizedState=e},useTransition:function(){var e=Wc(!1),t=e[0];return e=Rm.bind(null,e[1]),$t().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=Pe,u=$t();if(Ae){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),Ue===null)throw Error(s(349));Nn&30||Bc(o,t,n)}u.memoizedState=n;var a={value:n,getSnapshot:t};return u.queue=a,qc(Hc.bind(null,o,a,e),[e]),o.flags|=2048,ao(9,$c.bind(null,o,a,n,t),void 0,null),n},useId:function(){var e=$t(),t=Ue.identifierPrefix;if(Ae){var n=Kt,o=Gt;n=(o&~(1<<32-Pt(o)-1)).toString(32)+n,t=":"+t+"R"+n,n=lo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=d.createElement(n,{is:o.is}):(e=d.createElement(n),n==="select"&&(d=e,o.multiple?d.multiple=!0:o.size&&(d.size=o.size))):e=d.createElementNS(e,n),e[Ft]=t,e[eo]=o,jf(e,t,!1,!1),t.stateNode=e;e:{switch(d=Ps(n,o),n){case"dialog":Ce("cancel",e),Ce("close",e),u=o;break;case"iframe":case"object":case"embed":Ce("load",e),u=o;break;case"video":case"audio":for(u=0;ugr&&(t.flags|=128,o=!0,co(a,!1),t.lanes=4194304)}else{if(!o)if(e=hi(d),e!==null){if(t.flags|=128,o=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),co(a,!0),a.tail===null&&a.tailMode==="hidden"&&!d.alternate&&!Ae)return qe(t),null}else 2*Te()-a.renderingStartTime>gr&&n!==1073741824&&(t.flags|=128,o=!0,co(a,!1),t.lanes=4194304);a.isBackwards?(d.sibling=t.child,t.child=d):(n=a.last,n!==null?n.sibling=d:t.child=d,a.last=d)}return a.tail!==null?(t=a.tail,a.rendering=t,a.tail=t.sibling,a.renderingStartTime=Te(),t.sibling=null,n=Re.current,Ee(Re,o?n&1|2:n&1),t):(qe(t),null);case 22:case 23:return su(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&t.mode&1?pt&1073741824&&(qe(t),t.subtreeFlags&6&&(t.flags|=8192)):qe(t),null;case 24:return null;case 25:return null}throw Error(s(156,t.tag))}function Um(e,t){switch(ml(t),t.tag){case 1:return rt(t.type)&&ri(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return dr(),ke(nt),ke(We),Pl(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Al(t),null;case 13:if(ke(Re),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));ur()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ke(Re),null;case 4:return dr(),null;case 10:return Sl(t.type._context),null;case 22:case 23:return su(),null;case 24:return null;default:return null}}var Ci=!1,Qe=!1,Fm=typeof WeakSet=="function"?WeakSet:Set,G=null;function hr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(o){_e(e,t,o)}else n.current=null}function Ql(e,t,n){try{n()}catch(o){_e(e,t,o)}}var Pf=!1;function Bm(e,t){if(sl=bo,e=ic(),Js(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var o=n.getSelection&&n.getSelection();if(o&&o.rangeCount!==0){n=o.anchorNode;var u=o.anchorOffset,a=o.focusNode;o=o.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break e}var d=0,m=-1,y=-1,P=0,z=0,F=e,M=null;t:for(;;){for(var q;F!==n||u!==0&&F.nodeType!==3||(m=d+u),F!==a||o!==0&&F.nodeType!==3||(y=d+o),F.nodeType===3&&(d+=F.nodeValue.length),(q=F.firstChild)!==null;)M=F,F=q;for(;;){if(F===e)break t;if(M===n&&++P===u&&(m=d),M===a&&++z===o&&(y=d),(q=F.nextSibling)!==null)break;F=M,M=F.parentNode}F=q}n=m===-1||y===-1?null:{start:m,end:y}}else n=null}n=n||{start:0,end:0}}else n=null;for(ll={focusedElem:e,selectionRange:n},bo=!1,G=t;G!==null;)if(t=G,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,G=e;else for(;G!==null;){t=G;try{var K=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(K!==null){var X=K.memoizedProps,Ie=K.memoizedState,k=t.stateNode,w=k.getSnapshotBeforeUpdate(t.elementType===t.type?X:It(t.type,X),Ie);k.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var j=t.stateNode.containerInfo;j.nodeType===1?j.textContent="":j.nodeType===9&&j.documentElement&&j.removeChild(j.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(s(163))}}catch(H){_e(t,t.return,H)}if(e=t.sibling,e!==null){e.return=t.return,G=e;break}G=t.return}return K=Pf,Pf=!1,K}function fo(e,t,n){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var u=o=o.next;do{if((u.tag&e)===e){var a=u.destroy;u.destroy=void 0,a!==void 0&&Ql(t,n,a)}u=u.next}while(u!==o)}}function ki(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function Gl(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function _f(e){var t=e.alternate;t!==null&&(e.alternate=null,_f(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ft],delete t[eo],delete t[fl],delete t[Em],delete t[Cm])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Tf(e){return e.tag===5||e.tag===3||e.tag===4}function If(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Tf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Kl(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ti));else if(o!==4&&(e=e.child,e!==null))for(Kl(e,t,n),e=e.sibling;e!==null;)Kl(e,t,n),e=e.sibling}function Xl(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Xl(e,t,n),e=e.sibling;e!==null;)Xl(e,t,n),e=e.sibling}var He=null,Nt=!1;function yn(e,t,n){for(n=n.child;n!==null;)Nf(e,t,n),n=n.sibling}function Nf(e,t,n){if(Ut&&typeof Ut.onCommitFiberUnmount=="function")try{Ut.onCommitFiberUnmount(zo,n)}catch{}switch(n.tag){case 5:Qe||hr(n,t);case 6:var o=He,u=Nt;He=null,yn(e,t,n),He=o,Nt=u,He!==null&&(Nt?(e=He,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):He.removeChild(n.stateNode));break;case 18:He!==null&&(Nt?(e=He,n=n.stateNode,e.nodeType===8?cl(e.parentNode,n):e.nodeType===1&&cl(e,n),br(e)):cl(He,n.stateNode));break;case 4:o=He,u=Nt,He=n.stateNode.containerInfo,Nt=!0,yn(e,t,n),He=o,Nt=u;break;case 0:case 11:case 14:case 15:if(!Qe&&(o=n.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){u=o=o.next;do{var a=u,d=a.destroy;a=a.tag,d!==void 0&&(a&2||a&4)&&Ql(n,t,d),u=u.next}while(u!==o)}yn(e,t,n);break;case 1:if(!Qe&&(hr(n,t),o=n.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(m){_e(n,t,m)}yn(e,t,n);break;case 21:yn(e,t,n);break;case 22:n.mode&1?(Qe=(o=Qe)||n.memoizedState!==null,yn(e,t,n),Qe=o):yn(e,t,n);break;default:yn(e,t,n)}}function Of(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Fm),t.forEach(function(o){var u=Gm.bind(null,e,o);n.has(o)||(n.add(o),o.then(u,u))})}}function Ot(e,t){var n=t.deletions;if(n!==null)for(var o=0;ou&&(u=d),o&=~a}if(o=u,o=Te()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Hm(o/1960))-o,10e?16:e,wn===null)var o=!1;else{if(e=wn,wn=null,_i=0,he&6)throw Error(s(331));var u=he;for(he|=4,G=e.current;G!==null;){var a=G,d=a.child;if(G.flags&16){var m=a.deletions;if(m!==null){for(var y=0;yTe()-eu?Dn(e,0):Zl|=n),st(e,t)}function Yf(e,t){t===0&&(e.mode&1?(t=Fo,Fo<<=1,!(Fo&130023424)&&(Fo=4194304)):t=1);var n=tt();e=Xt(e,t),e!==null&&(Ur(e,t,n),st(e,n))}function Qm(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Yf(e,n)}function Gm(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,u=e.memoizedState;u!==null&&(n=u.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(s(314))}o!==null&&o.delete(t),Yf(e,n)}var qf;qf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||nt.current)ot=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return ot=!1,Mm(e,t,n);ot=!!(e.flags&131072)}else ot=!1,Ae&&t.flags&1048576&&jc(t,li,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;Ei(e,t),e=t.pendingProps;var u=ir(t,We.current);fr(t,n),u=Il(null,t,o,e,u,n);var a=Nl();return t.flags|=1,typeof u=="object"&&u!==null&&typeof u.render=="function"&&u.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,rt(o)?(a=!0,oi(t)):a=!1,t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,kl(t),u.updater=xi,t.stateNode=u,u._reactInternals=t,Ul(t,o,e,n),t=Hl(null,t,o,!0,a,n)):(t.tag=0,Ae&&a&&hl(t),et(null,t,u,n),t=t.child),t;case 16:o=t.elementType;e:{switch(Ei(e,t),e=t.pendingProps,u=o._init,o=u(o._payload),t.type=o,u=t.tag=Xm(o),e=It(o,e),u){case 0:t=$l(null,t,o,e,n);break e;case 1:t=wf(null,t,o,e,n);break e;case 11:t=hf(null,t,o,e,n);break e;case 14:t=mf(null,t,o,It(o.type,e),n);break e}throw Error(s(306,o,""))}return t;case 0:return o=t.type,u=t.pendingProps,u=t.elementType===o?u:It(o,u),$l(e,t,o,u,n);case 1:return o=t.type,u=t.pendingProps,u=t.elementType===o?u:It(o,u),wf(e,t,o,u,n);case 3:e:{if(xf(t),e===null)throw Error(s(387));o=t.pendingProps,a=t.memoizedState,u=a.element,Lc(e,t),pi(t,o,null,n);var d=t.memoizedState;if(o=d.element,a.isDehydrated)if(a={element:o,isDehydrated:!1,cache:d.cache,pendingSuspenseBoundaries:d.pendingSuspenseBoundaries,transitions:d.transitions},t.updateQueue.baseState=a,t.memoizedState=a,t.flags&256){u=pr(Error(s(423)),t),t=Sf(e,t,o,n,u);break e}else if(o!==u){u=pr(Error(s(424)),t),t=Sf(e,t,o,n,u);break e}else for(dt=fn(t.stateNode.containerInfo.firstChild),ft=t,Ae=!0,Tt=null,n=Nc(t,null,o,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(ur(),o===u){t=Zt(e,t,n);break e}et(e,t,o,n)}t=t.child}return t;case 5:return zc(t),e===null&&yl(t),o=t.type,u=t.pendingProps,a=e!==null?e.memoizedProps:null,d=u.children,ul(o,u)?d=null:a!==null&&ul(o,a)&&(t.flags|=32),vf(e,t),et(e,t,d,n),t.child;case 6:return e===null&&yl(t),null;case 13:return Ef(e,t,n);case 4:return jl(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=ar(t,null,o,n):et(e,t,o,n),t.child;case 11:return o=t.type,u=t.pendingProps,u=t.elementType===o?u:It(o,u),hf(e,t,o,u,n);case 7:return et(e,t,t.pendingProps,n),t.child;case 8:return et(e,t,t.pendingProps.children,n),t.child;case 12:return et(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,u=t.pendingProps,a=t.memoizedProps,d=u.value,Ee(ci,o._currentValue),o._currentValue=d,a!==null)if(_t(a.value,d)){if(a.children===u.children&&!nt.current){t=Zt(e,t,n);break e}}else for(a=t.child,a!==null&&(a.return=t);a!==null;){var m=a.dependencies;if(m!==null){d=a.child;for(var y=m.firstContext;y!==null;){if(y.context===o){if(a.tag===1){y=Jt(-1,n&-n),y.tag=2;var P=a.updateQueue;if(P!==null){P=P.shared;var z=P.pending;z===null?y.next=y:(y.next=z.next,z.next=y),P.pending=y}}a.lanes|=n,y=a.alternate,y!==null&&(y.lanes|=n),El(a.return,n,t),m.lanes|=n;break}y=y.next}}else if(a.tag===10)d=a.type===t.type?null:a.child;else if(a.tag===18){if(d=a.return,d===null)throw Error(s(341));d.lanes|=n,m=d.alternate,m!==null&&(m.lanes|=n),El(d,n,t),d=a.sibling}else d=a.child;if(d!==null)d.return=a;else for(d=a;d!==null;){if(d===t){d=null;break}if(a=d.sibling,a!==null){a.return=d.return,d=a;break}d=d.return}a=d}et(e,t,u.children,n),t=t.child}return t;case 9:return u=t.type,o=t.pendingProps.children,fr(t,n),u=Et(u),o=o(u),t.flags|=1,et(e,t,o,n),t.child;case 14:return o=t.type,u=It(o,t.pendingProps),u=It(o.type,u),mf(e,t,o,u,n);case 15:return gf(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,u=t.pendingProps,u=t.elementType===o?u:It(o,u),Ei(e,t),t.tag=1,rt(o)?(e=!0,oi(t)):e=!1,fr(t,n),lf(t,o,u),Ul(t,o,u,n),Hl(null,t,o,!0,e,n);case 19:return kf(e,t,n);case 22:return yf(e,t,n)}throw Error(s(156,t.tag))};function Qf(e,t){return Aa(e,t)}function Km(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function jt(e,t,n,o){return new Km(e,t,n,o)}function uu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Xm(e){if(typeof e=="function")return uu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===vt)return 11;if(e===wt)return 14}return 2}function En(e,t){var n=e.alternate;return n===null?(n=jt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Oi(e,t,n,o,u,a){var d=2;if(o=e,typeof e=="function")uu(e)&&(d=1);else if(typeof e=="string")d=5;else e:switch(e){case B:return zn(n.children,u,a,t);case ie:d=8,u|=8;break;case ye:return e=jt(12,n,t,u|2),e.elementType=ye,e.lanes=a,e;case Ze:return e=jt(13,n,t,u),e.elementType=Ze,e.lanes=a,e;case at:return e=jt(19,n,t,u),e.elementType=at,e.lanes=a,e;case Se:return Li(n,u,a,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Je:d=10;break e;case Wt:d=9;break e;case vt:d=11;break e;case wt:d=14;break e;case Ve:d=16,o=null;break e}throw Error(s(130,e==null?e:typeof e,""))}return t=jt(d,n,t,u),t.elementType=e,t.type=o,t.lanes=a,t}function zn(e,t,n,o){return e=jt(7,e,o,t),e.lanes=n,e}function Li(e,t,n,o){return e=jt(22,e,o,t),e.elementType=Se,e.lanes=n,e.stateNode={isHidden:!1},e}function au(e,t,n){return e=jt(6,e,null,t),e.lanes=n,e}function cu(e,t,n){return t=jt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Jm(e,t,n,o,u){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=zs(0),this.expirationTimes=zs(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zs(0),this.identifierPrefix=o,this.onRecoverableError=u,this.mutableSourceEagerHydrationData=null}function fu(e,t,n,o,u,a,d,m,y){return e=new Jm(e,t,n,m,y),t===1?(t=1,a===!0&&(t|=8)):t=0,a=jt(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},kl(a),e}function Zm(e,t,n){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(i){console.error(i)}}return r(),yu.exports=dg(),yu.exports}var ad;function hg(){if(ad)return $i;ad=1;var r=pg();return $i.createRoot=r.createRoot,$i.hydrateRoot=r.hydrateRoot,$i}var mg=hg(),Ke=function(){return Ke=Object.assign||function(i){for(var s,l=1,c=arguments.length;l0?Be(Ar,--At):0,Cr--,Oe===10&&(Cr=1,fs--),Oe}function Dt(){return Oe=At2||Lu(Oe)>3?"":" "}function jg(r,i){for(;--i&&Dt()&&!(Oe<48||Oe>102||Oe>57&&Oe<65||Oe>70&&Oe<97););return ps(r,Gi()+(i<6&&Bn()==32&&Dt()==32))}function Du(r){for(;Dt();)switch(Oe){case r:return At;case 34:case 39:r!==34&&r!==39&&Du(Oe);break;case 40:r===41&&Du(r);break;case 92:Dt();break}return At}function Ag(r,i){for(;Dt()&&r+Oe!==57;)if(r+Oe===84&&Bn()===47)break;return"/*"+ps(i,At-1)+"*"+Ju(r===47?r:Dt())}function Rg(r){for(;!Lu(Bn());)Dt();return ps(r,At)}function Pg(r){return Cg(Ki("",null,null,null,[""],r=Eg(r),0,[0],r))}function Ki(r,i,s,l,c,f,p,g,x){for(var v=0,S=0,A=p,T=0,I=0,R=0,C=1,N=1,b=1,U=0,V="",Q=c,$=f,L=l,B=V;N;)switch(R=U,U=Dt()){case 40:if(R!=108&&Be(B,A-1)==58){Qi(B+=ae(xu(U),"&","&\f"),"&\f",up(v?g[v-1]:0))!=-1&&(b=-1);break}case 34:case 39:case 91:B+=xu(U);break;case 9:case 10:case 13:case 32:B+=kg(R);break;case 92:B+=jg(Gi()-1,7);continue;case 47:switch(Bn()){case 42:case 47:Eo(_g(Ag(Dt(),Gi()),i,s,x),x);break;default:B+="/"}break;case 123*C:g[v++]=Vt(B)*b;case 125*C:case 59:case 0:switch(U){case 0:case 125:N=0;case 59+S:b==-1&&(B=ae(B,/\f/g,"")),I>0&&Vt(B)-A&&Eo(I>32?dd(B+";",l,s,A-1,x):dd(ae(B," ","")+";",l,s,A-2,x),x);break;case 59:B+=";";default:if(Eo(L=fd(B,i,s,v,S,c,g,V,Q=[],$=[],A,f),f),U===123)if(S===0)Ki(B,i,L,L,Q,f,A,g,$);else switch(T===99&&Be(B,3)===110?100:T){case 100:case 108:case 109:case 115:Ki(r,L,L,l&&Eo(fd(r,L,L,0,0,c,g,V,c,Q=[],A,$),$),c,$,A,g,l?Q:$);break;default:Ki(B,L,L,L,[""],$,0,g,$)}}v=S=I=0,C=b=1,V=B="",A=p;break;case 58:A=1+Vt(B),I=R;default:if(C<1){if(U==123)--C;else if(U==125&&C++==0&&Sg()==125)continue}switch(B+=Ju(U),U*C){case 38:b=S>0?1:(B+="\f",-1);break;case 44:g[v++]=(Vt(B)-1)*b,b=1;break;case 64:Bn()===45&&(B+=xu(Dt())),T=Bn(),S=A=Vt(V=B+=Rg(Gi())),U++;break;case 45:R===45&&Vt(B)==2&&(C=0)}}return f}function fd(r,i,s,l,c,f,p,g,x,v,S,A){for(var T=c-1,I=c===0?f:[""],R=cp(I),C=0,N=0,b=0;C0?I[U]+" "+V:ae(V,/&\f/g,I[U])))&&(x[b++]=Q);return ds(r,i,s,c===0?cs:g,x,v,S,A)}function _g(r,i,s,l){return ds(r,i,s,sp,Ju(xg()),Er(r,2,-2),0,l)}function dd(r,i,s,l,c){return ds(r,i,s,Xu,Er(r,0,l),Er(r,l+1,-1),l,c)}function dp(r,i,s){switch(vg(r,i)){case 5103:return we+"print-"+r+r;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return we+r+r;case 4789:return Co+r+r;case 5349:case 4246:case 4810:case 6968:case 2756:return we+r+Co+r+je+r+r;case 5936:switch(Be(r,i+11)){case 114:return we+r+je+ae(r,/[svh]\w+-[tblr]{2}/,"tb")+r;case 108:return we+r+je+ae(r,/[svh]\w+-[tblr]{2}/,"tb-rl")+r;case 45:return we+r+je+ae(r,/[svh]\w+-[tblr]{2}/,"lr")+r}case 6828:case 4268:case 2903:return we+r+je+r+r;case 6165:return we+r+je+"flex-"+r+r;case 5187:return we+r+ae(r,/(\w+).+(:[^]+)/,we+"box-$1$2"+je+"flex-$1$2")+r;case 5443:return we+r+je+"flex-item-"+ae(r,/flex-|-self/g,"")+(tn(r,/flex-|baseline/)?"":je+"grid-row-"+ae(r,/flex-|-self/g,""))+r;case 4675:return we+r+je+"flex-line-pack"+ae(r,/align-content|flex-|-self/g,"")+r;case 5548:return we+r+je+ae(r,"shrink","negative")+r;case 5292:return we+r+je+ae(r,"basis","preferred-size")+r;case 6060:return we+"box-"+ae(r,"-grow","")+we+r+je+ae(r,"grow","positive")+r;case 4554:return we+ae(r,/([^-])(transform)/g,"$1"+we+"$2")+r;case 6187:return ae(ae(ae(r,/(zoom-|grab)/,we+"$1"),/(image-set)/,we+"$1"),r,"")+r;case 5495:case 3959:return ae(r,/(image-set\([^]*)/,we+"$1$`$1");case 4968:return ae(ae(r,/(.+:)(flex-)?(.*)/,we+"box-pack:$3"+je+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+we+r+r;case 4200:if(!tn(r,/flex-|baseline/))return je+"grid-column-align"+Er(r,i)+r;break;case 2592:case 3360:return je+ae(r,"template-","")+r;case 4384:case 3616:return s&&s.some(function(l,c){return i=c,tn(l.props,/grid-\w+-end/)})?~Qi(r+(s=s[i].value),"span",0)?r:je+ae(r,"-start","")+r+je+"grid-row-span:"+(~Qi(s,"span",0)?tn(s,/\d+/):+tn(s,/\d+/)-+tn(r,/\d+/))+";":je+ae(r,"-start","")+r;case 4896:case 4128:return s&&s.some(function(l){return tn(l.props,/grid-\w+-start/)})?r:je+ae(ae(r,"-end","-span"),"span ","")+r;case 4095:case 3583:case 4068:case 2532:return ae(r,/(.+)-inline(.+)/,we+"$1$2")+r;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(Vt(r)-1-i>6)switch(Be(r,i+1)){case 109:if(Be(r,i+4)!==45)break;case 102:return ae(r,/(.+:)(.+)-([^]+)/,"$1"+we+"$2-$3$1"+Co+(Be(r,i+3)==108?"$3":"$2-$3"))+r;case 115:return~Qi(r,"stretch",0)?dp(ae(r,"stretch","fill-available"),i,s)+r:r}break;case 5152:case 5920:return ae(r,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(l,c,f,p,g,x,v){return je+c+":"+f+v+(p?je+c+"-span:"+(g?x:+x-+f)+v:"")+r});case 4949:if(Be(r,i+6)===121)return ae(r,":",":"+we)+r;break;case 6444:switch(Be(r,Be(r,14)===45?18:11)){case 120:return ae(r,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+we+(Be(r,14)===45?"inline-":"")+"box$3$1"+we+"$2$3$1"+je+"$2box$3")+r;case 100:return ae(r,":",":"+je)+r}break;case 5719:case 2647:case 2135:case 3927:case 2391:return ae(r,"scroll-","scroll-snap-")+r}return r}function rs(r,i){for(var s="",l=0;l-1&&!r.return)switch(r.type){case Xu:r.return=dp(r.value,r.length,s);return;case lp:return rs([kn(r,{value:ae(r.value,"@","@"+we)})],l);case cs:if(r.length)return wg(s=r.props,function(c){switch(tn(c,l=/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":vr(kn(r,{props:[ae(c,/:(read-\w+)/,":"+Co+"$1")]})),vr(kn(r,{props:[c]})),Ou(r,{props:cd(s,l)});break;case"::placeholder":vr(kn(r,{props:[ae(c,/:(plac\w+)/,":"+we+"input-$1")]})),vr(kn(r,{props:[ae(c,/:(plac\w+)/,":"+Co+"$1")]})),vr(kn(r,{props:[ae(c,/:(plac\w+)/,je+"input-$1")]})),vr(kn(r,{props:[c]})),Ou(r,{props:cd(s,l)});break}return""})}}var Lg={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},ht={},kr=typeof process<"u"&&ht!==void 0&&(ht.REACT_APP_SC_ATTR||ht.SC_ATTR)||"data-styled",pp="active",hp="data-styled-version",hs="6.1.14",Zu=`/*!sc*/ +`,os=typeof window<"u"&&"HTMLElement"in window,Dg=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&ht!==void 0&&ht.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&ht.REACT_APP_SC_DISABLE_SPEEDY!==""?ht.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&ht.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&ht!==void 0&&ht.SC_DISABLE_SPEEDY!==void 0&&ht.SC_DISABLE_SPEEDY!==""&&ht.SC_DISABLE_SPEEDY!=="false"&&ht.SC_DISABLE_SPEEDY),ms=Object.freeze([]),jr=Object.freeze({});function Mg(r,i,s){return s===void 0&&(s=jr),r.theme!==s.theme&&r.theme||i||s.theme}var mp=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),zg=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,Ug=/(^-|-$)/g;function pd(r){return r.replace(zg,"-").replace(Ug,"")}var Fg=/(a)(d)/gi,Hi=52,hd=function(r){return String.fromCharCode(r+(r>25?39:97))};function Mu(r){var i,s="";for(i=Math.abs(r);i>Hi;i=i/Hi|0)s=hd(i%Hi)+s;return(hd(i%Hi)+s).replace(Fg,"$1-$2")}var Su,gp=5381,wr=function(r,i){for(var s=i.length;s;)r=33*r^i.charCodeAt(--s);return r},yp=function(r){return wr(gp,r)};function Bg(r){return Mu(yp(r)>>>0)}function $g(r){return r.displayName||r.name||"Component"}function Eu(r){return typeof r=="string"&&!0}var vp=typeof Symbol=="function"&&Symbol.for,wp=vp?Symbol.for("react.memo"):60115,Hg=vp?Symbol.for("react.forward_ref"):60112,bg={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},Vg={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},xp={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},Wg=((Su={})[Hg]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},Su[wp]=xp,Su);function md(r){return("type"in(i=r)&&i.type.$$typeof)===wp?xp:"$$typeof"in r?Wg[r.$$typeof]:bg;var i}var Yg=Object.defineProperty,qg=Object.getOwnPropertyNames,gd=Object.getOwnPropertySymbols,Qg=Object.getOwnPropertyDescriptor,Gg=Object.getPrototypeOf,yd=Object.prototype;function Sp(r,i,s){if(typeof i!="string"){if(yd){var l=Gg(i);l&&l!==yd&&Sp(r,l,s)}var c=qg(i);gd&&(c=c.concat(gd(i)));for(var f=md(r),p=md(i),g=0;g0?" Args: ".concat(i.join(", ")):""))}var Kg=function(){function r(i){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=i}return r.prototype.indexOfGroup=function(i){for(var s=0,l=0;l=this.groupSizes.length){for(var l=this.groupSizes,c=l.length,f=c;i>=f;)if((f<<=1)<0)throw Vn(16,"".concat(i));this.groupSizes=new Uint32Array(f),this.groupSizes.set(l),this.length=f;for(var p=c;p=this.length||this.groupSizes[i]===0)return s;for(var l=this.groupSizes[i],c=this.indexOfGroup(i),f=c+l,p=c;p=0){var l=document.createTextNode(s);return this.element.insertBefore(l,this.nodes[i]||null),this.length++,!0}return!1},r.prototype.deleteRule=function(i){this.element.removeChild(this.nodes[i]),this.length--},r.prototype.getRule=function(i){return i0&&(N+="".concat(b,","))}),x+="".concat(R).concat(C,'{content:"').concat(N,'"}').concat(Zu)},S=0;S0?".".concat(i):T},S=x.slice();S.push(function(T){T.type===cs&&T.value.includes("&")&&(T.props[0]=T.props[0].replace(ly,s).replace(l,v))}),p.prefix&&S.push(Og),S.push(Tg);var A=function(T,I,R,C){I===void 0&&(I=""),R===void 0&&(R=""),C===void 0&&(C="&"),i=C,s=I,l=new RegExp("\\".concat(s,"\\b"),"g");var N=T.replace(uy,""),b=Pg(R||I?"".concat(R," ").concat(I," { ").concat(N," }"):N);p.namespace&&(b=kp(b,p.namespace));var U=[];return rs(b,Ig(S.concat(Ng(function(V){return U.push(V)})))),U};return A.hash=x.length?x.reduce(function(T,I){return I.name||Vn(15),wr(T,I.name)},gp).toString():"",A}var cy=new Cp,Uu=ay(),jp=mt.createContext({shouldForwardProp:void 0,styleSheet:cy,stylis:Uu});jp.Consumer;mt.createContext(void 0);function Sd(){return oe.useContext(jp)}var fy=function(){function r(i,s){var l=this;this.inject=function(c,f){f===void 0&&(f=Uu);var p=l.name+f.hash;c.hasNameForId(l.id,p)||c.insertRules(l.id,p,f(l.rules,p,"@keyframes"))},this.name=i,this.id="sc-keyframes-".concat(i),this.rules=s,ta(this,function(){throw Vn(12,String(l.name))})}return r.prototype.getName=function(i){return i===void 0&&(i=Uu),this.name+i.hash},r}(),dy=function(r){return r>="A"&&r<="Z"};function Ed(r){for(var i="",s=0;s>>0);if(!s.hasNameForId(this.componentId,p)){var g=l(f,".".concat(p),void 0,this.componentId);s.insertRules(this.componentId,p,g)}c=Un(c,p),this.staticRulesId=p}else{for(var x=wr(this.baseHash,l.hash),v="",S=0;S>>0);s.hasNameForId(this.componentId,I)||s.insertRules(this.componentId,I,l(v,".".concat(I),void 0,this.componentId)),c=Un(c,I)}}return c},r}(),ss=mt.createContext(void 0);ss.Consumer;function Cd(r){var i=mt.useContext(ss),s=oe.useMemo(function(){return function(l,c){if(!l)throw Vn(14);if(bn(l)){var f=l(c);return f}if(Array.isArray(l)||typeof l!="object")throw Vn(8);return c?Ke(Ke({},c),l):l}(r.theme,i)},[r.theme,i]);return r.children?mt.createElement(ss.Provider,{value:s},r.children):null}var Cu={};function gy(r,i,s){var l=ea(r),c=r,f=!Eu(r),p=i.attrs,g=p===void 0?ms:p,x=i.componentId,v=x===void 0?function(Q,$){var L=typeof Q!="string"?"sc":pd(Q);Cu[L]=(Cu[L]||0)+1;var B="".concat(L,"-").concat(Bg(hs+L+Cu[L]));return $?"".concat($,"-").concat(B):B}(i.displayName,i.parentComponentId):x,S=i.displayName,A=S===void 0?function(Q){return Eu(Q)?"styled.".concat(Q):"Styled(".concat($g(Q),")")}(r):S,T=i.displayName&&i.componentId?"".concat(pd(i.displayName),"-").concat(i.componentId):i.componentId||v,I=l&&c.attrs?c.attrs.concat(g).filter(Boolean):g,R=i.shouldForwardProp;if(l&&c.shouldForwardProp){var C=c.shouldForwardProp;if(i.shouldForwardProp){var N=i.shouldForwardProp;R=function(Q,$){return C(Q,$)&&N(Q,$)}}else R=C}var b=new my(s,T,l?c.componentStyle:void 0);function U(Q,$){return function(L,B,ie){var ye=L.attrs,Je=L.componentStyle,Wt=L.defaultProps,vt=L.foldedComponentIds,Ze=L.styledComponentId,at=L.target,wt=mt.useContext(ss),Ve=Sd(),Se=L.shouldForwardProp||Ve.shouldForwardProp,W=Mg(B,wt,Wt)||jr,Z=function(de,ce,ve){for(var pe,me=Ke(Ke({},ce),{className:void 0,theme:ve}),$e=0;$ei=>{const s=vy.call(i);return r[s]||(r[s]=s.slice(8,-1).toLowerCase())})(Object.create(null)),zt=r=>(r=r.toLowerCase(),i=>gs(i)===r),ys=r=>i=>typeof i===r,{isArray:Rr}=Array,Po=ys("undefined");function wy(r){return r!==null&&!Po(r)&&r.constructor!==null&&!Po(r.constructor)&>(r.constructor.isBuffer)&&r.constructor.isBuffer(r)}const Tp=zt("ArrayBuffer");function xy(r){let i;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?i=ArrayBuffer.isView(r):i=r&&r.buffer&&Tp(r.buffer),i}const Sy=ys("string"),gt=ys("function"),Ip=ys("number"),vs=r=>r!==null&&typeof r=="object",Ey=r=>r===!0||r===!1,Zi=r=>{if(gs(r)!=="object")return!1;const i=na(r);return(i===null||i===Object.prototype||Object.getPrototypeOf(i)===null)&&!(Symbol.toStringTag in r)&&!(Symbol.iterator in r)},Cy=zt("Date"),ky=zt("File"),jy=zt("Blob"),Ay=zt("FileList"),Ry=r=>vs(r)&>(r.pipe),Py=r=>{let i;return r&&(typeof FormData=="function"&&r instanceof FormData||gt(r.append)&&((i=gs(r))==="formdata"||i==="object"&>(r.toString)&&r.toString()==="[object FormData]"))},_y=zt("URLSearchParams"),[Ty,Iy,Ny,Oy]=["ReadableStream","Request","Response","Headers"].map(zt),Ly=r=>r.trim?r.trim():r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function _o(r,i,{allOwnKeys:s=!1}={}){if(r===null||typeof r>"u")return;let l,c;if(typeof r!="object"&&(r=[r]),Rr(r))for(l=0,c=r.length;l0;)if(c=s[l],i===c.toLowerCase())return c;return null}const Fn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Op=r=>!Po(r)&&r!==Fn;function Bu(){const{caseless:r}=Op(this)&&this||{},i={},s=(l,c)=>{const f=r&&Np(i,c)||c;Zi(i[f])&&Zi(l)?i[f]=Bu(i[f],l):Zi(l)?i[f]=Bu({},l):Rr(l)?i[f]=l.slice():i[f]=l};for(let l=0,c=arguments.length;l(_o(i,(c,f)=>{s&>(c)?r[f]=_p(c,s):r[f]=c},{allOwnKeys:l}),r),My=r=>(r.charCodeAt(0)===65279&&(r=r.slice(1)),r),zy=(r,i,s,l)=>{r.prototype=Object.create(i.prototype,l),r.prototype.constructor=r,Object.defineProperty(r,"super",{value:i.prototype}),s&&Object.assign(r.prototype,s)},Uy=(r,i,s,l)=>{let c,f,p;const g={};if(i=i||{},r==null)return i;do{for(c=Object.getOwnPropertyNames(r),f=c.length;f-- >0;)p=c[f],(!l||l(p,r,i))&&!g[p]&&(i[p]=r[p],g[p]=!0);r=s!==!1&&na(r)}while(r&&(!s||s(r,i))&&r!==Object.prototype);return i},Fy=(r,i,s)=>{r=String(r),(s===void 0||s>r.length)&&(s=r.length),s-=i.length;const l=r.indexOf(i,s);return l!==-1&&l===s},By=r=>{if(!r)return null;if(Rr(r))return r;let i=r.length;if(!Ip(i))return null;const s=new Array(i);for(;i-- >0;)s[i]=r[i];return s},$y=(r=>i=>r&&i instanceof r)(typeof Uint8Array<"u"&&na(Uint8Array)),Hy=(r,i)=>{const l=(r&&r[Symbol.iterator]).call(r);let c;for(;(c=l.next())&&!c.done;){const f=c.value;i.call(r,f[0],f[1])}},by=(r,i)=>{let s;const l=[];for(;(s=r.exec(i))!==null;)l.push(s);return l},Vy=zt("HTMLFormElement"),Wy=r=>r.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(s,l,c){return l.toUpperCase()+c}),Ad=(({hasOwnProperty:r})=>(i,s)=>r.call(i,s))(Object.prototype),Yy=zt("RegExp"),Lp=(r,i)=>{const s=Object.getOwnPropertyDescriptors(r),l={};_o(s,(c,f)=>{let p;(p=i(c,f,r))!==!1&&(l[f]=p||c)}),Object.defineProperties(r,l)},qy=r=>{Lp(r,(i,s)=>{if(gt(r)&&["arguments","caller","callee"].indexOf(s)!==-1)return!1;const l=r[s];if(gt(l)){if(i.enumerable=!1,"writable"in i){i.writable=!1;return}i.set||(i.set=()=>{throw Error("Can not rewrite read-only method '"+s+"'")})}})},Qy=(r,i)=>{const s={},l=c=>{c.forEach(f=>{s[f]=!0})};return Rr(r)?l(r):l(String(r).split(i)),s},Gy=()=>{},Ky=(r,i)=>r!=null&&Number.isFinite(r=+r)?r:i,ku="abcdefghijklmnopqrstuvwxyz",Rd="0123456789",Dp={DIGIT:Rd,ALPHA:ku,ALPHA_DIGIT:ku+ku.toUpperCase()+Rd},Xy=(r=16,i=Dp.ALPHA_DIGIT)=>{let s="";const{length:l}=i;for(;r--;)s+=i[Math.random()*l|0];return s};function Jy(r){return!!(r&>(r.append)&&r[Symbol.toStringTag]==="FormData"&&r[Symbol.iterator])}const Zy=r=>{const i=new Array(10),s=(l,c)=>{if(vs(l)){if(i.indexOf(l)>=0)return;if(!("toJSON"in l)){i[c]=l;const f=Rr(l)?[]:{};return _o(l,(p,g)=>{const x=s(p,c+1);!Po(x)&&(f[g]=x)}),i[c]=void 0,f}}return l};return s(r,0)},ev=zt("AsyncFunction"),tv=r=>r&&(vs(r)||gt(r))&>(r.then)&>(r.catch),Mp=((r,i)=>r?setImmediate:i?((s,l)=>(Fn.addEventListener("message",({source:c,data:f})=>{c===Fn&&f===s&&l.length&&l.shift()()},!1),c=>{l.push(c),Fn.postMessage(s,"*")}))(`axios@${Math.random()}`,[]):s=>setTimeout(s))(typeof setImmediate=="function",gt(Fn.postMessage)),nv=typeof queueMicrotask<"u"?queueMicrotask.bind(Fn):typeof process<"u"&&process.nextTick||Mp,O={isArray:Rr,isArrayBuffer:Tp,isBuffer:wy,isFormData:Py,isArrayBufferView:xy,isString:Sy,isNumber:Ip,isBoolean:Ey,isObject:vs,isPlainObject:Zi,isReadableStream:Ty,isRequest:Iy,isResponse:Ny,isHeaders:Oy,isUndefined:Po,isDate:Cy,isFile:ky,isBlob:jy,isRegExp:Yy,isFunction:gt,isStream:Ry,isURLSearchParams:_y,isTypedArray:$y,isFileList:Ay,forEach:_o,merge:Bu,extend:Dy,trim:Ly,stripBOM:My,inherits:zy,toFlatObject:Uy,kindOf:gs,kindOfTest:zt,endsWith:Fy,toArray:By,forEachEntry:Hy,matchAll:by,isHTMLForm:Vy,hasOwnProperty:Ad,hasOwnProp:Ad,reduceDescriptors:Lp,freezeMethods:qy,toObjectSet:Qy,toCamelCase:Wy,noop:Gy,toFiniteNumber:Ky,findKey:Np,global:Fn,isContextDefined:Op,ALPHABET:Dp,generateString:Xy,isSpecCompliantForm:Jy,toJSONObject:Zy,isAsyncFn:ev,isThenable:tv,setImmediate:Mp,asap:nv};function le(r,i,s,l,c){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=r,this.name="AxiosError",i&&(this.code=i),s&&(this.config=s),l&&(this.request=l),c&&(this.response=c,this.status=c.status?c.status:null)}O.inherits(le,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:O.toJSONObject(this.config),code:this.code,status:this.status}}});const zp=le.prototype,Up={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(r=>{Up[r]={value:r}});Object.defineProperties(le,Up);Object.defineProperty(zp,"isAxiosError",{value:!0});le.from=(r,i,s,l,c,f)=>{const p=Object.create(zp);return O.toFlatObject(r,p,function(x){return x!==Error.prototype},g=>g!=="isAxiosError"),le.call(p,r.message,i,s,l,c),p.cause=r,p.name=r.name,f&&Object.assign(p,f),p};const rv=null;function $u(r){return O.isPlainObject(r)||O.isArray(r)}function Fp(r){return O.endsWith(r,"[]")?r.slice(0,-2):r}function Pd(r,i,s){return r?r.concat(i).map(function(c,f){return c=Fp(c),!s&&f?"["+c+"]":c}).join(s?".":""):i}function ov(r){return O.isArray(r)&&!r.some($u)}const iv=O.toFlatObject(O,{},null,function(i){return/^is[A-Z]/.test(i)});function ws(r,i,s){if(!O.isObject(r))throw new TypeError("target must be an object");i=i||new FormData,s=O.toFlatObject(s,{metaTokens:!0,dots:!1,indexes:!1},!1,function(C,N){return!O.isUndefined(N[C])});const l=s.metaTokens,c=s.visitor||S,f=s.dots,p=s.indexes,x=(s.Blob||typeof Blob<"u"&&Blob)&&O.isSpecCompliantForm(i);if(!O.isFunction(c))throw new TypeError("visitor must be a function");function v(R){if(R===null)return"";if(O.isDate(R))return R.toISOString();if(!x&&O.isBlob(R))throw new le("Blob is not supported. Use a Buffer instead.");return O.isArrayBuffer(R)||O.isTypedArray(R)?x&&typeof Blob=="function"?new Blob([R]):Buffer.from(R):R}function S(R,C,N){let b=R;if(R&&!N&&typeof R=="object"){if(O.endsWith(C,"{}"))C=l?C:C.slice(0,-2),R=JSON.stringify(R);else if(O.isArray(R)&&ov(R)||(O.isFileList(R)||O.endsWith(C,"[]"))&&(b=O.toArray(R)))return C=Fp(C),b.forEach(function(V,Q){!(O.isUndefined(V)||V===null)&&i.append(p===!0?Pd([C],Q,f):p===null?C:C+"[]",v(V))}),!1}return $u(R)?!0:(i.append(Pd(N,C,f),v(R)),!1)}const A=[],T=Object.assign(iv,{defaultVisitor:S,convertValue:v,isVisitable:$u});function I(R,C){if(!O.isUndefined(R)){if(A.indexOf(R)!==-1)throw Error("Circular reference detected in "+C.join("."));A.push(R),O.forEach(R,function(b,U){(!(O.isUndefined(b)||b===null)&&c.call(i,b,O.isString(U)?U.trim():U,C,T))===!0&&I(b,C?C.concat(U):[U])}),A.pop()}}if(!O.isObject(r))throw new TypeError("data must be an object");return I(r),i}function _d(r){const i={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(r).replace(/[!'()~]|%20|%00/g,function(l){return i[l]})}function ra(r,i){this._pairs=[],r&&ws(r,this,i)}const Bp=ra.prototype;Bp.append=function(i,s){this._pairs.push([i,s])};Bp.toString=function(i){const s=i?function(l){return i.call(this,l,_d)}:_d;return this._pairs.map(function(c){return s(c[0])+"="+s(c[1])},"").join("&")};function sv(r){return encodeURIComponent(r).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function $p(r,i,s){if(!i)return r;const l=s&&s.encode||sv;O.isFunction(s)&&(s={serialize:s});const c=s&&s.serialize;let f;if(c?f=c(i,s):f=O.isURLSearchParams(i)?i.toString():new ra(i,s).toString(l),f){const p=r.indexOf("#");p!==-1&&(r=r.slice(0,p)),r+=(r.indexOf("?")===-1?"?":"&")+f}return r}class Td{constructor(){this.handlers=[]}use(i,s,l){return this.handlers.push({fulfilled:i,rejected:s,synchronous:l?l.synchronous:!1,runWhen:l?l.runWhen:null}),this.handlers.length-1}eject(i){this.handlers[i]&&(this.handlers[i]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(i){O.forEach(this.handlers,function(l){l!==null&&i(l)})}}const Hp={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},lv=typeof URLSearchParams<"u"?URLSearchParams:ra,uv=typeof FormData<"u"?FormData:null,av=typeof Blob<"u"?Blob:null,cv={isBrowser:!0,classes:{URLSearchParams:lv,FormData:uv,Blob:av},protocols:["http","https","file","blob","url","data"]},oa=typeof window<"u"&&typeof document<"u",Hu=typeof navigator=="object"&&navigator||void 0,fv=oa&&(!Hu||["ReactNative","NativeScript","NS"].indexOf(Hu.product)<0),dv=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",pv=oa&&window.location.href||"http://localhost",hv=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:oa,hasStandardBrowserEnv:fv,hasStandardBrowserWebWorkerEnv:dv,navigator:Hu,origin:pv},Symbol.toStringTag,{value:"Module"})),Ge={...hv,...cv};function mv(r,i){return ws(r,new Ge.classes.URLSearchParams,Object.assign({visitor:function(s,l,c,f){return Ge.isNode&&O.isBuffer(s)?(this.append(l,s.toString("base64")),!1):f.defaultVisitor.apply(this,arguments)}},i))}function gv(r){return O.matchAll(/\w+|\[(\w*)]/g,r).map(i=>i[0]==="[]"?"":i[1]||i[0])}function yv(r){const i={},s=Object.keys(r);let l;const c=s.length;let f;for(l=0;l=s.length;return p=!p&&O.isArray(c)?c.length:p,x?(O.hasOwnProp(c,p)?c[p]=[c[p],l]:c[p]=l,!g):((!c[p]||!O.isObject(c[p]))&&(c[p]=[]),i(s,l,c[p],f)&&O.isArray(c[p])&&(c[p]=yv(c[p])),!g)}if(O.isFormData(r)&&O.isFunction(r.entries)){const s={};return O.forEachEntry(r,(l,c)=>{i(gv(l),c,s,0)}),s}return null}function vv(r,i,s){if(O.isString(r))try{return(i||JSON.parse)(r),O.trim(r)}catch(l){if(l.name!=="SyntaxError")throw l}return(0,JSON.stringify)(r)}const To={transitional:Hp,adapter:["xhr","http","fetch"],transformRequest:[function(i,s){const l=s.getContentType()||"",c=l.indexOf("application/json")>-1,f=O.isObject(i);if(f&&O.isHTMLForm(i)&&(i=new FormData(i)),O.isFormData(i))return c?JSON.stringify(bp(i)):i;if(O.isArrayBuffer(i)||O.isBuffer(i)||O.isStream(i)||O.isFile(i)||O.isBlob(i)||O.isReadableStream(i))return i;if(O.isArrayBufferView(i))return i.buffer;if(O.isURLSearchParams(i))return s.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),i.toString();let g;if(f){if(l.indexOf("application/x-www-form-urlencoded")>-1)return mv(i,this.formSerializer).toString();if((g=O.isFileList(i))||l.indexOf("multipart/form-data")>-1){const x=this.env&&this.env.FormData;return ws(g?{"files[]":i}:i,x&&new x,this.formSerializer)}}return f||c?(s.setContentType("application/json",!1),vv(i)):i}],transformResponse:[function(i){const s=this.transitional||To.transitional,l=s&&s.forcedJSONParsing,c=this.responseType==="json";if(O.isResponse(i)||O.isReadableStream(i))return i;if(i&&O.isString(i)&&(l&&!this.responseType||c)){const p=!(s&&s.silentJSONParsing)&&c;try{return JSON.parse(i)}catch(g){if(p)throw g.name==="SyntaxError"?le.from(g,le.ERR_BAD_RESPONSE,this,null,this.response):g}}return i}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ge.classes.FormData,Blob:Ge.classes.Blob},validateStatus:function(i){return i>=200&&i<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};O.forEach(["delete","get","head","post","put","patch"],r=>{To.headers[r]={}});const wv=O.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),xv=r=>{const i={};let s,l,c;return r&&r.split(` +`).forEach(function(p){c=p.indexOf(":"),s=p.substring(0,c).trim().toLowerCase(),l=p.substring(c+1).trim(),!(!s||i[s]&&wv[s])&&(s==="set-cookie"?i[s]?i[s].push(l):i[s]=[l]:i[s]=i[s]?i[s]+", "+l:l)}),i},Id=Symbol("internals");function vo(r){return r&&String(r).trim().toLowerCase()}function es(r){return r===!1||r==null?r:O.isArray(r)?r.map(es):String(r)}function Sv(r){const i=Object.create(null),s=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let l;for(;l=s.exec(r);)i[l[1]]=l[2];return i}const Ev=r=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(r.trim());function ju(r,i,s,l,c){if(O.isFunction(l))return l.call(this,i,s);if(c&&(i=s),!!O.isString(i)){if(O.isString(l))return i.indexOf(l)!==-1;if(O.isRegExp(l))return l.test(i)}}function Cv(r){return r.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(i,s,l)=>s.toUpperCase()+l)}function kv(r,i){const s=O.toCamelCase(" "+i);["get","set","has"].forEach(l=>{Object.defineProperty(r,l+s,{value:function(c,f,p){return this[l].call(this,i,c,f,p)},configurable:!0})})}class ut{constructor(i){i&&this.set(i)}set(i,s,l){const c=this;function f(g,x,v){const S=vo(x);if(!S)throw new Error("header name must be a non-empty string");const A=O.findKey(c,S);(!A||c[A]===void 0||v===!0||v===void 0&&c[A]!==!1)&&(c[A||x]=es(g))}const p=(g,x)=>O.forEach(g,(v,S)=>f(v,S,x));if(O.isPlainObject(i)||i instanceof this.constructor)p(i,s);else if(O.isString(i)&&(i=i.trim())&&!Ev(i))p(xv(i),s);else if(O.isHeaders(i))for(const[g,x]of i.entries())f(x,g,l);else i!=null&&f(s,i,l);return this}get(i,s){if(i=vo(i),i){const l=O.findKey(this,i);if(l){const c=this[l];if(!s)return c;if(s===!0)return Sv(c);if(O.isFunction(s))return s.call(this,c,l);if(O.isRegExp(s))return s.exec(c);throw new TypeError("parser must be boolean|regexp|function")}}}has(i,s){if(i=vo(i),i){const l=O.findKey(this,i);return!!(l&&this[l]!==void 0&&(!s||ju(this,this[l],l,s)))}return!1}delete(i,s){const l=this;let c=!1;function f(p){if(p=vo(p),p){const g=O.findKey(l,p);g&&(!s||ju(l,l[g],g,s))&&(delete l[g],c=!0)}}return O.isArray(i)?i.forEach(f):f(i),c}clear(i){const s=Object.keys(this);let l=s.length,c=!1;for(;l--;){const f=s[l];(!i||ju(this,this[f],f,i,!0))&&(delete this[f],c=!0)}return c}normalize(i){const s=this,l={};return O.forEach(this,(c,f)=>{const p=O.findKey(l,f);if(p){s[p]=es(c),delete s[f];return}const g=i?Cv(f):String(f).trim();g!==f&&delete s[f],s[g]=es(c),l[g]=!0}),this}concat(...i){return this.constructor.concat(this,...i)}toJSON(i){const s=Object.create(null);return O.forEach(this,(l,c)=>{l!=null&&l!==!1&&(s[c]=i&&O.isArray(l)?l.join(", "):l)}),s}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([i,s])=>i+": "+s).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(i){return i instanceof this?i:new this(i)}static concat(i,...s){const l=new this(i);return s.forEach(c=>l.set(c)),l}static accessor(i){const l=(this[Id]=this[Id]={accessors:{}}).accessors,c=this.prototype;function f(p){const g=vo(p);l[g]||(kv(c,p),l[g]=!0)}return O.isArray(i)?i.forEach(f):f(i),this}}ut.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);O.reduceDescriptors(ut.prototype,({value:r},i)=>{let s=i[0].toUpperCase()+i.slice(1);return{get:()=>r,set(l){this[s]=l}}});O.freezeMethods(ut);function Au(r,i){const s=this||To,l=i||s,c=ut.from(l.headers);let f=l.data;return O.forEach(r,function(g){f=g.call(s,f,c.normalize(),i?i.status:void 0)}),c.normalize(),f}function Vp(r){return!!(r&&r.__CANCEL__)}function Pr(r,i,s){le.call(this,r??"canceled",le.ERR_CANCELED,i,s),this.name="CanceledError"}O.inherits(Pr,le,{__CANCEL__:!0});function Wp(r,i,s){const l=s.config.validateStatus;!s.status||!l||l(s.status)?r(s):i(new le("Request failed with status code "+s.status,[le.ERR_BAD_REQUEST,le.ERR_BAD_RESPONSE][Math.floor(s.status/100)-4],s.config,s.request,s))}function jv(r){const i=/^([-+\w]{1,25})(:?\/\/|:)/.exec(r);return i&&i[1]||""}function Av(r,i){r=r||10;const s=new Array(r),l=new Array(r);let c=0,f=0,p;return i=i!==void 0?i:1e3,function(x){const v=Date.now(),S=l[f];p||(p=v),s[c]=x,l[c]=v;let A=f,T=0;for(;A!==c;)T+=s[A++],A=A%r;if(c=(c+1)%r,c===f&&(f=(f+1)%r),v-p{s=S,c=null,f&&(clearTimeout(f),f=null),r.apply(null,v)};return[(...v)=>{const S=Date.now(),A=S-s;A>=l?p(v,S):(c=v,f||(f=setTimeout(()=>{f=null,p(c)},l-A)))},()=>c&&p(c)]}const ls=(r,i,s=3)=>{let l=0;const c=Av(50,250);return Rv(f=>{const p=f.loaded,g=f.lengthComputable?f.total:void 0,x=p-l,v=c(x),S=p<=g;l=p;const A={loaded:p,total:g,progress:g?p/g:void 0,bytes:x,rate:v||void 0,estimated:v&&g&&S?(g-p)/v:void 0,event:f,lengthComputable:g!=null,[i?"download":"upload"]:!0};r(A)},s)},Nd=(r,i)=>{const s=r!=null;return[l=>i[0]({lengthComputable:s,total:r,loaded:l}),i[1]]},Od=r=>(...i)=>O.asap(()=>r(...i)),Pv=Ge.hasStandardBrowserEnv?((r,i)=>s=>(s=new URL(s,Ge.origin),r.protocol===s.protocol&&r.host===s.host&&(i||r.port===s.port)))(new URL(Ge.origin),Ge.navigator&&/(msie|trident)/i.test(Ge.navigator.userAgent)):()=>!0,_v=Ge.hasStandardBrowserEnv?{write(r,i,s,l,c,f){const p=[r+"="+encodeURIComponent(i)];O.isNumber(s)&&p.push("expires="+new Date(s).toGMTString()),O.isString(l)&&p.push("path="+l),O.isString(c)&&p.push("domain="+c),f===!0&&p.push("secure"),document.cookie=p.join("; ")},read(r){const i=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return i?decodeURIComponent(i[3]):null},remove(r){this.write(r,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Tv(r){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(r)}function Iv(r,i){return i?r.replace(/\/?\/$/,"")+"/"+i.replace(/^\/+/,""):r}function Yp(r,i){return r&&!Tv(i)?Iv(r,i):i}const Ld=r=>r instanceof ut?{...r}:r;function Wn(r,i){i=i||{};const s={};function l(v,S,A,T){return O.isPlainObject(v)&&O.isPlainObject(S)?O.merge.call({caseless:T},v,S):O.isPlainObject(S)?O.merge({},S):O.isArray(S)?S.slice():S}function c(v,S,A,T){if(O.isUndefined(S)){if(!O.isUndefined(v))return l(void 0,v,A,T)}else return l(v,S,A,T)}function f(v,S){if(!O.isUndefined(S))return l(void 0,S)}function p(v,S){if(O.isUndefined(S)){if(!O.isUndefined(v))return l(void 0,v)}else return l(void 0,S)}function g(v,S,A){if(A in i)return l(v,S);if(A in r)return l(void 0,v)}const x={url:f,method:f,data:f,baseURL:p,transformRequest:p,transformResponse:p,paramsSerializer:p,timeout:p,timeoutMessage:p,withCredentials:p,withXSRFToken:p,adapter:p,responseType:p,xsrfCookieName:p,xsrfHeaderName:p,onUploadProgress:p,onDownloadProgress:p,decompress:p,maxContentLength:p,maxBodyLength:p,beforeRedirect:p,transport:p,httpAgent:p,httpsAgent:p,cancelToken:p,socketPath:p,responseEncoding:p,validateStatus:g,headers:(v,S,A)=>c(Ld(v),Ld(S),A,!0)};return O.forEach(Object.keys(Object.assign({},r,i)),function(S){const A=x[S]||c,T=A(r[S],i[S],S);O.isUndefined(T)&&A!==g||(s[S]=T)}),s}const qp=r=>{const i=Wn({},r);let{data:s,withXSRFToken:l,xsrfHeaderName:c,xsrfCookieName:f,headers:p,auth:g}=i;i.headers=p=ut.from(p),i.url=$p(Yp(i.baseURL,i.url),r.params,r.paramsSerializer),g&&p.set("Authorization","Basic "+btoa((g.username||"")+":"+(g.password?unescape(encodeURIComponent(g.password)):"")));let x;if(O.isFormData(s)){if(Ge.hasStandardBrowserEnv||Ge.hasStandardBrowserWebWorkerEnv)p.setContentType(void 0);else if((x=p.getContentType())!==!1){const[v,...S]=x?x.split(";").map(A=>A.trim()).filter(Boolean):[];p.setContentType([v||"multipart/form-data",...S].join("; "))}}if(Ge.hasStandardBrowserEnv&&(l&&O.isFunction(l)&&(l=l(i)),l||l!==!1&&Pv(i.url))){const v=c&&f&&_v.read(f);v&&p.set(c,v)}return i},Nv=typeof XMLHttpRequest<"u",Ov=Nv&&function(r){return new Promise(function(s,l){const c=qp(r);let f=c.data;const p=ut.from(c.headers).normalize();let{responseType:g,onUploadProgress:x,onDownloadProgress:v}=c,S,A,T,I,R;function C(){I&&I(),R&&R(),c.cancelToken&&c.cancelToken.unsubscribe(S),c.signal&&c.signal.removeEventListener("abort",S)}let N=new XMLHttpRequest;N.open(c.method.toUpperCase(),c.url,!0),N.timeout=c.timeout;function b(){if(!N)return;const V=ut.from("getAllResponseHeaders"in N&&N.getAllResponseHeaders()),$={data:!g||g==="text"||g==="json"?N.responseText:N.response,status:N.status,statusText:N.statusText,headers:V,config:r,request:N};Wp(function(B){s(B),C()},function(B){l(B),C()},$),N=null}"onloadend"in N?N.onloadend=b:N.onreadystatechange=function(){!N||N.readyState!==4||N.status===0&&!(N.responseURL&&N.responseURL.indexOf("file:")===0)||setTimeout(b)},N.onabort=function(){N&&(l(new le("Request aborted",le.ECONNABORTED,r,N)),N=null)},N.onerror=function(){l(new le("Network Error",le.ERR_NETWORK,r,N)),N=null},N.ontimeout=function(){let Q=c.timeout?"timeout of "+c.timeout+"ms exceeded":"timeout exceeded";const $=c.transitional||Hp;c.timeoutErrorMessage&&(Q=c.timeoutErrorMessage),l(new le(Q,$.clarifyTimeoutError?le.ETIMEDOUT:le.ECONNABORTED,r,N)),N=null},f===void 0&&p.setContentType(null),"setRequestHeader"in N&&O.forEach(p.toJSON(),function(Q,$){N.setRequestHeader($,Q)}),O.isUndefined(c.withCredentials)||(N.withCredentials=!!c.withCredentials),g&&g!=="json"&&(N.responseType=c.responseType),v&&([T,R]=ls(v,!0),N.addEventListener("progress",T)),x&&N.upload&&([A,I]=ls(x),N.upload.addEventListener("progress",A),N.upload.addEventListener("loadend",I)),(c.cancelToken||c.signal)&&(S=V=>{N&&(l(!V||V.type?new Pr(null,r,N):V),N.abort(),N=null)},c.cancelToken&&c.cancelToken.subscribe(S),c.signal&&(c.signal.aborted?S():c.signal.addEventListener("abort",S)));const U=jv(c.url);if(U&&Ge.protocols.indexOf(U)===-1){l(new le("Unsupported protocol "+U+":",le.ERR_BAD_REQUEST,r));return}N.send(f||null)})},Lv=(r,i)=>{const{length:s}=r=r?r.filter(Boolean):[];if(i||s){let l=new AbortController,c;const f=function(v){if(!c){c=!0,g();const S=v instanceof Error?v:this.reason;l.abort(S instanceof le?S:new Pr(S instanceof Error?S.message:S))}};let p=i&&setTimeout(()=>{p=null,f(new le(`timeout ${i} of ms exceeded`,le.ETIMEDOUT))},i);const g=()=>{r&&(p&&clearTimeout(p),p=null,r.forEach(v=>{v.unsubscribe?v.unsubscribe(f):v.removeEventListener("abort",f)}),r=null)};r.forEach(v=>v.addEventListener("abort",f));const{signal:x}=l;return x.unsubscribe=()=>O.asap(g),x}},Dv=function*(r,i){let s=r.byteLength;if(s{const c=Mv(r,i);let f=0,p,g=x=>{p||(p=!0,l&&l(x))};return new ReadableStream({async pull(x){try{const{done:v,value:S}=await c.next();if(v){g(),x.close();return}let A=S.byteLength;if(s){let T=f+=A;s(T)}x.enqueue(new Uint8Array(S))}catch(v){throw g(v),v}},cancel(x){return g(x),c.return()}},{highWaterMark:2})},xs=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Qp=xs&&typeof ReadableStream=="function",Uv=xs&&(typeof TextEncoder=="function"?(r=>i=>r.encode(i))(new TextEncoder):async r=>new Uint8Array(await new Response(r).arrayBuffer())),Gp=(r,...i)=>{try{return!!r(...i)}catch{return!1}},Fv=Qp&&Gp(()=>{let r=!1;const i=new Request(Ge.origin,{body:new ReadableStream,method:"POST",get duplex(){return r=!0,"half"}}).headers.has("Content-Type");return r&&!i}),Md=64*1024,bu=Qp&&Gp(()=>O.isReadableStream(new Response("").body)),us={stream:bu&&(r=>r.body)};xs&&(r=>{["text","arrayBuffer","blob","formData","stream"].forEach(i=>{!us[i]&&(us[i]=O.isFunction(r[i])?s=>s[i]():(s,l)=>{throw new le(`Response type '${i}' is not supported`,le.ERR_NOT_SUPPORT,l)})})})(new Response);const Bv=async r=>{if(r==null)return 0;if(O.isBlob(r))return r.size;if(O.isSpecCompliantForm(r))return(await new Request(Ge.origin,{method:"POST",body:r}).arrayBuffer()).byteLength;if(O.isArrayBufferView(r)||O.isArrayBuffer(r))return r.byteLength;if(O.isURLSearchParams(r)&&(r=r+""),O.isString(r))return(await Uv(r)).byteLength},$v=async(r,i)=>{const s=O.toFiniteNumber(r.getContentLength());return s??Bv(i)},Hv=xs&&(async r=>{let{url:i,method:s,data:l,signal:c,cancelToken:f,timeout:p,onDownloadProgress:g,onUploadProgress:x,responseType:v,headers:S,withCredentials:A="same-origin",fetchOptions:T}=qp(r);v=v?(v+"").toLowerCase():"text";let I=Lv([c,f&&f.toAbortSignal()],p),R;const C=I&&I.unsubscribe&&(()=>{I.unsubscribe()});let N;try{if(x&&Fv&&s!=="get"&&s!=="head"&&(N=await $v(S,l))!==0){let $=new Request(i,{method:"POST",body:l,duplex:"half"}),L;if(O.isFormData(l)&&(L=$.headers.get("content-type"))&&S.setContentType(L),$.body){const[B,ie]=Nd(N,ls(Od(x)));l=Dd($.body,Md,B,ie)}}O.isString(A)||(A=A?"include":"omit");const b="credentials"in Request.prototype;R=new Request(i,{...T,signal:I,method:s.toUpperCase(),headers:S.normalize().toJSON(),body:l,duplex:"half",credentials:b?A:void 0});let U=await fetch(R);const V=bu&&(v==="stream"||v==="response");if(bu&&(g||V&&C)){const $={};["status","statusText","headers"].forEach(ye=>{$[ye]=U[ye]});const L=O.toFiniteNumber(U.headers.get("content-length")),[B,ie]=g&&Nd(L,ls(Od(g),!0))||[];U=new Response(Dd(U.body,Md,B,()=>{ie&&ie(),C&&C()}),$)}v=v||"text";let Q=await us[O.findKey(us,v)||"text"](U,r);return!V&&C&&C(),await new Promise(($,L)=>{Wp($,L,{data:Q,headers:ut.from(U.headers),status:U.status,statusText:U.statusText,config:r,request:R})})}catch(b){throw C&&C(),b&&b.name==="TypeError"&&/fetch/i.test(b.message)?Object.assign(new le("Network Error",le.ERR_NETWORK,r,R),{cause:b.cause||b}):le.from(b,b&&b.code,r,R)}}),Vu={http:rv,xhr:Ov,fetch:Hv};O.forEach(Vu,(r,i)=>{if(r){try{Object.defineProperty(r,"name",{value:i})}catch{}Object.defineProperty(r,"adapterName",{value:i})}});const zd=r=>`- ${r}`,bv=r=>O.isFunction(r)||r===null||r===!1,Kp={getAdapter:r=>{r=O.isArray(r)?r:[r];const{length:i}=r;let s,l;const c={};for(let f=0;f`adapter ${g} `+(x===!1?"is not supported by the environment":"is not available in the build"));let p=i?f.length>1?`since : +`+f.map(zd).join(` +`):" "+zd(f[0]):"as no adapter specified";throw new le("There is no suitable adapter to dispatch the request "+p,"ERR_NOT_SUPPORT")}return l},adapters:Vu};function Ru(r){if(r.cancelToken&&r.cancelToken.throwIfRequested(),r.signal&&r.signal.aborted)throw new Pr(null,r)}function Ud(r){return Ru(r),r.headers=ut.from(r.headers),r.data=Au.call(r,r.transformRequest),["post","put","patch"].indexOf(r.method)!==-1&&r.headers.setContentType("application/x-www-form-urlencoded",!1),Kp.getAdapter(r.adapter||To.adapter)(r).then(function(l){return Ru(r),l.data=Au.call(r,r.transformResponse,l),l.headers=ut.from(l.headers),l},function(l){return Vp(l)||(Ru(r),l&&l.response&&(l.response.data=Au.call(r,r.transformResponse,l.response),l.response.headers=ut.from(l.response.headers))),Promise.reject(l)})}const Xp="1.7.9",Ss={};["object","boolean","number","function","string","symbol"].forEach((r,i)=>{Ss[r]=function(l){return typeof l===r||"a"+(i<1?"n ":" ")+r}});const Fd={};Ss.transitional=function(i,s,l){function c(f,p){return"[Axios v"+Xp+"] Transitional option '"+f+"'"+p+(l?". "+l:"")}return(f,p,g)=>{if(i===!1)throw new le(c(p," has been removed"+(s?" in "+s:"")),le.ERR_DEPRECATED);return s&&!Fd[p]&&(Fd[p]=!0,console.warn(c(p," has been deprecated since v"+s+" and will be removed in the near future"))),i?i(f,p,g):!0}};Ss.spelling=function(i){return(s,l)=>(console.warn(`${l} is likely a misspelling of ${i}`),!0)};function Vv(r,i,s){if(typeof r!="object")throw new le("options must be an object",le.ERR_BAD_OPTION_VALUE);const l=Object.keys(r);let c=l.length;for(;c-- >0;){const f=l[c],p=i[f];if(p){const g=r[f],x=g===void 0||p(g,f,r);if(x!==!0)throw new le("option "+f+" must be "+x,le.ERR_BAD_OPTION_VALUE);continue}if(s!==!0)throw new le("Unknown option "+f,le.ERR_BAD_OPTION)}}const ts={assertOptions:Vv,validators:Ss},bt=ts.validators;class Hn{constructor(i){this.defaults=i,this.interceptors={request:new Td,response:new Td}}async request(i,s){try{return await this._request(i,s)}catch(l){if(l instanceof Error){let c={};Error.captureStackTrace?Error.captureStackTrace(c):c=new Error;const f=c.stack?c.stack.replace(/^.+\n/,""):"";try{l.stack?f&&!String(l.stack).endsWith(f.replace(/^.+\n.+\n/,""))&&(l.stack+=` +`+f):l.stack=f}catch{}}throw l}}_request(i,s){typeof i=="string"?(s=s||{},s.url=i):s=i||{},s=Wn(this.defaults,s);const{transitional:l,paramsSerializer:c,headers:f}=s;l!==void 0&&ts.assertOptions(l,{silentJSONParsing:bt.transitional(bt.boolean),forcedJSONParsing:bt.transitional(bt.boolean),clarifyTimeoutError:bt.transitional(bt.boolean)},!1),c!=null&&(O.isFunction(c)?s.paramsSerializer={serialize:c}:ts.assertOptions(c,{encode:bt.function,serialize:bt.function},!0)),ts.assertOptions(s,{baseUrl:bt.spelling("baseURL"),withXsrfToken:bt.spelling("withXSRFToken")},!0),s.method=(s.method||this.defaults.method||"get").toLowerCase();let p=f&&O.merge(f.common,f[s.method]);f&&O.forEach(["delete","get","head","post","put","patch","common"],R=>{delete f[R]}),s.headers=ut.concat(p,f);const g=[];let x=!0;this.interceptors.request.forEach(function(C){typeof C.runWhen=="function"&&C.runWhen(s)===!1||(x=x&&C.synchronous,g.unshift(C.fulfilled,C.rejected))});const v=[];this.interceptors.response.forEach(function(C){v.push(C.fulfilled,C.rejected)});let S,A=0,T;if(!x){const R=[Ud.bind(this),void 0];for(R.unshift.apply(R,g),R.push.apply(R,v),T=R.length,S=Promise.resolve(s);A{if(!l._listeners)return;let f=l._listeners.length;for(;f-- >0;)l._listeners[f](c);l._listeners=null}),this.promise.then=c=>{let f;const p=new Promise(g=>{l.subscribe(g),f=g}).then(c);return p.cancel=function(){l.unsubscribe(f)},p},i(function(f,p,g){l.reason||(l.reason=new Pr(f,p,g),s(l.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(i){if(this.reason){i(this.reason);return}this._listeners?this._listeners.push(i):this._listeners=[i]}unsubscribe(i){if(!this._listeners)return;const s=this._listeners.indexOf(i);s!==-1&&this._listeners.splice(s,1)}toAbortSignal(){const i=new AbortController,s=l=>{i.abort(l)};return this.subscribe(s),i.signal.unsubscribe=()=>this.unsubscribe(s),i.signal}static source(){let i;return{token:new ia(function(c){i=c}),cancel:i}}}function Wv(r){return function(s){return r.apply(null,s)}}function Yv(r){return O.isObject(r)&&r.isAxiosError===!0}const Wu={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Wu).forEach(([r,i])=>{Wu[i]=r});function Jp(r){const i=new Hn(r),s=_p(Hn.prototype.request,i);return O.extend(s,Hn.prototype,i,{allOwnKeys:!0}),O.extend(s,i,null,{allOwnKeys:!0}),s.create=function(c){return Jp(Wn(r,c))},s}const Le=Jp(To);Le.Axios=Hn;Le.CanceledError=Pr;Le.CancelToken=ia;Le.isCancel=Vp;Le.VERSION=Xp;Le.toFormData=ws;Le.AxiosError=le;Le.Cancel=Le.CanceledError;Le.all=function(i){return Promise.all(i)};Le.spread=Wv;Le.isAxiosError=Yv;Le.mergeConfig=Wn;Le.AxiosHeaders=ut;Le.formToJSON=r=>bp(O.isHTMLForm(r)?new FormData(r):r);Le.getAdapter=Kp.getAdapter;Le.HttpStatusCode=Wu;Le.default=Le;const qv={apiBaseUrl:"/api"};class Qv{constructor(){ed(this,"events",{})}on(i,s){return this.events[i]||(this.events[i]=[]),this.events[i].push(s),()=>this.off(i,s)}off(i,s){this.events[i]&&(this.events[i]=this.events[i].filter(l=>l!==s))}emit(i,...s){this.events[i]&&this.events[i].forEach(l=>{l(...s)})}}const as=new Qv,Xe=Le.create({baseURL:qv.apiBaseUrl,headers:{"Content-Type":"application/json"}});Xe.interceptors.response.use(r=>r,r=>{var s,l,c;const i=(s=r.response)==null?void 0:s.data;if(i){const f=(c=(l=r.response)==null?void 0:l.headers)==null?void 0:c["discodeit-request-id"];f&&(i.requestId=f),r.response.data=i}return as.emit("api-error",r),r.response&&r.response.status===401&&as.emit("auth-error"),Promise.reject(r)});const Gv=()=>Xe.defaults.baseURL,Kv=async(r,i)=>{const s={username:r,password:i};return(await Xe.post("/auth/login",s)).data},Xv=async r=>(await Xe.post("/users",r,{headers:{"Content-Type":"multipart/form-data"}})).data,Bd=r=>{let i;const s=new Set,l=(v,S)=>{const A=typeof v=="function"?v(i):v;if(!Object.is(A,i)){const T=i;i=S??(typeof A!="object"||A===null)?A:Object.assign({},i,A),s.forEach(I=>I(i,T))}},c=()=>i,g={setState:l,getState:c,getInitialState:()=>x,subscribe:v=>(s.add(v),()=>s.delete(v))},x=i=r(l,c,g);return g},Jv=r=>r?Bd(r):Bd,Zv=r=>r;function e0(r,i=Zv){const s=mt.useSyncExternalStore(r.subscribe,()=>i(r.getState()),()=>i(r.getInitialState()));return mt.useDebugValue(s),s}const $d=r=>{const i=Jv(r),s=l=>e0(i,l);return Object.assign(s,i),s},_r=r=>r?$d(r):$d,Zp=async(r,i)=>(await Xe.patch(`/users/${r}`,i,{headers:{"Content-Type":"multipart/form-data"}})).data,t0=async()=>(await Xe.get("/users")).data,n0=async r=>(await Xe.patch(`/users/${r}/userStatus`,{newLastActiveAt:new Date().toISOString()})).data,nn=_r(r=>({users:[],fetchUsers:async()=>{try{const i=await t0();r({users:i})}catch(i){console.error("사용자 목록 조회 실패:",i)}},updateUserStatus:async i=>{try{await n0(i)}catch(s){console.error("사용자 상태 업데이트 실패:",s)}}}));function eh(r,i){let s;try{s=r()}catch{return}return{getItem:c=>{var f;const p=x=>x===null?null:JSON.parse(x,void 0),g=(f=s.getItem(c))!=null?f:null;return g instanceof Promise?g.then(p):p(g)},setItem:(c,f)=>s.setItem(c,JSON.stringify(f,void 0)),removeItem:c=>s.removeItem(c)}}const Yu=r=>i=>{try{const s=r(i);return s instanceof Promise?s:{then(l){return Yu(l)(s)},catch(l){return this}}}catch(s){return{then(l){return this},catch(l){return Yu(l)(s)}}}},r0=(r,i)=>(s,l,c)=>{let f={storage:eh(()=>localStorage),partialize:C=>C,version:0,merge:(C,N)=>({...N,...C}),...i},p=!1;const g=new Set,x=new Set;let v=f.storage;if(!v)return r((...C)=>{console.warn(`[zustand persist middleware] Unable to update item '${f.name}', the given storage is currently unavailable.`),s(...C)},l,c);const S=()=>{const C=f.partialize({...l()});return v.setItem(f.name,{state:C,version:f.version})},A=c.setState;c.setState=(C,N)=>{A(C,N),S()};const T=r((...C)=>{s(...C),S()},l,c);c.getInitialState=()=>T;let I;const R=()=>{var C,N;if(!v)return;p=!1,g.forEach(U=>{var V;return U((V=l())!=null?V:T)});const b=((N=f.onRehydrateStorage)==null?void 0:N.call(f,(C=l())!=null?C:T))||void 0;return Yu(v.getItem.bind(v))(f.name).then(U=>{if(U)if(typeof U.version=="number"&&U.version!==f.version){if(f.migrate){const V=f.migrate(U.state,U.version);return V instanceof Promise?V.then(Q=>[!0,Q]):[!0,V]}console.error("State loaded from storage couldn't be migrated since no migrate function was provided")}else return[!1,U.state];return[!1,void 0]}).then(U=>{var V;const[Q,$]=U;if(I=f.merge($,(V=l())!=null?V:T),s(I,!0),Q)return S()}).then(()=>{b==null||b(I,void 0),I=l(),p=!0,x.forEach(U=>U(I))}).catch(U=>{b==null||b(void 0,U)})};return c.persist={setOptions:C=>{f={...f,...C},C.storage&&(v=C.storage)},clearStorage:()=>{v==null||v.removeItem(f.name)},getOptions:()=>f,rehydrate:()=>R(),hasHydrated:()=>p,onHydrate:C=>(g.add(C),()=>{g.delete(C)}),onFinishHydration:C=>(x.add(C),()=>{x.delete(C)})},f.skipHydration||R(),I||T},o0=r0,yt=_r()(o0(r=>({currentUserId:null,setCurrentUser:i=>r({currentUserId:i.id}),logout:()=>{const i=yt.getState().currentUserId;i&&nn.getState().updateUserStatus(i),r({currentUserId:null})},updateUser:async(i,s)=>{try{const l=await Zp(i,s);return await nn.getState().fetchUsers(),l}catch(l){throw console.error("사용자 정보 수정 실패:",l),l}}}),{name:"user-storage",storage:eh(()=>sessionStorage)})),ee={colors:{brand:{primary:"#5865F2",hover:"#4752C4"},background:{primary:"#1a1a1a",secondary:"#2a2a2a",tertiary:"#333333",input:"#40444B",hover:"rgba(255, 255, 255, 0.1)"},text:{primary:"#ffffff",secondary:"#cccccc",muted:"#999999"},status:{online:"#43b581",idle:"#faa61a",dnd:"#f04747",offline:"#747f8d",error:"#ED4245"},border:{primary:"#404040"}}},th=_.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,nh=_.div` + background: ${ee.colors.background.primary}; + padding: 32px; + border-radius: 8px; + width: 440px; + + h2 { + color: ${ee.colors.text.primary}; + margin-bottom: 24px; + font-size: 24px; + font-weight: bold; + } + + form { + display: flex; + flex-direction: column; + gap: 16px; + } +`,ko=_.input` + width: 100%; + padding: 10px; + border-radius: 4px; + background: ${ee.colors.background.input}; + border: none; + color: ${ee.colors.text.primary}; + font-size: 16px; + + &::placeholder { + color: ${ee.colors.text.muted}; + } + + &:focus { + outline: none; + } +`,rh=_.button` + width: 100%; + padding: 12px; + border-radius: 4px; + background: ${ee.colors.brand.primary}; + color: white; + font-size: 16px; + font-weight: 500; + border: none; + cursor: pointer; + transition: background-color 0.2s; + + &:hover { + background: ${ee.colors.brand.hover}; + } +`,oh=_.div` + color: ${ee.colors.status.error}; + font-size: 14px; + text-align: center; +`,i0=_.p` + text-align: center; + margin-top: 16px; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 14px; +`,s0=_.span` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +`,Vi=_.div` + margin-bottom: 20px; +`,Wi=_.label` + display: block; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 12px; + font-weight: 700; + margin-bottom: 8px; +`,Pu=_.span` + color: ${({theme:r})=>r.colors.status.error}; +`,l0=_.div` + display: flex; + flex-direction: column; + align-items: center; + margin: 10px 0; +`,u0=_.img` + width: 80px; + height: 80px; + border-radius: 50%; + margin-bottom: 10px; + object-fit: cover; +`,a0=_.input` + display: none; +`,c0=_.label` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + font-size: 14px; + + &:hover { + text-decoration: underline; + } +`,f0=_.span` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +`,d0=_(f0)` + display: block; + text-align: center; + margin-top: 16px; +`,Mt="data:image/png;base64,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",p0=({isOpen:r,onClose:i})=>{const[s,l]=oe.useState(""),[c,f]=oe.useState(""),[p,g]=oe.useState(""),[x,v]=oe.useState(null),[S,A]=oe.useState(null),[T,I]=oe.useState(""),R=yt(b=>b.setCurrentUser),C=b=>{var V;const U=(V=b.target.files)==null?void 0:V[0];if(U){v(U);const Q=new FileReader;Q.onloadend=()=>{A(Q.result)},Q.readAsDataURL(U)}},N=async b=>{b.preventDefault(),I("");try{const U=new FormData;U.append("userCreateRequest",new Blob([JSON.stringify({email:s,username:c,password:p})],{type:"application/json"})),x&&U.append("profile",x);const V=await Xv(U);R(V),i()}catch{I("회원가입에 실패했습니다.")}};return r?h.jsx(th,{children:h.jsxs(nh,{children:[h.jsx("h2",{children:"계정 만들기"}),h.jsxs("form",{onSubmit:N,children:[h.jsxs(Vi,{children:[h.jsxs(Wi,{children:["이메일 ",h.jsx(Pu,{children:"*"})]}),h.jsx(ko,{type:"email",value:s,onChange:b=>l(b.target.value),required:!0})]}),h.jsxs(Vi,{children:[h.jsxs(Wi,{children:["사용자명 ",h.jsx(Pu,{children:"*"})]}),h.jsx(ko,{type:"text",value:c,onChange:b=>f(b.target.value),required:!0})]}),h.jsxs(Vi,{children:[h.jsxs(Wi,{children:["비밀번호 ",h.jsx(Pu,{children:"*"})]}),h.jsx(ko,{type:"password",value:p,onChange:b=>g(b.target.value),required:!0})]}),h.jsxs(Vi,{children:[h.jsx(Wi,{children:"프로필 이미지"}),h.jsxs(l0,{children:[h.jsx(u0,{src:S||Mt,alt:"profile"}),h.jsx(a0,{type:"file",accept:"image/*",onChange:C,id:"profile-image"}),h.jsx(c0,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),T&&h.jsx(oh,{children:T}),h.jsx(rh,{type:"submit",children:"계속하기"}),h.jsx(d0,{onClick:i,children:"이미 계정이 있으신가요?"})]})]})}):null},h0=({isOpen:r,onClose:i})=>{const[s,l]=oe.useState(""),[c,f]=oe.useState(""),[p,g]=oe.useState(""),[x,v]=oe.useState(!1),S=yt(I=>I.setCurrentUser),{fetchUsers:A}=nn(),T=async()=>{var I;try{const R=await Kv(s,c);await A(),S(R),g(""),i()}catch(R){console.error("로그인 에러:",R),((I=R.response)==null?void 0:I.status)===401?g("아이디 또는 비밀번호가 올바르지 않습니다."):g("로그인에 실패했습니다.")}};return r?h.jsxs(h.Fragment,{children:[h.jsx(th,{children:h.jsxs(nh,{children:[h.jsx("h2",{children:"돌아오신 것을 환영해요!"}),h.jsxs("form",{onSubmit:I=>{I.preventDefault(),T()},children:[h.jsx(ko,{type:"text",placeholder:"사용자 이름",value:s,onChange:I=>l(I.target.value)}),h.jsx(ko,{type:"password",placeholder:"비밀번호",value:c,onChange:I=>f(I.target.value)}),p&&h.jsx(oh,{children:p}),h.jsx(rh,{type:"submit",children:"로그인"})]}),h.jsxs(i0,{children:["계정이 필요한가요? ",h.jsx(s0,{onClick:()=>v(!0),children:"가입하기"})]})]})}),h.jsx(p0,{isOpen:x,onClose:()=>v(!1)})]}):null},m0=async r=>(await Xe.get(`/channels?userId=${r}`)).data,g0=async r=>(await Xe.post("/channels/public",r)).data,y0=async r=>{const i={participantIds:r};return(await Xe.post("/channels/private",i)).data},v0=async r=>(await Xe.get("/readStatuses",{params:{userId:r}})).data,w0=async(r,i)=>{const s={newLastReadAt:i};return(await Xe.patch(`/readStatuses/${r}`,s)).data},x0=async(r,i,s)=>{const l={userId:r,channelId:i,lastReadAt:s};return(await Xe.post("/readStatuses",l)).data},jo=_r((r,i)=>({readStatuses:{},fetchReadStatuses:async()=>{try{const s=yt.getState().currentUserId;if(!s)return;const c=(await v0(s)).reduce((f,p)=>(f[p.channelId]={id:p.id,lastReadAt:p.lastReadAt},f),{});r({readStatuses:c})}catch(s){console.error("읽음 상태 조회 실패:",s)}},updateReadStatus:async s=>{try{const l=yt.getState().currentUserId;if(!l)return;const c=i().readStatuses[s];let f;c?f=await w0(c.id,new Date().toISOString()):f=await x0(l,s,new Date().toISOString()),r(p=>({readStatuses:{...p.readStatuses,[s]:{id:f.id,lastReadAt:f.lastReadAt}}}))}catch(l){console.error("읽음 상태 업데이트 실패:",l)}},hasUnreadMessages:(s,l)=>{const c=i().readStatuses[s],f=c==null?void 0:c.lastReadAt;return!f||new Date(l)>new Date(f)}})),xr=_r((r,i)=>({channels:[],pollingInterval:null,loading:!1,error:null,fetchChannels:async s=>{r({loading:!0,error:null});try{const l=await m0(s);r(f=>{const p=new Set(f.channels.map(S=>S.id)),g=l.filter(S=>!p.has(S.id));return{channels:[...f.channels.filter(S=>l.some(A=>A.id===S.id)),...g],loading:!1}});const{fetchReadStatuses:c}=jo.getState();return c(),l}catch(l){return r({error:l,loading:!1}),[]}},startPolling:s=>{const l=i().pollingInterval;l&&clearInterval(l);const c=setInterval(()=>{i().fetchChannels(s)},3e3);r({pollingInterval:c})},stopPolling:()=>{const s=i().pollingInterval;s&&(clearInterval(s),r({pollingInterval:null}))},createPublicChannel:async s=>{try{const l=await g0(s);return r(c=>c.channels.some(p=>p.id===l.id)?c:{channels:[...c.channels,{...l,participantIds:[],lastMessageAt:new Date().toISOString()}]}),l}catch(l){throw console.error("공개 채널 생성 실패:",l),l}},createPrivateChannel:async s=>{try{const l=await y0(s);return r(c=>c.channels.some(p=>p.id===l.id)?c:{channels:[...c.channels,{...l,participantIds:s,lastMessageAt:new Date().toISOString()}]}),l}catch(l){throw console.error("비공개 채널 생성 실패:",l),l}}})),S0=async r=>(await Xe.get(`/binaryContents/${r}`)).data,E0=r=>`${Gv()}/binaryContents/${r}/download`,Yn=_r((r,i)=>({binaryContents:{},fetchBinaryContent:async s=>{if(i().binaryContents[s])return i().binaryContents[s];try{const l=await S0(s),{contentType:c,fileName:f,size:p}=l,x={url:E0(s),contentType:c,fileName:f,size:p};return r(v=>({binaryContents:{...v.binaryContents,[s]:x}})),x}catch(l){return console.error("첨부파일 정보 조회 실패:",l),null}}})),Io=_.div` + position: absolute; + bottom: -3px; + right: -3px; + width: 16px; + height: 16px; + border-radius: 50%; + background: ${r=>r.$online?ee.colors.status.online:ee.colors.status.offline}; + border: 4px solid ${r=>r.$background||ee.colors.background.secondary}; +`;_.div` + width: 8px; + height: 8px; + border-radius: 50%; + margin-right: 8px; + background: ${r=>ee.colors.status[r.status||"offline"]||ee.colors.status.offline}; +`;const Tr=_.div` + position: relative; + width: ${r=>r.$size||"32px"}; + height: ${r=>r.$size||"32px"}; + flex-shrink: 0; + margin: ${r=>r.$margin||"0"}; +`,rn=_.img` + width: 100%; + height: 100%; + border-radius: 50%; + object-fit: cover; + border: ${r=>r.$border||"none"}; +`;function C0({isOpen:r,onClose:i,user:s}){var $,L;const[l,c]=oe.useState(s.username),[f,p]=oe.useState(s.email),[g,x]=oe.useState(""),[v,S]=oe.useState(null),[A,T]=oe.useState(""),[I,R]=oe.useState(null),{binaryContents:C,fetchBinaryContent:N}=Yn(),b=yt(B=>B.logout);oe.useEffect(()=>{var B;(B=s.profile)!=null&&B.id&&!C[s.profile.id]&&N(s.profile.id)},[s.profile,C,N]);const U=()=>{c(s.username),p(s.email),x(""),S(null),R(null),T(""),i()},V=B=>{var ye;const ie=(ye=B.target.files)==null?void 0:ye[0];if(ie){S(ie);const Je=new FileReader;Je.onloadend=()=>{R(Je.result)},Je.readAsDataURL(ie)}},Q=async B=>{B.preventDefault(),T("");try{const ie=new FormData,ye={};l!==s.username&&(ye.newUsername=l),f!==s.email&&(ye.newEmail=f),g&&(ye.newPassword=g),(Object.keys(ye).length>0||v)&&(ie.append("userUpdateRequest",new Blob([JSON.stringify(ye)],{type:"application/json"})),v&&ie.append("profile",v),await Zp(s.id,ie)),i()}catch{T("사용자 정보 수정에 실패했습니다.")}};return r?h.jsx(k0,{children:h.jsxs(j0,{children:[h.jsx("h2",{children:"프로필 수정"}),h.jsxs("form",{onSubmit:Q,children:[h.jsxs(Yi,{children:[h.jsx(qi,{children:"프로필 이미지"}),h.jsxs(R0,{children:[h.jsx(P0,{src:I||(($=s.profile)!=null&&$.id?(L=C[s.profile.id])==null?void 0:L.url:void 0)||Mt,alt:"profile"}),h.jsx(_0,{type:"file",accept:"image/*",onChange:V,id:"profile-image"}),h.jsx(T0,{htmlFor:"profile-image",children:"이미지 변경"})]})]}),h.jsxs(Yi,{children:[h.jsxs(qi,{children:["사용자명 ",h.jsx(bd,{children:"*"})]}),h.jsx(_u,{type:"text",value:l,onChange:B=>c(B.target.value),required:!0})]}),h.jsxs(Yi,{children:[h.jsxs(qi,{children:["이메일 ",h.jsx(bd,{children:"*"})]}),h.jsx(_u,{type:"email",value:f,onChange:B=>p(B.target.value),required:!0})]}),h.jsxs(Yi,{children:[h.jsx(qi,{children:"새 비밀번호"}),h.jsx(_u,{type:"password",placeholder:"변경하지 않으려면 비워두세요",value:g,onChange:B=>x(B.target.value)})]}),A&&h.jsx(A0,{children:A}),h.jsxs(I0,{children:[h.jsx(Hd,{type:"button",onClick:U,$secondary:!0,children:"취소"}),h.jsx(Hd,{type:"submit",children:"저장"})]})]}),h.jsx(N0,{onClick:b,children:"로그아웃"})]})}):null}const k0=_.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,j0=_.div` + background: ${({theme:r})=>r.colors.background.secondary}; + padding: 32px; + border-radius: 5px; + width: 100%; + max-width: 480px; + + h2 { + color: ${({theme:r})=>r.colors.text.primary}; + margin-bottom: 24px; + text-align: center; + font-size: 24px; + } +`,_u=_.input` + width: 100%; + padding: 10px; + margin-bottom: 10px; + border: none; + border-radius: 4px; + background: ${({theme:r})=>r.colors.background.input}; + color: ${({theme:r})=>r.colors.text.primary}; + + &::placeholder { + color: ${({theme:r})=>r.colors.text.muted}; + } + + &:focus { + outline: none; + box-shadow: 0 0 0 2px ${({theme:r})=>r.colors.brand.primary}; + } +`,Hd=_.button` + width: 100%; + padding: 10px; + border: none; + border-radius: 4px; + background: ${({$secondary:r,theme:i})=>r?"transparent":i.colors.brand.primary}; + color: ${({theme:r})=>r.colors.text.primary}; + cursor: pointer; + font-weight: 500; + + &:hover { + background: ${({$secondary:r,theme:i})=>r?i.colors.background.hover:i.colors.brand.hover}; + } +`,A0=_.div` + color: ${({theme:r})=>r.colors.status.error}; + font-size: 14px; + margin-bottom: 10px; +`,R0=_.div` + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 20px; +`,P0=_.img` + width: 100px; + height: 100px; + border-radius: 50%; + margin-bottom: 10px; + object-fit: cover; +`,_0=_.input` + display: none; +`,T0=_.label` + color: ${({theme:r})=>r.colors.brand.primary}; + cursor: pointer; + font-size: 14px; + + &:hover { + text-decoration: underline; + } +`,I0=_.div` + display: flex; + gap: 10px; + margin-top: 20px; +`,N0=_.button` + width: 100%; + padding: 10px; + margin-top: 16px; + border: none; + border-radius: 4px; + background: transparent; + color: ${({theme:r})=>r.colors.status.error}; + cursor: pointer; + font-weight: 500; + + &:hover { + background: ${({theme:r})=>r.colors.status.error}20; + } +`,Yi=_.div` + margin-bottom: 20px; +`,qi=_.label` + display: block; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 12px; + font-weight: 700; + margin-bottom: 8px; +`,bd=_.span` + color: ${({theme:r})=>r.colors.status.error}; +`,O0=_.div` + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem 0.75rem; + background-color: ${({theme:r})=>r.colors.background.tertiary}; + width: 100%; + height: 52px; +`,L0=_(Tr)``;_(rn)``;const D0=_.div` + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; +`,M0=_.div` + font-weight: 500; + color: ${({theme:r})=>r.colors.text.primary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 0.875rem; + line-height: 1.2; +`,z0=_.div` + font-size: 0.75rem; + color: ${({theme:r})=>r.colors.text.secondary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.2; +`,U0=_.div` + display: flex; + align-items: center; + flex-shrink: 0; +`,F0=_.button` + background: none; + border: none; + padding: 0.25rem; + cursor: pointer; + color: ${({theme:r})=>r.colors.text.secondary}; + font-size: 18px; + + &:hover { + color: ${({theme:r})=>r.colors.text.primary}; + } +`;function B0({user:r}){var f,p;const[i,s]=oe.useState(!1),{binaryContents:l,fetchBinaryContent:c}=Yn();return oe.useEffect(()=>{var g;(g=r.profile)!=null&&g.id&&!l[r.profile.id]&&c(r.profile.id)},[r.profile,l,c]),h.jsxs(h.Fragment,{children:[h.jsxs(O0,{children:[h.jsxs(L0,{children:[h.jsx(rn,{src:(f=r.profile)!=null&&f.id?(p=l[r.profile.id])==null?void 0:p.url:Mt,alt:r.username}),h.jsx(Io,{$online:!0})]}),h.jsxs(D0,{children:[h.jsx(M0,{children:r.username}),h.jsx(z0,{children:"온라인"})]}),h.jsx(U0,{children:h.jsx(F0,{onClick:()=>s(!0),children:"⚙️"})})]}),h.jsx(C0,{isOpen:i,onClose:()=>s(!1),user:r})]})}const $0=_.div` + width: 240px; + background: ${ee.colors.background.secondary}; + border-right: 1px solid ${ee.colors.border.primary}; + display: flex; + flex-direction: column; +`,H0=_.div` + flex: 1; + overflow-y: auto; +`,b0=_.div` + padding: 16px; + font-size: 16px; + font-weight: bold; + color: ${ee.colors.text.primary}; +`,ih=_.div` + height: 34px; + padding: 0 8px; + margin: 1px 8px; + display: flex; + align-items: center; + gap: 6px; + color: ${r=>r.$hasUnread?r.theme.colors.text.primary:r.theme.colors.text.muted}; + font-weight: ${r=>r.$hasUnread?"600":"normal"}; + cursor: pointer; + background: ${r=>r.$isActive?r.theme.colors.background.hover:"transparent"}; + border-radius: 4px; + + &:hover { + background: ${r=>r.theme.colors.background.hover}; + color: ${r=>r.theme.colors.text.primary}; + } +`,Vd=_.div` + margin-bottom: 8px; +`,qu=_.div` + padding: 8px 16px; + display: flex; + align-items: center; + color: ${ee.colors.text.muted}; + text-transform: uppercase; + font-size: 12px; + font-weight: 600; + cursor: pointer; + user-select: none; + + & > span:nth-child(2) { + flex: 1; + margin-right: auto; + } + + &:hover { + color: ${ee.colors.text.primary}; + } +`,Wd=_.span` + margin-right: 4px; + font-size: 10px; + transition: transform 0.2s; + transform: rotate(${r=>r.$folded?"-90deg":"0deg"}); +`,Yd=_.div` + display: ${r=>r.$folded?"none":"block"}; +`,qd=_(ih)` + height: ${r=>r.hasSubtext?"42px":"34px"}; +`,V0=_(Tr)` + width: 32px; + height: 32px; + margin: 0 8px; +`,Qd=_.div` + font-size: 16px; + line-height: 18px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + color: ${r=>r.$isActive||r.$hasUnread?r.theme.colors.text.primary:r.theme.colors.text.muted}; + font-weight: ${r=>r.$hasUnread?"600":"normal"}; +`;_(Io)` + border-color: ${ee.colors.background.primary}; +`;const Gd=_.button` + background: none; + border: none; + color: ${ee.colors.text.muted}; + font-size: 18px; + padding: 0; + cursor: pointer; + width: 16px; + height: 16px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.2s, color 0.2s; + + ${qu}:hover & { + opacity: 1; + } + + &:hover { + color: ${ee.colors.text.primary}; + } +`,W0=_(Tr)` + width: 40px; + height: 24px; + margin: 0 8px; +`,Y0=_.div` + font-size: 12px; + line-height: 13px; + color: ${ee.colors.text.muted}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,Kd=_.div` + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; + gap: 2px; +`,q0=_.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.85); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,Q0=_.div` + background: ${ee.colors.background.primary}; + border-radius: 4px; + width: 440px; + max-width: 90%; +`,G0=_.div` + padding: 16px; + display: flex; + justify-content: space-between; + align-items: center; +`,K0=_.h2` + color: ${ee.colors.text.primary}; + font-size: 20px; + font-weight: 600; + margin: 0; +`,X0=_.div` + padding: 0 16px 16px; +`,J0=_.form` + display: flex; + flex-direction: column; + gap: 16px; +`,Tu=_.div` + display: flex; + flex-direction: column; + gap: 8px; +`,Iu=_.label` + color: ${ee.colors.text.primary}; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; +`,Z0=_.p` + color: ${ee.colors.text.muted}; + font-size: 14px; + margin: -4px 0 0; +`,Qu=_.input` + padding: 10px; + background: ${ee.colors.background.tertiary}; + border: none; + border-radius: 3px; + color: ${ee.colors.text.primary}; + font-size: 16px; + + &:focus { + outline: none; + box-shadow: 0 0 0 2px ${ee.colors.status.online}; + } + + &::placeholder { + color: ${ee.colors.text.muted}; + } +`,e1=_.button` + margin-top: 8px; + padding: 12px; + background: ${ee.colors.status.online}; + color: white; + border: none; + border-radius: 3px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: #3ca374; + } +`,t1=_.button` + background: none; + border: none; + color: ${ee.colors.text.muted}; + font-size: 24px; + cursor: pointer; + padding: 4px; + line-height: 1; + + &:hover { + color: ${ee.colors.text.primary}; + } +`,n1=_(Qu)` + margin-bottom: 8px; +`,r1=_.div` + max-height: 300px; + overflow-y: auto; + background: ${ee.colors.background.tertiary}; + border-radius: 4px; +`,o1=_.div` + display: flex; + align-items: center; + padding: 8px 12px; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: ${ee.colors.background.hover}; + } + + & + & { + border-top: 1px solid ${ee.colors.border.primary}; + } +`,i1=_.input` + margin-right: 12px; + width: 16px; + height: 16px; + cursor: pointer; +`,Xd=_.img` + width: 32px; + height: 32px; + border-radius: 50%; + margin-right: 12px; +`,s1=_.div` + flex: 1; + min-width: 0; +`,l1=_.div` + color: ${ee.colors.text.primary}; + font-size: 14px; + font-weight: 500; +`,u1=_.div` + color: ${ee.colors.text.muted}; + font-size: 12px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,a1=_.div` + padding: 16px; + text-align: center; + color: ${ee.colors.text.muted}; +`,c1=_.div` + color: ${ee.colors.status.error}; + font-size: 14px; + padding: 8px 0; + text-align: center; + background-color: ${({theme:r})=>r.colors.background.tertiary}; + border-radius: 4px; + margin-bottom: 8px; +`;function f1(){return h.jsx(b0,{children:"채널 목록"})}function Jd({channel:r,isActive:i,onClick:s,hasUnread:l}){var x;const c=yt(v=>v.currentUserId),{binaryContents:f}=Yn();if(r.type==="PUBLIC")return h.jsxs(ih,{$isActive:i,onClick:s,$hasUnread:l,children:["# ",r.name]});const p=r.participants;if(p.length>2){const v=p.filter(S=>S.id!==c).map(S=>S.username).join(", ");return h.jsxs(qd,{$isActive:i,onClick:s,children:[h.jsx(W0,{children:p.filter(S=>S.id!==c).slice(0,2).map((S,A)=>{var T;return h.jsx(rn,{src:S.profile?(T=f[S.profile.id])==null?void 0:T.url:Mt,style:{position:"absolute",left:A*16,zIndex:2-A,width:"24px",height:"24px",border:"2px solid #2a2a2a"}},S.id)})}),h.jsxs(Kd,{children:[h.jsx(Qd,{$hasUnread:l,children:v}),h.jsxs(Y0,{children:["멤버 ",p.length,"명"]})]})]})}const g=p.filter(v=>v.id!==c)[0];return g&&h.jsxs(qd,{$isActive:i,onClick:s,children:[h.jsxs(V0,{children:[h.jsx(rn,{src:g.profile?(x=f[g.profile.id])==null?void 0:x.url:Mt,alt:"profile"}),h.jsx(Io,{$online:g.online})]}),h.jsx(Kd,{children:h.jsx(Qd,{$hasUnread:l,children:g.username})})]})}function d1({isOpen:r,type:i,onClose:s,onCreateSuccess:l}){const[c,f]=oe.useState({name:"",description:""}),[p,g]=oe.useState(""),[x,v]=oe.useState([]),[S,A]=oe.useState(""),T=nn($=>$.users),I=Yn($=>$.binaryContents),R=yt($=>$.currentUserId),C=oe.useMemo(()=>T.filter($=>$.id!==R).filter($=>$.username.toLowerCase().includes(p.toLowerCase())||$.email.toLowerCase().includes(p.toLowerCase())),[p,T,R]),N=xr($=>$.createPublicChannel),b=xr($=>$.createPrivateChannel),U=$=>{const{name:L,value:B}=$.target;f(ie=>({...ie,[L]:B}))},V=$=>{v(L=>L.includes($)?L.filter(B=>B!==$):[...L,$])},Q=async $=>{var L,B;$.preventDefault(),A("");try{let ie;if(i==="PUBLIC"){if(!c.name.trim()){A("채널 이름을 입력해주세요.");return}const ye={name:c.name,description:c.description};ie=await N(ye)}else{if(x.length===0){A("대화 상대를 선택해주세요.");return}const ye=R&&[...x,R]||x;ie=await b(ye)}l(ie)}catch(ie){console.error("채널 생성 실패:",ie),A(((B=(L=ie.response)==null?void 0:L.data)==null?void 0:B.message)||"채널 생성에 실패했습니다. 다시 시도해주세요.")}};return r?h.jsx(q0,{onClick:s,children:h.jsxs(Q0,{onClick:$=>$.stopPropagation(),children:[h.jsxs(G0,{children:[h.jsx(K0,{children:i==="PUBLIC"?"채널 만들기":"개인 메시지 시작하기"}),h.jsx(t1,{onClick:s,children:"×"})]}),h.jsx(X0,{children:h.jsxs(J0,{onSubmit:Q,children:[S&&h.jsx(c1,{children:S}),i==="PUBLIC"?h.jsxs(h.Fragment,{children:[h.jsxs(Tu,{children:[h.jsx(Iu,{children:"채널 이름"}),h.jsx(Qu,{name:"name",value:c.name,onChange:U,placeholder:"새로운-채널",required:!0})]}),h.jsxs(Tu,{children:[h.jsx(Iu,{children:"채널 설명"}),h.jsx(Z0,{children:"이 채널의 주제를 설명해주세요."}),h.jsx(Qu,{name:"description",value:c.description,onChange:U,placeholder:"채널 설명을 입력하세요"})]})]}):h.jsxs(Tu,{children:[h.jsx(Iu,{children:"사용자 검색"}),h.jsx(n1,{type:"text",value:p,onChange:$=>g($.target.value),placeholder:"사용자명 또는 이메일로 검색"}),h.jsx(r1,{children:C.length>0?C.map($=>h.jsxs(o1,{children:[h.jsx(i1,{type:"checkbox",checked:x.includes($.id),onChange:()=>V($.id)}),$.profile?h.jsx(Xd,{src:I[$.profile.id].url}):h.jsx(Xd,{src:Mt}),h.jsxs(s1,{children:[h.jsx(l1,{children:$.username}),h.jsx(u1,{children:$.email})]})]},$.id)):h.jsx(a1,{children:"검색 결과가 없습니다."})})]}),h.jsx(e1,{type:"submit",children:i==="PUBLIC"?"채널 만들기":"대화 시작하기"})]})})]})}):null}function p1({currentUser:r,activeChannel:i,onChannelSelect:s}){var Q,$;const[l,c]=oe.useState({PUBLIC:!1,PRIVATE:!1}),[f,p]=oe.useState({isOpen:!1,type:null}),g=xr(L=>L.channels),x=xr(L=>L.fetchChannels),v=xr(L=>L.startPolling),S=xr(L=>L.stopPolling),A=jo(L=>L.fetchReadStatuses),T=jo(L=>L.updateReadStatus),I=jo(L=>L.hasUnreadMessages);oe.useEffect(()=>{if(r)return x(r.id),A(),v(r.id),()=>{S()}},[r,x,A,v,S]);const R=L=>{c(B=>({...B,[L]:!B[L]}))},C=(L,B)=>{B.stopPropagation(),p({isOpen:!0,type:L})},N=()=>{p({isOpen:!1,type:null})},b=async L=>{try{const ie=(await x(r.id)).find(ye=>ye.id===L.id);ie&&s(ie),N()}catch(B){console.error("채널 생성 실패:",B)}},U=L=>{s(L),T(L.id)},V=g.reduce((L,B)=>(L[B.type]||(L[B.type]=[]),L[B.type].push(B),L),{});return h.jsxs($0,{children:[h.jsx(f1,{}),h.jsxs(H0,{children:[h.jsxs(Vd,{children:[h.jsxs(qu,{onClick:()=>R("PUBLIC"),children:[h.jsx(Wd,{$folded:l.PUBLIC,children:"▼"}),h.jsx("span",{children:"일반 채널"}),h.jsx(Gd,{onClick:L=>C("PUBLIC",L),children:"+"})]}),h.jsx(Yd,{$folded:l.PUBLIC,children:(Q=V.PUBLIC)==null?void 0:Q.map(L=>h.jsx(Jd,{channel:L,isActive:(i==null?void 0:i.id)===L.id,hasUnread:I(L.id,L.lastMessageAt),onClick:()=>U(L)},L.id))})]}),h.jsxs(Vd,{children:[h.jsxs(qu,{onClick:()=>R("PRIVATE"),children:[h.jsx(Wd,{$folded:l.PRIVATE,children:"▼"}),h.jsx("span",{children:"개인 메시지"}),h.jsx(Gd,{onClick:L=>C("PRIVATE",L),children:"+"})]}),h.jsx(Yd,{$folded:l.PRIVATE,children:($=V.PRIVATE)==null?void 0:$.map(L=>h.jsx(Jd,{channel:L,isActive:(i==null?void 0:i.id)===L.id,hasUnread:I(L.id,L.lastMessageAt),onClick:()=>U(L)},L.id))})]})]}),h.jsx(h1,{children:h.jsx(B0,{user:r})}),h.jsx(d1,{isOpen:f.isOpen,type:f.type,onClose:N,onCreateSuccess:b})]})}const h1=_.div` + margin-top: auto; + border-top: 1px solid ${({theme:r})=>r.colors.border.primary}; + background-color: ${({theme:r})=>r.colors.background.tertiary}; +`,m1=_.div` + flex: 1; + display: flex; + flex-direction: column; + background: ${({theme:r})=>r.colors.background.primary}; +`,g1=_.div` + display: flex; + flex-direction: column; + height: 100%; + background: ${({theme:r})=>r.colors.background.primary}; +`,y1=_(g1)` + justify-content: center; + align-items: center; + flex: 1; + padding: 0 20px; +`,v1=_.div` + text-align: center; + max-width: 400px; + padding: 20px; + margin-bottom: 80px; +`,w1=_.div` + font-size: 48px; + margin-bottom: 16px; + animation: wave 2s infinite; + transform-origin: 70% 70%; + + @keyframes wave { + 0% { transform: rotate(0deg); } + 10% { transform: rotate(14deg); } + 20% { transform: rotate(-8deg); } + 30% { transform: rotate(14deg); } + 40% { transform: rotate(-4deg); } + 50% { transform: rotate(10deg); } + 60% { transform: rotate(0deg); } + 100% { transform: rotate(0deg); } + } +`,x1=_.h2` + color: ${({theme:r})=>r.colors.text.primary}; + font-size: 28px; + font-weight: 700; + margin-bottom: 16px; +`,S1=_.p` + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 16px; + line-height: 1.6; + word-break: keep-all; +`,Zd=_.div` + height: 48px; + padding: 0 16px; + background: ${ee.colors.background.primary}; + border-bottom: 1px solid ${ee.colors.border.primary}; + display: flex; + align-items: center; +`,ep=_.div` + display: flex; + align-items: center; + gap: 8px; + height: 100%; +`,E1=_.div` + display: flex; + align-items: center; + gap: 12px; + height: 100%; +`,C1=_(Tr)` + width: 24px; + height: 24px; +`;_.img` + width: 24px; + height: 24px; + border-radius: 50%; +`;const k1=_.div` + position: relative; + width: 40px; + height: 24px; + flex-shrink: 0; +`,j1=_(Io)` + border-color: ${ee.colors.background.primary}; + bottom: -3px; + right: -3px; +`,A1=_.div` + font-size: 12px; + color: ${ee.colors.text.muted}; + line-height: 13px; +`,tp=_.div` + font-weight: bold; + color: ${ee.colors.text.primary}; + line-height: 20px; + font-size: 16px; +`,R1=_.div` + flex: 1; + display: flex; + flex-direction: column-reverse; + overflow-y: auto; +`,P1=_.div` + padding: 16px; + display: flex; + flex-direction: column; +`,_1=_.div` + margin-bottom: 16px; + display: flex; + align-items: flex-start; +`,T1=_(Tr)` + margin-right: 16px; + width: 40px; + height: 40px; +`;_.img` + width: 40px; + height: 40px; + border-radius: 50%; +`;const I1=_.div` + display: flex; + align-items: center; + margin-bottom: 4px; +`,N1=_.span` + font-weight: bold; + color: ${ee.colors.text.primary}; + margin-right: 8px; +`,O1=_.span` + font-size: 0.75rem; + color: ${ee.colors.text.muted}; +`,L1=_.div` + color: ${ee.colors.text.secondary}; + margin-top: 4px; +`,D1=_.form` + display: flex; + align-items: center; + gap: 8px; + padding: 16px; + background: ${({theme:r})=>r.colors.background.secondary}; +`,M1=_.textarea` + flex: 1; + padding: 12px; + background: ${({theme:r})=>r.colors.background.tertiary}; + border: none; + border-radius: 4px; + color: ${({theme:r})=>r.colors.text.primary}; + font-size: 14px; + resize: none; + min-height: 44px; + max-height: 144px; + + &:focus { + outline: none; + } + + &::placeholder { + color: ${({theme:r})=>r.colors.text.muted}; + } +`,z1=_.button` + background: none; + border: none; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 24px; + cursor: pointer; + padding: 4px 8px; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + color: ${({theme:r})=>r.colors.text.primary}; + } +`;_.div` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + color: ${ee.colors.text.muted}; + font-size: 16px; + font-weight: 500; + padding: 20px; + text-align: center; +`;const np=_.div` + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 8px; + width: 100%; +`,U1=_.a` + display: block; + border-radius: 4px; + overflow: hidden; + max-width: 300px; + + img { + width: 100%; + height: auto; + display: block; + } +`,F1=_.a` + display: flex; + align-items: center; + gap: 12px; + padding: 12px; + background: ${({theme:r})=>r.colors.background.tertiary}; + border-radius: 8px; + text-decoration: none; + width: fit-content; + + &:hover { + background: ${({theme:r})=>r.colors.background.hover}; + } +`,B1=_.div` + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + font-size: 40px; + color: #0B93F6; +`,$1=_.div` + display: flex; + flex-direction: column; + gap: 2px; +`,H1=_.span` + font-size: 14px; + color: #0B93F6; + font-weight: 500; +`,b1=_.span` + font-size: 13px; + color: ${({theme:r})=>r.colors.text.muted}; +`,V1=_.div` + display: flex; + flex-wrap: wrap; + gap: 8px; + padding: 8px 0; +`,sh=_.div` + position: relative; + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: ${({theme:r})=>r.colors.background.tertiary}; + border-radius: 4px; + max-width: 300px; +`,W1=_(sh)` + padding: 0; + overflow: hidden; + width: 200px; + height: 120px; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } +`,Y1=_.div` + color: #0B93F6; + font-size: 20px; +`,q1=_.div` + font-size: 13px; + color: ${({theme:r})=>r.colors.text.primary}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +`,rp=_.button` + position: absolute; + top: -6px; + right: -6px; + width: 20px; + height: 20px; + border-radius: 50%; + background: ${({theme:r})=>r.colors.background.secondary}; + border: none; + color: ${({theme:r})=>r.colors.text.muted}; + font-size: 16px; + line-height: 1; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + padding: 0; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + + &:hover { + color: ${({theme:r})=>r.colors.text.primary}; + } +`;function Q1({channel:r}){var x;const i=yt(v=>v.currentUserId),s=nn(v=>v.users),l=Yn(v=>v.binaryContents);if(!r)return null;if(r.type==="PUBLIC")return h.jsx(Zd,{children:h.jsx(ep,{children:h.jsxs(tp,{children:["# ",r.name]})})});const c=r.participants.map(v=>s.find(S=>S.id===v.id)).filter(Boolean),f=c.filter(v=>v.id!==i),p=c.length>2,g=c.filter(v=>v.id!==i).map(v=>v.username).join(", ");return h.jsx(Zd,{children:h.jsx(ep,{children:h.jsxs(E1,{children:[p?h.jsx(k1,{children:f.slice(0,2).map((v,S)=>{var A;return h.jsx(rn,{src:v.profile?(A=l[v.profile.id])==null?void 0:A.url:Mt,style:{position:"absolute",left:S*16,zIndex:2-S,width:"24px",height:"24px"}},v.id)})}):h.jsxs(C1,{children:[h.jsx(rn,{src:f[0].profile?(x=l[f[0].profile.id])==null?void 0:x.url:Mt}),h.jsx(j1,{$online:f[0].online})]}),h.jsxs("div",{children:[h.jsx(tp,{children:g}),p&&h.jsxs(A1,{children:["멤버 ",c.length,"명"]})]})]})})})}const G1=async(r,i,s)=>{var c;return(await Xe.get("/messages",{params:{channelId:r,cursor:i,size:s.size,sort:(c=s.sort)==null?void 0:c.join(",")}})).data},K1=async(r,i)=>{const s=new FormData,l={content:r.content,channelId:r.channelId,authorId:r.authorId};return s.append("messageCreateRequest",new Blob([JSON.stringify(l)],{type:"application/json"})),i&&i.length>0&&i.forEach(f=>{s.append("attachments",f)}),(await Xe.post("/messages",s,{headers:{"Content-Type":"multipart/form-data"}})).data},Nu={size:50,sort:["createdAt,desc"]},lh=_r((r,i)=>({messages:[],pollingIntervals:{},lastMessageId:null,pagination:{nextCursor:null,pageSize:50,hasNext:!1},fetchMessages:async(s,l,c=Nu)=>{try{const f=await G1(s,l,c),p=f.content,g=p.length>0?p[0]:null,x=(g==null?void 0:g.id)!==i().lastMessageId;return r(v=>{var C;const S=!l,A=s!==((C=v.messages[0])==null?void 0:C.channelId),T=S&&(v.messages.length===0||A);let I=[],R={...v.pagination};if(T)I=p,R={nextCursor:f.nextCursor,pageSize:f.size,hasNext:f.hasNext};else if(S){const N=new Set(v.messages.map(U=>U.id));I=[...p.filter(U=>!N.has(U.id)&&(v.messages.length===0||U.createdAt>v.messages[0].createdAt)),...v.messages]}else{const N=new Set(v.messages.map(U=>U.id)),b=p.filter(U=>!N.has(U.id));I=[...v.messages,...b],R={nextCursor:f.nextCursor,pageSize:f.size,hasNext:f.hasNext}}return{messages:I,lastMessageId:(g==null?void 0:g.id)||null,pagination:R}}),x}catch(f){return console.error("메시지 목록 조회 실패:",f),!1}},loadMoreMessages:async s=>{const{pagination:l}=i();l.hasNext&&await i().fetchMessages(s,l.nextCursor,{...Nu})},startPolling:s=>{const l=i();if(l.pollingIntervals[s]){const g=l.pollingIntervals[s];typeof g=="number"&&clearTimeout(g)}let c=300;const f=3e3;r(g=>({pollingIntervals:{...g.pollingIntervals,[s]:!0}}));const p=async()=>{const g=i();if(!g.pollingIntervals[s])return;if(await g.fetchMessages(s,null,Nu)?c=300:c=Math.min(c*1.5,f),i().pollingIntervals[s]){const v=setTimeout(p,c);r(S=>({pollingIntervals:{...S.pollingIntervals,[s]:v}}))}};p()},stopPolling:s=>{const{pollingIntervals:l}=i();if(l[s]){const c=l[s];typeof c=="number"&&clearTimeout(c),r(f=>{const p={...f.pollingIntervals};return delete p[s],{pollingIntervals:p}})}},createMessage:async(s,l)=>{try{const c=await K1(s,l),f=jo.getState().updateReadStatus;return await f(s.channelId),r(p=>p.messages.some(x=>x.id===c.id)?p:{messages:[c,...p.messages],lastMessageId:c.id}),c}catch(c){throw console.error("메시지 생성 실패:",c),c}}}));function X1({channel:r}){const[i,s]=oe.useState(""),[l,c]=oe.useState([]),f=lh(T=>T.createMessage),p=yt(T=>T.currentUserId),g=async T=>{if(T.preventDefault(),!(!i.trim()&&l.length===0))try{await f({content:i.trim(),channelId:r.id,authorId:p??""},l),s(""),c([])}catch(I){console.error("메시지 전송 실패:",I)}},x=T=>{const I=Array.from(T.target.files||[]);c(R=>[...R,...I]),T.target.value=""},v=T=>{c(I=>I.filter((R,C)=>C!==T))},S=T=>{if(T.key==="Enter"&&!T.shiftKey){if(console.log("Enter key pressed"),T.preventDefault(),T.nativeEvent.isComposing)return;g(T)}},A=(T,I)=>T.type.startsWith("image/")?h.jsxs(W1,{children:[h.jsx("img",{src:URL.createObjectURL(T),alt:T.name}),h.jsx(rp,{onClick:()=>v(I),children:"×"})]},I):h.jsxs(sh,{children:[h.jsx(Y1,{children:"📎"}),h.jsx(q1,{children:T.name}),h.jsx(rp,{onClick:()=>v(I),children:"×"})]},I);return oe.useEffect(()=>()=>{l.forEach(T=>{T.type.startsWith("image/")&&URL.revokeObjectURL(URL.createObjectURL(T))})},[l]),r?h.jsxs(h.Fragment,{children:[l.length>0&&h.jsx(V1,{children:l.map((T,I)=>A(T,I))}),h.jsxs(D1,{onSubmit:g,children:[h.jsxs(z1,{as:"label",children:["+",h.jsx("input",{type:"file",multiple:!0,onChange:x,style:{display:"none"}})]}),h.jsx(M1,{value:i,onChange:T=>s(T.target.value),onKeyDown:S,placeholder:r.type==="PUBLIC"?`#${r.name}에 메시지 보내기`:"메시지 보내기"})]})]}):null}/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +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 http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */var Gu=function(r,i){return Gu=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,l){s.__proto__=l}||function(s,l){for(var c in l)l.hasOwnProperty(c)&&(s[c]=l[c])},Gu(r,i)};function J1(r,i){Gu(r,i);function s(){this.constructor=r}r.prototype=i===null?Object.create(i):(s.prototype=i.prototype,new s)}var Ao=function(){return Ao=Object.assign||function(i){for(var s,l=1,c=arguments.length;lr?I():i!==!0&&(c=setTimeout(l?R:I,l===void 0?r-A:r))}return v.cancel=x,v}var Sr={Pixel:"Pixel",Percent:"Percent"},op={unit:Sr.Percent,value:.8};function ip(r){return typeof r=="number"?{unit:Sr.Percent,value:r*100}:typeof r=="string"?r.match(/^(\d*(\.\d+)?)px$/)?{unit:Sr.Pixel,value:parseFloat(r)}:r.match(/^(\d*(\.\d+)?)%$/)?{unit:Sr.Percent,value:parseFloat(r)}:(console.warn('scrollThreshold format is invalid. Valid formats: "120px", "50%"...'),op):(console.warn("scrollThreshold should be string or number"),op)}var ew=function(r){J1(i,r);function i(s){var l=r.call(this,s)||this;return l.lastScrollTop=0,l.actionTriggered=!1,l.startY=0,l.currentY=0,l.dragging=!1,l.maxPullDownDistance=0,l.getScrollableTarget=function(){return l.props.scrollableTarget instanceof HTMLElement?l.props.scrollableTarget:typeof l.props.scrollableTarget=="string"?document.getElementById(l.props.scrollableTarget):(l.props.scrollableTarget===null&&console.warn(`You are trying to pass scrollableTarget but it is null. This might + happen because the element may not have been added to DOM yet. + See https://github.com/ankeetmaini/react-infinite-scroll-component/issues/59 for more info. + `),null)},l.onStart=function(c){l.lastScrollTop||(l.dragging=!0,c instanceof MouseEvent?l.startY=c.pageY:c instanceof TouchEvent&&(l.startY=c.touches[0].pageY),l.currentY=l.startY,l._infScroll&&(l._infScroll.style.willChange="transform",l._infScroll.style.transition="transform 0.2s cubic-bezier(0,0,0.31,1)"))},l.onMove=function(c){l.dragging&&(c instanceof MouseEvent?l.currentY=c.pageY:c instanceof TouchEvent&&(l.currentY=c.touches[0].pageY),!(l.currentY=Number(l.props.pullDownToRefreshThreshold)&&l.setState({pullToRefreshThresholdBreached:!0}),!(l.currentY-l.startY>l.maxPullDownDistance*1.5)&&l._infScroll&&(l._infScroll.style.overflow="visible",l._infScroll.style.transform="translate3d(0px, "+(l.currentY-l.startY)+"px, 0px)")))},l.onEnd=function(){l.startY=0,l.currentY=0,l.dragging=!1,l.state.pullToRefreshThresholdBreached&&(l.props.refreshFunction&&l.props.refreshFunction(),l.setState({pullToRefreshThresholdBreached:!1})),requestAnimationFrame(function(){l._infScroll&&(l._infScroll.style.overflow="auto",l._infScroll.style.transform="none",l._infScroll.style.willChange="unset")})},l.onScrollListener=function(c){typeof l.props.onScroll=="function"&&setTimeout(function(){return l.props.onScroll&&l.props.onScroll(c)},0);var f=l.props.height||l._scrollableNode?c.target:document.documentElement.scrollTop?document.documentElement:document.body;if(!l.actionTriggered){var p=l.props.inverse?l.isElementAtTop(f,l.props.scrollThreshold):l.isElementAtBottom(f,l.props.scrollThreshold);p&&l.props.hasMore&&(l.actionTriggered=!0,l.setState({showLoader:!0}),l.props.next&&l.props.next()),l.lastScrollTop=f.scrollTop}},l.state={showLoader:!1,pullToRefreshThresholdBreached:!1,prevDataLength:s.dataLength},l.throttledOnScrollListener=Z1(150,l.onScrollListener).bind(l),l.onStart=l.onStart.bind(l),l.onMove=l.onMove.bind(l),l.onEnd=l.onEnd.bind(l),l}return i.prototype.componentDidMount=function(){if(typeof this.props.dataLength>"u")throw new Error('mandatory prop "dataLength" is missing. The prop is needed when loading more content. Check README.md for usage');if(this._scrollableNode=this.getScrollableTarget(),this.el=this.props.height?this._infScroll:this._scrollableNode||window,this.el&&this.el.addEventListener("scroll",this.throttledOnScrollListener),typeof this.props.initialScrollY=="number"&&this.el&&this.el instanceof HTMLElement&&this.el.scrollHeight>this.props.initialScrollY&&this.el.scrollTo(0,this.props.initialScrollY),this.props.pullDownToRefresh&&this.el&&(this.el.addEventListener("touchstart",this.onStart),this.el.addEventListener("touchmove",this.onMove),this.el.addEventListener("touchend",this.onEnd),this.el.addEventListener("mousedown",this.onStart),this.el.addEventListener("mousemove",this.onMove),this.el.addEventListener("mouseup",this.onEnd),this.maxPullDownDistance=this._pullDown&&this._pullDown.firstChild&&this._pullDown.firstChild.getBoundingClientRect().height||0,this.forceUpdate(),typeof this.props.refreshFunction!="function"))throw new Error(`Mandatory prop "refreshFunction" missing. + Pull Down To Refresh functionality will not work + as expected. Check README.md for usage'`)},i.prototype.componentWillUnmount=function(){this.el&&(this.el.removeEventListener("scroll",this.throttledOnScrollListener),this.props.pullDownToRefresh&&(this.el.removeEventListener("touchstart",this.onStart),this.el.removeEventListener("touchmove",this.onMove),this.el.removeEventListener("touchend",this.onEnd),this.el.removeEventListener("mousedown",this.onStart),this.el.removeEventListener("mousemove",this.onMove),this.el.removeEventListener("mouseup",this.onEnd)))},i.prototype.componentDidUpdate=function(s){this.props.dataLength!==s.dataLength&&(this.actionTriggered=!1,this.setState({showLoader:!1}))},i.getDerivedStateFromProps=function(s,l){var c=s.dataLength!==l.prevDataLength;return c?Ao(Ao({},l),{prevDataLength:s.dataLength}):null},i.prototype.isElementAtTop=function(s,l){l===void 0&&(l=.8);var c=s===document.body||s===document.documentElement?window.screen.availHeight:s.clientHeight,f=ip(l);return f.unit===Sr.Pixel?s.scrollTop<=f.value+c-s.scrollHeight+1:s.scrollTop<=f.value/100+c-s.scrollHeight+1},i.prototype.isElementAtBottom=function(s,l){l===void 0&&(l=.8);var c=s===document.body||s===document.documentElement?window.screen.availHeight:s.clientHeight,f=ip(l);return f.unit===Sr.Pixel?s.scrollTop+c>=s.scrollHeight-f.value:s.scrollTop+c>=f.value/100*s.scrollHeight},i.prototype.render=function(){var s=this,l=Ao({height:this.props.height||"auto",overflow:"auto",WebkitOverflowScrolling:"touch"},this.props.style),c=this.props.hasChildren||!!(this.props.children&&this.props.children instanceof Array&&this.props.children.length),f=this.props.pullDownToRefresh&&this.props.height?{overflow:"auto"}:{};return mt.createElement("div",{style:f,className:"infinite-scroll-component__outerdiv"},mt.createElement("div",{className:"infinite-scroll-component "+(this.props.className||""),ref:function(p){return s._infScroll=p},style:l},this.props.pullDownToRefresh&&mt.createElement("div",{style:{position:"relative"},ref:function(p){return s._pullDown=p}},mt.createElement("div",{style:{position:"absolute",left:0,right:0,top:-1*this.maxPullDownDistance}},this.state.pullToRefreshThresholdBreached?this.props.releaseToRefreshContent:this.props.pullDownToRefreshContent)),this.props.children,!this.state.showLoader&&!c&&this.props.hasMore&&this.props.loader,this.state.showLoader&&this.props.hasMore&&this.props.loader,!this.props.hasMore&&this.props.endMessage))},i}(oe.Component);const tw=r=>r<1024?r+" B":r<1024*1024?(r/1024).toFixed(2)+" KB":r<1024*1024*1024?(r/(1024*1024)).toFixed(2)+" MB":(r/(1024*1024*1024)).toFixed(2)+" GB";function nw({channel:r}){const{messages:i,fetchMessages:s,loadMoreMessages:l,pagination:c,startPolling:f,stopPolling:p}=lh(),{binaryContents:g,fetchBinaryContent:x}=Yn();oe.useEffect(()=>{if(r!=null&&r.id)return s(r.id,null),f(r.id),()=>{p(r.id)}},[r==null?void 0:r.id,s,f,p]),oe.useEffect(()=>{i.forEach(I=>{var R;(R=I.attachments)==null||R.forEach(C=>{g[C.id]||x(C.id)})})},[i,g,x]);const v=async I=>{try{const{url:R,fileName:C}=I,N=document.createElement("a");N.href=R,N.download=C,N.style.display="none",document.body.appendChild(N);try{const U=await(await window.showSaveFilePicker({suggestedName:I.fileName,types:[{description:"Files",accept:{"*/*":[".txt",".pdf",".doc",".docx",".xls",".xlsx",".jpg",".jpeg",".png",".gif"]}}]})).createWritable(),Q=await(await fetch(R)).blob();await U.write(Q),await U.close()}catch(b){b.name!=="AbortError"&&N.click()}document.body.removeChild(N),window.URL.revokeObjectURL(R)}catch(R){console.error("파일 다운로드 실패:",R)}},S=I=>I!=null&&I.length?I.map(R=>{const C=g[R.id];return C?C.contentType.startsWith("image/")?h.jsx(np,{children:h.jsx(U1,{href:"#",onClick:b=>{b.preventDefault(),v(C)},children:h.jsx("img",{src:C.url,alt:C.fileName})})},C.url):h.jsx(np,{children:h.jsxs(F1,{href:"#",onClick:b=>{b.preventDefault(),v(C)},children:[h.jsx(B1,{children:h.jsxs("svg",{width:"40",height:"40",viewBox:"0 0 40 40",fill:"none",children:[h.jsx("path",{d:"M8 3C8 1.89543 8.89543 1 10 1H22L32 11V37C32 38.1046 31.1046 39 30 39H10C8.89543 39 8 38.1046 8 37V3Z",fill:"#0B93F6",fillOpacity:"0.1"}),h.jsx("path",{d:"M22 1L32 11H24C22.8954 11 22 10.1046 22 9V1Z",fill:"#0B93F6",fillOpacity:"0.3"}),h.jsx("path",{d:"M13 19H27M13 25H27M13 31H27",stroke:"#0B93F6",strokeWidth:"2",strokeLinecap:"round"})]})}),h.jsxs($1,{children:[h.jsx(H1,{children:C.fileName}),h.jsx(b1,{children:tw(C.size)})]})]})},C.url):null}):null,A=I=>new Date(I).toLocaleTimeString(),T=()=>{r!=null&&r.id&&l(r.id)};return h.jsx(R1,{children:h.jsx("div",{id:"scrollableDiv",style:{height:"100%",overflow:"auto",display:"flex",flexDirection:"column-reverse"},children:h.jsx(ew,{dataLength:i.length,next:T,hasMore:c.hasNext,loader:h.jsx("h4",{style:{textAlign:"center"},children:"메시지를 불러오는 중..."}),scrollableTarget:"scrollableDiv",style:{display:"flex",flexDirection:"column-reverse"},inverse:!0,endMessage:h.jsx("p",{style:{textAlign:"center"},children:h.jsx("b",{children:c.nextCursor!==null?"모든 메시지를 불러왔습니다":""})}),children:h.jsx(P1,{children:[...i].reverse().map(I=>{var C;const R=I.author;return h.jsxs(_1,{children:[h.jsx(T1,{children:h.jsx(rn,{src:R&&R.profile?(C=g[R.profile.id])==null?void 0:C.url:Mt,alt:R&&R.username||"알 수 없음"})}),h.jsxs("div",{children:[h.jsxs(I1,{children:[h.jsx(N1,{children:R&&R.username||"알 수 없음"}),h.jsx(O1,{children:A(I.createdAt)})]}),h.jsx(L1,{children:I.content}),S(I.attachments)]})]},I.id)})})})})})}function rw({channel:r}){return r?h.jsxs(m1,{children:[h.jsx(Q1,{channel:r}),h.jsx(nw,{channel:r}),h.jsx(X1,{channel:r})]}):h.jsx(y1,{children:h.jsxs(v1,{children:[h.jsx(w1,{children:"👋"}),h.jsx(x1,{children:"채널을 선택해주세요"}),h.jsxs(S1,{children:["왼쪽의 채널 목록에서 채널을 선택하여",h.jsx("br",{}),"대화를 시작하세요."]})]})})}function ow(r,i="yyyy-MM-dd HH:mm:ss"){if(!r||!(r instanceof Date)||isNaN(r.getTime()))return"";const s=r.getFullYear(),l=String(r.getMonth()+1).padStart(2,"0"),c=String(r.getDate()).padStart(2,"0"),f=String(r.getHours()).padStart(2,"0"),p=String(r.getMinutes()).padStart(2,"0"),g=String(r.getSeconds()).padStart(2,"0");return i.replace("yyyy",s.toString()).replace("MM",l).replace("dd",c).replace("HH",f).replace("mm",p).replace("ss",g)}const iw=_.div` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +`,sw=_.div` + background: ${({theme:r})=>r.colors.background.primary}; + border-radius: 8px; + width: 500px; + max-width: 90%; + padding: 24px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); +`,lw=_.div` + display: flex; + align-items: center; + margin-bottom: 16px; +`,uw=_.div` + color: ${({theme:r})=>r.colors.status.error}; + font-size: 24px; + margin-right: 12px; +`,aw=_.h3` + color: ${({theme:r})=>r.colors.text.primary}; + margin: 0; + font-size: 18px; +`,cw=_.div` + background: ${({theme:r})=>r.colors.background.tertiary}; + color: ${({theme:r})=>r.colors.text.muted}; + padding: 2px 8px; + border-radius: 4px; + font-size: 14px; + margin-left: auto; +`,fw=_.p` + color: ${({theme:r})=>r.colors.text.secondary}; + margin-bottom: 20px; + line-height: 1.5; + font-weight: 500; +`,dw=_.div` + margin-bottom: 20px; + background: ${({theme:r})=>r.colors.background.secondary}; + border-radius: 6px; + padding: 12px; +`,wo=_.div` + display: flex; + margin-bottom: 8px; + font-size: 14px; +`,xo=_.span` + color: ${({theme:r})=>r.colors.text.muted}; + min-width: 100px; +`,So=_.span` + color: ${({theme:r})=>r.colors.text.secondary}; + word-break: break-word; +`,pw=_.button` + background: ${({theme:r})=>r.colors.brand.primary}; + color: white; + border: none; + border-radius: 4px; + padding: 8px 16px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + width: 100%; + + &:hover { + background: ${({theme:r})=>r.colors.brand.hover}; + } +`;function hw({isOpen:r,onClose:i,error:s}){var T,I;if(!r)return null;const l=(T=s==null?void 0:s.response)==null?void 0:T.data,c=(l==null?void 0:l.status)||((I=s==null?void 0:s.response)==null?void 0:I.status)||"오류",f=(l==null?void 0:l.code)||"",p=(l==null?void 0:l.message)||(s==null?void 0:s.message)||"알 수 없는 오류가 발생했습니다.",g=l!=null&&l.timestamp?new Date(l.timestamp):new Date,x=ow(g),v=(l==null?void 0:l.exceptionType)||"",S=(l==null?void 0:l.details)||{},A=(l==null?void 0:l.requestId)||"";return h.jsx(iw,{onClick:i,children:h.jsxs(sw,{onClick:R=>R.stopPropagation(),children:[h.jsxs(lw,{children:[h.jsx(uw,{children:"⚠️"}),h.jsx(aw,{children:"오류가 발생했습니다"}),h.jsxs(cw,{children:[c,f?` (${f})`:""]})]}),h.jsx(fw,{children:p}),h.jsxs(dw,{children:[h.jsxs(wo,{children:[h.jsx(xo,{children:"시간:"}),h.jsx(So,{children:x})]}),A&&h.jsxs(wo,{children:[h.jsx(xo,{children:"요청 ID:"}),h.jsx(So,{children:A})]}),f&&h.jsxs(wo,{children:[h.jsx(xo,{children:"에러 코드:"}),h.jsx(So,{children:f})]}),v&&h.jsxs(wo,{children:[h.jsx(xo,{children:"예외 유형:"}),h.jsx(So,{children:v})]}),Object.keys(S).length>0&&h.jsxs(wo,{children:[h.jsx(xo,{children:"상세 정보:"}),h.jsx(So,{children:Object.entries(S).map(([R,C])=>h.jsxs("div",{children:[R,": ",String(C)]},R))})]})]}),h.jsx(pw,{onClick:i,children:"확인"})]})})}const mw=_.div` + width: 240px; + background: ${ee.colors.background.secondary}; + border-left: 1px solid ${ee.colors.border.primary}; +`,gw=_.div` + padding: 16px; + font-size: 14px; + font-weight: bold; + color: ${ee.colors.text.muted}; + text-transform: uppercase; +`,yw=_.div` + padding: 8px 16px; + display: flex; + align-items: center; + color: ${ee.colors.text.muted}; +`,vw=_(Tr)` + margin-right: 12px; +`;_(rn)``;const ww=_.div` + display: flex; + align-items: center; +`;function xw({member:r}){var l,c,f;const{binaryContents:i,fetchBinaryContent:s}=Yn();return oe.useEffect(()=>{var p;(p=r.profile)!=null&&p.id&&!i[r.profile.id]&&s(r.profile.id)},[(l=r.profile)==null?void 0:l.id,i,s]),h.jsxs(yw,{children:[h.jsxs(vw,{children:[h.jsx(rn,{src:(c=r.profile)!=null&&c.id&&((f=i[r.profile.id])==null?void 0:f.url)||Mt,alt:r.username}),h.jsx(Io,{$online:r.online})]}),h.jsx(ww,{children:r.username})]})}function Sw(){const r=nn(c=>c.users),i=nn(c=>c.fetchUsers),s=yt(c=>c.currentUserId);oe.useEffect(()=>{i()},[i]);const l=[...r].sort((c,f)=>c.id===s?-1:f.id===s?1:c.online&&!f.online?-1:!c.online&&f.online?1:c.username.localeCompare(f.username));return h.jsxs(mw,{children:[h.jsxs(gw,{children:["멤버 목록 - ",r.length]}),l.map(c=>h.jsx(xw,{member:c},c.id))]})}function Ew(){const r=yt(C=>C.currentUserId),i=yt(C=>C.logout),s=nn(C=>C.users),{fetchUsers:l,updateUserStatus:c}=nn(),[f,p]=oe.useState(null),[g,x]=oe.useState(null),[v,S]=oe.useState(!1),[A,T]=oe.useState(!0),I=r?s.find(C=>C.id===r):null;oe.useEffect(()=>{(async()=>{try{if(r)try{await c(r),await l()}catch(N){console.warn("사용자 상태 업데이트 실패. 로그아웃합니다.",N),i()}}catch(N){console.error("초기화 오류:",N)}finally{T(!1)}})()},[r,c,l,i]),oe.useEffect(()=>{const C=V=>{x(V),S(!0)},N=()=>{i()},b=as.on("api-error",C),U=as.on("auth-error",N);return()=>{b("api-error",C),U("auth-error",N)}},[i]),oe.useEffect(()=>{let C;if(r){c(r),C=setInterval(()=>{c(r)},3e4);const N=setInterval(()=>{l()},6e4);return()=>{clearInterval(C),clearInterval(N)}}},[r,l,c]);const R=()=>{S(!1),x(null)};return A?h.jsx(Cd,{theme:ee,children:h.jsx(kw,{children:h.jsx(jw,{})})}):h.jsxs(Cd,{theme:ee,children:[I?h.jsxs(Cw,{children:[h.jsx(p1,{currentUser:I,activeChannel:f,onChannelSelect:p}),h.jsx(rw,{channel:f}),h.jsx(Sw,{})]}):h.jsx(h0,{isOpen:!0,onClose:()=>{}}),h.jsx(hw,{isOpen:v,onClose:R,error:g})]})}const Cw=_.div` + display: flex; + height: 100vh; + width: 100vw; + position: relative; +`,kw=_.div` + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + width: 100vw; + background-color: ${({theme:r})=>r.colors.background.primary}; +`,jw=_.div` + width: 40px; + height: 40px; + border: 4px solid ${({theme:r})=>r.colors.background.tertiary}; + border-top: 4px solid ${({theme:r})=>r.colors.brand.primary}; + border-radius: 50%; + animation: spin 1s linear infinite; + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } +`,uh=document.getElementById("root");if(!uh)throw new Error("Root element not found");mg.createRoot(uh).render(h.jsx(oe.StrictMode,{children:h.jsx(Ew,{})})); From 8837dee9e29338818b1b26ed1b6a2121d81ddbfe Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 27 Mar 2025 15:42:29 +0900 Subject: [PATCH 099/115] =?UTF-8?q?:recycle:=20=EA=B0=9C=EB=B0=9C,=20?= =?UTF-8?q?=EC=9A=B4=EC=98=81=20=ED=99=98=EA=B2=BD=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=94=84=EB=A1=9C=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +++ build.gradle | 1 + .../discodeit/DiscodeitApplication.java | 2 +- src/main/resources/application-dev.yaml | 37 +++++++++++++++++++ src/main/resources/application-prod.yaml | 35 ++++++++++++++++++ src/main/resources/application.yaml | 33 +---------------- 6 files changed, 81 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/application-dev.yaml create mode 100644 src/main/resources/application-prod.yaml diff --git a/.gitignore b/.gitignore index b2b7bf3d7..bf114868a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,11 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ +# .gitignore +.env +.env.* + + ### Eclipse ### .apt_generated .classpath diff --git a/build.gradle b/build.gradle index afb282369..e9da78e7f 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'org.postgresql:postgresql' + runtimeOnly 'com.h2database:h2' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 8f61230d4..0d4ae5758 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -9,4 +9,4 @@ public class DiscodeitApplication { public static void main(String[] args) { SpringApplication.run(DiscodeitApplication.class, args); } -} +} \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..0df8f9f3f --- /dev/null +++ b/src/main/resources/application-dev.yaml @@ -0,0 +1,37 @@ +spring: + application: + name: discodeit + servlet: + multipart: + maxFileSize: 10MB + maxRequestSize: 30MB + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + h2: + console: + enabled: true + path: /h2-console + jpa: + hibernate: + ddl-auto: update + properties: + hibernate: + format_sql: true + open-in-view: false + +logging: + level: + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace + +server: + port: 8081 + +discodeit: + storage: + type: local + local: + root-path: .discodeit/storage diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml new file mode 100644 index 000000000..4845b7230 --- /dev/null +++ b/src/main/resources/application-prod.yaml @@ -0,0 +1,35 @@ +spring: + application: + name: discodeit + servlet: + multipart: + maxFileSize: 10MB + maxRequestSize: 30MB + datasource: + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:5432/discodeit + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + jpa: + hibernate: + ddl-auto: none + properties: + hibernate: + format_sql: false + use_sql_comments: false + highlight_sql: false + generate_statistics: false + open-in-view: false + +logging: + level: + org.hibernate.SQL: info + +server: + port: 80 + +discodeit: + storage: + type: local + local: + root-path: .discodeit/storage diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 0c9d365e9..3d7808a0c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,32 +1,3 @@ spring: - application: - name: discodeit - servlet: - multipart: - maxFileSize: 10MB # 파일 하나의 최대 크기 - maxRequestSize: 30MB # 한 번에 최대 업로드 가능 용량 - datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:5432/discodeit - username: discodeit_user - password: discodeit1234 - jpa: - hibernate: - ddl-auto: validate - properties: - hibernate: - format_sql: true - # default_batch_fetch_size: 100 - open-in-view: false - - -logging: - level: - org.hibernate.SQL: debug - org.hibernate.orm.jdbc.bind: trace - -discodeit: - storage: - type: local - local: - root-path: .discodeit/storage + profiles: + active: dev From f13a8ccffc472a6f8d0caea031a841809c41ad31 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 27 Mar 2025 16:20:33 +0900 Subject: [PATCH 100/115] =?UTF-8?q?:recycle:=20=EA=B0=9C=EB=B0=9C,=20?= =?UTF-8?q?=EC=9A=B4=EC=98=81=20=ED=99=98=EA=B2=BD=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=94=84=EB=A1=9C=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20+=20=EB=A1=9C=EA=B9=85=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yaml | 19 +++------- src/main/resources/application-prod.yaml | 18 +--------- src/main/resources/application.yaml | 18 +++++++++- src/main/resources/logback-spring.xml | 46 ++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/logback-spring.xml diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 0df8f9f3f..1b6684dee 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,10 +1,4 @@ spring: - application: - name: discodeit - servlet: - multipart: - maxFileSize: 10MB - maxRequestSize: 30MB datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE @@ -19,7 +13,10 @@ spring: ddl-auto: update properties: hibernate: - format_sql: true + format_sql: true # SQL 줄바꿈 및 들여쓰기 + use_sql_comments: true # 쿼리 앞에 주석 출력 + highlight_sql: true # 컬러로 SQL 표현 + generate_statistics: false #실행 통계 출력 open-in-view: false logging: @@ -28,10 +25,4 @@ logging: org.hibernate.orm.jdbc.bind: trace server: - port: 8081 - -discodeit: - storage: - type: local - local: - root-path: .discodeit/storage + port: 8081 \ No newline at end of file diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml index 4845b7230..396e9bb41 100644 --- a/src/main/resources/application-prod.yaml +++ b/src/main/resources/application-prod.yaml @@ -1,10 +1,4 @@ spring: - application: - name: discodeit - servlet: - multipart: - maxFileSize: 10MB - maxRequestSize: 30MB datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/discodeit @@ -21,15 +15,5 @@ spring: generate_statistics: false open-in-view: false -logging: - level: - org.hibernate.SQL: info - server: - port: 80 - -discodeit: - storage: - type: local - local: - root-path: .discodeit/storage + port: 80 \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 3d7808a0c..c2ae2a00b 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,3 +1,19 @@ spring: profiles: - active: dev + active: prod + application: + name: discodeit + servlet: + multipart: + maxFileSize: 10MB + maxRequestSize: 30MB + +logging: + level: + org.hibernate.SQL: info + +discodeit: + storage: + type: local + local: + root-path: .discodeit/storage diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..deae9f367 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + ${LOG_PATTERN} + UTF-8 + + + + + + ${LOG_DIR}/latest.log + + + + ${LOG_DIR}/logfile-%d{yyyy-MM-dd}.log + + + 30 + + + 1GB + + + + ${LOG_PATTERN} + UTF-8 + + + + + + + + + + + + + From e5779dc4db28ef334639330544950bc056f6e43a Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 27 Mar 2025 17:48:34 +0900 Subject: [PATCH 101/115] =?UTF-8?q?:recycle:=20Service=20=EA=B3=84?= =?UTF-8?q?=EC=B8=B5=EC=97=90=20=EB=A1=9C=EA=B7=B8=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/DiscodeitException.java | 15 ++++ .../discodeit/exception/ErrorCode.java | 41 +++++++++ .../discodeit/exception/ErrorResponse.java | 24 +++++ .../exception/GlobalExceptionHandler.java | 6 ++ .../discodeit/exception/ServiceException.java | 11 +++ .../service/basic/BasicAuthService.java | 18 +++- .../basic/BasicBinaryContentService.java | 18 +++- .../service/basic/BasicChannelService.java | 32 +++++-- .../service/basic/BasicMessageService.java | 33 +++++-- .../service/basic/BasicReadStatusService.java | 36 ++++++-- .../service/basic/BasicUserService.java | 87 +++++++++++++------ .../service/basic/BasicUserStatusService.java | 58 ++++++++++--- 12 files changed, 309 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java diff --git a/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java b/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java new file mode 100644 index 000000000..e8e1eed10 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java @@ -0,0 +1,15 @@ +package com.sprint.mission.discodeit.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class DiscodeitException extends RuntimeException { + + private final HttpStatus status; + + public DiscodeitException(HttpStatus status, String message) { + super(message); + this.status = status; + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java new file mode 100644 index 000000000..3033f25f8 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorCode.java @@ -0,0 +1,41 @@ +package com.sprint.mission.discodeit.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ErrorCode { + EMPTY_CONTENT(HttpStatus.BAD_REQUEST, "내용을 입력해주세요"), + + CANNOT_FOUND_MESSAGE(HttpStatus.NOT_FOUND, "보낸 메시지가 없습니다"), + CANNOT_FOUND_CHANNEL(HttpStatus.NOT_FOUND, "해당 채널을 찾을 수가 없습니다."), + CANNOT_FOUND_USER(HttpStatus.NOT_FOUND, "해당하는 회원을 찾을 수 없습니다"), + CANNOT_FOUND_PROFILE(HttpStatus.NOT_FOUND, "해당하는 프로필 데이터를 찾을 수 없습니다"), + CANNOT_FOUND_USERSTATUS(HttpStatus.NOT_FOUND, "해당하는 사용자의 상태 정보를 찾을 수 없습니다"), + CANNOT_FOUND_READSTATUS(HttpStatus.NOT_FOUND, "해당하는 Read Status 정보를 찾을 수 없습니다"), + CANNOT_FOUND_ATTACHMENT(HttpStatus.NOT_FOUND, "해당하는 첨부자료를 찾을 수 없습니다"), + + DUPLICATE_NAME(HttpStatus.CONFLICT, "이미 등록된 사용자 이름입니다."), + DUPLICATE_EMAIL(HttpStatus.CONFLICT, "이미 등록된 이메일 입니다."), + DUPLICATE_CHANNEL(HttpStatus.CONFLICT, "이미 존재하는 채널 이름 입니다."), + + ALREADY_EXIST_READSTATUS(HttpStatus.CONFLICT, "이미 저장된 Read Status 입니다."), + ALREADY_EXIST_USERSTAUTS(HttpStatus.CONFLICT, "이미 저장된 User Status 입니다."), + + INVALID_WRITER(HttpStatus.BAD_REQUEST, "작성자가 올바르지 않습니다"), + INVALID_PROFILE(HttpStatus.BAD_REQUEST, "기존 프로필과 동일한 프로필입니다"), + + MESSAGE_EDIT_NOT_ALLOWED(HttpStatus.FORBIDDEN, "메시지 수정은 작성자 본인만 가능합니다"), + PASSWORD_EDIT_NOT_ALLOWED(HttpStatus.FORBIDDEN, "이전 비밀번호와 일치하지 않습니다"), + + PASSWORD_MISMATCH(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다"), + USERNAME_MISMATCH(HttpStatus.UNAUTHORIZED, "이름이 일치하지 않습니다"), + CHANNEL_TYPE_MISMATCH(HttpStatus.BAD_REQUEST, "채널 타입이 일치하지 않습니다"), + + SAME_AS_OLD_PASSWORD(HttpStatus.BAD_REQUEST, "이전 비밀번호와 동일한 비밀번호입니다"), + CANNOT_MODIFY_PRIVATE_CHANNEL(HttpStatus.BAD_REQUEST, "Private 채널은 수정할 수 없습니다"); + private final HttpStatus status; + private final String description; +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java new file mode 100644 index 000000000..c76b84ba3 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.exception; + +import java.time.Instant; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class ErrorResponse { + + private final int status; + + private final String error; + + private final String message; + + private final Instant timestamp; + + public ErrorResponse(HttpStatus status, String message) { + this.status = status.value(); + this.error = status.getReasonPhrase(); + this.message = message; + this.timestamp = Instant.now(); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java index 513caead2..b4ae97405 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java @@ -9,6 +9,12 @@ @RestControllerAdvice public class GlobalExceptionHandler { + @ExceptionHandler(DiscodeitException.class) + public ResponseEntity handleServiceException(DiscodeitException exception) { + ErrorResponse response = new ErrorResponse(exception.getStatus(), exception.getMessage()); + return new ResponseEntity<>(response, exception.getStatus()); + } + @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity handleException(IllegalArgumentException e) { e.printStackTrace(); diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java new file mode 100644 index 000000000..9692e152e --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.exception; + +import lombok.Getter; + +@Getter +public class ServiceException extends DiscodeitException { + + public ServiceException(ErrorCode errorCode) { + super(errorCode.getStatus(), errorCode.getDescription()); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index c8ac278de..5f2809300 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -3,14 +3,17 @@ import com.sprint.mission.discodeit.dto.data.UserDto; import com.sprint.mission.discodeit.dto.request.LoginRequest; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.AuthService; -import java.util.NoSuchElementException; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @RequiredArgsConstructor @Service public class BasicAuthService implements AuthService { @@ -24,14 +27,21 @@ public UserDto login(LoginRequest loginRequest) { String username = loginRequest.username(); String password = loginRequest.password(); + log.info("[로그인 시도] username: {}", username); + User user = userRepository.findByUsername(username) - .orElseThrow( - () -> new NoSuchElementException("User with username " + username + " not found")); + .orElseThrow(() -> { + log.warn("[로그인 실패] 회원을 찾을 수 없습니다 {}", username); + return new ServiceException(ErrorCode.USERNAME_MISMATCH); + }); + if (!user.getPassword().equals(password)) { - throw new IllegalArgumentException("Wrong password"); + log.warn("[로그인 실패} 잘못된 비밀번호 입니다: {}", username); + throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); } + log.info("[로그인 성공] username: {}", user.getUsername()); return userMapper.toDto(user); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index a8dcf767c..fe824dae4 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -3,6 +3,8 @@ import com.sprint.mission.discodeit.dto.data.BinaryContentDto; import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; import com.sprint.mission.discodeit.entity.BinaryContent; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.BinaryContentMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; @@ -11,9 +13,11 @@ import java.util.NoSuchElementException; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @RequiredArgsConstructor @Service public class BasicBinaryContentService implements BinaryContentService { @@ -28,6 +32,7 @@ public BinaryContentDto create(BinaryContentCreateRequest request) { String fileName = request.fileName(); byte[] bytes = request.bytes(); String contentType = request.contentType(); + BinaryContent binaryContent = new BinaryContent( fileName, (long) bytes.length, @@ -36,19 +41,26 @@ public BinaryContentDto create(BinaryContentCreateRequest request) { binaryContentRepository.save(binaryContent); binaryContentStorage.put(binaryContent.getId(), bytes); + log.info("[파일 생성 성공] id: {}", binaryContent.getId()); + return binaryContentMapper.toDto(binaryContent); } @Override public BinaryContentDto find(UUID binaryContentId) { + log.info("[파일 조회] id: {}", binaryContentId); + return binaryContentRepository.findById(binaryContentId) .map(binaryContentMapper::toDto) - .orElseThrow(() -> new NoSuchElementException( - "BinaryContent with id " + binaryContentId + " not found")); + .orElseThrow(() -> { + log.warn("[파일 조회 실패] 해당 파일을 찾을 수 없습니다 id: {}", binaryContentId); + return new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE);}); } @Override public List findAllByIdIn(List binaryContentIds) { + log.info("[여러 파일 조회] ids: {}", binaryContentIds); + return binaryContentRepository.findAllById(binaryContentIds).stream() .map(binaryContentMapper::toDto) .toList(); @@ -58,8 +70,10 @@ public List findAllByIdIn(List binaryContentIds) { @Override public void delete(UUID binaryContentId) { if (!binaryContentRepository.existsById(binaryContentId)) { + log.warn("[파일 삭제 실패] 해당 파일을 찾을 수 없습니다 id: {}", binaryContentId); throw new NoSuchElementException("BinaryContent with id " + binaryContentId + " not found"); } binaryContentRepository.deleteById(binaryContentId); + log.info("[파일 삭제 완료] id: {}", binaryContentId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 04e5a50f2..3addd5290 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -7,6 +7,8 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.ChannelType; import com.sprint.mission.discodeit.entity.ReadStatus; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.ChannelMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; @@ -14,18 +16,18 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import java.util.List; -import java.util.NoSuchElementException; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @RequiredArgsConstructor @Service public class BasicChannelService implements ChannelService { private final ChannelRepository channelRepository; - // private final ReadStatusRepository readStatusRepository; private final MessageRepository messageRepository; private final UserRepository userRepository; @@ -37,8 +39,11 @@ public ChannelDto create(PublicChannelCreateRequest request) { String name = request.name(); String description = request.description(); Channel channel = new Channel(ChannelType.PUBLIC, name, description); + log.info("[공개 채널 생성 시도] type: {}, name: {}", channel.getType(), channel.getName()); channelRepository.save(channel); + + log.info("[공개 채널 생성 성공] id: {}", channel.getId()); return channelMapper.toDto(channel); } @@ -46,13 +51,18 @@ public ChannelDto create(PublicChannelCreateRequest request) { @Override public ChannelDto create(PrivateChannelCreateRequest request) { Channel channel = new Channel(ChannelType.PRIVATE, null, null); + channelRepository.save(channel); + log.info("[개인 채널 생성 완료] id: {}", channel.getId()); + List readStatuses = userRepository.findAllById(request.participantIds()).stream() .map(user -> new ReadStatus(user, channel, channel.getCreatedAt())) .toList(); readStatusRepository.saveAll(readStatuses); + log.info("[읽기 정보 생성 완료] count: {}", readStatuses.size()); + return channelMapper.toDto(channel); } @@ -62,7 +72,9 @@ public ChannelDto find(UUID channelId) { return channelRepository.findById(channelId) .map(channelMapper::toDto) .orElseThrow( - () -> new NoSuchElementException("Channel with id " + channelId + " not found")); + () -> { + log.warn("[채널 조회 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); + return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL);}); } @Transactional(readOnly = true) @@ -73,6 +85,7 @@ public List findAllByUserId(UUID userId) { .map(Channel::getId) .toList(); + log.info("[채널 조회 성공] id: {}", userId); return channelRepository.findAllByTypeOrIdIn(ChannelType.PUBLIC, mySubscribedChannelIds) .stream() .map(channelMapper::toDto) @@ -86,11 +99,15 @@ public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { String newDescription = request.newDescription(); Channel channel = channelRepository.findById(channelId) .orElseThrow( - () -> new NoSuchElementException("Channel with id " + channelId + " not found")); + () -> { + log.warn("[채널 업데이트 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); + return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL);}); if (channel.getType().equals(ChannelType.PRIVATE)) { - throw new IllegalArgumentException("Private channel cannot be updated"); + log.warn("[채널 업데이트 실패] 개인 채널은 업데이트 할 수 없습니다 type: {}", channel.getType()); + throw new ServiceException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); } channel.update(newName, newDescription); + log.info("[채널 업데이트 성공] id: {}", channel.getId()); return channelMapper.toDto(channel); } @@ -98,12 +115,15 @@ public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { @Override public void delete(UUID channelId) { if (!channelRepository.existsById(channelId)) { - throw new NoSuchElementException("Channel with id " + channelId + " not found"); + log.warn("[채널 삭제 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); + throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); } messageRepository.deleteAllByChannelId(channelId); readStatusRepository.deleteAllByChannelId(channelId); channelRepository.deleteById(channelId); + + log.info("[채널 삭제 완료] id: {}", channelId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index d874d76da..b32c98a0d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -9,6 +9,8 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.MessageMapper; import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -19,15 +21,16 @@ import com.sprint.mission.discodeit.storage.BinaryContentStorage; import java.time.Instant; import java.util.List; -import java.util.NoSuchElementException; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @RequiredArgsConstructor @Service public class BasicMessageService implements MessageService { @@ -50,11 +53,17 @@ public MessageDto create(MessageCreateRequest messageCreateRequest, Channel channel = channelRepository.findById(channelId) .orElseThrow( - () -> new NoSuchElementException("Channel with id " + channelId + " does not exist")); + () -> { + log.warn("[메시지 생성 오류] 채널을 찾을 수 없습니다"); + return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + }); + User author = userRepository.findById(authorId) .orElseThrow( - () -> new NoSuchElementException("Author with id " + authorId + " does not exist") - ); + () -> { + log.warn("[메시지 생성 오류] 작성자를 찾을 수 없습니다"); + return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + }); List attachments = binaryContentCreateRequests.stream() .map(attachmentRequest -> { @@ -79,6 +88,7 @@ public MessageDto create(MessageCreateRequest messageCreateRequest, ); messageRepository.save(message); + log.info("[메시지 생성 성공] 생성된 메시지 id: {}", message.getId()); return messageMapper.toDto(message); } @@ -88,7 +98,10 @@ public MessageDto find(UUID messageId) { return messageRepository.findById(messageId) .map(messageMapper::toDto) .orElseThrow( - () -> new NoSuchElementException("Message with id " + messageId + " not found")); + () -> { + log.warn("[메시지 조회 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); + return new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + }); } @Transactional(readOnly = true) @@ -115,8 +128,12 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { String newContent = request.newContent(); Message message = messageRepository.findById(messageId) .orElseThrow( - () -> new NoSuchElementException("Message with id " + messageId + " not found")); + () -> { + log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); + return new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + }); message.update(newContent); + log.info("[메시지 업데이트 성공]"); return messageMapper.toDto(message); } @@ -124,9 +141,11 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { @Override public void delete(UUID messageId) { if (!messageRepository.existsById(messageId)) { - throw new NoSuchElementException("Message with id " + messageId + " not found"); + log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); + new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } messageRepository.deleteById(messageId); + log.info("[메시지 삭제 완료] 메시지를 삭제하였습니다 id: {}", messageId); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 8c52802ba..a56b05a64 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -6,6 +6,8 @@ import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.ReadStatusMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; @@ -13,12 +15,13 @@ import com.sprint.mission.discodeit.service.ReadStatusService; import java.time.Instant; import java.util.List; -import java.util.NoSuchElementException; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @RequiredArgsConstructor @Service public class BasicReadStatusService implements ReadStatusService { @@ -36,21 +39,26 @@ public ReadStatusDto create(ReadStatusCreateRequest request) { User user = userRepository.findById(userId) .orElseThrow( - () -> new NoSuchElementException("User with id " + userId + " does not exist")); + () -> { + log.warn("[읽기 정보 생성 실패] 해당하는 회원을 찾을 수 없습니다"); + return new ServiceException(ErrorCode.CANNOT_FOUND_USER);}); Channel channel = channelRepository.findById(channelId) .orElseThrow( - () -> new NoSuchElementException("Channel with id " + channelId + " does not exist") - ); + () -> { + log.warn("[읽기 정보 생성 실패] 해당하는 채널을 찾을 수 없습니다"); + return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL);}); if (readStatusRepository.existsByUserIdAndChannelId(user.getId(), channel.getId())) { - throw new IllegalArgumentException( - "ReadStatus with userId " + userId + " and channelId " + channelId + " already exists"); + log.warn("[읽기 정보 생성 실패] 회원과 채널에 해당하는 읽기 정보가 이미 존재합니다"); + throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); } Instant lastReadAt = request.lastReadAt(); ReadStatus readStatus = new ReadStatus(user, channel, lastReadAt); readStatusRepository.save(readStatus); + log.info("[읽기 정보 생성 완료] 읽기 정보가 생성되었습니다 id: {}", readStatus.getId()); + return readStatusMapper.toDto(readStatus); } @@ -59,7 +67,10 @@ public ReadStatusDto find(UUID readStatusId) { return readStatusRepository.findById(readStatusId) .map(readStatusMapper::toDto) .orElseThrow( - () -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found")); + () ->{ + log.warn("[읽기 정보 조회 실패] 해당하는 정보를 찾을 수 없습니다"); + return new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS);} + ); } @Override @@ -75,8 +86,12 @@ public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) Instant newLastReadAt = request.newLastReadAt(); ReadStatus readStatus = readStatusRepository.findById(readStatusId) .orElseThrow( - () -> new NoSuchElementException("ReadStatus with id " + readStatusId + " not found")); + () ->{ + log.warn("[읽기 정보 업데이트 실패] 해당하는 정보를 찾을 수 없습니다"); + return new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS);}); readStatus.update(newLastReadAt); + + log.info("[읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: {}", readStatus.getId()); return readStatusMapper.toDto(readStatus); } @@ -84,8 +99,11 @@ public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) @Override public void delete(UUID readStatusId) { if (!readStatusRepository.existsById(readStatusId)) { - throw new NoSuchElementException("ReadStatus with id " + readStatusId + " not found"); + log.warn("[읽기 정보 삭제 실패] 해당 정보를 찾을 수 없습니다"); + throw new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS); } + readStatusRepository.deleteById(readStatusId); + log.info("[읽기 정보 삭제 완료]"); } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 91f6f278d..e2175f2cd 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -7,6 +7,8 @@ import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; @@ -15,14 +17,15 @@ import com.sprint.mission.discodeit.storage.BinaryContentStorage; import java.time.Instant; import java.util.List; -import java.util.NoSuchElementException; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor +@Slf4j @Service public class BasicUserService implements UserService { @@ -36,49 +39,61 @@ public class BasicUserService implements UserService { @Override public UserDto create(UserCreateRequest userCreateRequest, Optional optionalProfileCreateRequest) { + String username = userCreateRequest.username(); String email = userCreateRequest.email(); + log.info("[회원 생성 요청] username: {}, email: {}", username, email); if (userRepository.existsByEmail(email)) { - throw new IllegalArgumentException("User with email " + email + " already exists"); + log.warn("[회원 생성 실패] 중복된 이메일: {}", email); + throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); } if (userRepository.existsByUsername(username)) { - throw new IllegalArgumentException("User with username " + username + " already exists"); + log.warn("[회원 생성 실패] 중복된 사용자 이름: {}", username); + throw new ServiceException(ErrorCode.DUPLICATE_NAME); } BinaryContent nullableProfile = optionalProfileCreateRequest .map(profileRequest -> { - String fileName = profileRequest.fileName(); - String contentType = profileRequest.contentType(); - byte[] bytes = profileRequest.bytes(); - BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length, - contentType); + log.info("[프로필 이미지 업로드] 파일명: {}, 타입: {}, 크기: {} bytes", + profileRequest.fileName(), profileRequest.contentType(), profileRequest.bytes().length); + + BinaryContent binaryContent = new BinaryContent( + profileRequest.fileName(), + (long) profileRequest.bytes().length, + profileRequest.contentType() + ); binaryContentRepository.save(binaryContent); - binaryContentStorage.put(binaryContent.getId(), bytes); + binaryContentStorage.put(binaryContent.getId(), profileRequest.bytes()); return binaryContent; }) .orElse(null); - String password = userCreateRequest.password(); - User user = new User(username, email, password, nullableProfile); + User user = new User(username, email, userCreateRequest.password(), nullableProfile); Instant now = Instant.now(); UserStatus userStatus = new UserStatus(user, now); userRepository.save(user); + log.info("[회원 생성 완료] username: {}, id: {}", username, user.getId()); + return userMapper.toDto(user); } @Override public UserDto find(UUID userId) { + log.debug("[회원 조회] id: {}", userId); return userRepository.findById(userId) .map(userMapper::toDto) - .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found")); + .orElseThrow(() -> { + log.warn("[회원 조회 실패] 존재하지 않는 사용자: {}", userId); + return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + }); } @Override public List findAll() { - return userRepository.findAllWithProfileAndStatus() - .stream() + log.debug("[전체 회원 목록 조회]"); + return userRepository.findAllWithProfileAndStatus().stream() .map(userMapper::toDto) .toList(); } @@ -87,34 +102,45 @@ public List findAll() { @Override public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, Optional optionalProfileCreateRequest) { + + log.info("[회원 수정 요청] id: {}", userId); + User user = userRepository.findById(userId) - .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found")); + .orElseThrow(() -> { + log.warn("[회원 수정 실패] 존재하지 않는 사용자: {}", userId); + return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + }); String newUsername = userUpdateRequest.newUsername(); String newEmail = userUpdateRequest.newEmail(); + if (userRepository.existsByEmail(newEmail)) { - throw new IllegalArgumentException("User with email " + newEmail + " already exists"); + log.warn("[회원 수정 실패] 중복된 이메일: {}", newEmail); + throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); } if (userRepository.existsByUsername(newUsername)) { - throw new IllegalArgumentException("User with username " + newUsername + " already exists"); + log.warn("[회원 수정 실패] 중복된 사용자 이름: {}", newUsername); + throw new ServiceException(ErrorCode.DUPLICATE_NAME); } BinaryContent nullableProfile = optionalProfileCreateRequest .map(profileRequest -> { - - String fileName = profileRequest.fileName(); - String contentType = profileRequest.contentType(); - byte[] bytes = profileRequest.bytes(); - BinaryContent binaryContent = new BinaryContent(fileName, (long) bytes.length, - contentType); + log.info("[프로필 이미지 업데이트] 파일명: {}, 타입: {}, 크기: {} bytes", + profileRequest.fileName(), profileRequest.contentType(), profileRequest.bytes().length); + + BinaryContent binaryContent = new BinaryContent( + profileRequest.fileName(), + (long) profileRequest.bytes().length, + profileRequest.contentType() + ); binaryContentRepository.save(binaryContent); - binaryContentStorage.put(binaryContent.getId(), bytes); + binaryContentStorage.put(binaryContent.getId(), profileRequest.bytes()); return binaryContent; }) .orElse(null); - String newPassword = userUpdateRequest.newPassword(); - user.update(newUsername, newEmail, newPassword, nullableProfile); + user.update(newUsername, newEmail, userUpdateRequest.newPassword(), nullableProfile); + log.info("[회원 수정 완료] id: {}, 새로운 이름: {}, 새로운 이메일: {}", userId, newUsername, newEmail); return userMapper.toDto(user); } @@ -122,10 +148,15 @@ public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, @Transactional @Override public void delete(UUID userId) { - if (userRepository.existsById(userId)) { - throw new NoSuchElementException("User with id " + userId + " not found"); + log.info("[회원 삭제 요청] id: {}", userId); + + if (!userRepository.existsById(userId)) { + log.warn("[회원 삭제 실패] 존재하지 않는 사용자: {}", userId); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); } userRepository.deleteById(userId); + log.info("[회원 삭제 완료] id: {}", userId); } } + diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index 4528aa08d..8c87899a4 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -5,20 +5,23 @@ import com.sprint.mission.discodeit.dto.request.UserStatusUpdateRequest; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; import com.sprint.mission.discodeit.mapper.UserStatusMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserStatusService; import java.time.Instant; import java.util.List; -import java.util.NoSuchElementException; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor +@Slf4j @Service public class BasicUserStatusService implements UserStatusService { @@ -30,30 +33,41 @@ public class BasicUserStatusService implements UserStatusService { @Override public UserStatusDto create(UserStatusCreateRequest request) { UUID userId = request.userId(); + log.info("[유저 상태 생성 요청] userId: {}", userId); User user = userRepository.findById(userId) - .orElseThrow(() -> new NoSuchElementException("User with id " + userId + " not found")); - Optional.ofNullable(user.getStatus()) - .ifPresent(status -> { - throw new IllegalArgumentException("UserStatus with id " + userId + " already exists"); + .orElseThrow(() -> { + log.warn("[유저 상태 생성 실패] 존재하지 않는 사용자: {}", userId); + return new ServiceException(ErrorCode.CANNOT_FOUND_USER); }); + Optional.ofNullable(user.getStatus()).ifPresent(status -> { + log.warn("[유저 상태 생성 실패] 이미 상태가 존재하는 사용자: {}", userId); + throw new ServiceException(ErrorCode.ALREADY_EXIST_USERSTAUTS); + }); + Instant lastActiveAt = request.lastActiveAt(); UserStatus userStatus = new UserStatus(user, lastActiveAt); userStatusRepository.save(userStatus); + + log.info("[유저 상태 생성 완료] userId: {}, lastActiveAt: {}", userId, lastActiveAt); return userStatusMapper.toDto(userStatus); } @Override public UserStatusDto find(UUID userStatusId) { + log.debug("[유저 상태 조회] userStatusId: {}", userStatusId); return userStatusRepository.findById(userStatusId) .map(userStatusMapper::toDto) - .orElseThrow( - () -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found")); + .orElseThrow(() -> { + log.warn("[유저 상태 조회 실패] 존재하지 않는 상태 ID: {}", userStatusId); + return new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + }); } @Override public List findAll() { + log.debug("[전체 유저 상태 목록 조회]"); return userStatusRepository.findAll().stream() .map(userStatusMapper::toDto) .toList(); @@ -62,35 +76,51 @@ public List findAll() { @Transactional @Override public UserStatusDto update(UUID userStatusId, UserStatusUpdateRequest request) { - Instant newLastActiveAt = request.newLastActiveAt(); + log.info("[유저 상태 수정 요청] userStatusId: {}", userStatusId); UserStatus userStatus = userStatusRepository.findById(userStatusId) - .orElseThrow( - () -> new NoSuchElementException("UserStatus with id " + userStatusId + " not found")); + .orElseThrow(() -> { + log.warn("[유저 상태 수정 실패] 존재하지 않는 상태 ID: {}", userStatusId); + return new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + }); + + Instant newLastActiveAt = request.newLastActiveAt(); userStatus.update(newLastActiveAt); + log.info("[유저 상태 수정 완료] userStatusId: {}, newLastActiveAt: {}", userStatusId, newLastActiveAt); return userStatusMapper.toDto(userStatus); } @Transactional @Override public UserStatusDto updateByUserId(UUID userId, UserStatusUpdateRequest request) { - Instant newLastActiveAt = request.newLastActiveAt(); + log.info("[유저 상태 수정 요청 - userId 기준] userId: {}", userId); UserStatus userStatus = userStatusRepository.findByUserId(userId) - .orElseThrow( - () -> new NoSuchElementException("UserStatus with userId " + userId + " not found")); + .orElseThrow(() -> { + log.warn("[유저 상태 수정 실패] 상태가 존재하지 않는 사용자: {}", userId); + return new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + }); + + Instant newLastActiveAt = request.newLastActiveAt(); userStatus.update(newLastActiveAt); + log.info("[유저 상태 수정 완료 - userId 기준] userId: {}, newLastActiveAt: {}", userId, newLastActiveAt); return userStatusMapper.toDto(userStatus); } @Transactional @Override public void delete(UUID userStatusId) { + log.info("[유저 상태 삭제 요청] userStatusId: {}", userStatusId); + if (!userStatusRepository.existsById(userStatusId)) { - throw new NoSuchElementException("UserStatus with id " + userStatusId + " not found"); + log.warn("[유저 상태 삭제 실패] 존재하지 않는 상태 ID: {}", userStatusId); + throw new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); } + userStatusRepository.deleteById(userStatusId); + log.info("[유저 상태 삭제 완료] userStatusId: {}", userStatusId); } } + From 03076d18beca3752a998b3eab3f29bbaf4b2e615 Mon Sep 17 00:00:00 2001 From: junwoo Date: Thu, 27 Mar 2025 18:41:14 +0900 Subject: [PATCH 102/115] =?UTF-8?q?:recycle:=20=EC=9C=A0=ED=9A=A8=EC=84=B1?= =?UTF-8?q?=20=EA=B2=80=EC=82=AC=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ .../discodeit/controller/AuthController.java | 3 ++- .../controller/MessageController.java | 3 ++- .../controller/ReadStatusController.java | 3 ++- .../discodeit/controller/UserController.java | 5 +++-- .../discodeit/dto/request/LoginRequest.java | 4 ++++ .../dto/request/MessageCreateRequest.java | 2 ++ .../dto/request/ReadStatusCreateRequest.java | 4 ++++ .../dto/request/UserCreateRequest.java | 9 ++++++++ .../dto/request/UserStatusCreateRequest.java | 2 ++ .../dto/request/UserUpdateRequest.java | 5 +++++ .../exception/GlobalExceptionHandler.java | 22 +++++++++++++++++++ src/main/resources/application-dev.yaml | 2 +- src/main/resources/application.yaml | 2 +- src/main/resources/logback-spring.xml | 1 + 15 files changed, 62 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index e9da78e7f..9b9a7159b 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' + runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'com.h2database:h2' diff --git a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java index ac2149e37..5f120c657 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/AuthController.java @@ -4,6 +4,7 @@ import com.sprint.mission.discodeit.dto.data.UserDto; import com.sprint.mission.discodeit.dto.request.LoginRequest; import com.sprint.mission.discodeit.service.AuthService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,7 +21,7 @@ public class AuthController implements AuthApi { private final AuthService authService; @PostMapping(path = "login") - public ResponseEntity login(@RequestBody LoginRequest loginRequest) { + public ResponseEntity login(@Valid @RequestBody LoginRequest loginRequest) { UserDto user = authService.login(loginRequest); return ResponseEntity .status(HttpStatus.OK) diff --git a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java index d8974366d..1f48cd1e1 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/MessageController.java @@ -7,6 +7,7 @@ import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.dto.response.PageResponse; import com.sprint.mission.discodeit.service.MessageService; +import jakarta.validation.Valid; import java.io.IOException; import java.time.Instant; import java.util.ArrayList; @@ -41,7 +42,7 @@ public class MessageController implements MessageApi { @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity create( - @RequestPart("messageCreateRequest") MessageCreateRequest messageCreateRequest, + @Valid @RequestPart("messageCreateRequest") MessageCreateRequest messageCreateRequest, @RequestPart(value = "attachments", required = false) List attachments ) { List attachmentRequests = Optional.ofNullable(attachments) diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java index 4235d7c89..bef300e1b 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ReadStatusController.java @@ -5,6 +5,7 @@ import com.sprint.mission.discodeit.dto.request.ReadStatusCreateRequest; import com.sprint.mission.discodeit.dto.request.ReadStatusUpdateRequest; import com.sprint.mission.discodeit.service.ReadStatusService; +import jakarta.validation.Valid; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -27,7 +28,7 @@ public class ReadStatusController implements ReadStatusApi { private final ReadStatusService readStatusService; @PostMapping - public ResponseEntity create(@RequestBody ReadStatusCreateRequest request) { + public ResponseEntity create(@Valid @RequestBody ReadStatusCreateRequest request) { ReadStatusDto createdReadStatus = readStatusService.create(request); return ResponseEntity .status(HttpStatus.CREATED) diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index c2b59fed1..79cad82c7 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -9,6 +9,7 @@ import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; +import jakarta.validation.Valid; import java.io.IOException; import java.util.List; import java.util.Optional; @@ -39,7 +40,7 @@ public class UserController implements UserApi { @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) @Override public ResponseEntity create( - @RequestPart("userCreateRequest") UserCreateRequest userCreateRequest, + @Valid @RequestPart("userCreateRequest") UserCreateRequest userCreateRequest, @RequestPart(value = "profile", required = false) MultipartFile profile ) { Optional profileRequest = Optional.ofNullable(profile) @@ -57,7 +58,7 @@ public ResponseEntity create( @Override public ResponseEntity update( @PathVariable("userId") UUID userId, - @RequestPart("userUpdateRequest") UserUpdateRequest userUpdateRequest, + @Valid @RequestPart("userUpdateRequest") UserUpdateRequest userUpdateRequest, @RequestPart(value = "profile", required = false) MultipartFile profile ) { Optional profileRequest = Optional.ofNullable(profile) diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java index 51ca9e620..609356e30 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/LoginRequest.java @@ -1,7 +1,11 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.NotBlank; + public record LoginRequest( + @NotBlank(message = "회원 이름 입력은 필수입니다") String username, + @NotBlank(message = "비밀번호 입력은 필수입니다") String password ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java index 0f65742b1..1f066af95 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/MessageCreateRequest.java @@ -1,9 +1,11 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.NotNull; import java.util.UUID; public record MessageCreateRequest( String content, + @NotNull(message = "채널 아이디 입력은 필수입니다") UUID channelId, UUID authorId ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java index 046a48808..ff5deee4f 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/ReadStatusCreateRequest.java @@ -1,10 +1,14 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import java.time.Instant; import java.util.UUID; public record ReadStatusCreateRequest( + @NotNull(message = "회원아이디 입력은 필수입니다") UUID userId, + @NotNull(message = "채널 아이디 입력은 필수입니다") UUID channelId, Instant lastReadAt ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java index e10e0ec57..ce02ae1e1 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserCreateRequest.java @@ -1,8 +1,17 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; + public record UserCreateRequest( + @NotBlank(message = "회원 이름 입력은 필수입니다.") String username, + @Email + @NotBlank(message = "이메일 입력은 필수입니다") String email, + @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") + @NotBlank(message = "비밀번호 입력은 필수입니다") String password ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java index 71c92abba..52a225085 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserStatusCreateRequest.java @@ -1,9 +1,11 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.NotBlank; import java.time.Instant; import java.util.UUID; public record UserStatusCreateRequest( + @NotBlank(message = "회원 아이디 입력은 필수입니다") UUID userId, Instant lastActiveAt ) { diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java index 1e14e2cbd..65ff8c406 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/UserUpdateRequest.java @@ -1,8 +1,13 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Pattern; + public record UserUpdateRequest( String newUsername, + @Email String newEmail, + @Pattern(regexp = "^(?=.*[A-Z])(?=.*[\\W_])(?=.*[a-zA-Z\\d]).{8,15}$", message = "8자리 이상 15자리 이하 대문자 및 특수문자 하나 이상 포함해야 합니다") String newPassword ) { diff --git a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java index b4ae97405..ef1ec20ad 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java @@ -1,8 +1,12 @@ package com.sprint.mission.discodeit.exception; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; import java.util.NoSuchElementException; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -38,4 +42,22 @@ public ResponseEntity handleException(Exception e) { .status(HttpStatus.INTERNAL_SERVER_ERROR) .body(e.getMessage()); } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleValidationException(MethodArgumentNotValidException ex) { + // 가장 첫 번째 에러 메시지 가져오기 + String firstErrorMessage = ex.getBindingResult() + .getFieldErrors() + .stream() + .findFirst() + .map(error -> error.getDefaultMessage()) + .orElse("입력값이 유효하지 않습니다."); + + ErrorResponse errorResponse = new ErrorResponse( + HttpStatus.BAD_REQUEST, + firstErrorMessage + ); + + return ResponseEntity.badRequest().body(errorResponse); + } } diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 1b6684dee..6559ad27a 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -15,7 +15,7 @@ spring: hibernate: format_sql: true # SQL 줄바꿈 및 들여쓰기 use_sql_comments: true # 쿼리 앞에 주석 출력 - highlight_sql: true # 컬러로 SQL 표현 + highlight_sql: false # 컬러로 SQL 표현 generate_statistics: false #실행 통계 출력 open-in-view: false diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index c2ae2a00b..961633882 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,6 +1,6 @@ spring: profiles: - active: prod + active: dev application: name: discodeit servlet: diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index deae9f367..158cb90a7 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -44,3 +44,4 @@ + From 84dc08ed2558e854a9458ec95145dddd785932f1 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 28 Mar 2025 14:36:33 +0900 Subject: [PATCH 103/115] =?UTF-8?q?:sparkles:=20=EB=8B=A8=EC=9C=84?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EC=8A=AC=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../discodeit/exception/ServiceException.java | 3 + .../service/basic/BasicMessageService.java | 2 +- .../service/basic/BasicUserService.java | 2 - src/main/resources/application-dev.yaml | 60 ++++-- src/main/resources/application-prod.yaml | 19 -- src/main/resources/application-test.yaml | 62 ++++++ src/main/resources/application.yaml | 10 +- .../repository/ChannelRepositoryTest.java | 46 +++++ .../repository/MessageRepositoryTest.java | 102 ++++++++++ .../repository/UserRepositoryTest.java | 82 ++++++++ .../basic/BasicChannelServiceTest.java | 137 +++++++++++++ .../basic/BasicMessageServiceTest.java | 185 ++++++++++++++++++ .../service/basic/BasicUserServiceTest.java | 131 +++++++++++++ 14 files changed, 797 insertions(+), 45 deletions(-) delete mode 100644 src/main/resources/application-prod.yaml create mode 100644 src/main/resources/application-test.yaml create mode 100644 src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java diff --git a/build.gradle b/build.gradle index 9b9a7159b..bc699a814 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-actuator' runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'com.h2database:h2' diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java index 9692e152e..78d864f9e 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java @@ -5,7 +5,10 @@ @Getter public class ServiceException extends DiscodeitException { + private final ErrorCode errorCode; + public ServiceException(ErrorCode errorCode) { super(errorCode.getStatus(), errorCode.getDescription()); + this.errorCode = errorCode; } } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index b32c98a0d..880844cd5 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -142,7 +142,7 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { public void delete(UUID messageId) { if (!messageRepository.existsById(messageId)) { log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); } messageRepository.deleteById(messageId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index e2175f2cd..4e8f65993 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -12,7 +12,6 @@ import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; -import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.storage.BinaryContentStorage; import java.time.Instant; @@ -30,7 +29,6 @@ public class BasicUserService implements UserService { private final UserRepository userRepository; - private final UserStatusRepository userStatusRepository; private final UserMapper userMapper; private final BinaryContentRepository binaryContentRepository; private final BinaryContentStorage binaryContentStorage; diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 6559ad27a..31531d67e 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,28 +1,52 @@ spring: datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - h2: - console: - enabled: true - path: /h2-console + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:5432/discodeit + username: ${DB_USERNAME} + password: ${DB_PASSWORD} jpa: hibernate: - ddl-auto: update + ddl-auto: none properties: hibernate: - format_sql: true # SQL 줄바꿈 및 들여쓰기 - use_sql_comments: true # 쿼리 앞에 주석 출력 - highlight_sql: false # 컬러로 SQL 표현 - generate_statistics: false #실행 통계 출력 + format_sql: false + use_sql_comments: false + highlight_sql: false + generate_statistics: false open-in-view: false -logging: - level: - org.hibernate.SQL: debug - org.hibernate.orm.jdbc.bind: trace +info: + app: + name: Discodeit + description: 디스코드 클론 프로젝트 + version: 1.7.0 + author: junwo + java-version: ${java.version} + spring-boot-version: 3.4.0 + datasource: + url: ${spring.datasource.url} + driver-class-name: ${spring.datasource.driver-class-name} + jpa: + ddl-auto: ${spring.jpa.hibernate.ddl-auto} + storage: + type: ${discodeit.storage.type} + path: ${discodeit.storage.local.root-path} + multipart: + max-file-size: ${spring.servlet.multipart.max-file-size} + max-request-size: ${spring.servlet.multipart.max-request-size} + +management: + endpoints: + web: + exposure: + include: + - health + - info + - metrics + - loggers + info: + env: + enabled: true server: - port: 8081 \ No newline at end of file + port: 80 \ No newline at end of file diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml deleted file mode 100644 index 396e9bb41..000000000 --- a/src/main/resources/application-prod.yaml +++ /dev/null @@ -1,19 +0,0 @@ -spring: - datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:5432/discodeit - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - jpa: - hibernate: - ddl-auto: none - properties: - hibernate: - format_sql: false - use_sql_comments: false - highlight_sql: false - generate_statistics: false - open-in-view: false - -server: - port: 80 \ No newline at end of file diff --git a/src/main/resources/application-test.yaml b/src/main/resources/application-test.yaml new file mode 100644 index 000000000..fd140ecb6 --- /dev/null +++ b/src/main/resources/application-test.yaml @@ -0,0 +1,62 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:testdb;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + h2: + console: + enabled: true + path: /h2-console + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true # SQL 줄바꿈 및 들여쓰기 + use_sql_comments: true # 쿼리 앞에 주석 출력 + highlight_sql: false # 컬러로 SQL 표현 + generate_statistics: false #실행 통계 출력 + open-in-view: false + +logging: + level: + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace + +info: + app: + name: ${spring.application.name} + description: 디스코드 클론 프로젝트 + version: 1.7.0 + author: junwo + java-version: ${java.version} + spring-boot-version: 3.4.0 + datasource: + url: ${spring.datasource.url} + driver-class-name: ${spring.datasource.driver-class-name} + jpa: + ddl-auto: ${spring.jpa.hibernate.ddl-auto} + storage: + type: ${discodeit.storage.type} + path: ${discodeit.storage.local.root-path} + multipart: + max-file-size: ${spring.servlet.multipart.max-file-size} + max-request-size: ${spring.servlet.multipart.max-request-size} + +management: + endpoints: + web: + exposure: + include: + - health + - info + - metrics + - loggers + info: + env: + enabled: true + + +server: + port: 8081 \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 961633882..21600b95c 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,12 +1,12 @@ spring: - profiles: - active: dev application: name: discodeit + profiles: + active: test servlet: multipart: - maxFileSize: 10MB - maxRequestSize: 30MB + max-file-size: 10MB + max-request-size: 30MB logging: level: @@ -16,4 +16,4 @@ discodeit: storage: type: local local: - root-path: .discodeit/storage + root-path: .discodeit/storage \ No newline at end of file diff --git a/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java new file mode 100644 index 000000000..fc8dc4538 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java @@ -0,0 +1,46 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.test.context.ActiveProfiles; + +@DataJpaTest +@EnableJpaAuditing +@ActiveProfiles("test") +class ChannelRepositoryTest { + + @Autowired + private ChannelRepository channelRepository; + + @Test + @DisplayName("공개 타입 또는 ID가 일치하는 채널을 조회할 수 있다") + void findAllByTypeOrIdIn() { + // given + Channel publicChannel1 = new Channel(ChannelType.PUBLIC, "공지사항", "전체 공지"); + Channel publicChannel2 = new Channel(ChannelType.PUBLIC, "자유채팅", "잡담방"); + Channel privateChannel = new Channel(ChannelType.PRIVATE, null, null); + + channelRepository.saveAll(List.of(publicChannel1, publicChannel2, privateChannel)); + + List ids = List.of(privateChannel.getId()); + + // when + List result = channelRepository.findAllByTypeOrIdIn(ChannelType.PUBLIC, ids); + + // then + assertThat(result).hasSize(3); // PUBLIC 2 + privateChannel 1 + assertThat(result).extracting(Channel::getId) + .containsExactlyInAnyOrder(publicChannel1.getId(), publicChannel2.getId(), privateChannel.getId()); + } +} + diff --git a/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java new file mode 100644 index 000000000..dae731a82 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java @@ -0,0 +1,102 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.test.context.ActiveProfiles; + +@DataJpaTest +@EnableJpaAuditing +@ActiveProfiles("test") +class MessageRepositoryTest { + + @Autowired + private MessageRepository messageRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private ChannelRepository channelRepository; + + @Autowired + private UserStatusRepository userStatusRepository; + + @Test + @DisplayName("채널 ID로 메시지 목록을 페이징 조회한다.") + void findAllByChannelIdWithAuthor() { + // given + Channel channel = channelRepository.save(new Channel(ChannelType.PUBLIC, "test", "설명")); + User user = userRepository.save(new User("junwo", "junwo@email.com", "pass", null)); + userStatusRepository.save(new UserStatus(user, Instant.now())); + + messageRepository.saveAll(List.of( + new Message("Hello 1", channel, user, List.of()), + new Message("Hello 2", channel, user, List.of()) + )); + + // when + Slice messages = messageRepository.findAllByChannelIdWithAuthor( + channel.getId(), + Instant.now(), + PageRequest.of(0, 10) + ); + + // then + assertThat(messages).isNotNull(); + assertThat(messages.getContent()).hasSize(2); + assertThat(messages.getContent().get(0).getAuthor()).isNotNull(); + assertThat(messages.getContent().get(0).getAuthor().getStatus()).isNotNull(); + } + + @Test + @DisplayName("채널 ID로 가장 마지막 메시지 시간을 조회한다.") + void findLastMessageAtByChannelId() { + // given + Channel channel = channelRepository.save(new Channel(ChannelType.PUBLIC, "test", "설명")); + User user = userRepository.save(new User("junwo", "junwo@email.com", "pass", null)); + userStatusRepository.save(new UserStatus(user, Instant.now())); + + Instant now = Instant.now(); + messageRepository.save(new Message("Hi!", channel, user, List.of())); + messageRepository.save(new Message("Latest", channel, user, List.of())); + + // when + Optional lastMessageAt = messageRepository.findLastMessageAtByChannelId(channel.getId()); + + // then + assertThat(lastMessageAt).isPresent(); + } + + @Test + @DisplayName("채널 ID로 모든 메시지를 삭제한다.") + void deleteAllByChannelId() { + // given + Channel channel = channelRepository.save(new Channel(ChannelType.PUBLIC, "test", "설명")); + User user = userRepository.save(new User("junwo", "junwo@email.com", "pass", null)); + userStatusRepository.save(new UserStatus(user, Instant.now())); + + messageRepository.saveAll(List.of( + new Message("Msg1", channel, user, List.of()), + new Message("Msg2", channel, user, List.of()) + )); + + // when + messageRepository.deleteAllByChannelId(channel.getId()); + + // then + assertThat(messageRepository.findAll()).isEmpty(); + } +} + diff --git a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java new file mode 100644 index 000000000..8df21403d --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java @@ -0,0 +1,82 @@ +package com.sprint.mission.discodeit.repository; + +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.entity.UserStatus; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.test.context.ActiveProfiles; + +@DataJpaTest +@ActiveProfiles("test") +@EnableJpaAuditing +public class UserRepositoryTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserStatusRepository userStatusRepository; + + @Test + @DisplayName("User 생성 시 createdAt 자동 생성") + void createUser_shouldSetTimestamps() { + User user = new User("rex", "rex@naver.com", "Rlawnsdn12!", null); + User save = userRepository.save(user); + + assertThat(save.getCreatedAt()).isNotNull(); + assertThat(save.getUpdatedAt()).isNotNull(); + } + + @Test + @DisplayName("사용자 저장 및 username으로 조회 성공") + void findByUsername_success() { + User user = new User("rex", "rex@naver.com", "Rlawnsdn12!", null); + userRepository.save(user); + + Optional findUser = userRepository.findByUsername("rex"); + + assertThat(findUser).isPresent(); + } + + + @Test + @DisplayName("existsByEmail, existsByUsername 테스트") + void existsByEmailAndUsername_success() { + // given + User user = new User("junwo", "junwo@email.com", "password123!", null); + userRepository.save(user); + + // when + boolean emailExists = userRepository.existsByEmail("junwo@email.com"); + boolean usernameExists = userRepository.existsByUsername("junwo"); + + // then + assertThat(emailExists).isTrue(); + assertThat(usernameExists).isTrue(); + } + + @Test + @DisplayName("사용자와 프로필, 상태까지 함께 조회 (fetch join)") + void findAllWithProfileAndStatus_success() { + // given + User user = new User("junwo", "junwo@email.com", "password123!", null); + userRepository.save(user); + + UserStatus status = new UserStatus(user, Instant.now()); + userStatusRepository.save(status); + + // when + List users = userRepository.findAllWithProfileAndStatus(); + + // then + assertThat(users).isNotNull(); + assertThat(users.get(0).getStatus()).isNotNull(); // fetch join 확인 + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java new file mode 100644 index 000000000..1e39027ff --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java @@ -0,0 +1,137 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.ChannelMapper; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.ReadStatusRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import static org.mockito.ArgumentMatchers.any; +import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException; +import org.springframework.test.context.ActiveProfiles; + +import static org.mockito.BDDMockito.*; + +@ActiveProfiles("test") +@ExtendWith(MockitoExtension.class) +public class BasicChannelServiceTest { + + @Mock + private ChannelRepository channelRepository; + @Mock + private ReadStatusRepository readStatusRepository; + @Mock + private MessageRepository messageRepository; + @Mock + private UserRepository userRepository; + @Mock + private ChannelMapper channelMapper; + @InjectMocks + private BasicChannelService channelService; + + @Test + @DisplayName("성공 - 공개 채널 생성") + void createPublicChannel_success() { + PublicChannelCreateRequest request = new PublicChannelCreateRequest("공지방", "안내용"); + Channel channel = new Channel(ChannelType.PUBLIC, "공지방", "안내용"); + ChannelDto dto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, "공지방", "안내용", null, + null); + + given(channelRepository.save(any())).willReturn(channel); + given(channelMapper.toDto(any())).willReturn(dto); + + ChannelDto result = channelService.create(request); + + assertThat(result.name()).isEqualTo("공지방"); + then(channelRepository).should().save(any()); + } + + @Test + @DisplayName("성공 - 개인 채널 생성") + void createPrivateChannel_success() { + List users = List.of(UUID.randomUUID(), UUID.randomUUID()); + PrivateChannelCreateRequest request = new PrivateChannelCreateRequest(users); + Channel channel = new Channel(ChannelType.PRIVATE, null, null); + ChannelDto dto = new ChannelDto(UUID.randomUUID(), ChannelType.PRIVATE, null, null, null, null); + + given(channelRepository.save(any())).willReturn(channel); + given(userRepository.findAllById(users)).willReturn( + users.stream().map(id -> new User("user", "email", "pw", null)).toList() + ); + given(readStatusRepository.saveAll(any())).willReturn(List.of()); + given(channelMapper.toDto(any())).willReturn(dto); + + ChannelDto result = channelService.create(request); + + assertThat(result.type()).isEqualTo(ChannelType.PRIVATE); + then(readStatusRepository).should().saveAll(any()); + } + + @Test + @DisplayName("실패 - 채널 조회") + void findChannel_fail_notFound() { + UUID channelId = UUID.randomUUID(); + given(channelRepository.findById(channelId)).willReturn(Optional.empty()); + + assertThatThrownBy(() -> channelService.find(channelId)) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); + } + + @Test + @DisplayName("실패 - 개인 채널은 수정 불가") + void updateChannel_fail_privateChannel() { + UUID channelId = UUID.randomUUID(); + Channel channel = new Channel(ChannelType.PRIVATE, null, null); + PublicChannelUpdateRequest request = new PublicChannelUpdateRequest("newChannel", "hello"); + + given(channelRepository.findById(channelId)).willReturn(Optional.of(channel)); + + assertThatThrownBy(() -> channelService.update(channelId, request)) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); + } + + @Test + @DisplayName("성공 - 채널 삭제") + void deleteChannel_success() { + UUID channelId = UUID.randomUUID(); + given(channelRepository.existsById(channelId)).willReturn(true); + + channelService.delete(channelId); + + then(messageRepository).should().deleteAllByChannelId(channelId); + then(readStatusRepository).should().deleteAllByChannelId(channelId); + then(channelRepository).should().deleteById(channelId); + } + + @Test + @DisplayName("실패 - 채널 삭제") + void deleteChannel_fail_notFound() { + UUID channelId = UUID.randomUUID(); + given(channelRepository.existsById(channelId)).willReturn(false); + + assertThatThrownBy(() -> channelService.delete(channelId)) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java new file mode 100644 index 000000000..bf1705e95 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java @@ -0,0 +1,185 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; +import com.sprint.mission.discodeit.dto.response.PageResponse; +import com.sprint.mission.discodeit.entity.Channel; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.Message; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.MessageMapper; +import com.sprint.mission.discodeit.mapper.PageResponseMapper; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; +import jakarta.persistence.criteria.CriteriaBuilder.In; +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentMatchers; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@ExtendWith(MockitoExtension.class) +public class BasicMessageServiceTest { + + @Mock + private ChannelRepository channelRepository; + @Mock + private UserRepository userRepository; + @Mock + private MessageRepository messageRepository; + @Mock + private MessageMapper messageMapper; + @Mock + private BinaryContentStorage binaryContentStorage; + @Mock + private BinaryContentRepository binaryContentRepository; + @Mock + private PageResponseMapper pageResponseMapper; + @InjectMocks + private BasicMessageService messageService; + + @Test + @DisplayName("성공 - 메시지 생성") + void createMessage_success() { + UUID channelId = UUID.randomUUID(); + UUID userId = UUID.randomUUID(); + String content = "Hello World"; + + MessageCreateRequest request = new MessageCreateRequest(content, channelId, userId); + BinaryContentCreateRequest binaryContentCreateRequest = new BinaryContentCreateRequest( + "file.txt", "text/plain", new byte[]{1, 2}); + Channel channel = new Channel(ChannelType.PUBLIC, "공개 채널", "공개 채널입니다."); + User user = new User("user", "user@naver.com", "Rlawnsdn12!", null); + UserDto userDto = new UserDto(UUID.randomUUID(), user.getUsername(), user.getEmail(), null, + true); + Message message = new Message(content, channel, user, List.of()); + MessageDto messageDto = new MessageDto(UUID.randomUUID(), Instant.now(), Instant.now(), content, + channelId, userDto, null); + + given(channelRepository.findById(channelId)).willReturn(Optional.of(channel)); + given(userRepository.findById(userId)).willReturn(Optional.of(user)); + given(messageRepository.save(any())).willReturn(message); + given(messageMapper.toDto(any())).willReturn(messageDto); + + MessageDto result = messageService.create(request, List.of(binaryContentCreateRequest)); + + assertThat(result.content()).isEqualTo("Hello World"); + then(messageRepository).should().save(any()); + } + + @Test + @DisplayName("실패 - 채널이 존재하지 않음") + void createMessage_fail_channelNotFound() { + UUID channelId = UUID.randomUUID(); + UUID userId = UUID.randomUUID(); + MessageCreateRequest request = new MessageCreateRequest("Hello World", channelId, userId); + + given(channelRepository.findById(channelId)).willReturn(Optional.empty()); + + assertThatThrownBy(() -> messageService.create(request, List.of())) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); + } + + @Test + @DisplayName("성공 - 메시지 수정") + void updateMessage_success() { + UUID messageId = UUID.randomUUID(); + Message message = mock(Message.class); + MessageUpdateRequest request = new MessageUpdateRequest("New Content"); + MessageDto messageDto = new MessageDto(messageId, Instant.now(), Instant.now(), + request.newContent(), UUID.randomUUID(), null, null); + + given(messageRepository.findById(messageId)).willReturn(Optional.of(message)); + given(messageMapper.toDto(any())).willReturn(messageDto); + + MessageDto update = messageService.update(messageId, request); + + assertThat(update.content()).isEqualTo("New Content"); + then(message).should().update(any()); + } + + @Test + @DisplayName("실패 - 메시지 없음") + void updateMessage_fail_notFound() { + UUID messageId = UUID.randomUUID(); + MessageUpdateRequest request = new MessageUpdateRequest("New Content"); + + given(messageRepository.findById(messageId)).willReturn(Optional.empty()); + + assertThatThrownBy(() -> messageService.update(messageId, request)) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_MESSAGE); + } + + @Test + @DisplayName("성공 - 메시지 삭제") + void deleteMessage_success() { + UUID messageId = UUID.randomUUID(); + given(messageRepository.existsById(messageId)).willReturn(true); + + messageService.delete(messageId); + + then(messageRepository).should().deleteById(any()); + } + + @Test + @DisplayName("실패 - 삭제하려는 메시지가 없음") + void deleteMessage_fail_notFound() { + UUID messageId = UUID.randomUUID(); + given(messageRepository.existsById(messageId)).willReturn(false); + + assertThatThrownBy(() -> messageService.delete(messageId)) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_MESSAGE); + } + + @Test + @DisplayName("성공 - 채널 메시지 목록 조회") + void findAllByChannelId_success() { + UUID channelId = UUID.randomUUID(); + Instant cursor = Instant.now(); + Pageable pageable = PageRequest.of(0, 10); + Message message = mock(Message.class); + MessageDto dto = mock(MessageDto.class); + + Slice slice = new SliceImpl<>(List.of(message), pageable, false); + Slice dtoSlice = new SliceImpl<>(List.of(dto), pageable, false); + PageResponse response = new PageResponse<>(List.of(dto), null, 1, false, 0L); + + given(messageRepository.findAllByChannelIdWithAuthor(eq(channelId), any(), eq(pageable))).willReturn(slice); + given(messageMapper.toDto(any())).willReturn(dto); + given(pageResponseMapper.fromSlice(ArgumentMatchers.>any(), any())).willReturn(response); + + PageResponse result = messageService.findAllByChannelId(channelId, cursor, pageable); + + assertThat(result.content()).isNotNull(); + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java new file mode 100644 index 000000000..a37abaab7 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java @@ -0,0 +1,131 @@ +package com.sprint.mission.discodeit.service.basic; + +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; +import com.sprint.mission.discodeit.entity.User; +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.mapper.UserMapper; +import com.sprint.mission.discodeit.repository.BinaryContentRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import com.sprint.mission.discodeit.storage.BinaryContentStorage; +import java.util.Optional; +import java.util.UUID; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.*; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@ExtendWith(MockitoExtension.class) +public class BasicUserServiceTest { + + @Mock + private UserRepository userRepository; + + @Mock + private UserMapper userMapper; + + @Mock + private BinaryContentRepository binaryContentRepository; + + @Mock + private BinaryContentStorage binaryContentStorage; + + @InjectMocks + private BasicUserService userService; + + @Test + @DisplayName("성공 - 유저 생성") + void createUser_success() { + UserCreateRequest request = new UserCreateRequest("rex", "rex@naver.com", "Rlawnsdn12!"); + User user = new User(request.username(), request.email(), request.password(), null); + UserDto userDto = new UserDto(UUID.randomUUID(), "rex", "rex@naver.com", null, true); + + given(userRepository.existsByEmail(request.email())).willReturn(false); + given(userRepository.existsByUsername(request.username())).willReturn(false); + given(userRepository.save(any(User.class))).willReturn(user); + given(userMapper.toDto(any())).willReturn(userDto); + + UserDto result = userService.create(request, Optional.empty()); + + assertThat(result.username()).isEqualTo("rex"); + then(userRepository).should(times(1)).save(any()); + } + + @Test + @DisplayName("실패 - 중복된 이메일로 유저 생성") + void createUser_fail_duplicateEmail() { + UserCreateRequest request = new UserCreateRequest("rex", "rex@naver.com", "Rlawnsdn12!"); + given(userRepository.existsByEmail(request.email())).willReturn(true); + + assertThatThrownBy(() -> userService.create(request, Optional.empty())) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.DUPLICATE_EMAIL); + } + + @Test + @DisplayName("성공 - 유저 삭제") + void deleteUser_success() { + UUID userId = UUID.randomUUID(); + given(userRepository.existsById(userId)).willReturn(true); + + userService.delete(userId); + + then(userRepository).should().deleteById(userId); + } + + @Test + @DisplayName("실패 - 존재하지 않는 유저") + void deleteUser_fail_notfound() { + UUID userId = UUID.randomUUID(); + given(userRepository.existsById(userId)).willReturn(false); + + assertThatThrownBy(() -> userService.delete(userId)) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_USER); + } + + @Test + @DisplayName("성공 - 유저 업데이트") + void updateUser_success() { + UUID userId = UUID.randomUUID(); + UserUpdateRequest request = new UserUpdateRequest("newRex", "newRex@naver.com", "TestRex123!"); + User user = mock(User.class); + + given(userRepository.findById(userId)).willReturn(Optional.of(user)); + given(userRepository.existsByEmail(request.newEmail())).willReturn(false); + given(userRepository.existsByUsername(request.newUsername())).willReturn(false); + given(userMapper.toDto(user)).willReturn( + new UserDto(userId, request.newUsername(), request.newEmail(), null, true)); + + UserDto update = userService.update(userId, request, Optional.empty()); + + assertThat(update.username()).isEqualTo("newRex"); + then(user).should().update("newRex", "newRex@naver.com", "TestRex123!", null); + } + + @Test + @DisplayName("실패 - 유저 업데이트 중 중복 이름") + void updateUser_fail_duplicateName() { + UUID userId = UUID.randomUUID(); + UserUpdateRequest request = new UserUpdateRequest("newRex", "newRex@naver.com", "TestRex123!"); + User oldUser = new User("rex", "rex@naver.com", "Rlawnsdn12!", null); + + given(userRepository.findById(userId)).willReturn(Optional.of(oldUser)); + given(userRepository.existsByEmail(request.newEmail())).willReturn(false); + given(userRepository.existsByUsername(request.newUsername())).willReturn(true); + + assertThatThrownBy(() -> userService.update(userId, request, Optional.empty())) + .isInstanceOf(ServiceException.class) + .hasFieldOrPropertyWithValue("errorCode", ErrorCode.DUPLICATE_NAME); + } +} From 0145279ba79489807f66eadc1a969cb847e6a548 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 28 Mar 2025 15:30:08 +0900 Subject: [PATCH 104/115] =?UTF-8?q?:sparkles:=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discodeit/DiscodeitApplicationTests.java | 13 -- .../mission/discodeit/IntegrationTests.java | 152 ++++++++++++++++++ .../controller/ChannelControllerTest.java | 73 +++++++++ .../controller/MessageControllerTest.java | 90 +++++++++++ .../controller/UserControllerTest.java | 104 ++++++++++++ 5 files changed, 419 insertions(+), 13 deletions(-) delete mode 100644 src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java create mode 100644 src/test/java/com/sprint/mission/discodeit/IntegrationTests.java create mode 100644 src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java create mode 100644 src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java diff --git a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java b/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java deleted file mode 100644 index 3a987a214..000000000 --- a/src/test/java/com/sprint/mission/discodeit/DiscodeitApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sprint.mission.discodeit; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DiscodeitApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java b/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java new file mode 100644 index 000000000..3eeed3619 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java @@ -0,0 +1,152 @@ +package com.sprint.mission.discodeit; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.*; +import com.sprint.mission.discodeit.repository.ChannelRepository; +import com.sprint.mission.discodeit.repository.MessageRepository; +import com.sprint.mission.discodeit.repository.UserRepository; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@SpringBootTest +@Transactional +@ActiveProfiles("test") +@AutoConfigureMockMvc +public class IntegrationTests { + + @Autowired + private MockMvc mockMvc; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private UserRepository userRepository; + @Autowired + private ChannelRepository channelRepository; + @Autowired + private MessageRepository messageRepository; + + @Test + @DisplayName("사용자 생성 및 조회") + void userCreateAndFetch() throws Exception { + // given + UserCreateRequest request = new UserCreateRequest("testuser", "test@email.com", "Password1!"); + byte[] jsonBytes = objectMapper.writeValueAsBytes(request); + + MockMultipartFile userCreateRequest = new MockMultipartFile( + "userCreateRequest", // name (must match @RequestPart) + "userCreateRequest.json", // filename (optional) + "application/json", // content type + jsonBytes // content + ); + + // when + ResultActions result = mockMvc.perform( + MockMvcRequestBuilders.multipart("/api/users") + .file(userCreateRequest) + .contentType(MediaType.MULTIPART_FORM_DATA) + ) + .andExpect(status().isCreated()); + + // then + String responseBody = result.andReturn().getResponse().getContentAsString(); + UserDto userDto = objectMapper.readValue(responseBody, UserDto.class); + + assertThat(userDto.username()).isEqualTo("testuser"); + } + + @Test + @DisplayName("채널 생성 및 삭제") + void channelCreateAndDelete() throws Exception { + PublicChannelCreateRequest request = new PublicChannelCreateRequest("test-channel", "desc"); + + ResultActions result = mockMvc.perform(MockMvcRequestBuilders.post("/api/channels/public") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()); + + String responseBody = result.andReturn().getResponse().getContentAsString(); + ChannelDto channelDto = objectMapper.readValue(responseBody, ChannelDto.class); + + UUID channelId = channelDto.id(); + + mockMvc.perform(MockMvcRequestBuilders.delete("/api/channels/" + channelId)) + .andExpect(status().isNoContent()); + + assertThat(channelRepository.findById(channelId)).isEmpty(); + } + + @Test + @DisplayName("메시지 생성 및 수정") + void messageCreateAndUpdate() throws Exception { + // 사용자 생성 + UserCreateRequest userRequest = new UserCreateRequest("msguser", "msg@email.com", "Password1!"); + MockMultipartFile userPart = new MockMultipartFile( + "userCreateRequest", + "userCreateRequest.json", + "application/json", + objectMapper.writeValueAsBytes(userRequest) + ); + + String userResponse = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/users") + .file(userPart) + .contentType(MediaType.MULTIPART_FORM_DATA)) + .andExpect(status().isCreated()) + .andReturn().getResponse().getContentAsString(); + + UserDto user = objectMapper.readValue(userResponse, UserDto.class); + + // 채널 생성 + PublicChannelCreateRequest channelRequest = new PublicChannelCreateRequest("msg-channel", "msg-desc"); + String channelResponse = mockMvc.perform(MockMvcRequestBuilders.post("/api/channels/public") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(channelRequest))) + .andExpect(status().isCreated()) + .andReturn().getResponse().getContentAsString(); + + ChannelDto channel = objectMapper.readValue(channelResponse, ChannelDto.class); + + // 메시지 생성 + MessageCreateRequest request = new MessageCreateRequest("test", channel.id(), user.id()); + MockMultipartFile messagePart = new MockMultipartFile( + "messageCreateRequest", + "messageCreateRequest.json", + "application/json", + objectMapper.writeValueAsBytes(request) + ); + + String messageResponse = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/messages") + .file(messagePart) + .contentType(MediaType.MULTIPART_FORM_DATA)) + .andExpect(status().isCreated()) + .andReturn().getResponse().getContentAsString(); + + MessageDto createdMessage = objectMapper.readValue(messageResponse, MessageDto.class); + UUID messageId = createdMessage.id(); + + // 메시지 수정 + MessageUpdateRequest updateRequest = new MessageUpdateRequest("Updated content"); + + mockMvc.perform(MockMvcRequestBuilders.patch("/api/messages/" + messageId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updateRequest))) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content").value("Updated content")); + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java new file mode 100644 index 000000000..0a443db47 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java @@ -0,0 +1,73 @@ +package com.sprint.mission.discodeit.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.service.ChannelService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(ChannelController.class) +@ExtendWith(SpringExtension.class) +@ActiveProfiles("test") +class ChannelControllerTest { + + @Autowired + MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @MockitoBean + ChannelService channelService; + + @Test + @DisplayName("성공 - 공개 채널 생성") + void createPublicChannel_success() throws Exception { + PublicChannelCreateRequest request = new PublicChannelCreateRequest("default", "default"); + ChannelDto channelDto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, request.name(), + request.description(), null, null); + + BDDMockito.given(channelService.create(any(PublicChannelCreateRequest.class))) + .willReturn(channelDto); + + mockMvc.perform(post("/api/channels/public") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request))) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.name").value("default")); + } + + @Test + @DisplayName("성공 - 채널 목록 조회") + void findAllChannels_success() throws Exception { + UUID userId = UUID.randomUUID(); + ChannelDto channelDto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, "default", + "PUBLIC", null, null); + + BDDMockito.given(channelService.findAllByUserId(userId)) + .willReturn(List.of(channelDto)); + + mockMvc.perform(get("/api/channels") + .param("userId", userId.toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].name").value("default")); + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java new file mode 100644 index 000000000..15fafcb6f --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java @@ -0,0 +1,90 @@ +package com.sprint.mission.discodeit.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; +import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; +import com.sprint.mission.discodeit.dto.response.PageResponse; +import com.sprint.mission.discodeit.service.MessageService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(controllers = MessageController.class) +public class MessageControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @MockitoBean + private MessageService messageService; + + @Test + @DisplayName("성공 - 메시지 생성") + void createMessage_success() throws Exception { + MessageCreateRequest request = new MessageCreateRequest("test", UUID.randomUUID(), UUID.randomUUID()); + MessageDto dto = new MessageDto(UUID.randomUUID(), Instant.now(), Instant.now(), "test", + UUID.randomUUID(), null, null); + + BDDMockito.given(messageService.create(any(), any())).willReturn(dto); + + MockMultipartFile jsonPart = new MockMultipartFile("messageCreateRequest", null, + MediaType.APPLICATION_JSON_VALUE, + objectMapper.writeValueAsBytes(request)); + + mockMvc.perform(MockMvcRequestBuilders.multipart("/api/messages") + .file(jsonPart)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.content").value("test")); + } + + @Test + @DisplayName("실패 - 메시지 업데이트 요청 시 존재하지 않는 메시지") + void updateMessage_notFound() throws Exception { + UUID messageId = UUID.randomUUID(); + MessageUpdateRequest updateRequest = new MessageUpdateRequest("Updated!"); + + BDDMockito.given(messageService.update(any(), any())) + .willThrow(new RuntimeException("Message not found")); + + mockMvc.perform(MockMvcRequestBuilders.patch("/api/messages/" + messageId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(updateRequest))) + .andExpect(status().isInternalServerError()); + } + + @Test + @DisplayName("성공 - 메시지 목록 조회") + void findAllByChannelId_success() throws Exception { + UUID channelId = UUID.randomUUID(); + MessageDto dto = new MessageDto(UUID.randomUUID(), Instant.now(), Instant.now(), "test", + channelId, null, null); + PageResponse response = new PageResponse<>(List.of(dto), null, 1, false, 1L); + + BDDMockito.given(messageService.findAllByChannelId(any(), any(), any())).willReturn(response); + + mockMvc.perform(MockMvcRequestBuilders.get("/api/messages") + .param("channelId", channelId.toString()) + .param("page", "0") + .param("size", "50")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content[0].channelId").value(channelId.toString())); + } +} diff --git a/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java new file mode 100644 index 000000000..3cc53bf45 --- /dev/null +++ b/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java @@ -0,0 +1,104 @@ +package com.sprint.mission.discodeit.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.UserCreateRequest; +import com.sprint.mission.discodeit.service.UserService; +import com.sprint.mission.discodeit.service.UserStatusService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.List; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; + +@WebMvcTest(controllers = UserController.class) +class UserControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @MockitoBean + private UserService userService; + + @MockitoBean + private UserStatusService userStatusService; + + @Test + @DisplayName("성공 - 전체 유저 조회") + void findAll_success() throws Exception { + UserDto user = new UserDto(UUID.randomUUID(), "rex", "rex@naver.com", null, true); + BDDMockito.given(userService.findAll()).willReturn(List.of(user)); + + mockMvc.perform(get("/api/users")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].username").value("rex")); + } + + @Test + @DisplayName("성공 - 유저 삭제") + void deleteUser_success() throws Exception { + UUID userId = UUID.randomUUID(); + + mockMvc.perform(delete("/api/users/" + userId)) + .andExpect(status().isNoContent()); + } + + @Test + @DisplayName("실패 - 유효하지 않은 입력으로 유저 생성") + void createUser_fail_invalidInput() throws Exception { + UserCreateRequest invalidRequest = new UserCreateRequest("", "invalid", "123"); + + MockMultipartFile requestPart = new MockMultipartFile( + "userCreateRequest", + "userCreateRequest", + MediaType.APPLICATION_JSON_VALUE, + objectMapper.writeValueAsBytes(invalidRequest) + ); + + mockMvc.perform(MockMvcRequestBuilders.multipart("/api/users") + .file(requestPart) + .contentType(MediaType.MULTIPART_FORM_DATA)) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("성공 - 유저 생성") + void createUser_success() throws Exception { + UserCreateRequest request = new UserCreateRequest("rex", "rex@naver.com", "Password1!"); + UserDto userDto = new UserDto(UUID.randomUUID(), "rex", "rex@naver.com", null, true); + + BDDMockito.given(userService.create(any(), any())).willReturn(userDto); + + MockMultipartFile requestPart = new MockMultipartFile( + "userCreateRequest", + "userCreateRequest", + MediaType.APPLICATION_JSON_VALUE, + objectMapper.writeValueAsBytes(request) + ); + + mockMvc.perform(MockMvcRequestBuilders.multipart("/api/users") + .file(requestPart) + .contentType(MediaType.MULTIPART_FORM_DATA)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.username").value("rex")); + } + +} + From c3297f8bb04d6d2f8f0841057a7d60f56d2c3d49 Mon Sep 17 00:00:00 2001 From: junwoo Date: Fri, 28 Mar 2025 17:17:29 +0900 Subject: [PATCH 105/115] =?UTF-8?q?:sparkles:=20=EC=8B=AC=ED=99=94=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20-=20MDC=EB=A5=BC=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=9C=20=EB=A1=9C=EA=B9=85=20=EA=B3=A0?= =?UTF-8?q?=EB=8F=84=ED=99=94=20=EC=99=84=EB=A3=8C=20-=20Admin=EC=9D=84=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=9C=20=EB=A9=94=ED=8A=B8=EB=A6=AD=20?= =?UTF-8?q?=EA=B0=80=EC=8B=9C=ED=99=94=20=EC=99=84=EB=A3=8C=20-=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BB=A4=EB=B2=84=EB=A6=AC?= =?UTF-8?q?=EC=A7=80=20=EA=B4=80=EB=A6=AC=20=EC=84=A4=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/.gitignore | 37 +++ admin/build.gradle | 38 +++ admin/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + admin/gradlew | 251 ++++++++++++++++++ admin/gradlew.bat | 94 +++++++ admin/settings.gradle | 1 + .../mission/admin/AdminApplication.java | 15 ++ admin/src/main/resources/application.yml | 6 + .../mission/admin/AdminApplicationTests.java | 13 + build.gradle | 39 ++- .../discodeit/DiscodeitApplication.java | 1 + ...{AppConfig.java => JpaAuditingConfig.java} | 4 +- .../config/MDCLoggingInterceptor.java | 36 +++ .../mission/discodeit/config/WebConfig.java | 23 ++ src/main/resources/application-dev.yaml | 38 ++- ...cation-test.yaml => application-prod.yaml} | 38 ++- src/main/resources/application.yaml | 7 +- src/main/resources/logback-spring.xml | 10 +- .../mission/discodeit/IntegrationTests.java | 8 +- .../controller/ChannelControllerTest.java | 5 +- .../controller/MessageControllerTest.java | 2 + .../controller/UserControllerTest.java | 2 + .../repository/ChannelRepositoryTest.java | 2 +- .../repository/MessageRepositoryTest.java | 2 +- .../repository/UserRepositoryTest.java | 2 +- .../basic/BasicChannelServiceTest.java | 2 +- .../basic/BasicMessageServiceTest.java | 2 +- .../service/basic/BasicUserServiceTest.java | 2 +- 29 files changed, 625 insertions(+), 62 deletions(-) create mode 100644 admin/.gitignore create mode 100644 admin/build.gradle create mode 100644 admin/gradle/wrapper/gradle-wrapper.jar create mode 100644 admin/gradle/wrapper/gradle-wrapper.properties create mode 100644 admin/gradlew create mode 100644 admin/gradlew.bat create mode 100644 admin/settings.gradle create mode 100644 admin/src/main/java/com/sprint/mission/admin/AdminApplication.java create mode 100644 admin/src/main/resources/application.yml create mode 100644 admin/src/test/java/com/sprint/mission/admin/AdminApplicationTests.java rename src/main/java/com/sprint/mission/discodeit/config/{AppConfig.java => JpaAuditingConfig.java} (86%) create mode 100644 src/main/java/com/sprint/mission/discodeit/config/MDCLoggingInterceptor.java create mode 100644 src/main/java/com/sprint/mission/discodeit/config/WebConfig.java rename src/main/resources/{application-test.yaml => application-prod.yaml} (58%) diff --git a/admin/.gitignore b/admin/.gitignore new file mode 100644 index 000000000..c2065bc26 --- /dev/null +++ b/admin/.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/admin/build.gradle b/admin/build.gradle new file mode 100644 index 000000000..a2af82da0 --- /dev/null +++ b/admin/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.4.4' + id 'io.spring.dependency-management' version '1.1.7' +} + +group = 'com.sprint.mission' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +repositories { + mavenCentral() +} + +ext { + set('springBootAdminVersion', "3.4.5") +} + +dependencies { + implementation 'de.codecentric:spring-boot-admin-starter-server' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +dependencyManagement { + imports { + mavenBom "de.codecentric:spring-boot-admin-dependencies:${springBootAdminVersion}" + } +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/admin/gradle/wrapper/gradle-wrapper.jar b/admin/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9bbc975c742b298b441bfb90dbc124400a3751b9 GIT binary patch literal 43705 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 DHx0+F literal 0 HcmV?d00001 diff --git a/admin/gradle/wrapper/gradle-wrapper.properties b/admin/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..37f853b1c --- /dev/null +++ b/admin/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/admin/gradlew b/admin/gradlew new file mode 100644 index 000000000..faf93008b --- /dev/null +++ b/admin/gradlew @@ -0,0 +1,251 @@ +#!/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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# 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/platforms/jvm/plugins-application/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 -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || 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, 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/admin/gradlew.bat b/admin/gradlew.bat new file mode 100644 index 000000000..9d21a2183 --- /dev/null +++ b/admin/gradlew.bat @@ -0,0 +1,94 @@ +@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 +@rem SPDX-License-Identifier: Apache-2.0 +@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. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +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/admin/settings.gradle b/admin/settings.gradle new file mode 100644 index 000000000..e83a19cde --- /dev/null +++ b/admin/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'admin' diff --git a/admin/src/main/java/com/sprint/mission/admin/AdminApplication.java b/admin/src/main/java/com/sprint/mission/admin/AdminApplication.java new file mode 100644 index 000000000..3f66a5749 --- /dev/null +++ b/admin/src/main/java/com/sprint/mission/admin/AdminApplication.java @@ -0,0 +1,15 @@ +package com.sprint.mission.admin; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAdminServer +public class AdminApplication { + + public static void main(String[] args) { + SpringApplication.run(AdminApplication.class, args); + } + +} diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml new file mode 100644 index 000000000..f8512b595 --- /dev/null +++ b/admin/src/main/resources/application.yml @@ -0,0 +1,6 @@ +spring: + application: + name: admin + +server: + port: 9090 \ No newline at end of file diff --git a/admin/src/test/java/com/sprint/mission/admin/AdminApplicationTests.java b/admin/src/test/java/com/sprint/mission/admin/AdminApplicationTests.java new file mode 100644 index 000000000..9935e1e9c --- /dev/null +++ b/admin/src/test/java/com/sprint/mission/admin/AdminApplicationTests.java @@ -0,0 +1,13 @@ +package com.sprint.mission.admin; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AdminApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/build.gradle b/build.gradle index bc699a814..c3204d5c4 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.4.0' id 'io.spring.dependency-management' version '1.1.6' + id 'jacoco' // ✅ 테스트 커버리지 측정용 JaCoCo 플러그인 } group = 'com.sprint.mission' @@ -13,35 +14,63 @@ java { } } +repositories { + mavenCentral() +} + configurations { + // lombok annotation processor 설정 compileOnly { extendsFrom annotationProcessor } -} -repositories { - mavenCentral() + // SLF4J 충돌 방지: slf4j-nop 제거 + all { + exclude group: 'org.slf4j', module: 'slf4j-nop' + } } dependencies { + // 🌐 Spring Boot Starter implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation 'org.springframework.boot:spring-boot-starter-aop' + + // 📊 Spring Boot Admin Client + implementation 'de.codecentric:spring-boot-admin-starter-client:3.4.5' + + // 📘 API 문서 (Spring Boot 3.x 대응) + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' + // 🛢 DB 드라이버 runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'com.h2database:h2' + // ✏️ Lombok & MapStruct compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' implementation 'org.mapstruct:mapstruct:1.6.3' annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3' + // 🧪 테스트 testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + // 🔧 logback 명시적 추가 (SLF4J 2.x용) + implementation 'ch.qos.logback:logback-classic:1.4.14' } -tasks.named('test') { +test { useJUnitPlatform() + finalizedBy jacocoTestReport // 테스트 후 커버리지 리포트 생성 } + +jacocoTestReport { + dependsOn test + reports { + xml.required = true + html.required = true + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java index 0d4ae5758..fb7b88d5d 100644 --- a/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java +++ b/src/main/java/com/sprint/mission/discodeit/DiscodeitApplication.java @@ -2,6 +2,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication public class DiscodeitApplication { diff --git a/src/main/java/com/sprint/mission/discodeit/config/AppConfig.java b/src/main/java/com/sprint/mission/discodeit/config/JpaAuditingConfig.java similarity index 86% rename from src/main/java/com/sprint/mission/discodeit/config/AppConfig.java rename to src/main/java/com/sprint/mission/discodeit/config/JpaAuditingConfig.java index 96010621f..ac1eeda1a 100644 --- a/src/main/java/com/sprint/mission/discodeit/config/AppConfig.java +++ b/src/main/java/com/sprint/mission/discodeit/config/JpaAuditingConfig.java @@ -5,6 +5,6 @@ @Configuration @EnableJpaAuditing -public class AppConfig { +public class JpaAuditingConfig { -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/config/MDCLoggingInterceptor.java b/src/main/java/com/sprint/mission/discodeit/config/MDCLoggingInterceptor.java new file mode 100644 index 000000000..85b1150cb --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/MDCLoggingInterceptor.java @@ -0,0 +1,36 @@ +package com.sprint.mission.discodeit.config; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.util.UUID; + +@Component +public class MDCLoggingInterceptor implements HandlerInterceptor { + + private static final String REQUEST_ID_HEADER = "Discodeit-Request-ID"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + String requestId = UUID.randomUUID().toString(); + + // MDC에 로그 추적용 정보 저장 + MDC.put("requestId", requestId); + MDC.put("requestURL", request.getRequestURI()); + MDC.put("method", request.getMethod()); + + // 응답 헤더에 요청 ID 추가 + response.setHeader(REQUEST_ID_HEADER, requestId); + + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + MDC.clear(); // 요청 처리 끝나면 MDC 클리어 + } +} + diff --git a/src/main/java/com/sprint/mission/discodeit/config/WebConfig.java b/src/main/java/com/sprint/mission/discodeit/config/WebConfig.java new file mode 100644 index 000000000..654c40b18 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/config/WebConfig.java @@ -0,0 +1,23 @@ +package com.sprint.mission.discodeit.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + private final MDCLoggingInterceptor mdcLoggingInterceptor; + + @Autowired + public WebConfig(MDCLoggingInterceptor mdcLoggingInterceptor) { + this.mdcLoggingInterceptor = mdcLoggingInterceptor; + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(mdcLoggingInterceptor); + } +} + diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 31531d67e..c43537aa4 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,23 +1,38 @@ spring: + application: + name: discodeit + boot: + admin: + client: + url: http://localhost:9090 datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:5432/discodeit - username: ${DB_USERNAME} - password: ${DB_PASSWORD} + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:testdb;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + username: sa + password: + h2: + console: + enabled: true + path: /h2-console jpa: hibernate: - ddl-auto: none + ddl-auto: create properties: hibernate: - format_sql: false - use_sql_comments: false - highlight_sql: false - generate_statistics: false + format_sql: true # SQL 줄바꿈 및 들여쓰기 + use_sql_comments: true # 쿼리 앞에 주석 출력 + highlight_sql: false # 컬러로 SQL 표현 + generate_statistics: false #실행 통계 출력 open-in-view: false +logging: + level: + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace + info: app: - name: Discodeit + name: ${spring.application.name} description: 디스코드 클론 프로젝트 version: 1.7.0 author: junwo @@ -48,5 +63,6 @@ management: env: enabled: true + server: - port: 80 \ No newline at end of file + port: 8081 \ No newline at end of file diff --git a/src/main/resources/application-test.yaml b/src/main/resources/application-prod.yaml similarity index 58% rename from src/main/resources/application-test.yaml rename to src/main/resources/application-prod.yaml index fd140ecb6..827a5cd9f 100644 --- a/src/main/resources/application-test.yaml +++ b/src/main/resources/application-prod.yaml @@ -1,32 +1,29 @@ spring: + application: + name: discodeit + boot: + admin: + client: + url: ${SPRING_BOOT_ADMIN_CLIENT_URL} datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:testdb;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE - username: sa - password: - h2: - console: - enabled: true - path: /h2-console + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:5432/discodeit + username: ${DB_USERNAME} + password: ${DB_PASSWORD} jpa: hibernate: - ddl-auto: create + ddl-auto: none properties: hibernate: - format_sql: true # SQL 줄바꿈 및 들여쓰기 - use_sql_comments: true # 쿼리 앞에 주석 출력 - highlight_sql: false # 컬러로 SQL 표현 - generate_statistics: false #실행 통계 출력 + format_sql: false + use_sql_comments: false + highlight_sql: false + generate_statistics: false open-in-view: false -logging: - level: - org.hibernate.SQL: debug - org.hibernate.orm.jdbc.bind: trace - info: app: - name: ${spring.application.name} + name: Discodeit description: 디스코드 클론 프로젝트 version: 1.7.0 author: junwo @@ -57,6 +54,5 @@ management: env: enabled: true - server: - port: 8081 \ No newline at end of file + port: 80 \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 21600b95c..72d6b6a3b 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,11 +2,16 @@ spring: application: name: discodeit profiles: - active: test + active: dev servlet: multipart: max-file-size: 10MB max-request-size: 30MB + boot: + admin: + client: + instance: + name: discodeit logging: level: diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 158cb90a7..28ff17b5f 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,8 +1,8 @@ - - + + @@ -18,13 +18,8 @@ ${LOG_DIR}/latest.log - ${LOG_DIR}/logfile-%d{yyyy-MM-dd}.log - - 30 - - 1GB @@ -44,4 +39,3 @@ - diff --git a/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java b/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java index 3eeed3619..63f2d9da6 100644 --- a/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java +++ b/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java @@ -50,10 +50,10 @@ void userCreateAndFetch() throws Exception { byte[] jsonBytes = objectMapper.writeValueAsBytes(request); MockMultipartFile userCreateRequest = new MockMultipartFile( - "userCreateRequest", // name (must match @RequestPart) - "userCreateRequest.json", // filename (optional) - "application/json", // content type - jsonBytes // content + "userCreateRequest", + "userCreateRequest.json", + "application/json", + jsonBytes ); // when diff --git a/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java index 0a443db47..3e6a0381a 100644 --- a/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java +++ b/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java @@ -7,14 +7,12 @@ import com.sprint.mission.discodeit.service.ChannelService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.BDDMockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; import java.util.List; @@ -25,8 +23,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(ChannelController.class) -@ExtendWith(SpringExtension.class) -@ActiveProfiles("test") +@ActiveProfiles("dev") class ChannelControllerTest { @Autowired diff --git a/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java index 15fafcb6f..4ab6e8c5d 100644 --- a/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java +++ b/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java @@ -13,6 +13,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -24,6 +25,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +@ActiveProfiles("dev") @WebMvcTest(controllers = MessageController.class) public class MessageControllerTest { diff --git a/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java index 3cc53bf45..c695f12c5 100644 --- a/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java +++ b/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java @@ -13,6 +13,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.mock.web.MockMultipartFile; import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -25,6 +26,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +@ActiveProfiles("dev") @WebMvcTest(controllers = UserController.class) class UserControllerTest { diff --git a/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java index fc8dc4538..9aaf02b4d 100644 --- a/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java +++ b/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java @@ -16,7 +16,7 @@ @DataJpaTest @EnableJpaAuditing -@ActiveProfiles("test") +@ActiveProfiles("dev") class ChannelRepositoryTest { @Autowired diff --git a/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java index dae731a82..368312d00 100644 --- a/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java +++ b/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java @@ -18,7 +18,7 @@ @DataJpaTest @EnableJpaAuditing -@ActiveProfiles("test") +@ActiveProfiles("dev") class MessageRepositoryTest { @Autowired diff --git a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java index 8df21403d..8d9abaaf6 100644 --- a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java +++ b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java @@ -14,7 +14,7 @@ import org.springframework.test.context.ActiveProfiles; @DataJpaTest -@ActiveProfiles("test") +@ActiveProfiles("dev") @EnableJpaAuditing public class UserRepositoryTest { diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java index 1e39027ff..41e403bfb 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java @@ -31,7 +31,7 @@ import static org.mockito.BDDMockito.*; -@ActiveProfiles("test") +@ActiveProfiles("dev") @ExtendWith(MockitoExtension.class) public class BasicChannelServiceTest { diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java index bf1705e95..59824bf14 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java @@ -44,7 +44,7 @@ import org.springframework.data.domain.SliceImpl; import org.springframework.test.context.ActiveProfiles; -@ActiveProfiles("test") +@ActiveProfiles("dev") @ExtendWith(MockitoExtension.class) public class BasicMessageServiceTest { diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java index a37abaab7..e15e72d9e 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java @@ -24,7 +24,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.context.ActiveProfiles; -@ActiveProfiles("test") +@ActiveProfiles("dev") @ExtendWith(MockitoExtension.class) public class BasicUserServiceTest { From 6bb3b9ac2f1c2180b8a57249b3164f4a27007fdf Mon Sep 17 00:00:00 2001 From: junwoo Date: Mon, 31 Mar 2025 16:22:44 +0900 Subject: [PATCH 106/115] =?UTF-8?q?:recycle:=20=EC=BB=A4=EC=8A=A4=ED=85=80?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EC=88=98=EC=A0=95=20-=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=ED=95=84=EB=93=9C=20=EC=88=98=EC=A0=95=20-=20Disco?= =?UTF-8?q?deitException=EC=9D=84=20=EC=83=81=EC=86=8D=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=EC=A3=BC=EC=9A=94=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B3=84?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=95=EC=9D=98=20=EC=99=84=EB=A3=8C=20-=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=A9=94=EC=9D=B8=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=ED=95=98=EB=8A=94=20=EA=B5=AC=EC=B2=B4=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98=20=EC=99=84=EB=A3=8C=20-=20=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=20=EA=B5=AC=ED=98=84=ED=95=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=BB=A4=EC=8A=A4=ED=85=80=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A1=9C=20=EB=8C=80=EC=B2=B4=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/DiscodeitException.java | 13 ++++++- .../discodeit/exception/ErrorResponse.java | 29 ++++++-------- .../exception/GlobalExceptionHandler.java | 21 ++++++++-- .../discodeit/exception/ServiceException.java | 14 ------- .../exception/auth/AuthException.java | 12 ++++++ .../binarycontent/BinaryContentException.java | 12 ++++++ .../BinaryContentNotFoundException.java | 12 ++++++ .../exception/channel/ChannelException.java | 12 ++++++ .../channel/ChannelNotFoundException.java | 11 ++++++ .../exception/message/MessageException.java | 12 ++++++ .../message/MessageNotFoundException.java | 11 ++++++ .../readstatus/ReadStatusException.java | 12 ++++++ .../ReadStatusNotFoundException.java | 12 ++++++ .../user/UserAlreadyExistException.java | 12 ++++++ .../exception/user/UserException.java | 12 ++++++ .../exception/user/UserNotFoundException.java | 11 ++++++ .../userstatus/UserStatusException.java | 12 ++++++ .../UserStatusNotFoundException.java | 11 ++++++ .../sprint/mission/discodeit/ip/IPHeader.java | 33 ++++++++++++++++ .../sprint/mission/discodeit/ip/IPUtils.java | 38 +++++++++++++++++++ .../discodeit/ip/RequestIPContext.java | 24 ++++++++++++ .../service/basic/BasicAuthService.java | 9 +++-- .../basic/BasicBinaryContentService.java | 10 +++-- .../service/basic/BasicChannelService.java | 15 +++++--- .../service/basic/BasicMessageService.java | 18 +++++---- .../service/basic/BasicReadStatusService.java | 19 ++++++---- .../service/basic/BasicUserService.java | 20 ++++++---- .../service/basic/BasicUserStatusService.java | 19 ++++++---- src/main/resources/application-prod.yaml | 2 +- .../basic/BasicChannelServiceTest.java | 10 ++--- .../basic/BasicMessageServiceTest.java | 10 ++--- .../service/basic/BasicUserServiceTest.java | 9 +++-- 32 files changed, 384 insertions(+), 93 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/auth/AuthException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentNotFoundException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelNotFoundException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/message/MessageException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/message/MessageNotFoundException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusNotFoundException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/user/UserAlreadyExistException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/user/UserException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/user/UserNotFoundException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusNotFoundException.java create mode 100644 src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java create mode 100644 src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java create mode 100644 src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java diff --git a/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java b/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java index e8e1eed10..e8b72d218 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/DiscodeitException.java @@ -1,15 +1,26 @@ package com.sprint.mission.discodeit.exception; +import java.time.Instant; +import java.util.Map; import lombok.Getter; import org.springframework.http.HttpStatus; @Getter public class DiscodeitException extends RuntimeException { + private final Instant timestamp; + private final HttpStatus status; - public DiscodeitException(HttpStatus status, String message) { + private final ErrorCode errorCode; + + private final Map details; + + public DiscodeitException(HttpStatus status, String message, ErrorCode errorCode, Map details) { super(message); this.status = status; + this.timestamp = Instant.now(); + this.errorCode = errorCode; + this.details = details; } } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java index c76b84ba3..7195a8844 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/ErrorResponse.java @@ -1,24 +1,17 @@ package com.sprint.mission.discodeit.exception; import java.time.Instant; -import lombok.Getter; -import org.springframework.http.HttpStatus; +import java.util.Map; +/* -@Getter -public class ErrorResponse { + */ +public record ErrorResponse( + Instant timestamp, + String code, + String message, + Map details, + String exceptionType, + int status +) { - private final int status; - - private final String error; - - private final String message; - - private final Instant timestamp; - - public ErrorResponse(HttpStatus status, String message) { - this.status = status.value(); - this.error = status.getReasonPhrase(); - this.message = message; - this.timestamp = Instant.now(); - } } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java index ef1ec20ad..382bba6fe 100644 --- a/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/sprint/mission/discodeit/exception/GlobalExceptionHandler.java @@ -15,7 +15,9 @@ public class GlobalExceptionHandler { @ExceptionHandler(DiscodeitException.class) public ResponseEntity handleServiceException(DiscodeitException exception) { - ErrorResponse response = new ErrorResponse(exception.getStatus(), exception.getMessage()); + ErrorResponse response = new ErrorResponse(exception.getTimestamp(), + exception.getErrorCode().toString(), exception.getMessage(), exception.getDetails(), + exception.getClass().getSimpleName(), exception.getErrorCode().getStatus().value()); return new ResponseEntity<>(response, exception.getStatus()); } @@ -54,10 +56,21 @@ public ResponseEntity handleValidationException(MethodArgumentNot .orElse("입력값이 유효하지 않습니다."); ErrorResponse errorResponse = new ErrorResponse( - HttpStatus.BAD_REQUEST, - firstErrorMessage + Instant.now(), + "BAD_REQUEST", + firstErrorMessage, + Map.of("errors", ex.getBindingResult() + .getFieldErrors() + .stream() + .map(error -> Map.of( + "field", error.getField(), + "rejectedValue", error.getRejectedValue(), + "message", error.getDefaultMessage() + )) + .toList()), + ex.getClass().getSimpleName(), + HttpStatus.BAD_REQUEST.value() ); - return ResponseEntity.badRequest().body(errorResponse); } } diff --git a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java b/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java deleted file mode 100644 index 78d864f9e..000000000 --- a/src/main/java/com/sprint/mission/discodeit/exception/ServiceException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sprint.mission.discodeit.exception; - -import lombok.Getter; - -@Getter -public class ServiceException extends DiscodeitException { - - private final ErrorCode errorCode; - - public ServiceException(ErrorCode errorCode) { - super(errorCode.getStatus(), errorCode.getDescription()); - this.errorCode = errorCode; - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/auth/AuthException.java b/src/main/java/com/sprint/mission/discodeit/exception/auth/AuthException.java new file mode 100644 index 000000000..b1db064ca --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/auth/AuthException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.auth; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class AuthException extends DiscodeitException { + + public AuthException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentException.java b/src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentException.java new file mode 100644 index 000000000..cafeb9978 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.binarycontent; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class BinaryContentException extends DiscodeitException { + + public BinaryContentException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentNotFoundException.java b/src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentNotFoundException.java new file mode 100644 index 000000000..f9b41da44 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/binarycontent/BinaryContentNotFoundException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.binarycontent; + +import com.sprint.mission.discodeit.exception.ErrorCode; +import com.sprint.mission.discodeit.exception.readstatus.ReadStatusException; +import java.util.Map; + +public class BinaryContentNotFoundException extends BinaryContentException { + + public BinaryContentNotFoundException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelException.java b/src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelException.java new file mode 100644 index 000000000..d5059c24c --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.channel; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class ChannelException extends DiscodeitException { + + public ChannelException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelNotFoundException.java b/src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelNotFoundException.java new file mode 100644 index 000000000..0d64fb3b2 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/channel/ChannelNotFoundException.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.exception.channel; + +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class ChannelNotFoundException extends ChannelException { + + public ChannelNotFoundException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/message/MessageException.java b/src/main/java/com/sprint/mission/discodeit/exception/message/MessageException.java new file mode 100644 index 000000000..49f032173 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/message/MessageException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.message; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class MessageException extends DiscodeitException { + + public MessageException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/message/MessageNotFoundException.java b/src/main/java/com/sprint/mission/discodeit/exception/message/MessageNotFoundException.java new file mode 100644 index 000000000..61f827b70 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/message/MessageNotFoundException.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.exception.message; + +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class MessageNotFoundException extends MessageException { + + public MessageNotFoundException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusException.java b/src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusException.java new file mode 100644 index 000000000..6834a830d --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.readstatus; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class ReadStatusException extends DiscodeitException { + + public ReadStatusException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusNotFoundException.java b/src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusNotFoundException.java new file mode 100644 index 000000000..95e4ebc23 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/readstatus/ReadStatusNotFoundException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.readstatus; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class ReadStatusNotFoundException extends ReadStatusException { + + public ReadStatusNotFoundException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/user/UserAlreadyExistException.java b/src/main/java/com/sprint/mission/discodeit/exception/user/UserAlreadyExistException.java new file mode 100644 index 000000000..a6b52b02a --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/user/UserAlreadyExistException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.user; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class UserAlreadyExistException extends UserException { + + public UserAlreadyExistException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/user/UserException.java b/src/main/java/com/sprint/mission/discodeit/exception/user/UserException.java new file mode 100644 index 000000000..060ea0da6 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/user/UserException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.user; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class UserException extends DiscodeitException { + + public UserException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/user/UserNotFoundException.java b/src/main/java/com/sprint/mission/discodeit/exception/user/UserNotFoundException.java new file mode 100644 index 000000000..eaf358322 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/user/UserNotFoundException.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.exception.user; + +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class UserNotFoundException extends UserException { + + public UserNotFoundException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusException.java b/src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusException.java new file mode 100644 index 000000000..8893e47ac --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusException.java @@ -0,0 +1,12 @@ +package com.sprint.mission.discodeit.exception.userstatus; + +import com.sprint.mission.discodeit.exception.DiscodeitException; +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class UserStatusException extends DiscodeitException { + + public UserStatusException(ErrorCode errorCode, Map details) { + super(errorCode.getStatus(), errorCode.getDescription(), errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusNotFoundException.java b/src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusNotFoundException.java new file mode 100644 index 000000000..a3718a799 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/exception/userstatus/UserStatusNotFoundException.java @@ -0,0 +1,11 @@ +package com.sprint.mission.discodeit.exception.userstatus; + +import com.sprint.mission.discodeit.exception.ErrorCode; +import java.util.Map; + +public class UserStatusNotFoundException extends UserStatusException { + + public UserStatusNotFoundException(ErrorCode errorCode, Map details) { + super(errorCode, details); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java b/src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java new file mode 100644 index 000000000..678c5bd94 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java @@ -0,0 +1,33 @@ +package com.sprint.mission.discodeit.ip; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; + +/** + * HTTP 요청에서 클라이언트 IP를 식별하기 위해 확인할 수 있는 헤더 목록을 정의하는 열거형(Enum) - 프록시나 로드 밸런서를 거친 요청에서도 올바른 클라이언트 IP를 + * 가져오기 위해 다양한 헤더를 확인함 + */ +@RequiredArgsConstructor +public enum IPHeader { + X_FORWARDED_FOR("X-Forwarded-For"), + PROXY_CLIENT_IP("Proxy-Client-IP"), + WL_PROXY_CLIENT_IP("WL-Proxy-Client-IP"), + HTTP_CLIENT_IP("HTTP_CLIENT_IP"), + HTTP_X_FORWARDED_FOR("HTTP_X_FORWARDED_FOR"), + X_REAL_IP("X-Real-IP"), + X_REALIP("X-RealIP"); + + private final String headerName; + + public String getHeaderName() { + return headerName; + } + + public static List getAllHeaderNames() { + return Arrays.stream(values()) + .map(IPHeader::getHeaderName) + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java b/src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java new file mode 100644 index 000000000..0bb91ab9b --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java @@ -0,0 +1,38 @@ +package com.sprint.mission.discodeit.ip; + +import jakarta.servlet.http.HttpServletRequest; + +public class IPUtils { + + public static String getClientIp(HttpServletRequest request) { + for (String header : IPHeader.getAllHeaderNames()) { + String ip = request.getHeader(header); + if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) { + return getFirstIp(ip); + } + } + // IPv6 localhost (::1)을 IPv4 (127.0.0.1)로 변환 - 강제 변환 + String remoteAddr = request.getRemoteAddr(); + if ("0:0:0:0:0:0:0:1".equals(remoteAddr)) { + remoteAddr = "127.0.0.1"; + } + return remoteAddr; + } + + private static String getFirstIp(String ipList) { + String[] ips = ipList.split(","); + for (String ip : ips) { + ip = ip.trim(); + if (isIpv4(ip)) { // IPv4가 있으면 우선 반환 + return ip; + } + } + return ips[0].trim(); // IPv4가 없으면 첫 번째 값 반환 (IPv6) + } + + private static boolean isIpv4(String ip) { + return ip.matches("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b"); + } + +} + diff --git a/src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java b/src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java new file mode 100644 index 000000000..f614a6e89 --- /dev/null +++ b/src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java @@ -0,0 +1,24 @@ +package com.sprint.mission.discodeit.ip; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.Getter; +import org.springframework.stereotype.Component; +import org.springframework.web.context.annotation.RequestScope; + +/** + * 현재 HTTP 요청의 클라이언트 IP 주소를 저장하는 컨텍스트 클래스 - 요청 범위(@RequestScope)로 관리되어 각 요청마다 새로운 인스턴스가 생성됨 - + * HttpServletRequest를 통해 클라이언트 IP를 추출하여 저장 + * + * @RequestScope 요청 단위로 빈을 생성하여 매 요청마다 새로운 IP 정보 유지 + */ +@RequestScope +@Component +@Getter +public class RequestIPContext { + + private final String clientIp; + + public RequestIPContext(HttpServletRequest request) { + this.clientIp = IPUtils.getClientIp(request); + } +} diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index 5f2809300..ebe7b1199 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -4,10 +4,12 @@ import com.sprint.mission.discodeit.dto.request.LoginRequest; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.auth.AuthException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.AuthService; +import java.util.Map; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -20,6 +22,7 @@ public class BasicAuthService implements AuthService { private final UserRepository userRepository; private final UserMapper userMapper; + private final RequestIPContext requestIPContext; @Transactional(readOnly = true) @Override @@ -32,13 +35,13 @@ public UserDto login(LoginRequest loginRequest) { User user = userRepository.findByUsername(username) .orElseThrow(() -> { log.warn("[로그인 실패] 회원을 찾을 수 없습니다 {}", username); - return new ServiceException(ErrorCode.USERNAME_MISMATCH); + return new AuthException(ErrorCode.USERNAME_MISMATCH, Map.of("username", username , "requestIp", requestIPContext.getClientIp())); }); if (!user.getPassword().equals(password)) { log.warn("[로그인 실패} 잘못된 비밀번호 입니다: {}", username); - throw new ServiceException(ErrorCode.PASSWORD_MISMATCH); + throw new AuthException(ErrorCode.PASSWORD_MISMATCH, Map.of("username", username , "requestIp", requestIPContext.getClientIp())); } log.info("[로그인 성공] username: {}", user.getUsername()); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index fe824dae4..29c74c5fb 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -4,13 +4,14 @@ import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.binarycontent.BinaryContentNotFoundException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.BinaryContentMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; import com.sprint.mission.discodeit.storage.BinaryContentStorage; import java.util.List; -import java.util.NoSuchElementException; +import java.util.Map; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,6 +26,7 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; private final BinaryContentMapper binaryContentMapper; private final BinaryContentStorage binaryContentStorage; + private final RequestIPContext requestIPContext; @Transactional @Override @@ -54,7 +56,7 @@ public BinaryContentDto find(UUID binaryContentId) { .map(binaryContentMapper::toDto) .orElseThrow(() -> { log.warn("[파일 조회 실패] 해당 파일을 찾을 수 없습니다 id: {}", binaryContentId); - return new ServiceException(ErrorCode.CANNOT_FOUND_PROFILE);}); + return new BinaryContentNotFoundException(ErrorCode.CANNOT_FOUND_PROFILE, Map.of("binaryContentId", binaryContentId , "requestIp", requestIPContext.getClientIp()));}); } @Override @@ -71,7 +73,7 @@ public List findAllByIdIn(List binaryContentIds) { public void delete(UUID binaryContentId) { if (!binaryContentRepository.existsById(binaryContentId)) { log.warn("[파일 삭제 실패] 해당 파일을 찾을 수 없습니다 id: {}", binaryContentId); - throw new NoSuchElementException("BinaryContent with id " + binaryContentId + " not found"); + throw new BinaryContentNotFoundException(ErrorCode.CANNOT_FOUND_PROFILE, Map.of("binaryContentId", binaryContentId , "requestIp", requestIPContext.getClientIp())); } binaryContentRepository.deleteById(binaryContentId); log.info("[파일 삭제 완료] id: {}", binaryContentId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 3addd5290..99ef8ebfc 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -8,7 +8,9 @@ import com.sprint.mission.discodeit.entity.ChannelType; import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.channel.ChannelException; +import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.ChannelMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; @@ -16,6 +18,7 @@ import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.ChannelService; import java.util.List; +import java.util.Map; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,6 +35,7 @@ public class BasicChannelService implements ChannelService { private final MessageRepository messageRepository; private final UserRepository userRepository; private final ChannelMapper channelMapper; + private final RequestIPContext requestIPContext; @Transactional @Override @@ -74,7 +78,7 @@ public ChannelDto find(UUID channelId) { .orElseThrow( () -> { log.warn("[채널 조회 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); - return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL);}); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId , "requestIp", requestIPContext.getClientIp()));}); } @Transactional(readOnly = true) @@ -101,10 +105,11 @@ public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { .orElseThrow( () -> { log.warn("[채널 업데이트 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); - return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL);}); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, + Map.of("channelId", channelId , "requestIp", requestIPContext.getClientIp()));}); if (channel.getType().equals(ChannelType.PRIVATE)) { log.warn("[채널 업데이트 실패] 개인 채널은 업데이트 할 수 없습니다 type: {}", channel.getType()); - throw new ServiceException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); + throw new ChannelException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp())); } channel.update(newName, newDescription); log.info("[채널 업데이트 성공] id: {}", channel.getId()); @@ -116,7 +121,7 @@ public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { public void delete(UUID channelId) { if (!channelRepository.existsById(channelId)) { log.warn("[채널 삭제 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); - throw new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + throw new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp())); } messageRepository.deleteAllByChannelId(channelId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index 880844cd5..e36cb5cde 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -10,7 +10,10 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; +import com.sprint.mission.discodeit.exception.message.MessageNotFoundException; +import com.sprint.mission.discodeit.exception.user.UserNotFoundException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.MessageMapper; import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -21,6 +24,7 @@ import com.sprint.mission.discodeit.storage.BinaryContentStorage; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -36,13 +40,13 @@ public class BasicMessageService implements MessageService { private final MessageRepository messageRepository; - // private final ChannelRepository channelRepository; private final UserRepository userRepository; private final MessageMapper messageMapper; private final BinaryContentStorage binaryContentStorage; private final BinaryContentRepository binaryContentRepository; private final PageResponseMapper pageResponseMapper; + private final RequestIPContext requestIPContext; @Transactional @Override @@ -55,14 +59,14 @@ public MessageDto create(MessageCreateRequest messageCreateRequest, .orElseThrow( () -> { log.warn("[메시지 생성 오류] 채널을 찾을 수 없습니다"); - return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp())); }); User author = userRepository.findById(authorId) .orElseThrow( () -> { log.warn("[메시지 생성 오류] 작성자를 찾을 수 없습니다"); - return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("authorId", authorId, "requestIp", requestIPContext.getClientIp())); }); List attachments = binaryContentCreateRequests.stream() @@ -100,7 +104,7 @@ public MessageDto find(UUID messageId) { .orElseThrow( () -> { log.warn("[메시지 조회 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - return new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + return new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId, "requestIp", requestIPContext.getClientIp())); }); } @@ -130,7 +134,7 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { .orElseThrow( () -> { log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - return new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + return new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId, "requestIp", requestIPContext.getClientIp())); }); message.update(newContent); log.info("[메시지 업데이트 성공]"); @@ -142,7 +146,7 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { public void delete(UUID messageId) { if (!messageRepository.existsById(messageId)) { log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - throw new ServiceException(ErrorCode.CANNOT_FOUND_MESSAGE); + throw new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId, "requestIp", requestIPContext.getClientIp())); } messageRepository.deleteById(messageId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index a56b05a64..83c229385 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -7,7 +7,10 @@ import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; +import com.sprint.mission.discodeit.exception.readstatus.ReadStatusNotFoundException; +import com.sprint.mission.discodeit.exception.user.UserNotFoundException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.ReadStatusMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; @@ -15,6 +18,7 @@ import com.sprint.mission.discodeit.service.ReadStatusService; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -30,6 +34,7 @@ public class BasicReadStatusService implements ReadStatusService { private final UserRepository userRepository; private final ChannelRepository channelRepository; private final ReadStatusMapper readStatusMapper; + private final RequestIPContext requestIPContext; @Transactional @Override @@ -41,16 +46,16 @@ public ReadStatusDto create(ReadStatusCreateRequest request) { .orElseThrow( () -> { log.warn("[읽기 정보 생성 실패] 해당하는 회원을 찾을 수 없습니다"); - return new ServiceException(ErrorCode.CANNOT_FOUND_USER);}); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp()));}); Channel channel = channelRepository.findById(channelId) .orElseThrow( () -> { log.warn("[읽기 정보 생성 실패] 해당하는 채널을 찾을 수 없습니다"); - return new ServiceException(ErrorCode.CANNOT_FOUND_CHANNEL);}); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp()));}); if (readStatusRepository.existsByUserIdAndChannelId(user.getId(), channel.getId())) { log.warn("[읽기 정보 생성 실패] 회원과 채널에 해당하는 읽기 정보가 이미 존재합니다"); - throw new ServiceException(ErrorCode.ALREADY_EXIST_READSTATUS); + throw new ReadStatusNotFoundException(ErrorCode.ALREADY_EXIST_READSTATUS, Map.of("userId", userId, "channelId", channelId, "requestIp", requestIPContext.getClientIp())); } Instant lastReadAt = request.lastReadAt(); @@ -69,7 +74,7 @@ public ReadStatusDto find(UUID readStatusId) { .orElseThrow( () ->{ log.warn("[읽기 정보 조회 실패] 해당하는 정보를 찾을 수 없습니다"); - return new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS);} + return new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId, "requestIp", requestIPContext.getClientIp()));} ); } @@ -88,7 +93,7 @@ public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) .orElseThrow( () ->{ log.warn("[읽기 정보 업데이트 실패] 해당하는 정보를 찾을 수 없습니다"); - return new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS);}); + return new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId, "requestIp", requestIPContext.getClientIp()));}); readStatus.update(newLastReadAt); log.info("[읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: {}", readStatus.getId()); @@ -100,7 +105,7 @@ public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) public void delete(UUID readStatusId) { if (!readStatusRepository.existsById(readStatusId)) { log.warn("[읽기 정보 삭제 실패] 해당 정보를 찾을 수 없습니다"); - throw new ServiceException(ErrorCode.CANNOT_FOUND_READSTATUS); + throw new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId, "requestIp", requestIPContext.getClientIp())); } readStatusRepository.deleteById(readStatusId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 4e8f65993..73d26681d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -8,7 +8,9 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.user.UserAlreadyExistException; +import com.sprint.mission.discodeit.exception.user.UserNotFoundException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; @@ -16,6 +18,7 @@ import com.sprint.mission.discodeit.storage.BinaryContentStorage; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -32,6 +35,7 @@ public class BasicUserService implements UserService { private final UserMapper userMapper; private final BinaryContentRepository binaryContentRepository; private final BinaryContentStorage binaryContentStorage; + private final RequestIPContext requestIPContext; @Transactional @Override @@ -44,11 +48,11 @@ public UserDto create(UserCreateRequest userCreateRequest, if (userRepository.existsByEmail(email)) { log.warn("[회원 생성 실패] 중복된 이메일: {}", email); - throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_EMAIL, Map.of("email", email , "requestIp", requestIPContext.getClientIp())); } if (userRepository.existsByUsername(username)) { log.warn("[회원 생성 실패] 중복된 사용자 이름: {}", username); - throw new ServiceException(ErrorCode.DUPLICATE_NAME); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_NAME, Map.of("username", username , "requestIp", requestIPContext.getClientIp())); } BinaryContent nullableProfile = optionalProfileCreateRequest @@ -84,7 +88,7 @@ public UserDto find(UUID userId) { .map(userMapper::toDto) .orElseThrow(() -> { log.warn("[회원 조회 실패] 존재하지 않는 사용자: {}", userId); - return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId , "requestIp", requestIPContext.getClientIp())); }); } @@ -106,7 +110,7 @@ public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, User user = userRepository.findById(userId) .orElseThrow(() -> { log.warn("[회원 수정 실패] 존재하지 않는 사용자: {}", userId); - return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp())); }); String newUsername = userUpdateRequest.newUsername(); @@ -114,11 +118,11 @@ public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, if (userRepository.existsByEmail(newEmail)) { log.warn("[회원 수정 실패] 중복된 이메일: {}", newEmail); - throw new ServiceException(ErrorCode.DUPLICATE_EMAIL); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_EMAIL, Map.of("email", newEmail , "requestIp", requestIPContext.getClientIp())); } if (userRepository.existsByUsername(newUsername)) { log.warn("[회원 수정 실패] 중복된 사용자 이름: {}", newUsername); - throw new ServiceException(ErrorCode.DUPLICATE_NAME); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_NAME, Map.of("username", newUsername , "requestIp", requestIPContext.getClientIp())); } BinaryContent nullableProfile = optionalProfileCreateRequest @@ -150,7 +154,7 @@ public void delete(UUID userId) { if (!userRepository.existsById(userId)) { log.warn("[회원 삭제 실패] 존재하지 않는 사용자: {}", userId); - throw new ServiceException(ErrorCode.CANNOT_FOUND_USER); + throw new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId , "requestIp", requestIPContext.getClientIp())); } userRepository.deleteById(userId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index 8c87899a4..42727781d 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -6,13 +6,17 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.user.UserNotFoundException; +import com.sprint.mission.discodeit.exception.userstatus.UserStatusException; +import com.sprint.mission.discodeit.exception.userstatus.UserStatusNotFoundException; +import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.UserStatusMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; import com.sprint.mission.discodeit.service.UserStatusService; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -28,6 +32,7 @@ public class BasicUserStatusService implements UserStatusService { private final UserStatusRepository userStatusRepository; private final UserRepository userRepository; private final UserStatusMapper userStatusMapper; + private final RequestIPContext requestIPContext; @Transactional @Override @@ -38,12 +43,12 @@ public UserStatusDto create(UserStatusCreateRequest request) { User user = userRepository.findById(userId) .orElseThrow(() -> { log.warn("[유저 상태 생성 실패] 존재하지 않는 사용자: {}", userId); - return new ServiceException(ErrorCode.CANNOT_FOUND_USER); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp())); }); Optional.ofNullable(user.getStatus()).ifPresent(status -> { log.warn("[유저 상태 생성 실패] 이미 상태가 존재하는 사용자: {}", userId); - throw new ServiceException(ErrorCode.ALREADY_EXIST_USERSTAUTS); + throw new UserStatusException(ErrorCode.ALREADY_EXIST_USERSTAUTS, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp())); }); Instant lastActiveAt = request.lastActiveAt(); @@ -61,7 +66,7 @@ public UserStatusDto find(UUID userStatusId) { .map(userStatusMapper::toDto) .orElseThrow(() -> { log.warn("[유저 상태 조회 실패] 존재하지 않는 상태 ID: {}", userStatusId); - return new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId, "requestIp", requestIPContext.getClientIp())); }); } @@ -81,7 +86,7 @@ public UserStatusDto update(UUID userStatusId, UserStatusUpdateRequest request) UserStatus userStatus = userStatusRepository.findById(userStatusId) .orElseThrow(() -> { log.warn("[유저 상태 수정 실패] 존재하지 않는 상태 ID: {}", userStatusId); - return new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId, "requestIp", requestIPContext.getClientIp())); }); Instant newLastActiveAt = request.newLastActiveAt(); @@ -99,7 +104,7 @@ public UserStatusDto updateByUserId(UUID userId, UserStatusUpdateRequest request UserStatus userStatus = userStatusRepository.findByUserId(userId) .orElseThrow(() -> { log.warn("[유저 상태 수정 실패] 상태가 존재하지 않는 사용자: {}", userId); - return new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userId", userId, "userStatusId", userId, "requestIp", requestIPContext.getClientIp())); }); Instant newLastActiveAt = request.newLastActiveAt(); @@ -116,7 +121,7 @@ public void delete(UUID userStatusId) { if (!userStatusRepository.existsById(userStatusId)) { log.warn("[유저 상태 삭제 실패] 존재하지 않는 상태 ID: {}", userStatusId); - throw new ServiceException(ErrorCode.CANNOT_FOUND_USERSTATUS); + throw new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId, "requestIp", requestIPContext.getClientIp())); } userStatusRepository.deleteById(userStatusId); diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml index 827a5cd9f..130dd0244 100644 --- a/src/main/resources/application-prod.yaml +++ b/src/main/resources/application-prod.yaml @@ -4,7 +4,7 @@ spring: boot: admin: client: - url: ${SPRING_BOOT_ADMIN_CLIENT_URL} + url: http://localhost:9090 datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/discodeit diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java index 41e403bfb..c43cbb068 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java @@ -8,7 +8,8 @@ import com.sprint.mission.discodeit.entity.ChannelType; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.channel.ChannelException; +import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; import com.sprint.mission.discodeit.mapper.ChannelMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; @@ -26,7 +27,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import static org.mockito.ArgumentMatchers.any; -import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException; import org.springframework.test.context.ActiveProfiles; import static org.mockito.BDDMockito.*; @@ -93,7 +93,7 @@ void findChannel_fail_notFound() { given(channelRepository.findById(channelId)).willReturn(Optional.empty()); assertThatThrownBy(() -> channelService.find(channelId)) - .isInstanceOf(ServiceException.class) + .isInstanceOf(ChannelNotFoundException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); } @@ -107,7 +107,7 @@ void updateChannel_fail_privateChannel() { given(channelRepository.findById(channelId)).willReturn(Optional.of(channel)); assertThatThrownBy(() -> channelService.update(channelId, request)) - .isInstanceOf(ServiceException.class) + .isInstanceOf(ChannelException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); } @@ -131,7 +131,7 @@ void deleteChannel_fail_notFound() { given(channelRepository.existsById(channelId)).willReturn(false); assertThatThrownBy(() -> channelService.delete(channelId)) - .isInstanceOf(ServiceException.class) + .isInstanceOf(ChannelNotFoundException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); } } diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java index 59824bf14..f57838192 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java @@ -11,7 +11,8 @@ import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; +import com.sprint.mission.discodeit.exception.message.MessageNotFoundException; import com.sprint.mission.discodeit.mapper.MessageMapper; import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -19,7 +20,6 @@ import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.storage.BinaryContentStorage; -import jakarta.persistence.criteria.CriteriaBuilder.In; import java.time.Instant; import java.util.List; import java.util.Optional; @@ -104,7 +104,7 @@ void createMessage_fail_channelNotFound() { given(channelRepository.findById(channelId)).willReturn(Optional.empty()); assertThatThrownBy(() -> messageService.create(request, List.of())) - .isInstanceOf(ServiceException.class) + .isInstanceOf(ChannelNotFoundException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); } @@ -135,7 +135,7 @@ void updateMessage_fail_notFound() { given(messageRepository.findById(messageId)).willReturn(Optional.empty()); assertThatThrownBy(() -> messageService.update(messageId, request)) - .isInstanceOf(ServiceException.class) + .isInstanceOf(MessageNotFoundException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_MESSAGE); } @@ -157,7 +157,7 @@ void deleteMessage_fail_notFound() { given(messageRepository.existsById(messageId)).willReturn(false); assertThatThrownBy(() -> messageService.delete(messageId)) - .isInstanceOf(ServiceException.class) + .isInstanceOf(MessageNotFoundException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_MESSAGE); } diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java index e15e72d9e..ef2415eb1 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java @@ -5,7 +5,8 @@ import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; -import com.sprint.mission.discodeit.exception.ServiceException; +import com.sprint.mission.discodeit.exception.user.UserAlreadyExistException; +import com.sprint.mission.discodeit.exception.user.UserNotFoundException; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; @@ -68,7 +69,7 @@ void createUser_fail_duplicateEmail() { given(userRepository.existsByEmail(request.email())).willReturn(true); assertThatThrownBy(() -> userService.create(request, Optional.empty())) - .isInstanceOf(ServiceException.class) + .isInstanceOf(UserAlreadyExistException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.DUPLICATE_EMAIL); } @@ -90,7 +91,7 @@ void deleteUser_fail_notfound() { given(userRepository.existsById(userId)).willReturn(false); assertThatThrownBy(() -> userService.delete(userId)) - .isInstanceOf(ServiceException.class) + .isInstanceOf(UserNotFoundException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_USER); } @@ -125,7 +126,7 @@ void updateUser_fail_duplicateName() { given(userRepository.existsByUsername(request.newUsername())).willReturn(true); assertThatThrownBy(() -> userService.update(userId, request, Optional.empty())) - .isInstanceOf(ServiceException.class) + .isInstanceOf(UserAlreadyExistException.class) .hasFieldOrPropertyWithValue("errorCode", ErrorCode.DUPLICATE_NAME); } } From 7e83358fd9b267c97fb68b83973bf168029ed966 Mon Sep 17 00:00:00 2001 From: junwoo Date: Wed, 2 Apr 2025 09:44:20 +0900 Subject: [PATCH 107/115] =?UTF-8?q?:recycle:=20RequestDTO=EC=97=90=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=20=EC=A1=B0=EA=B1=B4=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sprint/mission/discodeit/controller/ChannelController.java | 3 ++- .../sprint/mission/discodeit/controller/UserController.java | 2 +- .../discodeit/dto/request/PublicChannelCreateRequest.java | 3 +++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java index ab3e2d7ed..934a1364d 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/ChannelController.java @@ -6,6 +6,7 @@ import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; import com.sprint.mission.discodeit.service.ChannelService; +import jakarta.validation.Valid; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -29,7 +30,7 @@ public class ChannelController implements ChannelApi { private final ChannelService channelService; @PostMapping(path = "public") - public ResponseEntity create(@RequestBody PublicChannelCreateRequest request) { + public ResponseEntity create(@Valid @RequestBody PublicChannelCreateRequest request) { ChannelDto createdChannel = channelService.create(request); return ResponseEntity .status(HttpStatus.CREATED) diff --git a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java index 79cad82c7..0e4ee7d56 100644 --- a/src/main/java/com/sprint/mission/discodeit/controller/UserController.java +++ b/src/main/java/com/sprint/mission/discodeit/controller/UserController.java @@ -90,7 +90,7 @@ public ResponseEntity> findAll() { @PatchMapping(path = "{userId}/userStatus") @Override public ResponseEntity updateUserStatusByUserId(@PathVariable("userId") UUID userId, - @RequestBody UserStatusUpdateRequest request) { + @Valid @RequestBody UserStatusUpdateRequest request) { UserStatusDto updatedUserStatus = userStatusService.updateByUserId(userId, request); return ResponseEntity .status(HttpStatus.OK) diff --git a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java index 48e26327a..ce5e15eaf 100644 --- a/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java +++ b/src/main/java/com/sprint/mission/discodeit/dto/request/PublicChannelCreateRequest.java @@ -1,6 +1,9 @@ package com.sprint.mission.discodeit.dto.request; +import jakarta.validation.constraints.NotBlank; + public record PublicChannelCreateRequest( + @NotBlank(message = "채널 이름을 입력해주세요") String name, String description ) { From d6925ece1cd0b6099100f777611e14d110622ce0 Mon Sep 17 00:00:00 2001 From: junwoo Date: Sun, 6 Apr 2025 00:13:05 +0900 Subject: [PATCH 108/115] =?UTF-8?q?:recycle:=20=EB=A0=88=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC,=20=EC=84=9C=EB=B9=84=EC=8A=A4,=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=8B=A8=EC=9C=84=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?->=20=ED=86=B5=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20=EB=AA=BB=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 22 +- .../sprint/mission/discodeit/ip/IPHeader.java | 33 -- .../sprint/mission/discodeit/ip/IPUtils.java | 38 --- .../discodeit/ip/RequestIPContext.java | 24 -- .../discodeit/repository/UserRepository.java | 1 + .../service/basic/BasicAuthService.java | 6 +- .../basic/BasicBinaryContentService.java | 7 +- .../service/basic/BasicChannelService.java | 10 +- .../service/basic/BasicMessageService.java | 12 +- .../service/basic/BasicReadStatusService.java | 14 +- .../service/basic/BasicUserService.java | 16 +- .../service/basic/BasicUserStatusService.java | 14 +- src/main/resources/sql/message-data.sql | 35 ++ src/main/resources/{ => sql}/schema.sql | 0 .../mission/discodeit/IntegrationTests.java | 152 --------- .../controller/ChannelControllerTest.java | 111 +++++-- .../controller/MessageControllerTest.java | 208 ++++++++---- .../controller/UserControllerTest.java | 176 ++++++---- .../repository/ChannelRepositoryTest.java | 9 +- .../repository/MessageRepositoryTest.java | 92 +++--- .../repository/UserRepositoryTest.java | 79 +++-- .../basic/BasicChannelServiceTest.java | 200 ++++++++---- .../basic/BasicMessageServiceTest.java | 245 +++++++++----- .../service/basic/BasicUserServiceTest.java | 303 ++++++++++++++---- 24 files changed, 1047 insertions(+), 760 deletions(-) delete mode 100644 src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java delete mode 100644 src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java create mode 100644 src/main/resources/sql/message-data.sql rename src/main/resources/{ => sql}/schema.sql (100%) delete mode 100644 src/test/java/com/sprint/mission/discodeit/IntegrationTests.java diff --git a/build.gradle b/build.gradle index c3204d5c4..2323e5e4b 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.4.0' id 'io.spring.dependency-management' version '1.1.6' - id 'jacoco' // ✅ 테스트 커버리지 측정용 JaCoCo 플러그인 + id 'jacoco' } group = 'com.sprint.mission' @@ -19,58 +19,56 @@ repositories { } configurations { - // lombok annotation processor 설정 compileOnly { extendsFrom annotationProcessor } - // SLF4J 충돌 방지: slf4j-nop 제거 all { exclude group: 'org.slf4j', module: 'slf4j-nop' } } dependencies { - // 🌐 Spring Boot Starter implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-aop' - // 📊 Spring Boot Admin Client implementation 'de.codecentric:spring-boot-admin-starter-client:3.4.5' - // 📘 API 문서 (Spring Boot 3.x 대응) implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4' - // 🛢 DB 드라이버 runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'com.h2database:h2' - // ✏️ Lombok & MapStruct compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' implementation 'org.mapstruct:mapstruct:1.6.3' annotationProcessor 'org.mapstruct:mapstruct-processor:1.6.3' - // 🧪 테스트 testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - // 🔧 logback 명시적 추가 (SLF4J 2.x용) implementation 'ch.qos.logback:logback-classic:1.4.14' } test { useJUnitPlatform() - finalizedBy jacocoTestReport // 테스트 후 커버리지 리포트 생성 + + jacoco { + destinationFile = file("$buildDir/jacoco/test-${System.currentTimeMillis()}.exec") + } + + finalizedBy jacocoTestReport } jacocoTestReport { dependsOn test + executionData fileTree(dir: "$buildDir/jacoco", include: "*.exec") + reports { xml.required = true html.required = true } -} \ No newline at end of file +} diff --git a/src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java b/src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java deleted file mode 100644 index 678c5bd94..000000000 --- a/src/main/java/com/sprint/mission/discodeit/ip/IPHeader.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sprint.mission.discodeit.ip; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; - -/** - * HTTP 요청에서 클라이언트 IP를 식별하기 위해 확인할 수 있는 헤더 목록을 정의하는 열거형(Enum) - 프록시나 로드 밸런서를 거친 요청에서도 올바른 클라이언트 IP를 - * 가져오기 위해 다양한 헤더를 확인함 - */ -@RequiredArgsConstructor -public enum IPHeader { - X_FORWARDED_FOR("X-Forwarded-For"), - PROXY_CLIENT_IP("Proxy-Client-IP"), - WL_PROXY_CLIENT_IP("WL-Proxy-Client-IP"), - HTTP_CLIENT_IP("HTTP_CLIENT_IP"), - HTTP_X_FORWARDED_FOR("HTTP_X_FORWARDED_FOR"), - X_REAL_IP("X-Real-IP"), - X_REALIP("X-RealIP"); - - private final String headerName; - - public String getHeaderName() { - return headerName; - } - - public static List getAllHeaderNames() { - return Arrays.stream(values()) - .map(IPHeader::getHeaderName) - .collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java b/src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java deleted file mode 100644 index 0bb91ab9b..000000000 --- a/src/main/java/com/sprint/mission/discodeit/ip/IPUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sprint.mission.discodeit.ip; - -import jakarta.servlet.http.HttpServletRequest; - -public class IPUtils { - - public static String getClientIp(HttpServletRequest request) { - for (String header : IPHeader.getAllHeaderNames()) { - String ip = request.getHeader(header); - if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) { - return getFirstIp(ip); - } - } - // IPv6 localhost (::1)을 IPv4 (127.0.0.1)로 변환 - 강제 변환 - String remoteAddr = request.getRemoteAddr(); - if ("0:0:0:0:0:0:0:1".equals(remoteAddr)) { - remoteAddr = "127.0.0.1"; - } - return remoteAddr; - } - - private static String getFirstIp(String ipList) { - String[] ips = ipList.split(","); - for (String ip : ips) { - ip = ip.trim(); - if (isIpv4(ip)) { // IPv4가 있으면 우선 반환 - return ip; - } - } - return ips[0].trim(); // IPv4가 없으면 첫 번째 값 반환 (IPv6) - } - - private static boolean isIpv4(String ip) { - return ip.matches("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b"); - } - -} - diff --git a/src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java b/src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java deleted file mode 100644 index f614a6e89..000000000 --- a/src/main/java/com/sprint/mission/discodeit/ip/RequestIPContext.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sprint.mission.discodeit.ip; - -import jakarta.servlet.http.HttpServletRequest; -import lombok.Getter; -import org.springframework.stereotype.Component; -import org.springframework.web.context.annotation.RequestScope; - -/** - * 현재 HTTP 요청의 클라이언트 IP 주소를 저장하는 컨텍스트 클래스 - 요청 범위(@RequestScope)로 관리되어 각 요청마다 새로운 인스턴스가 생성됨 - - * HttpServletRequest를 통해 클라이언트 IP를 추출하여 저장 - * - * @RequestScope 요청 단위로 빈을 생성하여 매 요청마다 새로운 IP 정보 유지 - */ -@RequestScope -@Component -@Getter -public class RequestIPContext { - - private final String clientIp; - - public RequestIPContext(HttpServletRequest request) { - this.clientIp = IPUtils.getClientIp(request); - } -} diff --git a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java index f7103705f..0b2172766 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/UserRepository.java @@ -19,4 +19,5 @@ public interface UserRepository extends JpaRepository { + "LEFT JOIN FETCH u.profile " + "JOIN FETCH u.status") List findAllWithProfileAndStatus(); + } diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java index ebe7b1199..86101e793 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicAuthService.java @@ -5,7 +5,6 @@ import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.auth.AuthException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.service.AuthService; @@ -22,7 +21,6 @@ public class BasicAuthService implements AuthService { private final UserRepository userRepository; private final UserMapper userMapper; - private final RequestIPContext requestIPContext; @Transactional(readOnly = true) @Override @@ -35,13 +33,13 @@ public UserDto login(LoginRequest loginRequest) { User user = userRepository.findByUsername(username) .orElseThrow(() -> { log.warn("[로그인 실패] 회원을 찾을 수 없습니다 {}", username); - return new AuthException(ErrorCode.USERNAME_MISMATCH, Map.of("username", username , "requestIp", requestIPContext.getClientIp())); + return new AuthException(ErrorCode.USERNAME_MISMATCH, Map.of("username", username)); }); if (!user.getPassword().equals(password)) { log.warn("[로그인 실패} 잘못된 비밀번호 입니다: {}", username); - throw new AuthException(ErrorCode.PASSWORD_MISMATCH, Map.of("username", username , "requestIp", requestIPContext.getClientIp())); + throw new AuthException(ErrorCode.PASSWORD_MISMATCH, Map.of("username", username)); } log.info("[로그인 성공] username: {}", user.getUsername()); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java index 29c74c5fb..664c708f7 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicBinaryContentService.java @@ -5,7 +5,6 @@ import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.binarycontent.BinaryContentNotFoundException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.BinaryContentMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.service.BinaryContentService; @@ -26,7 +25,7 @@ public class BasicBinaryContentService implements BinaryContentService { private final BinaryContentRepository binaryContentRepository; private final BinaryContentMapper binaryContentMapper; private final BinaryContentStorage binaryContentStorage; - private final RequestIPContext requestIPContext; + @Transactional @Override @@ -56,7 +55,7 @@ public BinaryContentDto find(UUID binaryContentId) { .map(binaryContentMapper::toDto) .orElseThrow(() -> { log.warn("[파일 조회 실패] 해당 파일을 찾을 수 없습니다 id: {}", binaryContentId); - return new BinaryContentNotFoundException(ErrorCode.CANNOT_FOUND_PROFILE, Map.of("binaryContentId", binaryContentId , "requestIp", requestIPContext.getClientIp()));}); + return new BinaryContentNotFoundException(ErrorCode.CANNOT_FOUND_PROFILE, Map.of("binaryContentId", binaryContentId));}); } @Override @@ -73,7 +72,7 @@ public List findAllByIdIn(List binaryContentIds) { public void delete(UUID binaryContentId) { if (!binaryContentRepository.existsById(binaryContentId)) { log.warn("[파일 삭제 실패] 해당 파일을 찾을 수 없습니다 id: {}", binaryContentId); - throw new BinaryContentNotFoundException(ErrorCode.CANNOT_FOUND_PROFILE, Map.of("binaryContentId", binaryContentId , "requestIp", requestIPContext.getClientIp())); + throw new BinaryContentNotFoundException(ErrorCode.CANNOT_FOUND_PROFILE, Map.of("binaryContentId", binaryContentId)); } binaryContentRepository.deleteById(binaryContentId); log.info("[파일 삭제 완료] id: {}", binaryContentId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java index 99ef8ebfc..3032e5c80 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicChannelService.java @@ -10,7 +10,6 @@ import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.channel.ChannelException; import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.ChannelMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.MessageRepository; @@ -35,7 +34,6 @@ public class BasicChannelService implements ChannelService { private final MessageRepository messageRepository; private final UserRepository userRepository; private final ChannelMapper channelMapper; - private final RequestIPContext requestIPContext; @Transactional @Override @@ -78,7 +76,7 @@ public ChannelDto find(UUID channelId) { .orElseThrow( () -> { log.warn("[채널 조회 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); - return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId , "requestIp", requestIPContext.getClientIp()));}); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId));}); } @Transactional(readOnly = true) @@ -106,10 +104,10 @@ public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { () -> { log.warn("[채널 업데이트 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, - Map.of("channelId", channelId , "requestIp", requestIPContext.getClientIp()));}); + Map.of("channelId", channelId));}); if (channel.getType().equals(ChannelType.PRIVATE)) { log.warn("[채널 업데이트 실패] 개인 채널은 업데이트 할 수 없습니다 type: {}", channel.getType()); - throw new ChannelException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp())); + throw new ChannelException(ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL, Map.of("channelId", channelId)); } channel.update(newName, newDescription); log.info("[채널 업데이트 성공] id: {}", channel.getId()); @@ -121,7 +119,7 @@ public ChannelDto update(UUID channelId, PublicChannelUpdateRequest request) { public void delete(UUID channelId) { if (!channelRepository.existsById(channelId)) { log.warn("[채널 삭제 실패] 해당 채널을 찾을 수 없습니다 id: {}", channelId); - throw new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp())); + throw new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId)); } messageRepository.deleteAllByChannelId(channelId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java index e36cb5cde..4710b5975 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicMessageService.java @@ -13,7 +13,6 @@ import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; import com.sprint.mission.discodeit.exception.message.MessageNotFoundException; import com.sprint.mission.discodeit.exception.user.UserNotFoundException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.MessageMapper; import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -46,7 +45,6 @@ public class BasicMessageService implements MessageService { private final BinaryContentStorage binaryContentStorage; private final BinaryContentRepository binaryContentRepository; private final PageResponseMapper pageResponseMapper; - private final RequestIPContext requestIPContext; @Transactional @Override @@ -59,14 +57,14 @@ public MessageDto create(MessageCreateRequest messageCreateRequest, .orElseThrow( () -> { log.warn("[메시지 생성 오류] 채널을 찾을 수 없습니다"); - return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp())); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId)); }); User author = userRepository.findById(authorId) .orElseThrow( () -> { log.warn("[메시지 생성 오류] 작성자를 찾을 수 없습니다"); - return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("authorId", authorId, "requestIp", requestIPContext.getClientIp())); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("authorId", authorId)); }); List attachments = binaryContentCreateRequests.stream() @@ -104,7 +102,7 @@ public MessageDto find(UUID messageId) { .orElseThrow( () -> { log.warn("[메시지 조회 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - return new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId, "requestIp", requestIPContext.getClientIp())); + return new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId)); }); } @@ -134,7 +132,7 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { .orElseThrow( () -> { log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - return new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId, "requestIp", requestIPContext.getClientIp())); + return new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId)); }); message.update(newContent); log.info("[메시지 업데이트 성공]"); @@ -146,7 +144,7 @@ public MessageDto update(UUID messageId, MessageUpdateRequest request) { public void delete(UUID messageId) { if (!messageRepository.existsById(messageId)) { log.warn("[메시지 업데이트 실패] 해당 메시지를 찾을 수 없습니다. id: {}", messageId); - throw new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId, "requestIp", requestIPContext.getClientIp())); + throw new MessageNotFoundException(ErrorCode.CANNOT_FOUND_MESSAGE, Map.of("messageId", messageId)); } messageRepository.deleteById(messageId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java index 83c229385..17ac78199 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicReadStatusService.java @@ -10,7 +10,6 @@ import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; import com.sprint.mission.discodeit.exception.readstatus.ReadStatusNotFoundException; import com.sprint.mission.discodeit.exception.user.UserNotFoundException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.ReadStatusMapper; import com.sprint.mission.discodeit.repository.ChannelRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; @@ -34,7 +33,6 @@ public class BasicReadStatusService implements ReadStatusService { private final UserRepository userRepository; private final ChannelRepository channelRepository; private final ReadStatusMapper readStatusMapper; - private final RequestIPContext requestIPContext; @Transactional @Override @@ -46,16 +44,16 @@ public ReadStatusDto create(ReadStatusCreateRequest request) { .orElseThrow( () -> { log.warn("[읽기 정보 생성 실패] 해당하는 회원을 찾을 수 없습니다"); - return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp()));}); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId));}); Channel channel = channelRepository.findById(channelId) .orElseThrow( () -> { log.warn("[읽기 정보 생성 실패] 해당하는 채널을 찾을 수 없습니다"); - return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId, "requestIp", requestIPContext.getClientIp()));}); + return new ChannelNotFoundException(ErrorCode.CANNOT_FOUND_CHANNEL, Map.of("channelId", channelId));}); if (readStatusRepository.existsByUserIdAndChannelId(user.getId(), channel.getId())) { log.warn("[읽기 정보 생성 실패] 회원과 채널에 해당하는 읽기 정보가 이미 존재합니다"); - throw new ReadStatusNotFoundException(ErrorCode.ALREADY_EXIST_READSTATUS, Map.of("userId", userId, "channelId", channelId, "requestIp", requestIPContext.getClientIp())); + throw new ReadStatusNotFoundException(ErrorCode.ALREADY_EXIST_READSTATUS, Map.of("userId", userId, "channelId", channelId)); } Instant lastReadAt = request.lastReadAt(); @@ -74,7 +72,7 @@ public ReadStatusDto find(UUID readStatusId) { .orElseThrow( () ->{ log.warn("[읽기 정보 조회 실패] 해당하는 정보를 찾을 수 없습니다"); - return new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId, "requestIp", requestIPContext.getClientIp()));} + return new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId));} ); } @@ -93,7 +91,7 @@ public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) .orElseThrow( () ->{ log.warn("[읽기 정보 업데이트 실패] 해당하는 정보를 찾을 수 없습니다"); - return new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId, "requestIp", requestIPContext.getClientIp()));}); + return new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId));}); readStatus.update(newLastReadAt); log.info("[읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: {}", readStatus.getId()); @@ -105,7 +103,7 @@ public ReadStatusDto update(UUID readStatusId, ReadStatusUpdateRequest request) public void delete(UUID readStatusId) { if (!readStatusRepository.existsById(readStatusId)) { log.warn("[읽기 정보 삭제 실패] 해당 정보를 찾을 수 없습니다"); - throw new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId, "requestIp", requestIPContext.getClientIp())); + throw new ReadStatusNotFoundException(ErrorCode.CANNOT_FOUND_READSTATUS, Map.of("readStatusId", readStatusId)); } readStatusRepository.deleteById(readStatusId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java index 73d26681d..3b41fbd4b 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserService.java @@ -10,7 +10,6 @@ import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.user.UserAlreadyExistException; import com.sprint.mission.discodeit.exception.user.UserNotFoundException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; @@ -35,7 +34,6 @@ public class BasicUserService implements UserService { private final UserMapper userMapper; private final BinaryContentRepository binaryContentRepository; private final BinaryContentStorage binaryContentStorage; - private final RequestIPContext requestIPContext; @Transactional @Override @@ -48,11 +46,11 @@ public UserDto create(UserCreateRequest userCreateRequest, if (userRepository.existsByEmail(email)) { log.warn("[회원 생성 실패] 중복된 이메일: {}", email); - throw new UserAlreadyExistException(ErrorCode.DUPLICATE_EMAIL, Map.of("email", email , "requestIp", requestIPContext.getClientIp())); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_EMAIL, Map.of("email", email )); } if (userRepository.existsByUsername(username)) { log.warn("[회원 생성 실패] 중복된 사용자 이름: {}", username); - throw new UserAlreadyExistException(ErrorCode.DUPLICATE_NAME, Map.of("username", username , "requestIp", requestIPContext.getClientIp())); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_NAME, Map.of("username", username)); } BinaryContent nullableProfile = optionalProfileCreateRequest @@ -88,7 +86,7 @@ public UserDto find(UUID userId) { .map(userMapper::toDto) .orElseThrow(() -> { log.warn("[회원 조회 실패] 존재하지 않는 사용자: {}", userId); - return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId , "requestIp", requestIPContext.getClientIp())); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId )); }); } @@ -110,7 +108,7 @@ public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, User user = userRepository.findById(userId) .orElseThrow(() -> { log.warn("[회원 수정 실패] 존재하지 않는 사용자: {}", userId); - return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp())); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId)); }); String newUsername = userUpdateRequest.newUsername(); @@ -118,11 +116,11 @@ public UserDto update(UUID userId, UserUpdateRequest userUpdateRequest, if (userRepository.existsByEmail(newEmail)) { log.warn("[회원 수정 실패] 중복된 이메일: {}", newEmail); - throw new UserAlreadyExistException(ErrorCode.DUPLICATE_EMAIL, Map.of("email", newEmail , "requestIp", requestIPContext.getClientIp())); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_EMAIL, Map.of("email", newEmail)); } if (userRepository.existsByUsername(newUsername)) { log.warn("[회원 수정 실패] 중복된 사용자 이름: {}", newUsername); - throw new UserAlreadyExistException(ErrorCode.DUPLICATE_NAME, Map.of("username", newUsername , "requestIp", requestIPContext.getClientIp())); + throw new UserAlreadyExistException(ErrorCode.DUPLICATE_NAME, Map.of("username", newUsername)); } BinaryContent nullableProfile = optionalProfileCreateRequest @@ -154,7 +152,7 @@ public void delete(UUID userId) { if (!userRepository.existsById(userId)) { log.warn("[회원 삭제 실패] 존재하지 않는 사용자: {}", userId); - throw new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId , "requestIp", requestIPContext.getClientIp())); + throw new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId)); } userRepository.deleteById(userId); diff --git a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java index 42727781d..60765d211 100644 --- a/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java +++ b/src/main/java/com/sprint/mission/discodeit/service/basic/BasicUserStatusService.java @@ -9,7 +9,6 @@ import com.sprint.mission.discodeit.exception.user.UserNotFoundException; import com.sprint.mission.discodeit.exception.userstatus.UserStatusException; import com.sprint.mission.discodeit.exception.userstatus.UserStatusNotFoundException; -import com.sprint.mission.discodeit.ip.RequestIPContext; import com.sprint.mission.discodeit.mapper.UserStatusMapper; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.repository.UserStatusRepository; @@ -32,7 +31,6 @@ public class BasicUserStatusService implements UserStatusService { private final UserStatusRepository userStatusRepository; private final UserRepository userRepository; private final UserStatusMapper userStatusMapper; - private final RequestIPContext requestIPContext; @Transactional @Override @@ -43,12 +41,12 @@ public UserStatusDto create(UserStatusCreateRequest request) { User user = userRepository.findById(userId) .orElseThrow(() -> { log.warn("[유저 상태 생성 실패] 존재하지 않는 사용자: {}", userId); - return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp())); + return new UserNotFoundException(ErrorCode.CANNOT_FOUND_USER, Map.of("userId", userId)); }); Optional.ofNullable(user.getStatus()).ifPresent(status -> { log.warn("[유저 상태 생성 실패] 이미 상태가 존재하는 사용자: {}", userId); - throw new UserStatusException(ErrorCode.ALREADY_EXIST_USERSTAUTS, Map.of("userId", userId, "requestIp", requestIPContext.getClientIp())); + throw new UserStatusException(ErrorCode.ALREADY_EXIST_USERSTAUTS, Map.of("userId", userId)); }); Instant lastActiveAt = request.lastActiveAt(); @@ -66,7 +64,7 @@ public UserStatusDto find(UUID userStatusId) { .map(userStatusMapper::toDto) .orElseThrow(() -> { log.warn("[유저 상태 조회 실패] 존재하지 않는 상태 ID: {}", userStatusId); - return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId, "requestIp", requestIPContext.getClientIp())); + return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId)); }); } @@ -86,7 +84,7 @@ public UserStatusDto update(UUID userStatusId, UserStatusUpdateRequest request) UserStatus userStatus = userStatusRepository.findById(userStatusId) .orElseThrow(() -> { log.warn("[유저 상태 수정 실패] 존재하지 않는 상태 ID: {}", userStatusId); - return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId, "requestIp", requestIPContext.getClientIp())); + return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId)); }); Instant newLastActiveAt = request.newLastActiveAt(); @@ -104,7 +102,7 @@ public UserStatusDto updateByUserId(UUID userId, UserStatusUpdateRequest request UserStatus userStatus = userStatusRepository.findByUserId(userId) .orElseThrow(() -> { log.warn("[유저 상태 수정 실패] 상태가 존재하지 않는 사용자: {}", userId); - return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userId", userId, "userStatusId", userId, "requestIp", requestIPContext.getClientIp())); + return new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userId", userId, "userStatusId", userId)); }); Instant newLastActiveAt = request.newLastActiveAt(); @@ -121,7 +119,7 @@ public void delete(UUID userStatusId) { if (!userStatusRepository.existsById(userStatusId)) { log.warn("[유저 상태 삭제 실패] 존재하지 않는 상태 ID: {}", userStatusId); - throw new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId, "requestIp", requestIPContext.getClientIp())); + throw new UserStatusNotFoundException(ErrorCode.CANNOT_FOUND_USERSTATUS, Map.of("userStatusId", userStatusId)); } userStatusRepository.deleteById(userStatusId); diff --git a/src/main/resources/sql/message-data.sql b/src/main/resources/sql/message-data.sql new file mode 100644 index 000000000..7c66acae1 --- /dev/null +++ b/src/main/resources/sql/message-data.sql @@ -0,0 +1,35 @@ +-- 1. 채널 생성 +INSERT INTO channels (id, name, description, type, created_at, updated_at) +VALUES ('11111111-1111-1111-1111-111111111111', 'Test Channel', '테스트 채널입니다.', 'PUBLIC', NOW(), NOW()); + +-- 2. 사용자 생성 +INSERT INTO users (id, username, email, password, profile_id, created_at, updated_at) +VALUES ('22222222-2222-2222-2222-222222222222', 'junwo', 'junwo@email.com', 'testPassword123!', NULL, NOW(), NOW()); + +-- 3. 사용자 상태 생성 +INSERT INTO user_statuses (id, user_id, last_active_at, created_at, updated_at) +VALUES ('33333333-3333-3333-3333-333333333333', '22222222-2222-2222-2222-222222222222', NOW(), NOW(), NOW()); + +-- 4. 메시지 20개 생성 (created_at/updated_at 각각 1분씩 다르게) +INSERT INTO messages (id, content, author_id, channel_id, created_at, updated_at) +VALUES + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001', 'Hello 1', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -20, NOW()), DATEADD(MINUTE, -20, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002', 'Hello 2', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -19, NOW()), DATEADD(MINUTE, -19, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003', 'Hello 3', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -18, NOW()), DATEADD(MINUTE, -18, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004', 'Hello 4', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -17, NOW()), DATEADD(MINUTE, -17, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005', 'Hello 5', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -16, NOW()), DATEADD(MINUTE, -16, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006', 'Hello 6', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -15, NOW()), DATEADD(MINUTE, -15, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007', 'Hello 7', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -14, NOW()), DATEADD(MINUTE, -14, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008', 'Hello 8', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -13, NOW()), DATEADD(MINUTE, -13, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009', 'Hello 9', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -12, NOW()), DATEADD(MINUTE, -12, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010', 'Hello 10', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -11, NOW()), DATEADD(MINUTE, -11, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011', 'Hello 11', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -10, NOW()), DATEADD(MINUTE, -10, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012', 'Hello 12', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -9, NOW()), DATEADD(MINUTE, -9, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013', 'Hello 13', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -8, NOW()), DATEADD(MINUTE, -8, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014', 'Hello 14', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -7, NOW()), DATEADD(MINUTE, -7, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015', 'Hello 15', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -6, NOW()), DATEADD(MINUTE, -6, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016', 'Hello 16', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -5, NOW()), DATEADD(MINUTE, -5, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017', 'Hello 17', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -4, NOW()), DATEADD(MINUTE, -4, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018', 'Hello 18', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -3, NOW()), DATEADD(MINUTE, -3, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019', 'Hello 19', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -2, NOW()), DATEADD(MINUTE, -2, NOW())), + ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020', 'Hello 20', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', DATEADD(MINUTE, -1, NOW()), DATEADD(MINUTE, -1, NOW())); diff --git a/src/main/resources/schema.sql b/src/main/resources/sql/schema.sql similarity index 100% rename from src/main/resources/schema.sql rename to src/main/resources/sql/schema.sql diff --git a/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java b/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java deleted file mode 100644 index 63f2d9da6..000000000 --- a/src/test/java/com/sprint/mission/discodeit/IntegrationTests.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.sprint.mission.discodeit; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sprint.mission.discodeit.dto.data.ChannelDto; -import com.sprint.mission.discodeit.dto.data.MessageDto; -import com.sprint.mission.discodeit.dto.data.UserDto; -import com.sprint.mission.discodeit.dto.request.*; -import com.sprint.mission.discodeit.repository.ChannelRepository; -import com.sprint.mission.discodeit.repository.MessageRepository; -import com.sprint.mission.discodeit.repository.UserRepository; -import java.util.UUID; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.transaction.annotation.Transactional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@SpringBootTest -@Transactional -@ActiveProfiles("test") -@AutoConfigureMockMvc -public class IntegrationTests { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - @Autowired - private UserRepository userRepository; - @Autowired - private ChannelRepository channelRepository; - @Autowired - private MessageRepository messageRepository; - - @Test - @DisplayName("사용자 생성 및 조회") - void userCreateAndFetch() throws Exception { - // given - UserCreateRequest request = new UserCreateRequest("testuser", "test@email.com", "Password1!"); - byte[] jsonBytes = objectMapper.writeValueAsBytes(request); - - MockMultipartFile userCreateRequest = new MockMultipartFile( - "userCreateRequest", - "userCreateRequest.json", - "application/json", - jsonBytes - ); - - // when - ResultActions result = mockMvc.perform( - MockMvcRequestBuilders.multipart("/api/users") - .file(userCreateRequest) - .contentType(MediaType.MULTIPART_FORM_DATA) - ) - .andExpect(status().isCreated()); - - // then - String responseBody = result.andReturn().getResponse().getContentAsString(); - UserDto userDto = objectMapper.readValue(responseBody, UserDto.class); - - assertThat(userDto.username()).isEqualTo("testuser"); - } - - @Test - @DisplayName("채널 생성 및 삭제") - void channelCreateAndDelete() throws Exception { - PublicChannelCreateRequest request = new PublicChannelCreateRequest("test-channel", "desc"); - - ResultActions result = mockMvc.perform(MockMvcRequestBuilders.post("/api/channels/public") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isCreated()); - - String responseBody = result.andReturn().getResponse().getContentAsString(); - ChannelDto channelDto = objectMapper.readValue(responseBody, ChannelDto.class); - - UUID channelId = channelDto.id(); - - mockMvc.perform(MockMvcRequestBuilders.delete("/api/channels/" + channelId)) - .andExpect(status().isNoContent()); - - assertThat(channelRepository.findById(channelId)).isEmpty(); - } - - @Test - @DisplayName("메시지 생성 및 수정") - void messageCreateAndUpdate() throws Exception { - // 사용자 생성 - UserCreateRequest userRequest = new UserCreateRequest("msguser", "msg@email.com", "Password1!"); - MockMultipartFile userPart = new MockMultipartFile( - "userCreateRequest", - "userCreateRequest.json", - "application/json", - objectMapper.writeValueAsBytes(userRequest) - ); - - String userResponse = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/users") - .file(userPart) - .contentType(MediaType.MULTIPART_FORM_DATA)) - .andExpect(status().isCreated()) - .andReturn().getResponse().getContentAsString(); - - UserDto user = objectMapper.readValue(userResponse, UserDto.class); - - // 채널 생성 - PublicChannelCreateRequest channelRequest = new PublicChannelCreateRequest("msg-channel", "msg-desc"); - String channelResponse = mockMvc.perform(MockMvcRequestBuilders.post("/api/channels/public") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(channelRequest))) - .andExpect(status().isCreated()) - .andReturn().getResponse().getContentAsString(); - - ChannelDto channel = objectMapper.readValue(channelResponse, ChannelDto.class); - - // 메시지 생성 - MessageCreateRequest request = new MessageCreateRequest("test", channel.id(), user.id()); - MockMultipartFile messagePart = new MockMultipartFile( - "messageCreateRequest", - "messageCreateRequest.json", - "application/json", - objectMapper.writeValueAsBytes(request) - ); - - String messageResponse = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/messages") - .file(messagePart) - .contentType(MediaType.MULTIPART_FORM_DATA)) - .andExpect(status().isCreated()) - .andReturn().getResponse().getContentAsString(); - - MessageDto createdMessage = objectMapper.readValue(messageResponse, MessageDto.class); - UUID messageId = createdMessage.id(); - - // 메시지 수정 - MessageUpdateRequest updateRequest = new MessageUpdateRequest("Updated content"); - - mockMvc.perform(MockMvcRequestBuilders.patch("/api/messages/" + messageId) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(updateRequest))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.content").value("Updated content")); - } -} diff --git a/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java index 3e6a0381a..746294925 100644 --- a/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java +++ b/src/test/java/com/sprint/mission/discodeit/controller/ChannelControllerTest.java @@ -1,70 +1,121 @@ package com.sprint.mission.discodeit.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; +import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; import com.sprint.mission.discodeit.entity.ChannelType; import com.sprint.mission.discodeit.service.ChannelService; +import java.util.List; +import java.util.UUID; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.BDDMockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; -import java.util.List; -import java.util.UUID; - -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(ChannelController.class) -@ActiveProfiles("dev") class ChannelControllerTest { - @Autowired - MockMvc mockMvc; - - @Autowired - ObjectMapper objectMapper; + @Autowired MockMvc mockMvc; - @MockitoBean - ChannelService channelService; + @MockitoBean ChannelService channelService; @Test - @DisplayName("성공 - 공개 채널 생성") + @DisplayName("공개 채널 생성 성공") void createPublicChannel_success() throws Exception { - PublicChannelCreateRequest request = new PublicChannelCreateRequest("default", "default"); - ChannelDto channelDto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, request.name(), - request.description(), null, null); + PublicChannelCreateRequest request = new PublicChannelCreateRequest("test", "desc"); + ChannelDto channelDto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, "test", "desc", null, null); - BDDMockito.given(channelService.create(any(PublicChannelCreateRequest.class))) - .willReturn(channelDto); + when(channelService.create(any(PublicChannelCreateRequest.class))).thenReturn(channelDto); mockMvc.perform(post("/api/channels/public") .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) + .content(""" + { + "name": "test", + "description": "desc" + } + """)) .andExpect(status().isCreated()) - .andExpect(jsonPath("$.name").value("default")); + .andExpect(jsonPath("$.name").value("test")) + .andExpect(jsonPath("$.description").value("desc")) + .andExpect(jsonPath("$.type").value("PUBLIC")); + } + + @Test + @DisplayName("개인 채널 생성 성공") + void createPrivateChannel_success() throws Exception { + UUID id1 = UUID.randomUUID(); + UUID id2 = UUID.randomUUID(); + PrivateChannelCreateRequest request = new PrivateChannelCreateRequest(List.of(id1, id2)); + ChannelDto channelDto = new ChannelDto(UUID.randomUUID(), ChannelType.PRIVATE, null, null, null, null); + + when(channelService.create(any(PrivateChannelCreateRequest.class))).thenReturn(channelDto); + + mockMvc.perform(post("/api/channels/private") + .contentType(MediaType.APPLICATION_JSON) + .content(String.format(""" + { + "participantIds": ["%s", "%s"] + } + """, id1, id2))) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.type").value("PRIVATE")); + } + + @Test + @DisplayName("채널 업데이트 성공") + void updateChannel_success() throws Exception { + UUID channelId = UUID.randomUUID(); + ChannelDto updated = new ChannelDto(channelId, ChannelType.PUBLIC, "new name", "new desc", null, null); + when(channelService.update(eq(channelId), any())).thenReturn(updated); + + mockMvc.perform(patch("/api/channels/{channelId}", channelId) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "newName": "new name", + "newDescription": "new desc" + } + """)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.name").value("new name")) + .andExpect(jsonPath("$.description").value("new desc")); + } + + @Test + @DisplayName("채널 삭제 성공") + void deleteChannel_success() throws Exception { + UUID channelId = UUID.randomUUID(); + + mockMvc.perform(delete("/api/channels/{channelId}", channelId)) + .andExpect(status().isNoContent()); + + verify(channelService).delete(channelId); } @Test - @DisplayName("성공 - 채널 목록 조회") - void findAllChannels_success() throws Exception { + @DisplayName("사용자 참여 채널 목록 조회 성공") + void findChannelsByUserId_success() throws Exception { UUID userId = UUID.randomUUID(); - ChannelDto channelDto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, "default", - "PUBLIC", null, null); + ChannelDto channel1 = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, "one", "desc1", null, null); + ChannelDto channel2 = new ChannelDto(UUID.randomUUID(), ChannelType.PRIVATE, null, null, null, null); - BDDMockito.given(channelService.findAllByUserId(userId)) - .willReturn(List.of(channelDto)); + when(channelService.findAllByUserId(userId)).thenReturn(List.of(channel1, channel2)); mockMvc.perform(get("/api/channels") .param("userId", userId.toString())) .andExpect(status().isOk()) - .andExpect(jsonPath("$[0].name").value("default")); + .andExpect(jsonPath("$[0].name").value("one")) + .andExpect(jsonPath("$[0].type").value("PUBLIC")) + .andExpect(jsonPath("$[1].type").value("PRIVATE")); } } diff --git a/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java index 4ab6e8c5d..7492557c7 100644 --- a/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java +++ b/src/test/java/com/sprint/mission/discodeit/controller/MessageControllerTest.java @@ -1,92 +1,188 @@ package com.sprint.mission.discodeit.controller; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sprint.mission.discodeit.dto.data.MessageDto; -import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; -import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.dto.response.PageResponse; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import com.sprint.mission.discodeit.dto.data.MessageDto; +import com.sprint.mission.discodeit.dto.data.UserDto; import com.sprint.mission.discodeit.service.MessageService; +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.BDDMockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -import java.time.Instant; -import java.util.List; -import java.util.UUID; -import static org.mockito.ArgumentMatchers.any; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@ActiveProfiles("dev") -@WebMvcTest(controllers = MessageController.class) -public class MessageControllerTest { +@WebMvcTest(MessageController.class) +class MessageControllerTest { @Autowired private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean private MessageService messageService; @Test - @DisplayName("성공 - 메시지 생성") - void createMessage_success() throws Exception { - MessageCreateRequest request = new MessageCreateRequest("test", UUID.randomUUID(), UUID.randomUUID()); - MessageDto dto = new MessageDto(UUID.randomUUID(), Instant.now(), Instant.now(), "test", - UUID.randomUUID(), null, null); - - BDDMockito.given(messageService.create(any(), any())).willReturn(dto); - - MockMultipartFile jsonPart = new MockMultipartFile("messageCreateRequest", null, - MediaType.APPLICATION_JSON_VALUE, - objectMapper.writeValueAsBytes(request)); + @DisplayName("메시지 생성 요청 성공 - 첨부파일 없음") + void createMessage_withoutAttachment_success() throws Exception { + UUID channelId = UUID.randomUUID(); + UUID authorId = UUID.randomUUID(); + UUID messageId = UUID.randomUUID(); - mockMvc.perform(MockMvcRequestBuilders.multipart("/api/messages") - .file(jsonPart)) + MockMultipartFile messageCreateRequest = new MockMultipartFile( + "messageCreateRequest", + "", + "application/json", + String.format(""" + { + "channelId": "%s", + "authorId": "%s", + "content": "Hello world!" + } + """, channelId, authorId).getBytes(StandardCharsets.UTF_8) + ); + + MessageDto responseDto = new MessageDto( + messageId, + Instant.now(), + Instant.now(), + "Hello world!", + channelId, + new UserDto(authorId, "junwo", "junwo@email.com", null, null), + null + ); + + when(messageService.create(any(), any())).thenReturn(responseDto); + + mockMvc.perform(multipart("/api/messages") + .file(messageCreateRequest) + .contentType(MediaType.MULTIPART_FORM_DATA)) .andExpect(status().isCreated()) - .andExpect(jsonPath("$.content").value("test")); + .andExpect(jsonPath("$.id").value(messageId.toString())) + .andExpect(jsonPath("$.content").value("Hello world!")) + .andExpect(jsonPath("$.channelId").value(channelId.toString())) + .andExpect(jsonPath("$.author.username").value("junwo")); } @Test - @DisplayName("실패 - 메시지 업데이트 요청 시 존재하지 않는 메시지") - void updateMessage_notFound() throws Exception { + @DisplayName("메시지 생성 성공 - 첨부파일 포함") + void createMessage_withAttachment_success() throws Exception { UUID messageId = UUID.randomUUID(); - MessageUpdateRequest updateRequest = new MessageUpdateRequest("Updated!"); - - BDDMockito.given(messageService.update(any(), any())) - .willThrow(new RuntimeException("Message not found")); - - mockMvc.perform(MockMvcRequestBuilders.patch("/api/messages/" + messageId) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(updateRequest))) - .andExpect(status().isInternalServerError()); + UUID channelId = UUID.randomUUID(); + UUID authorId = UUID.randomUUID(); + + MockMultipartFile messageCreateRequest = new MockMultipartFile( + "messageCreateRequest", + "", + "application/json", + (""" + { + "content": "Hello with file", + "channelId": "%s", + "authorId": "%s" + } + """.formatted(channelId.toString(), authorId.toString()) + ).getBytes(StandardCharsets.UTF_8) + ); + + MockMultipartFile attachmentFile = new MockMultipartFile( + "attachments", + "hello.png", + "image/png", + "fake image content".getBytes(StandardCharsets.UTF_8) + ); + + UserDto userDto = new UserDto(authorId, "junwo", "junwo@email.com", null, null); + MessageDto messageDto = new MessageDto(messageId, Instant.now(), Instant.now(), "Hello with file", channelId, userDto, List.of()); + + when(messageService.create(any(), any())).thenReturn(messageDto); + + mockMvc.perform( + multipart("/api/messages") + .file(messageCreateRequest) + .file(attachmentFile) + .contentType(MediaType.MULTIPART_FORM_DATA) + ) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id").value(messageId.toString())) + .andExpect(jsonPath("$.content").value("Hello with file")); } @Test - @DisplayName("성공 - 메시지 목록 조회") + @DisplayName("메시지 목록 조회 성공") void findAllByChannelId_success() throws Exception { UUID channelId = UUID.randomUUID(); - MessageDto dto = new MessageDto(UUID.randomUUID(), Instant.now(), Instant.now(), "test", - channelId, null, null); - PageResponse response = new PageResponse<>(List.of(dto), null, 1, false, 1L); + UUID messageId = UUID.randomUUID(); + UUID authorId = UUID.randomUUID(); + + MessageDto messageDto = new MessageDto( + messageId, + Instant.now(), + Instant.now(), + "test message", + channelId, + new UserDto(authorId, "junwo", "junwo@email.com", null, null), + null + ); + + PageResponse pageResponse = new PageResponse<>( + List.of(messageDto), null, 10, false, 0L + ); + + when(messageService.findAllByChannelId(eq(channelId), any(), any())).thenReturn(pageResponse); + + mockMvc.perform(get("/api/messages") + .param("channelId", channelId.toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content[0].id").value(messageId.toString())) + .andExpect(jsonPath("$.content[0].content").value("test message")) + .andExpect(jsonPath("$.content[0].author.username").value("junwo")); + } - BDDMockito.given(messageService.findAllByChannelId(any(), any(), any())).willReturn(response); + @Test + @DisplayName("메시지 업데이트 성공") + void updateMessage_success() throws Exception { + UUID messageId = UUID.randomUUID(); - mockMvc.perform(MockMvcRequestBuilders.get("/api/messages") - .param("channelId", channelId.toString()) - .param("page", "0") - .param("size", "50")) + MessageDto responseDto = new MessageDto( + messageId, + Instant.now(), + Instant.now(), + "updated content", + UUID.randomUUID(), + new UserDto(UUID.randomUUID(), "junwo", "junwo@email.com", null, null), + null + ); + + when(messageService.update(eq(messageId), any())).thenReturn(responseDto); + + mockMvc.perform(patch("/api/messages/{messageId}", messageId) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "newContent": "updated content" + } + """)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.content[0].channelId").value(channelId.toString())); + .andExpect(jsonPath("$.content").value("updated content")); + } + + @Test + @DisplayName("메시지 삭제 성공") + void deleteMessage_success() throws Exception { + UUID messageId = UUID.randomUUID(); + + mockMvc.perform(delete("/api/messages/{messageId}", messageId)) + .andExpect(status().isNoContent()); + + verify(messageService).delete(messageId); } -} +} \ No newline at end of file diff --git a/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java b/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java index c695f12c5..65bb42067 100644 --- a/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java +++ b/src/test/java/com/sprint/mission/discodeit/controller/UserControllerTest.java @@ -1,106 +1,152 @@ package com.sprint.mission.discodeit.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import com.sprint.mission.discodeit.dto.data.UserDto; -import com.sprint.mission.discodeit.dto.request.UserCreateRequest; import com.sprint.mission.discodeit.service.UserService; import com.sprint.mission.discodeit.service.UserStatusService; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.BDDMockito; - +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.http.MediaType; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -import java.util.List; -import java.util.UUID; - -import static org.mockito.ArgumentMatchers.any; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -@ActiveProfiles("dev") -@WebMvcTest(controllers = UserController.class) -class UserControllerTest { +@WebMvcTest(UserController.class) +public class UserControllerTest { @Autowired private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - @MockitoBean private UserService userService; - @MockitoBean - private UserStatusService userStatusService; - @Test - @DisplayName("성공 - 전체 유저 조회") - void findAll_success() throws Exception { - UserDto user = new UserDto(UUID.randomUUID(), "rex", "rex@naver.com", null, true); - BDDMockito.given(userService.findAll()).willReturn(List.of(user)); + @DisplayName("사용자 생성 요청 성공 - 프로필 포함 + JSON 응답 검증") + void createUser_withProfile_success() throws Exception { + UUID userId = UUID.randomUUID(); + UserDto userDto = new UserDto(userId, "junwo", "junwo@email.com", null, null); - mockMvc.perform(get("/api/users")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$[0].username").value("rex")); - } + MockMultipartFile userCreateRequest = new MockMultipartFile( + "userCreateRequest", + "", + "application/json", + """ + { + "username": "junwo", + "email": "junwo@email.com", + "password": "Password123!" + } + """.getBytes(StandardCharsets.UTF_8) + ); - @Test - @DisplayName("성공 - 유저 삭제") - void deleteUser_success() throws Exception { - UUID userId = UUID.randomUUID(); + MockMultipartFile profileFile = new MockMultipartFile( + "profile", + "profile.png", + "image/png", + "fake-image-bytes".getBytes(StandardCharsets.UTF_8) + ); - mockMvc.perform(delete("/api/users/" + userId)) - .andExpect(status().isNoContent()); + when(userService.create(any(), any())).thenReturn(userDto); + + mockMvc.perform( + multipart("/api/users") + .file(userCreateRequest) + .file(profileFile) + .contentType(MediaType.MULTIPART_FORM_DATA) + ) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id").value(userId.toString())) + .andExpect(jsonPath("$.username").value("junwo")) + .andExpect(jsonPath("$.email").value("junwo@email.com")) + .andExpect(jsonPath("$.profile").doesNotExist()) + .andExpect(jsonPath("$.status").doesNotExist()); } @Test - @DisplayName("실패 - 유효하지 않은 입력으로 유저 생성") - void createUser_fail_invalidInput() throws Exception { - UserCreateRequest invalidRequest = new UserCreateRequest("", "invalid", "123"); - - MockMultipartFile requestPart = new MockMultipartFile( - "userCreateRequest", + @DisplayName("사용자 생성 실패 - 잘못된 이메일 형식") + void createUser_invalidEmailFormat_fail() throws Exception { + MockMultipartFile invalidEmailRequest = new MockMultipartFile( "userCreateRequest", - MediaType.APPLICATION_JSON_VALUE, - objectMapper.writeValueAsBytes(invalidRequest) + "", + "application/json", + """ + { + "username": "junwo", + "email": "invalid-email-format", + "password": "Password123!" + } + """.getBytes(StandardCharsets.UTF_8) ); - mockMvc.perform(MockMvcRequestBuilders.multipart("/api/users") - .file(requestPart) - .contentType(MediaType.MULTIPART_FORM_DATA)) + mockMvc.perform( + multipart("/api/users") + .file(invalidEmailRequest) + .contentType(MediaType.MULTIPART_FORM_DATA) + ) .andExpect(status().isBadRequest()); } @Test - @DisplayName("성공 - 유저 생성") - void createUser_success() throws Exception { - UserCreateRequest request = new UserCreateRequest("rex", "rex@naver.com", "Password1!"); - UserDto userDto = new UserDto(UUID.randomUUID(), "rex", "rex@naver.com", null, true); - - BDDMockito.given(userService.create(any(), any())).willReturn(userDto); - - MockMultipartFile requestPart = new MockMultipartFile( - "userCreateRequest", + @DisplayName("사용자 생성 실패 - 잘못된 비밀번호 형식") + void createUser_invalidPasswordFormat_fail() throws Exception { + MockMultipartFile invalidPasswordRequest = new MockMultipartFile( "userCreateRequest", - MediaType.APPLICATION_JSON_VALUE, - objectMapper.writeValueAsBytes(request) + "", + "application/json", + """ + { + "username": "junwo", + "email": "junwo@email.com", + "password": "123" + } + """.getBytes(StandardCharsets.UTF_8) ); - mockMvc.perform(MockMvcRequestBuilders.multipart("/api/users") - .file(requestPart) - .contentType(MediaType.MULTIPART_FORM_DATA)) - .andExpect(status().isCreated()) - .andExpect(jsonPath("$.username").value("rex")); + mockMvc.perform( + multipart("/api/users") + .file(invalidPasswordRequest) + .contentType(MediaType.MULTIPART_FORM_DATA) + ) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("사용자 전체 조회 - JSON 응답 검증") + void findAllUsers_success() throws Exception { + UUID userId = UUID.randomUUID(); + when(userService.findAll()).thenReturn(List.of( + new UserDto(userId, "junwo", "junwo@email.com", null, null) + )); + + mockMvc.perform(get("/api/users")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].id").value(userId.toString())) + .andExpect(jsonPath("$[0].username").value("junwo")) + .andExpect(jsonPath("$[0].email").value("junwo@email.com")) + .andExpect(jsonPath("$[0].profile").doesNotExist()) + .andExpect(jsonPath("$[0].status").doesNotExist()); } -} + @Test + @DisplayName("사용자 삭제") + void deleteUser_success() throws Exception { + UUID userId = UUID.randomUUID(); + mockMvc.perform(delete("/api/users/{userId}", userId)) + .andExpect(status().isNoContent()); + + verify(userService).delete(userId); + } +} \ No newline at end of file diff --git a/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java index 9aaf02b4d..f9474ca96 100644 --- a/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java +++ b/src/test/java/com/sprint/mission/discodeit/repository/ChannelRepositoryTest.java @@ -23,22 +23,17 @@ class ChannelRepositoryTest { private ChannelRepository channelRepository; @Test - @DisplayName("공개 타입 또는 ID가 일치하는 채널을 조회할 수 있다") + @DisplayName("타입 또는 ID가 일치하는 채널을 조회할 수 있다") void findAllByTypeOrIdIn() { - // given Channel publicChannel1 = new Channel(ChannelType.PUBLIC, "공지사항", "전체 공지"); Channel publicChannel2 = new Channel(ChannelType.PUBLIC, "자유채팅", "잡담방"); Channel privateChannel = new Channel(ChannelType.PRIVATE, null, null); - channelRepository.saveAll(List.of(publicChannel1, publicChannel2, privateChannel)); - List ids = List.of(privateChannel.getId()); - // when List result = channelRepository.findAllByTypeOrIdIn(ChannelType.PUBLIC, ids); - // then - assertThat(result).hasSize(3); // PUBLIC 2 + privateChannel 1 + assertThat(result).hasSize(3); assertThat(result).extracting(Channel::getId) .containsExactlyInAnyOrder(publicChannel1.getId(), publicChannel2.getId(), privateChannel.getId()); } diff --git a/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java index 368312d00..9bfa43ec3 100644 --- a/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java +++ b/src/test/java/com/sprint/mission/discodeit/repository/MessageRepositoryTest.java @@ -1,11 +1,16 @@ package com.sprint.mission.discodeit.repository; import com.sprint.mission.discodeit.entity.*; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import java.time.Instant; @@ -13,9 +18,12 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; +@Sql(scripts = "/sql/message-data.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @DataJpaTest @EnableJpaAuditing @ActiveProfiles("dev") @@ -24,78 +32,50 @@ class MessageRepositoryTest { @Autowired private MessageRepository messageRepository; - @Autowired - private UserRepository userRepository; - - @Autowired - private ChannelRepository channelRepository; - - @Autowired - private UserStatusRepository userStatusRepository; - @Test @DisplayName("채널 ID로 메시지 목록을 페이징 조회한다.") - void findAllByChannelIdWithAuthor() { - // given - Channel channel = channelRepository.save(new Channel(ChannelType.PUBLIC, "test", "설명")); - User user = userRepository.save(new User("junwo", "junwo@email.com", "pass", null)); - userStatusRepository.save(new UserStatus(user, Instant.now())); - - messageRepository.saveAll(List.of( - new Message("Hello 1", channel, user, List.of()), - new Message("Hello 2", channel, user, List.of()) - )); - - // when - Slice messages = messageRepository.findAllByChannelIdWithAuthor( - channel.getId(), - Instant.now(), - PageRequest.of(0, 10) - ); - - // then - assertThat(messages).isNotNull(); - assertThat(messages.getContent()).hasSize(2); - assertThat(messages.getContent().get(0).getAuthor()).isNotNull(); - assertThat(messages.getContent().get(0).getAuthor().getStatus()).isNotNull(); + void findAllByChannelIdWithAuthor_success() { + UUID channelId = UUID.fromString("11111111-1111-1111-1111-111111111111"); + Instant cursor = Instant.now().minus(15, ChronoUnit.MINUTES); + Pageable pageable = PageRequest.of(0, 5, Sort.by("createdAt").descending()); + + Slice result = messageRepository.findAllByChannelIdWithAuthor(channelId, cursor, pageable); + + assertThat(result).isNotEmpty(); + assertThat(result.hasNext()).isTrue(); + + Message sample = result.getContent().get(0); + assertThat(result.getContent()).hasSize(5); + assertThat(sample.getAuthor()).isNotNull(); + assertThat(sample.getCreatedAt()).isBefore(cursor); + + List createdAts = result.getContent().stream() + .map(Message::getCreatedAt) + .toList(); + List sorted = new ArrayList<>(createdAts); + sorted.sort(Comparator.reverseOrder()); + assertThat(createdAts).isEqualTo(sorted); } @Test @DisplayName("채널 ID로 가장 마지막 메시지 시간을 조회한다.") void findLastMessageAtByChannelId() { - // given - Channel channel = channelRepository.save(new Channel(ChannelType.PUBLIC, "test", "설명")); - User user = userRepository.save(new User("junwo", "junwo@email.com", "pass", null)); - userStatusRepository.save(new UserStatus(user, Instant.now())); + UUID channelId = UUID.fromString("11111111-1111-1111-1111-111111111111"); - Instant now = Instant.now(); - messageRepository.save(new Message("Hi!", channel, user, List.of())); - messageRepository.save(new Message("Latest", channel, user, List.of())); + Optional message = messageRepository.findById(UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020")); + Optional result = messageRepository.findLastMessageAtByChannelId(channelId); - // when - Optional lastMessageAt = messageRepository.findLastMessageAtByChannelId(channel.getId()); - - // then - assertThat(lastMessageAt).isPresent(); + assertThat(result).isPresent(); + assertThat(message.get().getCreatedAt()).isEqualTo(result.get()); } @Test @DisplayName("채널 ID로 모든 메시지를 삭제한다.") void deleteAllByChannelId() { - // given - Channel channel = channelRepository.save(new Channel(ChannelType.PUBLIC, "test", "설명")); - User user = userRepository.save(new User("junwo", "junwo@email.com", "pass", null)); - userStatusRepository.save(new UserStatus(user, Instant.now())); - - messageRepository.saveAll(List.of( - new Message("Msg1", channel, user, List.of()), - new Message("Msg2", channel, user, List.of()) - )); + UUID channelId = UUID.fromString("11111111-1111-1111-1111-111111111111"); - // when - messageRepository.deleteAllByChannelId(channel.getId()); + messageRepository.deleteAllByChannelId(channelId); - // then assertThat(messageRepository.findAll()).isEmpty(); } } diff --git a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java index 8d9abaaf6..bf4d64e41 100644 --- a/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java +++ b/src/test/java/com/sprint/mission/discodeit/repository/UserRepositoryTest.java @@ -1,15 +1,16 @@ package com.sprint.mission.discodeit.repository; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.User; import com.sprint.mission.discodeit.entity.UserStatus; import java.time.Instant; import java.util.List; -import java.util.Optional; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.test.context.ActiveProfiles; @@ -24,59 +25,75 @@ public class UserRepositoryTest { @Autowired private UserStatusRepository userStatusRepository; + @Autowired + private TestEntityManager em; + @Test - @DisplayName("User 생성 시 createdAt 자동 생성") + @DisplayName("User 생성 시 createdAt와 updatedAt은 자동 생성된다") void createUser_shouldSetTimestamps() { - User user = new User("rex", "rex@naver.com", "Rlawnsdn12!", null); - User save = userRepository.save(user); + User user = userRepository.save(new User("test", "test@naver.com", "testPassword12!", null)); + em.flush(); + em.clear(); + + User findUser = userRepository.findById(user.getId()).orElse(null); - assertThat(save.getCreatedAt()).isNotNull(); - assertThat(save.getUpdatedAt()).isNotNull(); + assertThat(findUser.getCreatedAt()).isNotNull(); + assertThat(findUser.getUpdatedAt()).isNotNull(); } @Test - @DisplayName("사용자 저장 및 username으로 조회 성공") - void findByUsername_success() { - User user = new User("rex", "rex@naver.com", "Rlawnsdn12!", null); + @DisplayName("회원의 이름을 통해 DB에 회원이 존재하는지 확인할 수 있다.") + void existsByEmailAndUsername_success() { + User user = new User("junwo", "junwo@email.com", "password123!", null); userRepository.save(user); - Optional findUser = userRepository.findByUsername("rex"); + boolean usernameExists = userRepository.existsByUsername("junwo"); - assertThat(findUser).isPresent(); + assertThat(usernameExists).isTrue(); } - @Test - @DisplayName("existsByEmail, existsByUsername 테스트") - void existsByEmailAndUsername_success() { - // given + @DisplayName("이메일 주소를 통해서 회원이 DB에 존재하는지 확인할 수 있다.") + void existsByEmail_success() { User user = new User("junwo", "junwo@email.com", "password123!", null); userRepository.save(user); - // when boolean emailExists = userRepository.existsByEmail("junwo@email.com"); - boolean usernameExists = userRepository.existsByUsername("junwo"); - // then assertThat(emailExists).isTrue(); - assertThat(usernameExists).isTrue(); } @Test - @DisplayName("사용자와 프로필, 상태까지 함께 조회 (fetch join)") - void findAllWithProfileAndStatus_success() { - // given - User user = new User("junwo", "junwo@email.com", "password123!", null); - userRepository.save(user); + @DisplayName("User 조회 시 Profile, UserStatus가 함께 조회된다") + void findAllProfileAndStatus_success() { + BinaryContent profile = new BinaryContent("userProfile", 10L, ".jpeg"); + User user = userRepository.save(new User("test", "test@naver.com", "testPassword12!", profile)); + UserStatus userStatus = new UserStatus(user, Instant.now()); + em.flush(); + em.clear(); - UserStatus status = new UserStatus(user, Instant.now()); - userStatusRepository.save(status); - - // when List users = userRepository.findAllWithProfileAndStatus(); - // then - assertThat(users).isNotNull(); - assertThat(users.get(0).getStatus()).isNotNull(); // fetch join 확인 + assertThat(users.size()).isEqualTo(1); + User findUser = users.get(0); + assertThat(findUser.getProfile().getId()).isEqualTo(profile.getId()); + assertThat(findUser.getStatus().getId()).isEqualTo(userStatus.getId()); + } + + @Test + @DisplayName("User 삭제 시 UserStatus도 함께 삭제된다") + void userOrphanRemovalTest_success() { + User user = userRepository.save(new User("test", "test@naver.com", "testPassword12!", null)); + UserStatus userStatus = new UserStatus(user, Instant.now()); + em.flush(); + em.clear(); + + userRepository.delete(user); + + em.flush(); + em.clear(); + + List userStatuses = userStatusRepository.findAll(); + assertThat(userStatuses.size()).isEqualTo(0); } } diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java index c43cbb068..fd0fe24b1 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicChannelServiceTest.java @@ -1,13 +1,14 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.dto.data.ChannelDto; +import com.sprint.mission.discodeit.dto.data.UserDto; import com.sprint.mission.discodeit.dto.request.PrivateChannelCreateRequest; import com.sprint.mission.discodeit.dto.request.PublicChannelCreateRequest; import com.sprint.mission.discodeit.dto.request.PublicChannelUpdateRequest; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.ChannelType; +import com.sprint.mission.discodeit.entity.ReadStatus; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.channel.ChannelException; import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; import com.sprint.mission.discodeit.mapper.ChannelMapper; @@ -15,123 +16,194 @@ import com.sprint.mission.discodeit.repository.MessageRepository; import com.sprint.mission.discodeit.repository.ReadStatusRepository; import com.sprint.mission.discodeit.repository.UserRepository; +import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.UUID; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import static org.mockito.ArgumentMatchers.any; -import org.springframework.test.context.ActiveProfiles; - -import static org.mockito.BDDMockito.*; +import static org.mockito.ArgumentMatchers.eq; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.context.annotation.Import; +import org.springframework.test.util.ReflectionTestUtils; -@ActiveProfiles("dev") +@Import(BasicChannelService.class) @ExtendWith(MockitoExtension.class) public class BasicChannelServiceTest { - @Mock private ChannelRepository channelRepository; @Mock + private ChannelMapper channelMapper; + @Mock private ReadStatusRepository readStatusRepository; @Mock private MessageRepository messageRepository; @Mock private UserRepository userRepository; - @Mock - private ChannelMapper channelMapper; @InjectMocks private BasicChannelService channelService; @Test - @DisplayName("성공 - 공개 채널 생성") - void createPublicChannel_success() { - PublicChannelCreateRequest request = new PublicChannelCreateRequest("공지방", "안내용"); - Channel channel = new Channel(ChannelType.PUBLIC, "공지방", "안내용"); - ChannelDto dto = new ChannelDto(UUID.randomUUID(), ChannelType.PUBLIC, "공지방", "안내용", null, - null); + @DisplayName("공개 채널 생성 시 이름과 설명으로 생성된다") + void createPublicChannel() { + PublicChannelCreateRequest request = new PublicChannelCreateRequest("test", "desc"); + Channel channel = new Channel(ChannelType.PUBLIC, "test", "desc"); - given(channelRepository.save(any())).willReturn(channel); - given(channelMapper.toDto(any())).willReturn(dto); + when(channelRepository.save(any())).thenReturn(channel); + when(channelMapper.toDto(any())).thenReturn( + new ChannelDto(channel.getId(), channel.getType(), channel.getName(), channel.getDescription(), null, null)); ChannelDto result = channelService.create(request); - assertThat(result.name()).isEqualTo("공지방"); - then(channelRepository).should().save(any()); + assertThat(result.name()).isEqualTo("test"); + verify(channelRepository).save(any()); } @Test - @DisplayName("성공 - 개인 채널 생성") - void createPrivateChannel_success() { - List users = List.of(UUID.randomUUID(), UUID.randomUUID()); - PrivateChannelCreateRequest request = new PrivateChannelCreateRequest(users); + @DisplayName("개인 채널 생성 시 참여자에 대한 ReadStatus도 생성된다") + void createPrivateChannel() { + List userIds = List.of(UUID.randomUUID(), UUID.randomUUID()); + PrivateChannelCreateRequest request = new PrivateChannelCreateRequest(userIds); Channel channel = new Channel(ChannelType.PRIVATE, null, null); - ChannelDto dto = new ChannelDto(UUID.randomUUID(), ChannelType.PRIVATE, null, null, null, null); - given(channelRepository.save(any())).willReturn(channel); - given(userRepository.findAllById(users)).willReturn( - users.stream().map(id -> new User("user", "email", "pw", null)).toList() - ); - given(readStatusRepository.saveAll(any())).willReturn(List.of()); - given(channelMapper.toDto(any())).willReturn(dto); + List users = userIds.stream().map(id -> { + User u = new User("u", "e@e.com", "pass", null); + ReflectionTestUtils.setField(u, "id", id); + return u; + }).toList(); + + List participants = userIds.stream().map(id -> + new UserDto(id, "u", "e@e.com", null, null) + ).toList(); + + when(channelRepository.save(any())).thenReturn(channel); + when(userRepository.findAllById(userIds)).thenReturn(users); + when(readStatusRepository.saveAll(any())).thenAnswer(inv -> inv.getArgument(0)); + when(channelMapper.toDto(any())).thenReturn( + new ChannelDto(channel.getId(), channel.getType(), null, null, participants, null)); ChannelDto result = channelService.create(request); - assertThat(result.type()).isEqualTo(ChannelType.PRIVATE); - then(readStatusRepository).should().saveAll(any()); + assertThat(result).isNotNull(); + verify(readStatusRepository).saveAll(any()); } @Test - @DisplayName("실패 - 채널 조회") - void findChannel_fail_notFound() { - UUID channelId = UUID.randomUUID(); - given(channelRepository.findById(channelId)).willReturn(Optional.empty()); + @DisplayName("존재하지 않는 채널 ID로 조회하면 예외가 발생한다") + void findChannel_notFound() { + UUID id = UUID.randomUUID(); + when(channelRepository.findById(id)).thenReturn(Optional.empty()); - assertThatThrownBy(() -> channelService.find(channelId)) - .isInstanceOf(ChannelNotFoundException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); + assertThatThrownBy(() -> channelService.find(id)) + .isInstanceOf(ChannelNotFoundException.class); } @Test - @DisplayName("실패 - 개인 채널은 수정 불가") - void updateChannel_fail_privateChannel() { + @DisplayName("사용자의 참여 채널과 공개 채널을 모두 조회할 수 있다") + void findAllByUserId_success_withMultipleChannels() { + UUID userId = UUID.randomUUID(); + + Channel publicChannel1 = new Channel(ChannelType.PUBLIC, "Public1", "Desc1"); + Channel publicChannel2 = new Channel(ChannelType.PUBLIC, "Public2", "Desc2"); + Channel privateChannel = new Channel(ChannelType.PRIVATE, null, null); + + ReadStatus status = new ReadStatus(new User("test", "test@naver.com", "Testpass1234!", null), privateChannel, Instant.now()); + + List allChannels = List.of(publicChannel1, publicChannel2, privateChannel); + + when(readStatusRepository.findAllByUserId(userId)).thenReturn(List.of(status)); + when(channelRepository.findAllByTypeOrIdIn(eq(ChannelType.PUBLIC), any())).thenReturn(allChannels); + + when(channelMapper.toDto(publicChannel1)) + .thenReturn(new ChannelDto(publicChannel1.getId(), ChannelType.PUBLIC,"Public1", "Desc1", null, null)); + when(channelMapper.toDto(publicChannel2)) + .thenReturn(new ChannelDto(publicChannel2.getId(), ChannelType.PUBLIC,"Public2", "Desc2", null, null)); + when(channelMapper.toDto(privateChannel)) + .thenReturn(new ChannelDto(privateChannel.getId(), ChannelType.PRIVATE,null, null, null , null)); + + List result = channelService.findAllByUserId(userId); + + assertThat(result).hasSize(3); + assertThat(result) + .extracting(ChannelDto::type) + .containsExactlyInAnyOrder(ChannelType.PUBLIC, ChannelType.PUBLIC, ChannelType.PRIVATE); + } + + + @Test + @DisplayName("공개 채널 수정 성공") + void updatePublicChannel() { + UUID id = UUID.randomUUID(); + PublicChannelUpdateRequest request = new PublicChannelUpdateRequest("newName", "newDesc"); + Channel channel = new Channel(ChannelType.PUBLIC, "old", "desc"); + + when(channelRepository.findById(id)).thenReturn(Optional.of(channel)); + when(channelMapper.toDto(any())).thenReturn( + new ChannelDto(id, ChannelType.PUBLIC, "newName", "newDesc", null, null)); + + ChannelDto result = channelService.update(id, request); + + assertThat(result.name()).isEqualTo("newName"); + verify(channelRepository).findById(id); + } + + @Test + @DisplayName("존재하지 않는 채널은 업데이트 할 수 없다") + void updateChannel_notFound() { UUID channelId = UUID.randomUUID(); - Channel channel = new Channel(ChannelType.PRIVATE, null, null); - PublicChannelUpdateRequest request = new PublicChannelUpdateRequest("newChannel", "hello"); + PublicChannelUpdateRequest request = new PublicChannelUpdateRequest("newName", "newDescription"); - given(channelRepository.findById(channelId)).willReturn(Optional.of(channel)); + when(channelRepository.findById(channelId)).thenReturn(Optional.empty()); assertThatThrownBy(() -> channelService.update(channelId, request)) - .isInstanceOf(ChannelException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_MODIFY_PRIVATE_CHANNEL); + .isInstanceOf(ChannelNotFoundException.class); + + verifyNoMoreInteractions(channelMapper); } + @Test - @DisplayName("성공 - 채널 삭제") - void deleteChannel_success() { - UUID channelId = UUID.randomUUID(); - given(channelRepository.existsById(channelId)).willReturn(true); + @DisplayName("개인 채널은 수정할 수 없고 예외를 발생시킨다") + void updatePrivateChannel() { + UUID id = UUID.randomUUID(); + PublicChannelUpdateRequest request = new PublicChannelUpdateRequest("name", "desc"); + Channel channel = new Channel(ChannelType.PRIVATE, null, null); - channelService.delete(channelId); + when(channelRepository.findById(id)).thenReturn(Optional.of(channel)); - then(messageRepository).should().deleteAllByChannelId(channelId); - then(readStatusRepository).should().deleteAllByChannelId(channelId); - then(channelRepository).should().deleteById(channelId); + assertThatThrownBy(() -> channelService.update(id, request)) + .isInstanceOf(ChannelException.class); } @Test - @DisplayName("실패 - 채널 삭제") - void deleteChannel_fail_notFound() { - UUID channelId = UUID.randomUUID(); - given(channelRepository.existsById(channelId)).willReturn(false); + @DisplayName("존재하지 않는 채널 삭제 시 예외가 발생한다") + void deleteChannel_notFound() { + UUID id = UUID.randomUUID(); + when(channelRepository.existsById(id)).thenReturn(false); + + assertThatThrownBy(() -> channelService.delete(id)) + .isInstanceOf(ChannelNotFoundException.class); + } + + @Test + @DisplayName("채널 삭제 시 메시지와 읽기 상태도 함께 삭제된다") + void deleteChannel_cascadesRelatedEntities() { + UUID id = UUID.randomUUID(); + when(channelRepository.existsById(id)).thenReturn(true); + + channelService.delete(id); - assertThatThrownBy(() -> channelService.delete(channelId)) - .isInstanceOf(ChannelNotFoundException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); + verify(messageRepository).deleteAllByChannelId(id); + verify(readStatusRepository).deleteAllByChannelId(id); + verify(channelRepository).deleteById(id); } } diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java index f57838192..00b3cd8df 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicMessageServiceTest.java @@ -6,13 +6,14 @@ import com.sprint.mission.discodeit.dto.request.MessageCreateRequest; import com.sprint.mission.discodeit.dto.request.MessageUpdateRequest; import com.sprint.mission.discodeit.dto.response.PageResponse; +import com.sprint.mission.discodeit.entity.BinaryContent; import com.sprint.mission.discodeit.entity.Channel; import com.sprint.mission.discodeit.entity.ChannelType; import com.sprint.mission.discodeit.entity.Message; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.channel.ChannelNotFoundException; import com.sprint.mission.discodeit.exception.message.MessageNotFoundException; +import com.sprint.mission.discodeit.exception.user.UserNotFoundException; import com.sprint.mission.discodeit.mapper.MessageMapper; import com.sprint.mission.discodeit.mapper.PageResponseMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; @@ -24,37 +25,37 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentMatchers; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.then; import org.mockito.InjectMocks; import org.mockito.Mock; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.context.annotation.Import; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.domain.SliceImpl; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.util.ReflectionTestUtils; -@ActiveProfiles("dev") +@Import(BasicMessageService.class) @ExtendWith(MockitoExtension.class) public class BasicMessageServiceTest { - + @Mock + private MessageRepository messageRepository; @Mock private ChannelRepository channelRepository; @Mock private UserRepository userRepository; @Mock - private MessageRepository messageRepository; - @Mock private MessageMapper messageMapper; @Mock private BinaryContentStorage binaryContentStorage; @@ -66,120 +67,190 @@ public class BasicMessageServiceTest { private BasicMessageService messageService; @Test - @DisplayName("성공 - 메시지 생성") - void createMessage_success() { + @DisplayName("메시지 생성 성공 - 첨부파일 없음") + void createMessage_withoutAttachment() { UUID channelId = UUID.randomUUID(); - UUID userId = UUID.randomUUID(); - String content = "Hello World"; - - MessageCreateRequest request = new MessageCreateRequest(content, channelId, userId); - BinaryContentCreateRequest binaryContentCreateRequest = new BinaryContentCreateRequest( - "file.txt", "text/plain", new byte[]{1, 2}); - Channel channel = new Channel(ChannelType.PUBLIC, "공개 채널", "공개 채널입니다."); - User user = new User("user", "user@naver.com", "Rlawnsdn12!", null); - UserDto userDto = new UserDto(UUID.randomUUID(), user.getUsername(), user.getEmail(), null, - true); - Message message = new Message(content, channel, user, List.of()); - MessageDto messageDto = new MessageDto(UUID.randomUUID(), Instant.now(), Instant.now(), content, - channelId, userDto, null); - - given(channelRepository.findById(channelId)).willReturn(Optional.of(channel)); - given(userRepository.findById(userId)).willReturn(Optional.of(user)); - given(messageRepository.save(any())).willReturn(message); - given(messageMapper.toDto(any())).willReturn(messageDto); - - MessageDto result = messageService.create(request, List.of(binaryContentCreateRequest)); - - assertThat(result.content()).isEqualTo("Hello World"); - then(messageRepository).should().save(any()); + UUID authorId = UUID.randomUUID(); + UUID messageId = UUID.randomUUID(); + + MessageCreateRequest request = new MessageCreateRequest("Hello", channelId, authorId); + Channel channel = new Channel(ChannelType.PUBLIC, "test", "desc"); + User user = new User("junwo", "email", "pass", null); + ReflectionTestUtils.setField(user, "id", authorId); + + when(channelRepository.findById(channelId)).thenReturn(Optional.of(channel)); + when(userRepository.findById(authorId)).thenReturn(Optional.of(user)); + + UserDto userDto = new UserDto(user.getId(), user.getUsername(), user.getEmail(), null, null); + Message message = new Message("Hello", channel, user, List.of()); + ReflectionTestUtils.setField(message, "id", messageId); + when(messageRepository.save(any())).thenReturn(message); + when(messageMapper.toDto(any())).thenReturn( + new MessageDto(message.getId(), Instant.now(), Instant.now(), message.getContent(), + message.getChannel().getId(), userDto, null)); + + MessageDto result = messageService.create(request, List.of()); + + assertThat(result).isNotNull(); + verify(binaryContentRepository, never()).save(any()); + verify(binaryContentStorage, never()).put(any(), any()); } @Test - @DisplayName("실패 - 채널이 존재하지 않음") - void createMessage_fail_channelNotFound() { + @DisplayName("메시지 생성 성공 - 첨부파일 포함") + void createMessage_withAttachment_success() { + // given UUID channelId = UUID.randomUUID(); - UUID userId = UUID.randomUUID(); - MessageCreateRequest request = new MessageCreateRequest("Hello World", channelId, userId); + UUID authorId = UUID.randomUUID(); + UUID messageId = UUID.randomUUID(); + String content = "Hello with attachment"; + + byte[] dummyBytes = "fake-image-bytes".getBytes(); + BinaryContentCreateRequest attachmentRequest = new BinaryContentCreateRequest( + "image.png", "image/png", dummyBytes + ); + + MessageCreateRequest request = new MessageCreateRequest(content, channelId, authorId); + Channel channel = new Channel(ChannelType.PUBLIC, "test", "desc"); + User author = new User("junwo", "email", "pass", null); + ReflectionTestUtils.setField(author, "id", authorId); + + BinaryContent binaryContent = new BinaryContent("image.png", (long) dummyBytes.length, "image/png"); + UUID attachmentId = UUID.randomUUID(); + ReflectionTestUtils.setField(binaryContent, "id", attachmentId); - given(channelRepository.findById(channelId)).willReturn(Optional.empty()); + Message message = new Message(content, channel, author, List.of(binaryContent)); + ReflectionTestUtils.setField(message, "id", messageId); + + UserDto userDto = new UserDto(author.getId(), author.getUsername(), author.getEmail(), null, null); + + // when + when(channelRepository.findById(channelId)).thenReturn(Optional.of(channel)); + when(userRepository.findById(authorId)).thenReturn(Optional.of(author)); + when(binaryContentRepository.save(any())).thenReturn(binaryContent); + when(messageRepository.save(any())).thenReturn(message); + when(messageMapper.toDto(any())).thenReturn( + new MessageDto(message.getId(), Instant.now(), Instant.now(), message.getContent(), + message.getChannel().getId(), userDto, List.of()) + ); + + MessageDto result = messageService.create(request, List.of(attachmentRequest)); + + assertThat(result).isNotNull(); + verify(binaryContentRepository).save(any()); + verify(binaryContentStorage).put(any(), any()); + } + + @Test + @DisplayName("메시지 생성 실패 - 존재하지 않는 채널") + void createMessage_channelNotFound() { + UUID channelId = UUID.randomUUID(); + UUID authorId = UUID.randomUUID(); + MessageCreateRequest request = new MessageCreateRequest("Hello", channelId, authorId); + + when(channelRepository.findById(channelId)).thenReturn(Optional.empty()); assertThatThrownBy(() -> messageService.create(request, List.of())) - .isInstanceOf(ChannelNotFoundException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_CHANNEL); + .isInstanceOf(ChannelNotFoundException.class); } @Test - @DisplayName("성공 - 메시지 수정") - void updateMessage_success() { + @DisplayName("메시지 생성 실패 - 존재하지 않는 작성자") + void createMessage_authorNotFound() { + UUID channelId = UUID.randomUUID(); + UUID authorId = UUID.randomUUID(); + MessageCreateRequest request = new MessageCreateRequest("Hello", channelId, authorId); + Channel channel = new Channel(ChannelType.PUBLIC, "test", "desc"); + + when(channelRepository.findById(channelId)).thenReturn(Optional.of(channel)); + when(userRepository.findById(authorId)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> messageService.create(request, List.of())) + .isInstanceOf(UserNotFoundException.class); + } + + + @Test + @DisplayName("메시지 조회 성공") + void findMessage_success() { UUID messageId = UUID.randomUUID(); Message message = mock(Message.class); - MessageUpdateRequest request = new MessageUpdateRequest("New Content"); - MessageDto messageDto = new MessageDto(messageId, Instant.now(), Instant.now(), - request.newContent(), UUID.randomUUID(), null, null); + when(messageRepository.findById(messageId)).thenReturn(Optional.of(message)); + when(messageMapper.toDto(any())).thenReturn(mock(MessageDto.class)); - given(messageRepository.findById(messageId)).willReturn(Optional.of(message)); - given(messageMapper.toDto(any())).willReturn(messageDto); + MessageDto result = messageService.find(messageId); + assertThat(result).isNotNull(); + } - MessageDto update = messageService.update(messageId, request); + @Test + @DisplayName("메시지가 존재하지 않으면 조회할 수 없습니다") + void findMessage_notFound() { + UUID messageId = UUID.randomUUID(); + when(messageRepository.findById(messageId)).thenReturn(Optional.empty()); - assertThat(update.content()).isEqualTo("New Content"); - then(message).should().update(any()); + assertThatThrownBy(() -> messageService.find(messageId)) + .isInstanceOf(MessageNotFoundException.class); } @Test - @DisplayName("실패 - 메시지 없음") - void updateMessage_fail_notFound() { - UUID messageId = UUID.randomUUID(); - MessageUpdateRequest request = new MessageUpdateRequest("New Content"); + @DisplayName("특정 채널에 작성된 메시지 목록을 조회할 수 있습니다") + void findAllByChannelId_success() { + UUID channelId = UUID.randomUUID(); + Pageable pageable = PageRequest.of(0, 5); + Slice slice = new SliceImpl<>(List.of(mock(Message.class))); - given(messageRepository.findById(messageId)).willReturn(Optional.empty()); + when(messageRepository.findAllByChannelIdWithAuthor(eq(channelId), any(), eq(pageable))).thenReturn(slice); + when(messageMapper.toDto(any())).thenReturn(mock(MessageDto.class)); + when(pageResponseMapper.fromSlice(any(), any())).thenReturn(mock(PageResponse.class)); - assertThatThrownBy(() -> messageService.update(messageId, request)) - .isInstanceOf(MessageNotFoundException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_MESSAGE); + PageResponse result = messageService.findAllByChannelId(channelId, null, pageable); + + assertThat(result).isNotNull(); } @Test - @DisplayName("성공 - 메시지 삭제") - void deleteMessage_success() { + @DisplayName("메시지 업데이트 성공") + void updateMessage_success() { UUID messageId = UUID.randomUUID(); - given(messageRepository.existsById(messageId)).willReturn(true); + MessageUpdateRequest request = new MessageUpdateRequest("updated content"); + Message message = mock(Message.class); - messageService.delete(messageId); + when(messageRepository.findById(messageId)).thenReturn(Optional.of(message)); + when(messageMapper.toDto(any())).thenReturn(mock(MessageDto.class)); - then(messageRepository).should().deleteById(any()); + MessageDto result = messageService.update(messageId, request); + assertThat(result).isNotNull(); + verify(message).update("updated content"); } @Test - @DisplayName("실패 - 삭제하려는 메시지가 없음") - void deleteMessage_fail_notFound() { + @DisplayName("메시지를 찾을 수 없다면 업데이트를 할 수 없습니다") + void updateMessage_notFound() { UUID messageId = UUID.randomUUID(); - given(messageRepository.existsById(messageId)).willReturn(false); + MessageUpdateRequest request = new MessageUpdateRequest("update"); + when(messageRepository.findById(messageId)).thenReturn(Optional.empty()); - assertThatThrownBy(() -> messageService.delete(messageId)) - .isInstanceOf(MessageNotFoundException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_MESSAGE); + assertThatThrownBy(() -> messageService.update(messageId, request)) + .isInstanceOf(MessageNotFoundException.class); } @Test - @DisplayName("성공 - 채널 메시지 목록 조회") - void findAllByChannelId_success() { - UUID channelId = UUID.randomUUID(); - Instant cursor = Instant.now(); - Pageable pageable = PageRequest.of(0, 10); - Message message = mock(Message.class); - MessageDto dto = mock(MessageDto.class); - - Slice slice = new SliceImpl<>(List.of(message), pageable, false); - Slice dtoSlice = new SliceImpl<>(List.of(dto), pageable, false); - PageResponse response = new PageResponse<>(List.of(dto), null, 1, false, 0L); + @DisplayName("메시지 삭제 성공") + void deleteMessage_success() { + UUID messageId = UUID.randomUUID(); + when(messageRepository.existsById(messageId)).thenReturn(true); - given(messageRepository.findAllByChannelIdWithAuthor(eq(channelId), any(), eq(pageable))).willReturn(slice); - given(messageMapper.toDto(any())).willReturn(dto); - given(pageResponseMapper.fromSlice(ArgumentMatchers.>any(), any())).willReturn(response); + messageService.delete(messageId); + verify(messageRepository).deleteById(messageId); + } - PageResponse result = messageService.findAllByChannelId(channelId, cursor, pageable); + @Test + @DisplayName("메시지가 존재하지 않으면 삭제할 수 없습니다") + void deleteMessage_notFound() { + UUID messageId = UUID.randomUUID(); + when(messageRepository.existsById(messageId)).thenReturn(false); - assertThat(result.content()).isNotNull(); + assertThatThrownBy(() -> messageService.delete(messageId)) + .isInstanceOf(MessageNotFoundException.class); } } diff --git a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java index ef2415eb1..b5ec1b629 100644 --- a/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java +++ b/src/test/java/com/sprint/mission/discodeit/service/basic/BasicUserServiceTest.java @@ -1,132 +1,317 @@ package com.sprint.mission.discodeit.service.basic; import com.sprint.mission.discodeit.dto.data.UserDto; +import com.sprint.mission.discodeit.dto.request.BinaryContentCreateRequest; import com.sprint.mission.discodeit.dto.request.UserCreateRequest; import com.sprint.mission.discodeit.dto.request.UserUpdateRequest; import com.sprint.mission.discodeit.entity.User; -import com.sprint.mission.discodeit.exception.ErrorCode; import com.sprint.mission.discodeit.exception.user.UserAlreadyExistException; import com.sprint.mission.discodeit.exception.user.UserNotFoundException; import com.sprint.mission.discodeit.mapper.UserMapper; import com.sprint.mission.discodeit.repository.BinaryContentRepository; import com.sprint.mission.discodeit.repository.UserRepository; import com.sprint.mission.discodeit.storage.BinaryContentStorage; +import java.util.List; import java.util.Optional; import java.util.UUID; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.*; +import static org.mockito.ArgumentMatchers.anyString; import org.mockito.InjectMocks; import org.mockito.Mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.context.annotation.Import; +import org.springframework.test.util.ReflectionTestUtils; -@ActiveProfiles("dev") +@Import(BasicUserService.class) @ExtendWith(MockitoExtension.class) public class BasicUserServiceTest { @Mock private UserRepository userRepository; - @Mock private UserMapper userMapper; - @Mock private BinaryContentRepository binaryContentRepository; - @Mock private BinaryContentStorage binaryContentStorage; - @InjectMocks private BasicUserService userService; @Test - @DisplayName("성공 - 유저 생성") - void createUser_success() { - UserCreateRequest request = new UserCreateRequest("rex", "rex@naver.com", "Rlawnsdn12!"); - User user = new User(request.username(), request.email(), request.password(), null); - UserDto userDto = new UserDto(UUID.randomUUID(), "rex", "rex@naver.com", null, true); + @DisplayName("프로필 없이 회원을 생성합니다") + void createUser_withoutProfile() { + //given + UserCreateRequest request = new UserCreateRequest("junwo", "junwo@email.com", "password123"); + + when(userRepository.existsByEmail(anyString())).thenReturn(false); + when(userRepository.existsByUsername(anyString())).thenReturn(false); - given(userRepository.existsByEmail(request.email())).willReturn(false); - given(userRepository.existsByUsername(request.username())).willReturn(false); - given(userRepository.save(any(User.class))).willReturn(user); - given(userMapper.toDto(any())).willReturn(userDto); + User user = new User("junwo", "junwo@email.com", "password123", null); + when(userRepository.save(any())).thenReturn(user); + when(userMapper.toDto(any())).thenReturn( + new UserDto(user.getId(), user.getUsername(), user.getEmail(), null, null) + ); + //when UserDto result = userService.create(request, Optional.empty()); - assertThat(result.username()).isEqualTo("rex"); - then(userRepository).should(times(1)).save(any()); + //then + assertThat(result).isNotNull(); + assertThat(result.username()).isEqualTo("junwo"); + + verify(binaryContentRepository, never()).save(any()); + verify(binaryContentStorage, never()).put(any(), any()); } @Test - @DisplayName("실패 - 중복된 이메일로 유저 생성") - void createUser_fail_duplicateEmail() { - UserCreateRequest request = new UserCreateRequest("rex", "rex@naver.com", "Rlawnsdn12!"); - given(userRepository.existsByEmail(request.email())).willReturn(true); + @DisplayName("프로필과 함께 회원을 생성합니다") + void createUser_withProfile() { + // given + UserCreateRequest request = new UserCreateRequest("junwo", "junwo@email.com", "password123"); + + when(userRepository.existsByEmail(anyString())).thenReturn(false); + when(userRepository.existsByUsername(anyString())).thenReturn(false); + + User user = new User("junwo", "junwo@email.com", "password123", null); + when(userRepository.save(any())).thenReturn(user); + when(userMapper.toDto(any())).thenReturn( + new UserDto(user.getId(), user.getUsername(), user.getEmail(), null, null) + ); + + byte[] dummyBytes = "fake-image-bytes".getBytes(); + BinaryContentCreateRequest profileRequest = new BinaryContentCreateRequest( + "profile.jpg", "image/jpeg", dummyBytes + ); + + // when + UserDto result = userService.create(request, Optional.of(profileRequest)); + + // then + assertThat(result).isNotNull(); + assertThat(result.username()).isEqualTo("junwo"); + + verify(binaryContentRepository).save(any()); + verify(binaryContentStorage).put(any(), any()); + } + + @Test + @DisplayName("회원 생성 시 중복된 이메일이 존재하면 저장에 실패합니다") + void createUser_duplicateEmail() { + UserCreateRequest request = new UserCreateRequest("junwo", "junwo@email.com", "password123"); + + when(userRepository.existsByEmail("junwo@email.com")).thenReturn(true); assertThatThrownBy(() -> userService.create(request, Optional.empty())) - .isInstanceOf(UserAlreadyExistException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.DUPLICATE_EMAIL); + .isInstanceOf(UserAlreadyExistException.class); + + verify(userRepository, never()).save(any()); } @Test - @DisplayName("성공 - 유저 삭제") - void deleteUser_success() { + @DisplayName("회원 생성 시 중복된 회원 이름이 존재하면 저장에 실패합니다") + void createUser_duplicateUsername() { + UserCreateRequest request = new UserCreateRequest("junwo", "junwo@email.com", "password123"); + + when(userRepository.existsByUsername("junwo")).thenReturn(true); + + assertThatThrownBy(() -> userService.create(request, Optional.empty())) + .isInstanceOf(UserAlreadyExistException.class); + + verify(userRepository, never()).save(any()); + } + + @Test + @DisplayName("회원 조회 성공") + void findUser_success() { + // given UUID userId = UUID.randomUUID(); - given(userRepository.existsById(userId)).willReturn(true); + User user = new User("junwo", "junwo@email.com", "password123", null); + ReflectionTestUtils.setField(user, "id", userId); - userService.delete(userId); + UserDto userDto = new UserDto(userId, user.getUsername(), user.getEmail(), null, null); - then(userRepository).should().deleteById(userId); + when(userRepository.findById(userId)).thenReturn(Optional.of(user)); + when(userMapper.toDto(user)).thenReturn(userDto); + + // when + UserDto result = userService.find(userId); + + // then + assertThat(result).isNotNull(); + assertThat(result.id()).isEqualTo(userId); + assertThat(result.username()).isEqualTo("junwo"); } @Test - @DisplayName("실패 - 존재하지 않는 유저") - void deleteUser_fail_notfound() { + @DisplayName("회원 조회 실패 - 존재하지 않는 사용자") + void findUser_notFound() { UUID userId = UUID.randomUUID(); - given(userRepository.existsById(userId)).willReturn(false); - assertThatThrownBy(() -> userService.delete(userId)) - .isInstanceOf(UserNotFoundException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.CANNOT_FOUND_USER); + when(userRepository.findById(userId)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> userService.find(userId)) + .isInstanceOf(UserNotFoundException.class); + } + + @Test + @DisplayName("전체 회원 목록 조회 성공") + void findAllUsers() { + // given + User user1 = new User("junwo", "junwo@email.com", "pass1", null); + User user2 = new User("mina", "mina@email.com", "pass2", null); + + UUID id1 = UUID.randomUUID(); + UUID id2 = UUID.randomUUID(); + + ReflectionTestUtils.setField(user1, "id", id1); + ReflectionTestUtils.setField(user2, "id", id2); + + when(userRepository.findAllWithProfileAndStatus()).thenReturn(List.of(user1, user2)); + when(userMapper.toDto(user1)).thenReturn(new UserDto(id1, "junwo", "junwo@email.com", null, null)); + when(userMapper.toDto(user2)).thenReturn(new UserDto(id2, "mina", "mina@email.com", null, null)); + + // when + List result = userService.findAll(); + + // then + assertThat(result).hasSize(2); + assertThat(result).extracting("username").containsExactly("junwo", "mina"); + } + + @Test + @DisplayName("회원 수정 - 프로필 없이 성공") + void updateUser_withoutProfile() { + // given + UUID userId = UUID.randomUUID(); + User user = new User("oldName", "old@email.com", "oldPassword", null); + ReflectionTestUtils.setField(user, "id", userId); + + UserUpdateRequest request = new UserUpdateRequest("newName", "new@email.com", "newPassword"); + + when(userRepository.findById(userId)).thenReturn(Optional.of(user)); + when(userRepository.existsByEmail("new@email.com")).thenReturn(false); + when(userRepository.existsByUsername("newName")).thenReturn(false); + when(userMapper.toDto(any())).thenReturn(new UserDto(userId, "newName", "new@email.com", null, null)); + + // when + UserDto result = userService.update(userId, request, Optional.empty()); + + // then + assertThat(result).isNotNull(); + assertThat(result.username()).isEqualTo("newName"); + + verify(binaryContentRepository, never()).save(any()); + verify(binaryContentStorage, never()).put(any(), any()); } @Test - @DisplayName("성공 - 유저 업데이트") - void updateUser_success() { + @DisplayName("회원 수정 - 프로필 포함 성공") + void updateUser_withProfile_success() { + // given UUID userId = UUID.randomUUID(); - UserUpdateRequest request = new UserUpdateRequest("newRex", "newRex@naver.com", "TestRex123!"); - User user = mock(User.class); + User user = new User("oldName", "old@email.com", "oldPassword", null); + ReflectionTestUtils.setField(user, "id", userId); - given(userRepository.findById(userId)).willReturn(Optional.of(user)); - given(userRepository.existsByEmail(request.newEmail())).willReturn(false); - given(userRepository.existsByUsername(request.newUsername())).willReturn(false); - given(userMapper.toDto(user)).willReturn( - new UserDto(userId, request.newUsername(), request.newEmail(), null, true)); + byte[] profileBytes = "test-image".getBytes(); + BinaryContentCreateRequest profileRequest = new BinaryContentCreateRequest("profile.png", "image/png", profileBytes); - UserDto update = userService.update(userId, request, Optional.empty()); + UserUpdateRequest request = new UserUpdateRequest("newName", "new@email.com", "newPassword"); - assertThat(update.username()).isEqualTo("newRex"); - then(user).should().update("newRex", "newRex@naver.com", "TestRex123!", null); + when(userRepository.findById(userId)).thenReturn(Optional.of(user)); + when(userRepository.existsByEmail("new@email.com")).thenReturn(false); + when(userRepository.existsByUsername("newName")).thenReturn(false); + when(userMapper.toDto(any())).thenReturn(new UserDto(userId, "newName", "new@email.com", null, null)); + + // when + UserDto result = userService.update(userId, request, Optional.of(profileRequest)); + + // then + assertThat(result).isNotNull(); + assertThat(result.username()).isEqualTo("newName"); + + verify(binaryContentRepository).save(any()); + verify(binaryContentStorage).put(any(), any()); } @Test - @DisplayName("실패 - 유저 업데이트 중 중복 이름") - void updateUser_fail_duplicateName() { + @DisplayName("중복된 이메일로는 업데이트 할 수 없습니다") + void updateUser_duplicateEmail() { + // given UUID userId = UUID.randomUUID(); - UserUpdateRequest request = new UserUpdateRequest("newRex", "newRex@naver.com", "TestRex123!"); - User oldUser = new User("rex", "rex@naver.com", "Rlawnsdn12!", null); + User user = new User("oldName", "old@email.com", "oldPassword", null); + ReflectionTestUtils.setField(user, "id", userId); - given(userRepository.findById(userId)).willReturn(Optional.of(oldUser)); - given(userRepository.existsByEmail(request.newEmail())).willReturn(false); - given(userRepository.existsByUsername(request.newUsername())).willReturn(true); + UserUpdateRequest request = new UserUpdateRequest("newName", "dupe@email.com", "newPassword"); + when(userRepository.findById(userId)).thenReturn(Optional.of(user)); + when(userRepository.existsByEmail("dupe@email.com")).thenReturn(true); + + // when + then assertThatThrownBy(() -> userService.update(userId, request, Optional.empty())) - .isInstanceOf(UserAlreadyExistException.class) - .hasFieldOrPropertyWithValue("errorCode", ErrorCode.DUPLICATE_NAME); + .isInstanceOf(UserAlreadyExistException.class); + } + + @Test + @DisplayName("중복된 회원 이름으로는 업데이트 할 수 없습니다") + void updateUser_duplicateUsername() { + // given + UUID userId = UUID.randomUUID(); + User user = new User("oldName", "old@email.com", "oldPassword", null); + ReflectionTestUtils.setField(user, "id", userId); + + UserUpdateRequest request = new UserUpdateRequest("newName", "dupe@email.com", "newPassword"); + + when(userRepository.findById(userId)).thenReturn(Optional.of(user)); + when(userRepository.existsByUsername("newName")).thenReturn(true); + + // when + then + assertThatThrownBy(() -> userService.update(userId, request, Optional.empty())) + .isInstanceOf(UserAlreadyExistException.class); + } + + @Test + @DisplayName("회원 수정 실패 - 사용자 없음") + void updateUser_userNotFound() { + UUID userId = UUID.randomUUID(); + UserUpdateRequest request = new UserUpdateRequest("newName", "new@email.com", "newPassword"); + + when(userRepository.findById(userId)).thenReturn(Optional.empty()); + + assertThatThrownBy(() -> userService.update(userId, request, Optional.empty())) + .isInstanceOf(UserNotFoundException.class); + } + + @Test + @DisplayName("회원 삭제 - 성공") + void deleteUser_success() { + // given + UUID userId = UUID.randomUUID(); + + when(userRepository.existsById(userId)).thenReturn(true); + + // when + userService.delete(userId); + + verify(userRepository).deleteById(userId); + } + + @Test + @DisplayName("회원 삭제 - 실패 (존재하지 않는 사용자)") + void deleteUser_userNotFound_fail() { + UUID userId = UUID.randomUUID(); + when(userRepository.existsById(userId)).thenReturn(false); + + assertThatThrownBy(() -> userService.delete(userId)) + .isInstanceOf(UserNotFoundException.class); + + verify(userRepository, never()).deleteById(userId); } -} +} \ No newline at end of file From ad44fae8da6fb7c2cc9f26115fc36aaae08fec69 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 13:25:17 +0900 Subject: [PATCH 109/115] =?UTF-8?q?:recycle:=20=EC=BB=A4=EB=B0=8B=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sprint/mission/discodeit/repository/MessageRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index ac649b75f..c21028b3a 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -22,6 +22,7 @@ Slice findAllByChannelIdWithAuthor(@Param("channelId") UUID channelId, Pageable pageable); + @Query("SELECT m.createdAt " + "FROM Message m " + "WHERE m.channel.id = :channelId " From 114e27d6e899cd8656a63ca2fd9cc2d7543b4713 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 13:33:31 +0900 Subject: [PATCH 110/115] =?UTF-8?q?:white=5Fcheck=5Fmark:=20Git=20Action?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sprint/mission/discodeit/repository/MessageRepository.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index c21028b3a..8fba98dc5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -21,8 +21,6 @@ Slice findAllByChannelIdWithAuthor(@Param("channelId") UUID channelId, @Param("createdAt") Instant createdAt, Pageable pageable); - - @Query("SELECT m.createdAt " + "FROM Message m " + "WHERE m.channel.id = :channelId " From 39d4c580e67da4c2f76145023667b6f7f0b0bf81 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 13:37:27 +0900 Subject: [PATCH 111/115] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=EB=8F=99?= =?UTF-8?q?=EB=90=98=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sprint/mission/discodeit/repository/MessageRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index 8fba98dc5..d865c0611 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -11,7 +11,6 @@ import org.springframework.data.repository.query.Param; public interface MessageRepository extends JpaRepository { - @Query("SELECT m FROM Message m " + "LEFT JOIN FETCH m.author a " + "JOIN FETCH a.status " From fc0073341496e4fe4267fe50aa90a1322902084d Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 13:42:25 +0900 Subject: [PATCH 112/115] =?UTF-8?q?:white=5Fcheck=5Fmark:=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=20#=20[=ED=83=80?= =?UTF-8?q?=EC=9E=85]=20=EC=BB=A4=EB=B0=8B=20=EC=A0=9C=EB=AA=A9=20(?= =?UTF-8?q?=ED=95=9C=20=EC=A4=84=20=EC=9A=94=EC=95=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sprint/mission/discodeit/repository/MessageRepository.java | 1 + .../mission/discodeit/repository/ReadStatusRepository.java | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java index d865c0611..8fba98dc5 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/MessageRepository.java @@ -11,6 +11,7 @@ import org.springframework.data.repository.query.Param; public interface MessageRepository extends JpaRepository { + @Query("SELECT m FROM Message m " + "LEFT JOIN FETCH m.author a " + "JOIN FETCH a.status " diff --git a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java index f1d469af1..3d2e42e1b 100644 --- a/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java +++ b/src/main/java/com/sprint/mission/discodeit/repository/ReadStatusRepository.java @@ -8,8 +8,6 @@ import org.springframework.data.repository.query.Param; public interface ReadStatusRepository extends JpaRepository { - - List findAllByUserId(UUID userId); @Query("SELECT r FROM ReadStatus r " From 727a19eb5c6e1495783f86e9ef5077b48eefad23 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 14:12:12 +0900 Subject: [PATCH 113/115] =?UTF-8?q?:recycle:=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pr-ci.yaml | 47 + .gitignore | 3 +- .gitmessage.txt | 9 + .logs/latest.log | 24 + .logs/logfile-2025-03-27.log | 60 + .logs/logfile-2025-03-28.log | 78127 ++++++++++++++++ .logs/logfile-2025-03-29.log | 4610 + .logs/logfile-2025-03-31.log | 9449 ++ .logs/logfile-2025-04-01.log | 10225 ++ .logs/logfile-2025-04-02.log | 3481 + .logs/logfile-2025-04-05.log | 4644 + admin/.gitattributes | 3 + .../discodeit/repository/UserRepository.java | 1 - 13 files changed, 110681 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/pr-ci.yaml create mode 100644 .gitmessage.txt create mode 100644 .logs/latest.log create mode 100644 .logs/logfile-2025-03-27.log create mode 100644 .logs/logfile-2025-03-28.log create mode 100644 .logs/logfile-2025-03-29.log create mode 100644 .logs/logfile-2025-03-31.log create mode 100644 .logs/logfile-2025-04-01.log create mode 100644 .logs/logfile-2025-04-02.log create mode 100644 .logs/logfile-2025-04-05.log create mode 100644 admin/.gitattributes diff --git a/.github/workflows/pr-ci.yaml b/.github/workflows/pr-ci.yaml new file mode 100644 index 000000000..b6359e02a --- /dev/null +++ b/.github/workflows/pr-ci.yaml @@ -0,0 +1,47 @@ +name: PR 시 CI 테스트 자동화 + +on: + pull_request: + branches: + - main + - 'part3-김준우' + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + permissions: + checks: write + pull-requests: write + + steps: + - name: 레포지토리 체크아웃 + uses: actions/checkout@v4 + with: + token: ${{ secrets.GIT_TOKEN }} + + - name: JDK 17 설치 + uses: actions/setup-java@v3 + with: + distribution: 'oracle' + java-version: '17' + + - name: Gradle 명령 실행 권한 부여 + run: chmod +x ./gradlew + shell: bash + + - name: Gradle로 프로젝트 Build + run: ./gradlew build + + - name: 테스트 결과를 PR 코멘트로 출력 + uses: EnricoMi/publish-unit-test-result-action@v2 + if: always() + with: + files: '**/build/test-results/test/TEST-*.xml' + + - name: 테스트 실패 시, 오류가 발생한 코드 라인에 코멘트 추가 + uses: mikepenz/action-junit-report@v4 + if: always() + with: + report_paths: '**/build/test-results/test/TEST-*.xml' \ No newline at end of file diff --git a/.gitignore b/.gitignore index bf114868a..1ac7fed79 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ bin/ ### 숨김 파일 ### .* -!.gitignore \ No newline at end of file +!.gitignore +!.github/ \ No newline at end of file diff --git a/.gitmessage.txt b/.gitmessage.txt new file mode 100644 index 000000000..a6f6b81f9 --- /dev/null +++ b/.gitmessage.txt @@ -0,0 +1,9 @@ +# [타입] 커밋 제목 (한 줄 요약) +# 예: feat: 사용자 로그인 기능 추가 + +# 본문 (무엇을, 왜 했는지) +# - 변경한 이유 +# - 고려한 사항 + +# 이슈 번호 (있다면) +# Related issue: #123 \ No newline at end of file diff --git a/.logs/latest.log b/.logs/latest.log new file mode 100644 index 000000000..a40d30f6d --- /dev/null +++ b/.logs/latest.log @@ -0,0 +1,24 @@ +25-04-06 00:05:45.044 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-06 00:05:45.450 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - Starting MessageControllerTest using Java 17.0.14 with PID 25324 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-06 00:05:45.455 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-06 00:05:54.054 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-06 00:05:55.942 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext [ | | ] - Initializing Spring TestDispatcherServlet '' +25-04-06 00:05:55.945 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Initializing Servlet '' +25-04-06 00:05:55.950 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Completed initialization in 4 ms +25-04-06 00:05:56.082 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - Started MessageControllerTest in 14.304 seconds (process running for 18.155) +25-04-06 00:08:30.356 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-06 00:08:30.762 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - Starting MessageControllerTest using Java 17.0.14 with PID 7016 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-06 00:08:30.766 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-06 00:08:39.592 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-06 00:08:41.221 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext [ | | ] - Initializing Spring TestDispatcherServlet '' +25-04-06 00:08:41.222 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Initializing Servlet '' +25-04-06 00:08:41.226 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Completed initialization in 4 ms +25-04-06 00:08:41.358 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - Started MessageControllerTest in 14.393 seconds (process running for 18.743) +25-04-06 00:09:04.230 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-06 00:09:04.445 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - Starting MessageControllerTest using Java 17.0.14 with PID 6012 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-06 00:09:04.447 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-06 00:09:11.484 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-06 00:09:13.211 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext [ | | ] - Initializing Spring TestDispatcherServlet '' +25-04-06 00:09:13.213 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Initializing Servlet '' +25-04-06 00:09:13.219 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Completed initialization in 6 ms +25-04-06 00:09:13.397 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest [ | | ] - Started MessageControllerTest in 11.994 seconds (process running for 16.197) diff --git a/.logs/logfile-2025-03-27.log b/.logs/logfile-2025-03-27.log new file mode 100644 index 000000000..4e209d382 --- /dev/null +++ b/.logs/logfile-2025-03-27.log @@ -0,0 +1,60 @@ +25-03-27 18:39:54.558 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-27 18:39:54.813 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-27 18:39:54.818 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-27 18:39:54.820 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-27 18:39:54.822 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-27 18:39:57.526 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-27 18:39:57.591 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 9360 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-27 18:39:57.592 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-27 18:39:58.561 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-27 18:39:58.650 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 77 ms. Found 6 JPA repository interfaces. +25-03-27 18:39:59.285 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-27 18:39:59.313 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-27 18:39:59.316 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-27 18:39:59.316 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-27 18:39:59.392 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-27 18:39:59.393 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1755 ms +25-03-27 18:39:59.425 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-27 18:39:59.638 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-27 18:39:59.640 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-27 18:39:59.650 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-27 18:39:59.834 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-27 18:39:59.904 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-27 18:39:59.945 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-27 18:40:00.250 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-27 18:40:00.331 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-27 18:40:01.513 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-27 18:40:01.565 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-27 18:40:01.566 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-27 18:40:01.572 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-27 18:40:01.582 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-27 18:40:01.908 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-27 18:40:02.596 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-27 18:40:03.051 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-27 18:40:03.072 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-27 18:40:03.083 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 6.209 seconds (process running for 6.892) +25-03-27 18:42:35.191 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-27 18:42:35.192 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-27 18:42:35.197 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 4 ms +25-03-27 19:59:22.162 [HikariPool-1 housekeeper] WARN com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=58m52s69ms170µs200ns). +25-03-27 21:48:38.094 [HikariPool-1 housekeeper] WARN com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1h48m11s842ms998µs900ns). +25-03-27 21:57:24.070 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-27 21:57:24.377 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-27 21:57:24.390 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-27 21:57:24.404 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-27 21:57:24.410 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. diff --git a/.logs/logfile-2025-03-28.log b/.logs/logfile-2025-03-28.log new file mode 100644 index 000000000..ffda0e7fb --- /dev/null +++ b/.logs/logfile-2025-03-28.log @@ -0,0 +1,78127 @@ +25-03-28 08:58:38.540 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 08:58:38.653 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 8668 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 08:58:38.654 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 08:58:40.183 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 08:58:40.303 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 106 ms. Found 6 JPA repository interfaces. +25-03-28 08:58:41.364 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 08:58:41.387 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 08:58:41.390 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 08:58:41.390 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 08:58:41.491 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 08:58:41.491 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2769 ms +25-03-28 08:58:41.530 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 08:58:41.890 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 08:58:41.893 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 08:58:41.907 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 08:58:42.207 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 08:58:42.346 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 08:58:42.407 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 08:58:42.947 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 08:58:43.093 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 08:58:45.207 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 08:58:45.297 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 08:58:45.298 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 08:58:45.307 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 08:58:45.313 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 08:58:45.756 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 08:58:46.827 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 08:58:47.598 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 08:58:47.628 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 08:58:47.642 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 10.16 seconds (process running for 11.743) +25-03-28 08:59:03.518 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 08:59:03.519 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 08:59:03.522 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:09:03.476 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:09:03.818 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:09:03.825 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:09:03.828 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:09:03.831 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:09:10.408 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:09:10.487 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 7192 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:09:10.488 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:09:11.945 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:09:12.036 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 81 ms. Found 6 JPA repository interfaces. +25-03-28 09:09:13.033 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:09:13.048 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:09:13.050 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:09:13.051 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:09:13.133 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:09:13.134 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2594 ms +25-03-28 09:09:13.296 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:09:13.555 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:09:13.558 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:09:13.568 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:09:13.854 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:09:13.919 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:09:13.963 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:09:14.309 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:09:14.412 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:09:15.740 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:09:15.806 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:09:15.807 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:09:15.816 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:09:15.823 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:09:16.208 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:09:17.577 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:09:19.199 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:09:19.397 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:09:19.458 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:09:19.490 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.841 seconds (process running for 10.995) +25-03-28 09:09:19.813 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:09:19.814 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:09:19.816 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:11:04.081 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:11:04.381 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:11:04.391 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:11:04.394 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:11:04.399 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:11:08.673 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:11:08.738 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 2732 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:11:08.740 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:11:10.121 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:11:10.208 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 77 ms. Found 6 JPA repository interfaces. +25-03-28 09:11:11.151 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:11:11.164 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:11:11.165 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:11:11.166 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:11:11.253 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:11:11.254 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2467 ms +25-03-28 09:11:11.408 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:11:11.659 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:11:11.662 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:11:11.674 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:11:11.959 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:11:12.029 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:11:12.072 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:11:12.487 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:11:12.588 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:11:13.901 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:11:13.957 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:11:13.958 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:11:13.967 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:11:13.976 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:11:14.429 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:11:15.721 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:11:17.434 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:11:17.594 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:11:17.633 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:11:17.679 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.915 seconds (process running for 10.886) +25-03-28 09:11:18.015 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:11:18.016 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:11:18.019 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:12:37.686 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:12:38.041 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:12:38.050 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:12:38.052 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:12:38.056 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:12:41.691 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:12:41.769 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 9528 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:12:41.771 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:12:43.253 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:12:43.339 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 77 ms. Found 6 JPA repository interfaces. +25-03-28 09:12:44.184 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:12:44.208 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:12:44.210 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:12:44.212 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:12:44.284 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:12:44.285 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2459 ms +25-03-28 09:12:44.462 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:12:44.737 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:12:44.741 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:12:44.754 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:12:45.128 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:12:45.208 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:12:45.256 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:12:45.613 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:12:45.754 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:12:47.226 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:12:47.289 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:12:47.290 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:12:47.300 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:12:47.318 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:12:47.782 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:12:48.859 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:12:50.018 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:12:50.095 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:12:50.116 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:12:50.135 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.144 seconds (process running for 10.05) +25-03-28 09:12:50.682 [RMI TCP Connection(4)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:12:50.683 [RMI TCP Connection(4)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:12:50.685 [RMI TCP Connection(4)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:12:56.864 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:12:57.118 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:12:57.128 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:12:57.131 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:12:57.136 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:13:00.771 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:13:00.838 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 12684 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:13:00.838 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:13:02.329 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:13:02.442 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 96 ms. Found 6 JPA repository interfaces. +25-03-28 09:13:03.424 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:13:03.437 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:13:03.440 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:13:03.441 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:13:03.542 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:13:03.542 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2656 ms +25-03-28 09:13:03.683 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:13:03.917 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:13:03.921 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:13:03.936 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:13:04.224 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:13:04.285 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:13:04.329 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:13:04.661 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:13:04.763 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:13:06.079 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:13:06.136 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:13:06.136 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:13:06.144 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:13:06.150 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:13:06.656 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:13:07.752 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:13:09.458 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:13:09.626 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:13:09.668 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:13:09.715 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.619 seconds (process running for 10.492) +25-03-28 09:13:09.830 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:13:09.831 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:13:09.833 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:15:22.038 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:15:22.452 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:15:22.466 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:15:22.470 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:15:22.475 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:15:26.106 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:15:26.176 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 24888 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:15:26.176 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:15:27.527 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:15:27.625 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 86 ms. Found 6 JPA repository interfaces. +25-03-28 09:15:28.502 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:15:28.520 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:15:28.523 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:15:28.523 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:15:28.622 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:15:28.624 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2398 ms +25-03-28 09:15:28.793 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:15:29.050 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:15:29.052 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:15:29.064 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:15:29.369 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:15:29.470 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:15:29.533 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:15:29.987 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:15:30.108 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:15:31.615 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:15:31.679 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:15:31.680 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:15:31.687 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:15:31.697 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:15:32.090 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:15:33.297 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:15:34.533 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 14 endpoints beneath base path '/actuator' +25-03-28 09:15:34.621 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:15:34.647 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:15:34.666 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.314 seconds (process running for 10.16) +25-03-28 09:15:35.002 [RMI TCP Connection(2)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:15:35.003 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:15:35.005 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:15:40.119 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:15:40.450 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:15:40.459 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:15:40.462 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:15:40.466 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:15:43.916 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:15:43.988 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 9276 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:15:43.990 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:15:45.409 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:15:45.514 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 92 ms. Found 6 JPA repository interfaces. +25-03-28 09:15:46.381 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:15:46.399 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:15:46.403 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:15:46.403 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:15:46.479 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:15:46.479 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2437 ms +25-03-28 09:15:46.632 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:15:46.876 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:15:46.877 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:15:46.888 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:15:47.172 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:15:47.239 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:15:47.280 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:15:47.648 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:15:47.756 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:15:49.024 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:15:49.077 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:15:49.078 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:15:49.086 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:15:49.093 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:15:49.431 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:15:50.341 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:15:51.317 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:15:51.394 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:15:51.415 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:15:51.433 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.25 seconds (process running for 9.12) +25-03-28 09:15:51.814 [RMI TCP Connection(2)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:15:51.814 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:15:51.817 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:17:56.382 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:17:56.637 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:17:56.644 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:17:56.647 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:17:56.650 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:18:00.079 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:18:00.149 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 2728 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:18:00.150 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:18:01.659 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:18:01.818 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 143 ms. Found 6 JPA repository interfaces. +25-03-28 09:18:02.753 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:18:02.767 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:18:02.768 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:18:02.769 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:18:02.847 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:18:02.847 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2651 ms +25-03-28 09:18:03.002 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:18:03.232 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:18:03.234 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:18:03.246 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:18:03.527 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:18:03.587 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:18:03.627 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:18:04.026 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:18:04.119 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:18:05.466 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:18:05.528 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:18:05.530 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:18:05.538 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:18:05.549 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:18:05.892 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:18:06.902 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:18:08.527 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:18:08.676 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:18:08.714 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:18:08.757 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.445 seconds (process running for 10.22) +25-03-28 09:18:08.871 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:18:08.872 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:18:08.875 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:18:45.014 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:18:45.276 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:18:45.283 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:18:45.285 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:18:45.289 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:18:48.841 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:18:48.913 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 10108 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:18:48.915 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:18:50.239 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:18:50.333 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 85 ms. Found 6 JPA repository interfaces. +25-03-28 09:18:51.209 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:18:51.225 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:18:51.227 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:18:51.228 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:18:51.308 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:18:51.309 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2344 ms +25-03-28 09:18:51.474 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:18:51.761 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:18:51.763 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:18:51.773 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:18:52.075 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:18:52.139 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:18:52.182 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:18:52.530 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:18:52.634 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:18:53.986 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:18:54.045 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:18:54.046 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:18:54.057 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:18:54.063 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:18:54.517 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:18:55.422 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:18:56.439 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 14 endpoints beneath base path '/actuator' +25-03-28 09:18:56.531 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:18:56.557 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:18:56.576 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.526 seconds (process running for 9.418) +25-03-28 09:18:57.154 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:18:57.155 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:18:57.158 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:20:27.439 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:20:27.679 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:20:27.686 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:20:27.689 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:20:27.692 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:20:31.244 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:20:31.331 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 12004 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:20:31.332 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:20:32.644 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:20:32.739 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 83 ms. Found 6 JPA repository interfaces. +25-03-28 09:20:33.578 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:20:33.594 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:20:33.617 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:20:33.617 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:20:33.695 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:20:33.695 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2313 ms +25-03-28 09:20:33.845 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:20:34.105 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:20:34.108 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:20:34.121 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:20:34.407 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:20:34.468 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:20:34.511 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:20:34.838 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:20:34.927 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:20:36.183 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:20:36.239 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:20:36.239 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:20:36.248 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:20:36.254 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:20:36.599 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:20:37.476 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:20:39.146 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 1 endpoint beneath base path '/actuator' +25-03-28 09:20:39.325 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:20:39.378 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:20:39.417 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.844 seconds (process running for 9.671) +25-03-28 09:20:39.693 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:20:39.694 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:20:39.697 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:21:49.787 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:21:50.033 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:21:50.041 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:21:50.043 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:21:50.047 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:21:53.453 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:21:53.533 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 11208 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:21:53.535 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:21:54.856 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:21:54.949 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 82 ms. Found 6 JPA repository interfaces. +25-03-28 09:21:55.853 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:21:55.870 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:21:55.873 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:21:55.873 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:21:55.960 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:21:55.960 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2363 ms +25-03-28 09:21:56.132 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:21:56.437 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:21:56.439 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:21:56.453 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:21:56.750 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:21:56.819 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:21:56.858 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:21:57.194 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:21:57.284 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:21:58.497 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:21:58.557 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:21:58.558 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:21:58.566 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:21:58.573 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:21:58.966 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:21:59.805 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:22:00.818 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:22:00.904 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:22:00.926 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:22:00.953 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.163 seconds (process running for 8.949) +25-03-28 09:22:01.001 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:22:01.002 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:22:01.004 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 1 ms +25-03-28 09:25:32.103 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:25:32.494 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:25:32.503 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:25:32.507 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:25:32.511 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:25:36.175 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:25:36.244 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 23776 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:25:36.245 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:25:37.885 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:25:38.015 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 116 ms. Found 6 JPA repository interfaces. +25-03-28 09:25:39.052 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:25:39.065 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:25:39.068 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:25:39.068 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:25:39.145 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:25:39.146 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2848 ms +25-03-28 09:25:39.318 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:25:39.604 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:25:39.606 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:25:39.621 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:25:39.936 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:25:40.022 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:25:40.069 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:25:40.429 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:25:40.524 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:25:41.984 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:25:42.047 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:25:42.048 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:25:42.058 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:25:42.066 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:25:42.511 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:25:43.438 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:25:44.512 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:25:44.618 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:25:44.651 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:25:44.671 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.242 seconds (process running for 10.102) +25-03-28 09:25:45.137 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:25:45.137 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:25:45.139 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:26:45.239 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:26:45.506 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:26:45.513 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:26:45.516 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:26:45.520 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:26:48.767 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:26:48.859 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 16352 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:26:48.860 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:26:50.141 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:26:50.244 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 91 ms. Found 6 JPA repository interfaces. +25-03-28 09:26:51.092 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:26:51.109 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:26:51.112 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:26:51.112 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:26:51.186 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:26:51.187 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2267 ms +25-03-28 09:26:51.346 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:26:51.617 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:26:51.621 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:26:51.630 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:26:51.932 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:26:51.995 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:26:52.037 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:26:52.391 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:26:52.504 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:26:53.866 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:26:53.935 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:26:53.937 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:26:53.945 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:26:53.952 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:26:54.385 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:26:55.275 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:26:56.469 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:26:56.565 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:26:56.598 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:26:56.638 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.532 seconds (process running for 9.374) +25-03-28 09:26:57.241 [RMI TCP Connection(3)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:26:57.242 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:26:57.246 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:28:54.794 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:28:55.113 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:28:55.121 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:28:55.124 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:28:55.127 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:28:58.507 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:28:58.585 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 10532 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:28:58.587 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:28:59.985 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:29:00.079 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 85 ms. Found 6 JPA repository interfaces. +25-03-28 09:29:00.937 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:29:00.951 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:29:00.953 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:29:00.953 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:29:01.028 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:29:01.028 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2385 ms +25-03-28 09:29:01.198 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:29:01.440 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:29:01.442 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:29:01.453 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:29:01.735 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:29:01.801 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:29:01.839 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:29:02.186 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:29:02.282 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:29:03.528 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:29:03.584 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:29:03.585 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:29:03.592 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:29:03.605 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:29:04.027 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:29:05.035 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:29:06.020 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:29:06.105 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:29:06.126 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:29:06.146 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.372 seconds (process running for 9.291) +25-03-28 09:29:06.781 [RMI TCP Connection(2)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:29:06.781 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:29:06.783 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:31:20.490 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:31:20.755 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:31:20.763 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:31:20.766 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:31:20.769 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:31:24.080 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:31:24.168 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 10328 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:31:24.169 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:31:25.594 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:31:25.699 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 95 ms. Found 6 JPA repository interfaces. +25-03-28 09:31:26.694 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:31:26.710 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:31:26.714 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:31:26.714 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:31:26.811 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:31:26.811 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2573 ms +25-03-28 09:31:26.962 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:31:27.251 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:31:27.255 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:31:27.266 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:31:27.544 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:31:27.620 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:31:27.659 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:31:28.000 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:31:28.097 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:31:29.354 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:31:29.424 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:31:29.426 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:31:29.448 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:31:29.455 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:31:29.868 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:31:30.840 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:31:31.889 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:31:31.968 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:31:31.995 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:31:32.015 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.683 seconds (process running for 9.643) +25-03-28 09:31:32.364 [RMI TCP Connection(3)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:31:32.364 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:31:32.367 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:31:49.659 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:31:49.911 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:31:49.919 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:31:49.921 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:31:49.925 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:31:53.217 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:31:53.300 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 4412 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:31:53.302 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:31:54.623 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:31:54.716 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 84 ms. Found 6 JPA repository interfaces. +25-03-28 09:31:55.570 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:31:55.583 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:31:55.585 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:31:55.586 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:31:55.704 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:31:55.705 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2353 ms +25-03-28 09:31:55.898 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:31:56.183 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:31:56.187 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:31:56.196 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:31:56.505 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:31:56.566 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:31:56.605 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:31:56.946 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:31:57.039 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:31:58.472 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:31:58.537 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:31:58.538 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:31:58.548 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:31:58.558 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:31:59.077 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:32:00.042 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:32:01.001 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:32:01.084 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:32:01.113 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:32:01.139 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.569 seconds (process running for 9.384) +25-03-28 09:32:01.198 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:32:01.198 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:32:01.200 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:33:44.705 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:33:44.974 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:33:44.981 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:33:44.983 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:33:44.986 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:33:48.435 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:33:48.524 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 6364 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:33:48.525 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:33:50.008 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:33:50.108 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 86 ms. Found 6 JPA repository interfaces. +25-03-28 09:33:50.989 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:33:51.002 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:33:51.005 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:33:51.005 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:33:51.083 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:33:51.083 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2508 ms +25-03-28 09:33:51.233 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:33:51.476 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:33:51.478 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:33:51.489 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:33:51.767 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:33:51.829 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:33:51.866 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:33:52.203 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:33:52.297 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:33:53.544 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:33:53.605 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:33:53.606 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:33:53.613 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:33:53.622 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:33:53.974 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:33:54.879 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:33:56.435 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:33:56.566 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:33:56.593 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:33:56.612 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.945 seconds (process running for 9.719) +25-03-28 09:33:56.899 [RMI TCP Connection(3)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:33:56.899 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:33:56.902 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 09:34:36.566 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:34:36.800 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:34:36.806 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:34:36.808 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:34:36.812 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:34:40.060 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:34:40.129 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 22688 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:34:40.130 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:34:41.585 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:34:41.669 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 73 ms. Found 6 JPA repository interfaces. +25-03-28 09:34:42.487 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:34:42.500 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:34:42.502 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:34:42.503 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:34:42.584 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:34:42.584 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2401 ms +25-03-28 09:34:42.726 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:34:42.965 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:34:42.967 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:34:42.978 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:34:43.243 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:34:43.337 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:34:43.376 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:34:43.720 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:34:43.816 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:34:45.141 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:34:45.197 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:34:45.198 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:34:45.205 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:34:45.214 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:34:45.547 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:34:46.510 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:34:47.547 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:34:47.625 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:34:47.645 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:34:47.662 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.243 seconds (process running for 9.042) +25-03-28 09:34:47.787 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:34:47.787 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:34:47.789 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:35:56.893 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:35:57.148 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:35:57.155 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:35:57.158 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:35:57.161 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:36:00.290 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:36:00.375 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 12832 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:36:00.377 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:36:01.773 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:36:01.867 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 83 ms. Found 6 JPA repository interfaces. +25-03-28 09:36:02.779 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:36:02.794 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:36:02.796 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:36:02.796 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:36:02.878 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:36:02.878 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2432 ms +25-03-28 09:36:03.067 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:36:03.329 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:36:03.332 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:36:03.343 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:36:03.648 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:36:03.709 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:36:03.750 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:36:04.129 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:36:04.226 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:36:05.601 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:36:05.667 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:36:05.667 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:36:05.676 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:36:05.687 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:36:06.118 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:36:07.002 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:36:08.441 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 14 endpoints beneath base path '/actuator' +25-03-28 09:36:08.627 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:36:08.677 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:36:08.713 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.072 seconds (process running for 9.856) +25-03-28 09:36:08.926 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:36:08.927 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:36:08.928 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 1 ms +25-03-28 09:38:15.139 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:38:15.407 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:38:15.416 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:38:15.420 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:38:15.423 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:38:18.591 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:38:18.673 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 11856 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:38:18.676 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:38:20.027 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:38:20.128 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 91 ms. Found 6 JPA repository interfaces. +25-03-28 09:38:20.970 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:38:20.985 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:38:20.987 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:38:20.988 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:38:21.062 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:38:21.064 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2335 ms +25-03-28 09:38:21.220 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:38:21.436 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:38:21.439 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:38:21.451 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:38:21.731 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:38:21.796 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:38:21.837 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:38:22.165 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:38:22.271 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:38:23.599 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:38:23.658 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:38:23.659 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:38:23.668 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:38:23.676 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:38:24.098 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:38:25.040 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:38:26.792 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 14 endpoints beneath base path '/actuator' +25-03-28 09:38:26.943 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:38:26.982 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:38:27.008 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 9.131 seconds (process running for 10.025) +25-03-28 09:38:27.203 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:38:27.203 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:38:27.205 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 1 ms +25-03-28 09:38:54.432 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:38:54.691 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:38:54.711 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:38:54.716 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:38:54.721 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:38:58.106 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:38:58.185 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 25580 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:38:58.186 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:38:59.517 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:38:59.611 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 85 ms. Found 6 JPA repository interfaces. +25-03-28 09:39:00.498 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:39:00.515 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:39:00.516 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:39:00.516 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:39:00.595 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:39:00.595 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2352 ms +25-03-28 09:39:00.733 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:39:00.974 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:39:00.976 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:39:00.986 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:39:01.269 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:39:01.330 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:39:01.363 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:39:01.705 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:39:01.807 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:39:03.062 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:39:03.114 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:39:03.115 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:39:03.123 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:39:03.131 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:39:03.583 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:39:04.512 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:39:05.538 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 14 endpoints beneath base path '/actuator' +25-03-28 09:39:05.624 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:39:05.645 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:39:05.668 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.291 seconds (process running for 9.139) +25-03-28 09:39:05.725 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:39:05.726 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:39:05.727 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 1 ms +25-03-28 09:43:07.948 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:43:08.205 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:43:08.212 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:43:08.219 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:43:08.224 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:43:12.741 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:43:12.810 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 24592 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:43:12.811 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 09:43:14.195 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:43:14.284 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 80 ms. Found 6 JPA repository interfaces. +25-03-28 09:43:15.121 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 09:43:15.135 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 09:43:15.137 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:43:15.137 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:43:15.218 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:43:15.219 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2360 ms +25-03-28 09:43:15.371 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:43:15.625 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 09:43:15.627 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:43:15.639 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 09:43:15.917 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:43:15.984 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:43:16.031 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:43:16.395 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:43:16.493 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:43:17.850 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:43:17.903 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 09:43:17.904 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 09:43:17.914 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 09:43:17.922 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:43:18.371 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:43:19.267 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:43:20.391 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 14 endpoints beneath base path '/actuator' +25-03-28 09:43:20.483 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 09:43:20.504 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 09:43:20.529 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.489 seconds (process running for 9.527) +25-03-28 09:43:20.987 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:43:20.988 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:43:20.990 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 09:46:04.669 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 09:46:04.921 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 09:46:04.927 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:46:04.931 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 09:46:04.937 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 09:46:08.169 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 09:46:08.243 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 22284 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 09:46:08.244 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "prod" +25-03-28 09:46:09.592 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 09:46:09.694 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 87 ms. Found 6 JPA repository interfaces. +25-03-28 09:46:10.549 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 80 (http) +25-03-28 09:46:10.564 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-80"] +25-03-28 09:46:10.566 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 09:46:10.566 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 09:46:10.660 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 09:46:10.660 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2358 ms +25-03-28 09:46:10.974 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 09:46:11.311 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@762da62b +25-03-28 09:46:11.313 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 09:46:11.427 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 09:46:11.531 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 09:46:11.612 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 09:46:12.037 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 09:46:12.191 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 17.4 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 09:46:12.199 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@dcdb883) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@39420d59) +25-03-28 09:46:12.199 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@4fbbd98c) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@5dd227b7) +25-03-28 09:46:13.528 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 09:46:13.532 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 09:46:13.877 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 09:46:14.801 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 09:46:15.813 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 09:46:15.924 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-80"] +25-03-28 09:46:15.950 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 80 (http) with context path '/' +25-03-28 09:46:15.975 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.467 seconds (process running for 9.365) +25-03-28 09:46:16.531 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 09:46:16.532 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 09:46:16.536 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 10:02:48.374 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 10:02:48.691 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 10:02:48.701 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:02:48.705 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 10:02:48.714 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 10:02:52.549 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 10:02:52.623 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 12460 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 10:02:52.624 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 10:02:54.127 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 10:02:54.239 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 101 ms. Found 6 JPA repository interfaces. +25-03-28 10:02:55.119 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 10:02:55.134 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 10:02:55.138 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 10:02:55.138 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 10:02:55.228 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 10:02:55.228 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2546 ms +25-03-28 10:02:55.385 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 10:02:55.624 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 10:02:55.626 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 10:02:55.636 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 10:02:55.935 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 10:02:55.993 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 10:02:56.029 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 10:02:56.395 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 10:02:56.483 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 10:02:57.701 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 10:02:57.763 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 10:02:57.764 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 10:02:57.774 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 10:02:57.779 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:02:58.133 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 10:02:59.145 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 10:03:00.598 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 10:03:00.706 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 10:03:00.743 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 10:03:00.780 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.973 seconds (process running for 9.824) +25-03-28 10:03:01.439 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 10:03:01.439 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 10:03:01.442 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2 ms +25-03-28 10:03:34.639 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 10:03:34.934 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 10:03:34.943 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:03:34.946 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 10:03:34.949 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 10:03:38.406 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 10:03:38.487 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 14408 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 10:03:38.489 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 10:03:39.861 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 10:03:39.971 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 97 ms. Found 6 JPA repository interfaces. +25-03-28 10:03:40.787 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 10:03:40.800 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 10:03:40.804 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 10:03:40.804 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 10:03:40.879 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 10:03:40.880 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2330 ms +25-03-28 10:03:41.024 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 10:03:41.282 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 10:03:41.285 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 10:03:41.296 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 10:03:41.578 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 10:03:41.638 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 10:03:41.677 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 10:03:42.002 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 10:03:42.093 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 10:03:43.338 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 10:03:43.395 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 10:03:43.396 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 10:03:43.404 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 10:03:43.410 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:03:43.818 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 10:03:44.643 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 10:03:46.127 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 10:03:46.277 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 10:03:46.323 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 10:03:46.364 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.632 seconds (process running for 9.372) +25-03-28 10:03:46.989 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 10:03:46.990 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 10:03:46.994 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 4 ms +25-03-28 10:05:01.740 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 10:05:02.043 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 10:05:02.055 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:05:02.058 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 10:05:02.065 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 10:05:05.226 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 10:05:05.309 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 7032 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 10:05:05.311 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 10:05:06.665 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 10:05:06.761 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 86 ms. Found 6 JPA repository interfaces. +25-03-28 10:05:07.603 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 10:05:07.616 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 10:05:07.618 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 10:05:07.619 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 10:05:07.702 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 10:05:07.703 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2334 ms +25-03-28 10:05:07.846 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 10:05:08.115 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 10:05:08.118 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 10:05:08.130 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 10:05:08.429 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 10:05:08.492 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 10:05:08.528 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 10:05:08.843 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 10:05:08.933 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 10:05:10.158 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 10:05:10.213 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 10:05:10.214 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 10:05:10.222 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 10:05:10.232 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:05:10.562 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 10:05:11.454 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 10:05:12.798 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 10:05:12.935 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 10:05:12.976 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 10:05:13.003 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 8.416 seconds (process running for 9.154) +25-03-28 10:05:13.401 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 10:05:13.401 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 10:05:13.405 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 4 ms +25-03-28 10:14:33.791 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 10:14:34.019 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 10:14:34.025 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:14:34.028 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 10:14:34.031 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 10:17:42.251 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 10:17:42.367 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 2848 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 10:17:42.369 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "dev" +25-03-28 10:17:44.530 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 10:17:44.620 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 78 ms. Found 6 JPA repository interfaces. +25-03-28 10:17:45.501 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 10:17:45.516 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 10:17:45.517 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 10:17:45.518 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 10:17:45.597 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 10:17:45.597 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 3156 ms +25-03-28 10:17:45.747 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 10:17:46.016 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 10:17:46.018 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 10:17:46.028 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 10:17:46.318 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 10:17:46.381 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 10:17:46.425 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 10:17:46.814 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 10:17:46.908 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 10:17:48.306 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 10:17:48.364 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 10:17:48.364 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 10:17:48.377 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 10:17:48.387 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:17:48.987 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 10:17:50.588 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 10:17:52.177 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 10:17:52.335 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 10:17:52.374 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 10:17:52.404 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 11.147 seconds (process running for 11.998) +25-03-28 10:17:52.896 [RMI TCP Connection(2)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 10:17:52.897 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 10:17:52.900 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 10:18:07.653 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-28 10:18:07.786 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 10:18:07.789 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-28 10:18:07.789 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 10:18:07.826 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 10:18:07.827 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [rex] +25-03-28 10:18:07.827 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 10:18:07.828 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-28 10:18:07.958 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 완료] username: rex, id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:07.989 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 10:18:07.992 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [image/png] +25-03-28 10:18:07.993 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:18:07.876924700Z] +25-03-28 10:18:08.002 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [rex.png] +25-03-28 10:18:08.002 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:BIGINT) <- [64605] +25-03-28 10:18:08.002 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.008 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 10:18:08.009 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:18:07.945862200Z] +25-03-28 10:18:08.009 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-28 10:18:08.009 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 10:18:08.010 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.010 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T01:18:07.945862200Z] +25-03-28 10:18:08.010 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [rex] +25-03-28 10:18:08.010 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.011 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 10:18:08.013 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:18:07.955309100Z] +25-03-28 10:18:08.013 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:18:07.943487200Z] +25-03-28 10:18:08.013 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T01:18:07.955309100Z] +25-03-28 10:18:08.013 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.013 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:18:08.088 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:08.088 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:08.101 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:18:08.101 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:18:08.103 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.103 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.140 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:18:08.069Z +25-03-28 10:18:08.141 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:18:08.068Z +25-03-28 10:18:08.152 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:18:08.152 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:18:08.157 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:18:08.069Z] +25-03-28 10:18:08.157 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:18:08.068Z] +25-03-28 10:18:08.157 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:18:08.142550900Z] +25-03-28 10:18:08.157 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:18:08.142550900Z] +25-03-28 10:18:08.158 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.158 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.158 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:18:08.158 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:18:08.228 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:18:08.256 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: a6cd0c8a-40c9-4f7e-841f-9f76dde430af +25-03-28 10:18:08.258 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:08.259 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.260 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:08.261 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.261 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:08.263 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:18:08.273 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:08.275 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:08.275 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:08.279 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 10:18:08.280 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.291 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: a6cd0c8a-40c9-4f7e-841f-9f76dde430af +25-03-28 10:18:08.291 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:08.291 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:08.292 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.293 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.293 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 10:18:08.293 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.293 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:08.295 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:08.296 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:08.296 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:08.303 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:08.304 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.304 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: a6cd0c8a-40c9-4f7e-841f-9f76dde430af +25-03-28 10:18:08.306 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: a6cd0c8a-40c9-4f7e-841f-9f76dde430af +25-03-28 10:18:08.306 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 10:18:08.307 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.308 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 10:18:08.308 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.313 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: a6cd0c8a-40c9-4f7e-841f-9f76dde430af +25-03-28 10:18:08.313 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:08.314 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:08.314 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 10:18:08.315 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:08.322 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: a6cd0c8a-40c9-4f7e-841f-9f76dde430af +25-03-28 10:18:08.324 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 10:18:08.324 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [a6cd0c8a-40c9-4f7e-841f-9f76dde430af] +25-03-28 10:18:11.298 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:11.300 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:11.301 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:11.305 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:11.307 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:11.308 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:11.319 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:11.319 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:14.930 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:14.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:14.931 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:14.933 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:14.934 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:14.935 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:14.949 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:14.950 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:17.928 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:17.929 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:17.930 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:17.931 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:17.932 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:17.932 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:17.949 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:17.949 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:20.925 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:20.925 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:20.926 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:20.929 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:20.930 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:20.930 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:20.948 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:20.948 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:23.931 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:23.932 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:23.934 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:23.936 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:23.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:23.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:23.948 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:23.949 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:26.921 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:26.921 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:26.922 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:26.924 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:26.925 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:26.925 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:26.941 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:26.942 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:29.927 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:29.927 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:29.928 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:29.931 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:29.931 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:29.931 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:29.941 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:29.942 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:32.920 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:32.920 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:32.921 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:32.923 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:32.924 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:32.924 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:32.933 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:32.934 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:35.930 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:35.931 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:35.931 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:35.933 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:35.933 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:35.933 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:35.942 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:35.943 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:38.925 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:38.926 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:38.927 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:38.927 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:18:38.928 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:38.928 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:38.930 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:18:38.919Z +25-03-28 10:18:38.931 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:18:38.931 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:38.932 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:38.932 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:18:38.919Z] +25-03-28 10:18:38.933 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:18:38.930416400Z] +25-03-28 10:18:38.933 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:38.933 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:38.933 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:18:38.951 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:38.951 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:41.930 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:41.931 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:41.933 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:41.936 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:41.936 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:41.936 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:41.958 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:41.958 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:44.927 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:44.928 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:44.928 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:44.930 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:44.930 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:44.930 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:44.940 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:44.940 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:47.916 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:47.916 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:47.917 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:47.918 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:47.918 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:47.918 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:47.928 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:47.929 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:50.921 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:50.922 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:50.923 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:50.926 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:50.926 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:50.926 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:50.939 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:50.939 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:53.931 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:53.932 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:53.932 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:53.937 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:53.937 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:53.938 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:53.952 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:53.953 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:56.921 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:56.922 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:56.922 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:56.925 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:56.926 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:56.926 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:56.937 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:56.937 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:59.920 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:59.920 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:18:59.921 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:18:59.921 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:18:59.921 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:18:59.921 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:18:59.933 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:18:59.934 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:02.920 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:02.921 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:02.921 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:02.922 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:02.922 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:02.922 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:02.931 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:02.931 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:05.942 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:05.943 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:05.945 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:05.948 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:05.949 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:05.949 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:05.993 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:05.994 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.923 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:08.923 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:19:08.925 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:19:08.925 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:08.925 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.925 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.926 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:08.926 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:19:08.917Z +25-03-28 10:19:08.927 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:19:08.927 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:19:08.917Z] +25-03-28 10:19:08.927 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:19:08.926883700Z] +25-03-28 10:19:08.928 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.928 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:19:08.928 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:08.928 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:08.928 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:08.941 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:08.941 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:08.941 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.942 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.942 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:08.944 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:08.945 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:08.945 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:08.953 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:08.953 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:08.962 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:08.962 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:12.932 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:12.933 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:12.934 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:12.936 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:12.936 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:12.936 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:12.946 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:12.946 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:15.925 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:15.926 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:15.926 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:15.928 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:15.928 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:15.928 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:15.939 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:15.940 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:18.932 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:18.932 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:18.933 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:18.934 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:18.934 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:18.934 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:18.942 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:18.943 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:21.920 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:21.922 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:21.925 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:21.928 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:19:21.929 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:19:21.929 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:19:21.941 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:19:21.941 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:38.917 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:19:38.919 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:19:38.920 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:38.921 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:19:38.913Z +25-03-28 10:19:38.922 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:19:38.923 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:19:38.913Z] +25-03-28 10:19:38.923 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:19:38.921653800Z] +25-03-28 10:19:38.923 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:19:38.923 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:20:08.926 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:20:08.927 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:08.929 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:20:08.929 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:08.930 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:20:08.921Z +25-03-28 10:20:08.933 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:20:08.934 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:20:08.921Z] +25-03-28 10:20:08.934 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:20:08.932447400Z] +25-03-28 10:20:08.934 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:08.935 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:20:08.943 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:08.943 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:08.943 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:08.943 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:08.944 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:08.947 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:20:08.947 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:20:08.948 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:20:08.959 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:08.959 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:12.921 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:12.921 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:12.922 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:12.924 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:20:12.924 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:20:12.925 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:20:12.937 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:12.937 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:15.929 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:15.930 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:15.931 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:15.933 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:20:15.933 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:20:15.933 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:20:15.943 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:15.944 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:18.919 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:18.919 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:18.920 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:18.921 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:20:18.921 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:20:18.921 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:20:18.931 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:18.931 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:21.923 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:21.924 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:21.924 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:21.925 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:20:21.926 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:20:21.926 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:20:21.937 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:21.937 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:24.926 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:24.926 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:20:24.928 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:20:24.929 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:20:24.930 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:20:24.930 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:20:24.938 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:20:24.939 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:08.935 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:21:08.947 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:08.947 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:08.947 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:08.947 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:08.948 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:21:08.950 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:21:08.950 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:21:08.950 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:21:08.960 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:08.961 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:12.931 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:12.931 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:12.933 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:21:12.934 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:21:12.934 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:21:12.934 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:21:12.947 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:12.947 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:15.934 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:15.934 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:15.935 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:21:15.936 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:21:15.936 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:21:15.936 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:21:15.948 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:15.949 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:18.922 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:18.922 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:18.923 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:21:18.925 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:21:18.925 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:21:18.925 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:21:18.937 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:18.938 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:21.929 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:21.929 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:21.930 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:21:21.932 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:21:21.932 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:21:21.932 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:21:21.944 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:21:21.944 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:22.937 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:21:22.940 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:21:22.941 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:22.943 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:21:22.925Z +25-03-28 10:21:22.945 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:21:22.945 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:21:22.925Z] +25-03-28 10:21:22.945 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:21:22.944397900Z] +25-03-28 10:21:22.945 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:21:22.945 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:22:08.925 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:22:08.939 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:08.940 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:08.940 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:08.940 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:08.940 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:22:08.941 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:22:08.941 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:22:08.941 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:22:08.949 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:08.949 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:12.929 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:12.929 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:12.930 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:22:12.931 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:22:12.931 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:22:12.931 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:22:12.939 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:12.947 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:15.931 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:15.931 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:15.937 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:22:15.939 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:22:15.939 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:22:15.939 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:22:15.947 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:15.947 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:18.922 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:18.923 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:18.925 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:22:18.927 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:22:18.927 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:22:18.927 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:22:18.935 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:18.935 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:21.924 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:21.924 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:21.925 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:22:21.926 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:22:21.926 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:22:21.926 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:22:21.935 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:22:21.935 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:22.929 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:22:22.931 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:22:22.931 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:22.931 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:22:22.924Z +25-03-28 10:22:22.933 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:22:22.933 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:22:22.924Z] +25-03-28 10:22:22.933 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:22:22.932774800Z] +25-03-28 10:22:22.933 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:22:22.933 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:23:22.938 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:22.940 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:22.941 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:23:22.941 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:22.942 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:22.943 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:23:22.943 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:22.946 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:23:22.946 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:23:22.947 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:23:22.947 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:23:22.924Z +25-03-28 10:23:22.950 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:23:22.951 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:23:22.924Z] +25-03-28 10:23:22.951 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:23:22.948505300Z] +25-03-28 10:23:22.952 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:22.953 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:23:22.967 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:22.967 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:22.967 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:22.968 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:22.969 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:22.971 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:23:22.971 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:23:22.971 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:23:22.978 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:22.978 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:22.987 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:22.987 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:26.920 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:26.920 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:26.921 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:26.923 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:23:26.923 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:23:26.923 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:23:26.933 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:26.933 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:29.927 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:29.927 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:29.928 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:29.929 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:23:29.929 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:23:29.929 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:23:29.938 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:29.938 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:32.925 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:32.925 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:32.926 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:32.927 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:23:32.927 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:23:32.927 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:23:32.935 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:32.935 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:35.924 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:35.924 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:23:35.925 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:23:35.926 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:23:35.926 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:23:35.926 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:23:35.935 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:23:35.936 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.920 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:24:22.920 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:22.921 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:22.921 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:24:22.921 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.921 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.921 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:22.921 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:24:22.916Z +25-03-28 10:24:22.923 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:24:22.923 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:24:22.923 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:24:22.923 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:24:22.916Z] +25-03-28 10:24:22.923 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:24:22.924 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:24:22.922878100Z] +25-03-28 10:24:22.924 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.924 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:24:22.931 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:22.931 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:22.931 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.931 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.931 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:22.934 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:24:22.934 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:24:22.934 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:24:22.937 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:22.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:22.943 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:22.943 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:26.923 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:26.923 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:26.924 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:26.925 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:24:26.926 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:24:26.926 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:24:26.938 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:26.939 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:29.917 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:29.918 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:29.918 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:29.920 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:24:29.920 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:24:29.920 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:24:29.937 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:29.937 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:32.931 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:32.932 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:32.932 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:32.934 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:24:32.934 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:24:32.934 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:24:32.948 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:32.948 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:35.929 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:35.929 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:24:35.930 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:24:35.933 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:24:35.933 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:24:35.933 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:24:35.942 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:24:35.943 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.926 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:22.926 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 10:25:22.929 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 10:25:22.929 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:22.929 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.930 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.930 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:22.934 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9, newLastActiveAt: 2025-03-28T01:25:22.917Z +25-03-28 10:25:22.935 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:25:22.935 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:25:22.936 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:25:22.936 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 10:25:22.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T01:25:22.917Z] +25-03-28 10:25:22.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T01:25:22.935583600Z] +25-03-28 10:25:22.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.937 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [5ae3c7c2-d541-4f42-8fdf-6785e447e51e] +25-03-28 10:25:22.954 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:22.954 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:22.954 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.954 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.955 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:22.959 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:25:22.960 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:25:22.960 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:25:22.965 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:22.965 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:22.976 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:22.977 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:26.924 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:26.925 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:26.925 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:26.926 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:25:26.926 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:25:26.926 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:25:26.935 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:26.935 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:29.925 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:29.925 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:29.926 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:29.927 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:25:29.927 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:25:29.927 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:25:29.936 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:29.936 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:32.931 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:32.931 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:32.932 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:32.934 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:25:32.934 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:25:32.934 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:25:32.943 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:32.943 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:35.926 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:35.926 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:25:35.927 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 10:25:35.927 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 10:25:35.927 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 10:25:35.927 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 10:25:35.936 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 10:25:35.936 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 10:26:08.314 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 10:26:08.716 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 10:26:08.728 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 10:26:08.731 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 10:26:08.737 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 12:46:56.334 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 12:46:56.393 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Starting DiscodeitApplication using Java 17.0.14 with PID 4856 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 12:46:56.394 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - The following 1 profile is active: "test" +25-03-28 12:46:57.616 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 12:46:57.695 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 70 ms. Found 6 JPA repository interfaces. +25-03-28 12:46:58.382 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8081 (http) +25-03-28 12:46:58.392 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 12:46:58.394 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] +25-03-28 12:46:58.394 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 12:46:58.459 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +25-03-28 12:46:58.460 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2011 ms +25-03-28 12:46:58.573 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 12:46:58.780 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 12:46:58.782 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 12:46:58.791 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 12:46:59.030 [main] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 12:46:59.083 [main] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 12:46:59.114 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 12:46:59.410 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 12:46:59.485 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 12:47:00.535 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 12:47:00.582 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + drop constraint if exists UKqttel343c4eq691kcxipoixr7 +25-03-28 12:47:00.583 [main] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint UKqttel343c4eq691kcxipoixr7 unique (user_id, channel_id) +25-03-28 12:47:00.590 [main] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 12:47:00.598 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 12:47:00.930 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 12:47:01.733 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 12:47:02.582 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 12:47:02.663 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 12:47:02.680 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8081 (http) with context path '/' +25-03-28 12:47:02.697 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication - Started DiscodeitApplication in 6.938 seconds (process running for 7.668) +25-03-28 12:47:03.002 [RMI TCP Connection(4)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 12:47:03.002 [RMI TCP Connection(4)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +25-03-28 12:47:03.005 [RMI TCP Connection(4)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet - Completed initialization in 3 ms +25-03-28 12:52:48.871 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 12:52:48.871 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 12:52:49.013 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:52:49.013 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:52:49.015 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 12:52:49.015 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 12:52:49.079 [http-nio-8081-exec-4] WARN com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 실패] 상태가 존재하지 않는 사용자: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 12:52:49.079 [http-nio-8081-exec-5] WARN com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 실패] 상태가 존재하지 않는 사용자: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 12:52:49.175 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:53:18.759 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 12:53:18.762 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:18.763 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [fa1aa97a-221f-4cb9-adf2-a047728d15f9] +25-03-28 12:53:18.764 [http-nio-8081-exec-9] WARN com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 실패] 상태가 존재하지 않는 사용자: fa1aa97a-221f-4cb9-adf2-a047728d15f9 +25-03-28 12:53:18.852 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-28 12:53:18.859 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 12:53:18.860 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-28 12:53:18.860 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 12:53:18.862 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 12:53:18.862 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [rex] +25-03-28 12:53:18.862 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 12:53:18.863 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-28 12:53:18.955 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 완료] username: rex, id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:18.994 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 12:53:18.998 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [image/png] +25-03-28 12:53:18.999 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:18.902389600Z] +25-03-28 12:53:19.001 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [rex.png] +25-03-28 12:53:19.001 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:BIGINT) <- [64605] +25-03-28 12:53:19.001 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.008 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 12:53:19.009 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:18.946269Z] +25-03-28 12:53:19.009 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-28 12:53:19.010 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 12:53:19.010 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.010 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T03:53:18.946269Z] +25-03-28 12:53:19.010 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [rex] +25-03-28 12:53:19.010 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.011 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 12:53:19.011 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:18.953799800Z] +25-03-28 12:53:19.011 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:18.945277300Z] +25-03-28 12:53:19.012 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T03:53:18.953799800Z] +25-03-28 12:53:19.012 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.012 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:53:19.032 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:19.033 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:19.037 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:19.037 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:19.038 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.038 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.081 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:53:19.024Z +25-03-28 12:53:19.086 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:53:19.024Z +25-03-28 12:53:19.099 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:53:19.099 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:53:19.106 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:19.024Z] +25-03-28 12:53:19.106 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:19.024Z] +25-03-28 12:53:19.107 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:19.087316800Z] +25-03-28 12:53:19.107 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:19.085274500Z] +25-03-28 12:53:19.107 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.107 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.107 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:53:19.107 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:53:19.129 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:53:19.149 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:53:19.155 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:53:19.157 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:19.157 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:19.158 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.158 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.165 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:19.187 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:19.191 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:19.192 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:19.201 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:19.202 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.217 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:19.219 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.236 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:19.238 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.242 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:19.243 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:19.244 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:53:19.244 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.245 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:19.245 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:19.247 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:19.247 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:19.247 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.260 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:53:19.260 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:53:19.262 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:19.262 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:19.262 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.262 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.264 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:19.265 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:19.270 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:53:19.272 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:19.273 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:19.279 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:53:19.281 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:19.281 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:22.207 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:22.208 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:22.209 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:22.212 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:22.212 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:22.212 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:22.226 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:22.227 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:25.202 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:25.202 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:25.203 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:25.206 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:25.206 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:25.207 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:25.219 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:25.219 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:28.204 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:28.205 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:28.205 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:28.208 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:28.208 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:28.208 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:28.216 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:28.216 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:31.200 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:31.201 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:31.201 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:31.204 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:31.204 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:31.204 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:31.216 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:31.216 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:34.206 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:34.206 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:34.207 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:34.210 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:34.211 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:34.211 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:34.220 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:34.220 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:36.986 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:36.989 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:36.990 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:36.991 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:53:36.980Z +25-03-28 12:53:36.992 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:53:36.994 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:36.980Z] +25-03-28 12:53:36.994 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:36.992691400Z] +25-03-28 12:53:36.994 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:36.994 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:53:42.180 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService - [로그인 시도] username: rex +25-03-28 12:53:42.183 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-28 12:53:42.184 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [rex] +25-03-28 12:53:42.200 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:42.201 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.203 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService - [로그인 성공] username: rex +25-03-28 12:53:42.203 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:53:42.203 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:53:42.211 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:53:42.223 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:42.223 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:42.225 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:42.225 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.225 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:53:42.226 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.226 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.227 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.227 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:53:42.227 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.228 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:53:42.216Z +25-03-28 12:53:42.228 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.229 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:53:42.217Z +25-03-28 12:53:42.230 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:42.231 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:53:42.231 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:53:42.231 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:42.216Z] +25-03-28 12:53:42.231 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:42.229321500Z] +25-03-28 12:53:42.231 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.231 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:53:42.231 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:53:42.217Z] +25-03-28 12:53:42.232 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:53:42.230321300Z] +25-03-28 12:53:42.232 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.232 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:53:42.236 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:42.236 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:42.237 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:42.244 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:53:42.245 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.245 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.245 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.245 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:42.246 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.247 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:42.248 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:42.248 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:42.252 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.252 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.254 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.255 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.255 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:42.257 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:42.257 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:42.257 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:42.258 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.258 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.264 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.264 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:42.271 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:42.271 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:45.268 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:45.268 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:45.269 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:45.272 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:45.272 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:45.272 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:45.289 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:45.289 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:48.262 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:48.263 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:48.263 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:48.265 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:48.266 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:48.266 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:48.277 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:48.277 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:51.267 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:51.268 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:51.270 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:51.273 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:51.274 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:51.275 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:51.290 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:51.291 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:54.262 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:54.262 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:54.263 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:54.264 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:54.264 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:54.264 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:54.276 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:54.277 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:57.266 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:57.266 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:53:57.267 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:53:57.269 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:53:57.269 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:53:57.269 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:53:57.280 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:53:57.281 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:00.268 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:00.268 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:00.269 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:00.271 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:00.271 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:00.271 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:54:00.280 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:00.281 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:01.024 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 시도] type: PUBLIC, name: 공개 채널 +25-03-28 12:54:01.029 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 성공] id: cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9 +25-03-28 12:54:01.037 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:01.038 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:01.039 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 12:54:01.040 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:54:01.026748600Z] +25-03-28 12:54:01.040 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [공부하는 채널입니다!] +25-03-28 12:54:01.040 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [공개 채널] +25-03-28 12:54:01.040 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 12:54:01.040 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T03:54:01.026748600Z] +25-03-28 12:54:01.040 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:01.055 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:01.055 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:01.056 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:01.057 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:01.057 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:01.058 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [null] +25-03-28 12:54:01.059 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:01.060 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:01.069 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:01.070 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:01.107 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id + from + read_statuses rs1_0 + where + rs1_0.user_id=? + and rs1_0.channel_id=? + fetch + first ? rows only +25-03-28 12:54:02.538 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:02.538 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:02.538 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:INTEGER) <- [1] +25-03-28 12:54:02.551 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService - [읽기 정보 생성 완료] 읽기 정보가 생성되었습니다 id: 8436d87d-4c96-4d7c-8cd5-43cbed8a2be8 +25-03-28 12:54:02.552 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.ReadStatus */insert + into + read_statuses (channel_id, created_at, last_read_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 12:54:02.552 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:02.552 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:54:02.546603300Z] +25-03-28 12:54:02.552 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T03:54:02.509Z] +25-03-28 12:54:02.553 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T03:54:02.546603300Z] +25-03-28 12:54:02.553 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:02.553 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [8436d87d-4c96-4d7c-8cd5-43cbed8a2be8] +25-03-28 12:54:02.730 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:03.270 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:03.272 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:03.275 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:03.276 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:03.276 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:03.278 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:03.279 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:03.290 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:03.290 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:03.376 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:06.274 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:06.275 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:06.276 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:06.276 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:06.276 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:06.277 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:06.278 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:06.289 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:06.290 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:06.824 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:09.269 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:09.270 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:09.271 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:09.271 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:09.271 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:09.272 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:09.273 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:09.281 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:09.281 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:09.405 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:54:12.231 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:12.233 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:54:12.217Z +25-03-28 12:54:12.235 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:54:12.236 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:54:12.217Z] +25-03-28 12:54:12.236 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:54:12.234136700Z] +25-03-28 12:54:12.236 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:12.237 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:54:12.275 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:12.275 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:12.277 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:12.279 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:12.280 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:12.280 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:12.282 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:12.283 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:12.299 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:12.300 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:14.719 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:15.268 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:15.272 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:15.275 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:15.276 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:15.276 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:15.278 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:15.279 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:15.286 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:15.287 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:17.733 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:18.260 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:18.262 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:18.263 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:18.263 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:18.264 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:18.265 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:18.266 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:18.277 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:18.277 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.238 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:21.239 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 요청 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:21.240 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:54:21.240 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:54:21.240 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.240 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.241 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:54:21.235Z +25-03-28 12:54:21.241 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:54:21.230Z +25-03-28 12:54:21.242 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:54:21.242 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:54:21.235Z] +25-03-28 12:54:21.242 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:54:21.241489500Z] +25-03-28 12:54:21.242 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.242 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:54:21.242 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:54:21.242 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:54:21.230Z] +25-03-28 12:54:21.242 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:54:21.241489500Z] +25-03-28 12:54:21.242 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.242 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 12:54:21.249 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:54:21.304 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:54:21.305 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:54:21.306 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:54:21.307 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:21.307 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.308 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 12:54:21.309 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:21.310 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:21.311 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.313 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:21.313 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:54:21.313 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:21.313 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:21.314 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:54:21.315 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:54:21.315 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:21.315 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:21.318 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:54:21.319 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:54:21.320 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:54:21.324 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService - [파일 조회] id: e9cea8db-cc33-49bb-b331-04ce0e02f3e2 +25-03-28 12:54:21.325 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 12:54:21.325 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e9cea8db-cc33-49bb-b331-04ce0e02f3e2] +25-03-28 12:54:21.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:21.327 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:21.328 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.328 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.329 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:21.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:21.331 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:21.331 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:21.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:21.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:21.335 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:21.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:21.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:21.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:23.114 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.id=? +25-03-28 12:54:23.115 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [8436d87d-4c96-4d7c-8cd5-43cbed8a2be8] +25-03-28 12:54:23.116 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: 8436d87d-4c96-4d7c-8cd5-43cbed8a2be8 +25-03-28 12:54:23.117 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.ReadStatus */update read_statuses + set + channel_id=?, + last_read_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:54:23.118 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:23.118 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:54:23.105Z] +25-03-28 12:54:23.118 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T03:54:23.116954100Z] +25-03-28 12:54:23.118 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:23.118 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [8436d87d-4c96-4d7c-8cd5-43cbed8a2be8] +25-03-28 12:54:23.119 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:24.329 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:24.331 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 조회 성공] id: e555794e-a1f7-4761-9d57-78c392fc4d8d +25-03-28 12:54:24.334 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 12:54:24.334 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 12:54:24.334 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:24.336 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 12:54:24.336 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cc9ff584-1cc8-4bb9-8cc6-263c6fac0ad9] +25-03-28 12:54:24.352 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 12:54:24.352 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:25.352 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 12:54:25.953 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:25.954 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService - [유저 상태 수정 완료 - userId 기준] userId: e555794e-a1f7-4761-9d57-78c392fc4d8d, newLastActiveAt: 2025-03-28T03:54:25.946Z +25-03-28 12:54:25.956 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 12:54:25.956 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T03:54:25.946Z] +25-03-28 12:54:25.957 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T03:54:25.955957400Z] +25-03-28 12:54:25.957 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:UUID) <- [e555794e-a1f7-4761-9d57-78c392fc4d8d] +25-03-28 12:54:25.957 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [948e8f90-bfa4-453a-935e-0da5781a7303] +25-03-28 14:20:22.076 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:20:22.223 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 4708 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:20:22.225 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:20:22.956 [Test worker] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'jpaAuditingHandler' defined in null: Cannot register bean definition [Root bean: class=org.springframework.data.auditing.AuditingHandler; scope=; abstract=false; lazyInit=null; autowireMode=2; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=from; initMethodNames=null; destroyMethodNames=null] for bean 'jpaAuditingHandler' since there is already [Root bean: class=org.springframework.data.auditing.AuditingHandler; scope=; abstract=false; lazyInit=null; autowireMode=2; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=from; initMethodNames=null; destroyMethodNames=null] bound. +25-03-28 14:20:23.002 [Test worker] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-03-28 14:20:23.081 [Test worker] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +The bean 'jpaAuditingHandler' could not be registered. A bean with that name has already been defined and overriding is disabled. + +Action: + +Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true + +25-03-28 14:20:23.088 [Test worker] WARN org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.repository.UserRepositoryTest@44fdce3c] +java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@3f5156a6 testClass = com.sprint.mission.discodeit.repository.UserRepositoryTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["test"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2e11485, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@fd8294b, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@34be3d80, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@8a0fb7ef, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@618c5d94, [ImportsContextCustomizer@72bdd7c7 key = [@org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureDataJpa(), @org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase(connection=NONE, replace=NON_TEST), @org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureTestEntityManager(), @org.springframework.aot.hint.annotation.Reflective(processors={org.springframework.aot.hint.annotation.SimpleReflectiveProcessor.class}, value={org.springframework.aot.hint.annotation.SimpleReflectiveProcessor.class}), @org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest(bootstrapMode=DEFAULT, excludeAutoConfiguration={}, excludeFilters={}, includeFilters={}, properties={}, showSql=true, useDefaultFilters=true), @org.springframework.context.annotation.Import(value={org.springframework.boot.autoconfigure.ImportAutoConfigurationImportSelector.class}), @org.springframework.transaction.annotation.Transactional(isolation=DEFAULT, label={}, noRollbackFor={}, noRollbackForClassName={}, propagation=REQUIRED, readOnly=false, rollbackFor={}, rollbackForClassName={}, timeout=-1, timeoutString="", transactionManager="", value=""), @org.springframework.context.annotation.Import({com.sprint.mission.discodeit.config.AppConfig.class}), @org.springframework.test.context.BootstrapWith(value=org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper.class), @org.springframework.boot.test.autoconfigure.core.AutoConfigureCache(cacheProvider=NONE), @org.springframework.data.jpa.repository.config.EnableJpaAuditing(auditorAwareRef="", setDates=true, dateTimeProviderRef="", modifyOnCreate=true), @org.springframework.test.context.ActiveProfiles(inheritProfiles=true, profiles={"test"}, resolver=org.springframework.test.context.ActiveProfilesResolver.class, value={"test"}), @org.springframework.boot.test.autoconfigure.properties.PropertyMapping(skip=NO, value="spring.test.database"), @org.springframework.boot.autoconfigure.ImportAutoConfiguration(classes={}, exclude={}, value={}), @org.springframework.boot.test.autoconfigure.filter.TypeExcludeFilters(value={org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTypeExcludeFilter.class}), @org.springframework.context.annotation.Import(value={org.springframework.data.jpa.repository.config.JpaAuditingRegistrar.class}), @org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration(enabled=false)]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@12dae582, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@5b057c8c, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@15eebbff, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@913d7d91], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'jpaAuditingHandler' defined in null: Cannot register bean definition [Root bean: class=org.springframework.data.auditing.AuditingHandler; scope=; abstract=false; lazyInit=null; autowireMode=2; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=from; initMethodNames=null; destroyMethodNames=null] for bean 'jpaAuditingHandler' since there is already [Root bean: class=org.springframework.data.auditing.AuditingHandler; scope=; abstract=false; lazyInit=null; autowireMode=2; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=from; initMethodNames=null; destroyMethodNames=null] bound. + at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:1151) + at org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport.registerAuditHandlerBeanDefinition(AuditingBeanDefinitionRegistrarSupport.java:79) + at org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport.registerBeanDefinitions(AuditingBeanDefinitionRegistrarSupport.java:59) + at org.springframework.data.jpa.repository.config.JpaAuditingRegistrar.registerBeanDefinitions(JpaAuditingRegistrar.java:67) + at org.springframework.context.annotation.ImportBeanDefinitionRegistrar.registerBeanDefinitions(ImportBeanDefinitionRegistrar.java:86) + at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars$1(ConfigurationClassBeanDefinitionReader.java:387) + at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) + at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:386) + at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:149) + at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:121) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:430) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:290) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:791) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:609) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +25-03-28 14:22:03.336 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:22:03.458 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 1136 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:22:03.460 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:22:04.227 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:22:04.398 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 150 ms. Found 6 JPA repository interfaces. +25-03-28 14:22:04.498 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:22:04.795 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:57735ac2-c96d-4cf6-b0e3-591c6a12481e;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:22:05.361 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:22:05.489 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:22:05.560 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:22:06.010 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:22:06.140 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@bfd97fb'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:22:07.659 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:22:07.684 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:22:07.687 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:22:07.689 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:22:07.690 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:22:07.691 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:22:07.693 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:22:07.695 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:22:07.702 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:22:07.707 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:22:07.713 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:22:07.716 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:22:07.719 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:22:07.723 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:22:07.725 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:22:07.729 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:22:07.732 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:22:07.733 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:22:07.735 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:22:07.737 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:22:07.740 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:22:07.742 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:22:07.745 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:22:07.750 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:22:08.453 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:22:09.392 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.713 seconds (process running for 8.436) +25-03-28 14:22:10.191 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:24:14.554 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:24:14.668 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 5452 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:24:14.670 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:24:15.415 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:24:15.536 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 108 ms. Found 6 JPA repository interfaces. +25-03-28 14:24:15.644 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:24:15.983 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:1e7b442f-e346-44bf-9e39-a6032639bd8c;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:24:16.492 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:24:16.615 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:24:16.685 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:24:17.270 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:24:17.417 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@adc8683'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:24:18.921 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:24:18.946 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:24:18.951 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:24:18.953 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:24:18.954 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:24:18.956 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:24:18.957 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:24:18.960 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:24:18.967 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:24:18.973 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:24:18.981 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:24:18.984 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:24:18.986 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:24:18.990 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:24:18.994 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:24:18.997 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:24:19.001 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:24:19.004 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:24:19.006 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:24:19.009 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:24:19.011 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:24:19.013 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:24:19.016 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:24:19.021 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:24:19.634 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:24:20.589 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.756 seconds (process running for 8.589) +25-03-28 14:24:22.428 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:25:19.490 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:25:19.601 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 15052 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:25:19.603 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:25:20.507 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:25:20.699 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 170 ms. Found 6 JPA repository interfaces. +25-03-28 14:25:20.822 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:25:21.139 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:88436a4c-eec0-4a1e-9876-55db3d15e1c8;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:25:21.750 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:25:21.913 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:25:21.997 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:25:22.662 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:25:22.783 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@45f1413c'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:25:24.384 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:25:24.413 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:25:24.417 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:25:24.419 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:25:24.421 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:25:24.423 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:25:24.425 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:25:24.428 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:25:24.438 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:25:24.443 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:25:24.446 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:25:24.450 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:25:24.452 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:25:24.455 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:25:24.459 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:25:24.464 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:25:24.467 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:25:24.471 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:25:24.474 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:25:24.477 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:25:24.480 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:25:24.483 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:25:24.485 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:25:24.491 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:25:25.213 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:25:26.241 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 7.555 seconds (process running for 9.66) +25-03-28 14:25:28.191 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:26:17.044 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:26:17.167 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 17680 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:26:17.169 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:26:18.008 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:26:18.183 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 153 ms. Found 6 JPA repository interfaces. +25-03-28 14:26:18.291 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:26:18.565 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:1b4f3eaa-7b23-40b7-a118-723bb667b028;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:26:19.092 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:26:19.232 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:26:19.304 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:26:19.817 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:26:19.917 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@186295cc'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:26:21.323 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:26:21.346 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:26:21.350 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:26:21.351 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:26:21.352 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:26:21.354 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:26:21.355 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:26:21.358 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:26:21.366 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:26:21.371 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:26:21.376 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:26:21.379 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:26:21.383 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:26:21.387 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:26:21.390 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:26:21.395 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:26:21.398 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:26:21.401 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:26:21.404 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:26:21.405 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:26:21.407 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:26:21.408 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:26:21.410 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:26:21.417 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:26:22.022 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:26:22.912 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.572 seconds (process running for 8.58) +25-03-28 14:26:24.892 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:26:29.862 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:26:29.975 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 11384 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:26:29.976 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:26:30.748 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:26:30.917 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 148 ms. Found 6 JPA repository interfaces. +25-03-28 14:26:31.038 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:26:31.343 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:86a2564b-6c9a-4cab-9700-382be9ce5ed7;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:26:31.874 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:26:31.997 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:26:32.075 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:26:32.612 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:26:32.708 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@261a66b8'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:26:34.113 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:26:34.133 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:26:34.138 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:26:34.140 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:26:34.142 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:26:34.143 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:26:34.145 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:26:34.146 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:26:34.155 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:26:34.159 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:26:34.163 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:26:34.167 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:26:34.170 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:26:34.173 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:26:34.176 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:26:34.179 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:26:34.182 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:26:34.184 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:26:34.186 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:26:34.189 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:26:34.192 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:26:34.195 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:26:34.197 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:26:34.204 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:26:34.876 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:26:35.861 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.663 seconds (process running for 8.452) +25-03-28 14:26:37.751 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:27:42.176 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:27:42.271 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 2992 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:27:42.272 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:27:42.985 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:27:43.129 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 122 ms. Found 6 JPA repository interfaces. +25-03-28 14:27:43.221 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:27:43.492 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:75280dc5-0738-48d2-ba93-18fc80de4823;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:27:43.986 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:27:44.105 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:27:44.167 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:27:44.638 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:27:44.737 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@186295cc'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:27:46.058 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:27:46.077 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:27:46.082 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:27:46.083 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:27:46.085 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:27:46.086 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:27:46.087 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:27:46.089 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:27:46.095 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:27:46.100 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:27:46.104 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:27:46.105 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:27:46.107 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:27:46.111 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:27:46.115 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:27:46.121 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:27:46.125 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:27:46.129 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:27:46.131 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:27:46.135 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:27:46.137 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:27:46.140 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:27:46.142 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:27:46.150 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:27:46.749 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:27:47.637 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.136 seconds (process running for 7.748) +25-03-28 14:27:49.484 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:28:57.931 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:28:58.033 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 18992 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:28:58.035 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:28:58.731 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:28:58.875 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 127 ms. Found 6 JPA repository interfaces. +25-03-28 14:28:58.967 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:28:59.238 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:e6841c53-c2d7-4359-a66a-1eb342693a21;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:28:59.781 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:28:59.892 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:28:59.958 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:29:00.444 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:29:00.538 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@1b19712f'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:29:01.910 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:29:01.928 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:29:01.932 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:29:01.933 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:29:01.935 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:29:01.938 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:29:01.940 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:29:01.942 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:29:01.952 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:29:01.957 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:29:01.961 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:29:01.962 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:29:01.964 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:29:01.968 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:29:01.971 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:29:01.975 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:29:01.977 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:29:01.980 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:29:01.982 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:29:01.985 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:29:01.988 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:29:01.993 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:29:01.996 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:29:02.004 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:29:02.631 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:29:03.597 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.341 seconds (process running for 8.153) +25-03-28 14:29:04.416 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:29:04.424 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.289286400Z] +25-03-28 14:29:04.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:29:04.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [password123!] +25-03-28 14:29:04.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:29:04.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.289286400Z] +25-03-28 14:29:04.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:29:04.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [9714bef0-aae4-4715-98e4-f35012b041ad] +25-03-28 14:29:04.459 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 14:29:04.461 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [junwo@email.com] +25-03-28 14:29:04.462 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 14:29:04.488 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 14:29:04.489 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [junwo] +25-03-28 14:29:04.489 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 14:29:04.614 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:29:04.615 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.599626200Z] +25-03-28 14:29:04.615 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:29:04.616 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [password123!] +25-03-28 14:29:04.616 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:29:04.616 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.599626200Z] +25-03-28 14:29:04.616 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:29:04.616 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [91adf17e-81d3-45dd-8b30-110e90b0cabb] +25-03-28 14:29:04.619 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 14:29:04.620 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.601643500Z] +25-03-28 14:29:04.621 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.599626200Z] +25-03-28 14:29:04.621 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.601643500Z] +25-03-28 14:29:04.621 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [91adf17e-81d3-45dd-8b30-110e90b0cabb] +25-03-28 14:29:04.621 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [a0c2f689-a577-4fcc-9b31-5f8ea647c438] +25-03-28 14:29:04.623 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 14:29:04.655 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:29:04.656 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.650440600Z] +25-03-28 14:29:04.657 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-28 14:29:04.657 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 14:29:04.657 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:29:04.657 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:29:04.650440600Z] +25-03-28 14:29:04.658 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [rex] +25-03-28 14:29:04.658 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [0ecca2c7-14ee-4050-92b8-f286e7e67323] +25-03-28 14:29:04.660 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-28 14:29:04.661 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [rex] +25-03-28 14:29:04.703 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:29:51.692 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:29:51.804 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 20376 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:29:51.806 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:29:52.603 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:29:52.747 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 128 ms. Found 6 JPA repository interfaces. +25-03-28 14:29:52.877 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:29:53.157 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:5f0162a3-addb-4639-ab27-c673e86c4823;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:29:53.648 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:29:53.761 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:29:53.828 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:29:54.345 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:29:54.437 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@73be4cdd'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:29:55.808 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:29:55.829 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:29:55.834 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:29:55.838 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:29:55.840 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:29:55.842 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:29:55.844 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:29:55.847 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:29:55.857 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:29:55.861 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:29:55.865 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:29:55.866 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:29:55.870 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:29:55.874 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:29:55.877 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:29:55.881 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:29:55.884 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:29:55.889 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:29:55.893 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:29:55.895 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:29:55.898 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:29:55.901 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:29:55.903 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:29:55.911 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:29:56.475 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:29:57.286 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.279 seconds (process running for 7.951) +25-03-28 14:29:58.139 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:29:58.147 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:29:58.052311100Z] +25-03-28 14:29:58.155 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:29:58.156 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [password123!] +25-03-28 14:29:58.157 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:29:58.157 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:29:58.052311100Z] +25-03-28 14:29:58.157 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:29:58.157 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [79ac5158-dffb-4001-a2f2-c90f30897787] +25-03-28 14:29:58.189 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 14:29:58.321 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:30:08.979 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:30:09.094 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Starting UserRepositoryTest using Java 17.0.14 with PID 17844 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:30:09.096 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:30:09.861 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:30:10.011 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 132 ms. Found 6 JPA repository interfaces. +25-03-28 14:30:10.134 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:30:10.405 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:525a429f-ae02-425b-b3bf-5e187293ed88;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:30:10.905 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:30:11.018 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:30:11.069 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:30:11.576 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:30:11.681 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@bfd97fb'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:30:13.042 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:30:13.060 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:30:13.066 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:30:13.067 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:30:13.069 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:30:13.072 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:30:13.073 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:30:13.076 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:30:13.085 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:30:13.090 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:30:13.093 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:30:13.095 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:30:13.096 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:30:13.100 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:30:13.103 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:30:13.106 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:30:13.108 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:30:13.111 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:30:13.113 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:30:13.116 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:30:13.118 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:30:13.122 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:30:13.125 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:30:13.131 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:30:13.827 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:30:14.741 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest - Started UserRepositoryTest in 6.405 seconds (process running for 8.146) +25-03-28 14:30:15.557 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:30:15.563 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:30:15.437329200Z] +25-03-28 14:30:15.567 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:30:15.567 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [password123!] +25-03-28 14:30:15.568 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:30:15.568 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:30:15.437329200Z] +25-03-28 14:30:15.569 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:30:15.571 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [40e36fdc-81aa-4b3d-97de-8b09a79a39f0] +25-03-28 14:30:15.591 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 14:30:15.593 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:30:15.481381600Z] +25-03-28 14:30:15.593 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T05:30:15.477946200Z] +25-03-28 14:30:15.594 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T05:30:15.481381600Z] +25-03-28 14:30:15.594 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [40e36fdc-81aa-4b3d-97de-8b09a79a39f0] +25-03-28 14:30:15.595 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [56a218dd-d18f-4faa-9fa8-5176e5970450] +25-03-28 14:30:15.617 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 14:30:15.752 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:32:24.847 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:32:24.947 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - Starting MessageRepositoryTest using Java 17.0.14 with PID 11848 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:32:24.950 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:32:25.676 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:32:25.825 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 126 ms. Found 6 JPA repository interfaces. +25-03-28 14:32:25.917 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:32:26.152 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:5096277b-5eb7-454c-bf95-34635ca82ec3;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:32:26.614 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:32:26.709 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:32:26.763 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:32:27.320 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:32:27.421 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@70697478'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:32:28.734 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:32:28.760 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:32:28.764 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:32:28.767 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:32:28.768 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:32:28.770 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:32:28.772 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:32:28.775 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:32:28.782 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:32:28.786 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:32:28.791 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:32:28.793 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:32:28.795 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:32:28.798 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:32:28.803 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:32:28.810 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:32:28.812 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:32:28.814 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:32:28.816 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:32:28.818 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:32:28.821 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:32:28.823 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:32:28.825 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:32:28.831 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:32:29.368 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:32:30.176 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - Started MessageRepositoryTest in 6.085 seconds (process running for 8.05) +25-03-28 14:32:30.965 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:32:30.975 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:30.976 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:32:30.977 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:32:30.977 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:32:30.977 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:30.977 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [0680060d-95b4-46bc-9c4a-eaa880fc6053] +25-03-28 14:32:30.985 [Test worker] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 23502, SQLState: 23502 +25-03-28 14:32:30.985 [Test worker] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - NULL not allowed for column "CREATED_AT"; SQL statement: +/* insert for com.sprint.mission.discodeit.entity.Channel */insert into channels (created_ [23502-232] +25-03-28 14:32:31.097 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:32:31.097 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:31.097 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:32:31.098 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:32:31.098 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:32:31.098 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:31.098 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [8c0b18f5-3d89-4860-817e-c83d641d6447] +25-03-28 14:32:31.099 [Test worker] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 23502, SQLState: 23502 +25-03-28 14:32:31.099 [Test worker] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - NULL not allowed for column "CREATED_AT"; SQL statement: +/* insert for com.sprint.mission.discodeit.entity.Channel */insert into channels (created_ [23502-232] +25-03-28 14:32:31.134 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:32:31.135 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:31.136 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:32:31.136 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:32:31.136 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:32:31.136 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:31.136 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [32e3de6d-daf1-4074-adcf-161227c2781c] +25-03-28 14:32:31.137 [Test worker] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 23502, SQLState: 23502 +25-03-28 14:32:31.137 [Test worker] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - NULL not allowed for column "CREATED_AT"; SQL statement: +/* insert for com.sprint.mission.discodeit.entity.Channel */insert into channels (created_ [23502-232] +25-03-28 14:32:31.177 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:32:52.139 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:32:52.238 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - Starting MessageRepositoryTest using Java 17.0.14 with PID 20936 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:32:52.240 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:32:52.926 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:32:53.077 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 131 ms. Found 6 JPA repository interfaces. +25-03-28 14:32:53.172 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:32:53.422 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:5b71d656-01da-41cd-bd43-fe145fd1a78b;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:32:53.916 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:32:54.008 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:32:54.057 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:32:54.616 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:32:54.715 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@29519337'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:32:56.044 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:32:56.061 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:32:56.066 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:32:56.069 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:32:56.071 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:32:56.073 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:32:56.077 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:32:56.079 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:32:56.090 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:32:56.094 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:32:56.097 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:32:56.100 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:32:56.102 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:32:56.107 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:32:56.110 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:32:56.115 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:32:56.118 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:32:56.121 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:32:56.124 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:32:56.127 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:32:56.130 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:32:56.133 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:32:56.136 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:32:56.145 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:32:56.679 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:32:57.591 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - Started MessageRepositoryTest in 6.091 seconds (process running for 7.834) +25-03-28 14:32:58.394 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:32:58.402 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:58.403 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:32:58.404 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:32:58.404 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:32:58.405 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [null] +25-03-28 14:32:58.405 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [dd13d779-11ae-4d7f-84ec-ebfaad1f41bc] +25-03-28 14:32:58.412 [Test worker] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 23502, SQLState: 23502 +25-03-28 14:32:58.412 [Test worker] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - NULL not allowed for column "CREATED_AT"; SQL statement: +/* insert for com.sprint.mission.discodeit.entity.Channel */insert into channels (created_ [23502-232] +25-03-28 14:32:58.501 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:33:55.718 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:33:55.847 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - Starting MessageRepositoryTest using Java 17.0.14 with PID 9408 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:33:55.849 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - The following 1 profile is active: "test" +25-03-28 14:33:56.663 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 14:33:56.871 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 159 ms. Found 6 JPA repository interfaces. +25-03-28 14:33:56.965 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 14:33:57.305 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Starting embedded database: url='jdbc:h2:mem:72b10b7b-3902-4bd8-807e-57139f1d6b05;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 14:33:57.795 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 14:33:57.895 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 14:33:57.948 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 14:33:58.474 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 14:33:58.579 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@39b85a73'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 14:33:59.935 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 14:33:59.964 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 14:33:59.969 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 14:33:59.971 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 14:33:59.972 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 14:33:59.973 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 14:33:59.974 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 14:33:59.976 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 14:33:59.982 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 14:33:59.987 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 14:33:59.990 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 14:33:59.993 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 14:33:59.997 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 14:34:00.003 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 14:34:00.007 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 14:34:00.012 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 14:34:00.016 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 14:34:00.018 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 14:34:00.021 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 14:34:00.024 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 14:34:00.027 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 14:34:00.028 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 14:34:00.030 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 14:34:00.036 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:34:00.671 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 14:34:01.496 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest - Started MessageRepositoryTest in 6.446 seconds (process running for 8.245) +25-03-28 14:34:02.355 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.364 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.135014700Z] +25-03-28 14:34:02.371 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:34:02.372 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:34:02.373 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:34:02.373 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.135014700Z] +25-03-28 14:34:02.373 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [b8418454-b60d-4c33-bffa-3b03a1ba82b9] +25-03-28 14:34:02.393 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.394 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.193743200Z] +25-03-28 14:34:02.395 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:34:02.396 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [pass] +25-03-28 14:34:02.396 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:34:02.397 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.193743200Z] +25-03-28 14:34:02.397 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:34:02.398 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [015f8d3a-5a87-4c4f-8e9e-5176660eac0f] +25-03-28 14:34:02.399 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 14:34:02.401 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.201885500Z] +25-03-28 14:34:02.403 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.199272Z] +25-03-28 14:34:02.404 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.201885500Z] +25-03-28 14:34:02.404 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [015f8d3a-5a87-4c4f-8e9e-5176660eac0f] +25-03-28 14:34:02.405 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [f944227e-2226-4042-b4ba-c6607716fbb1] +25-03-28 14:34:02.406 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.407 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [015f8d3a-5a87-4c4f-8e9e-5176660eac0f] +25-03-28 14:34:02.407 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [b8418454-b60d-4c33-bffa-3b03a1ba82b9] +25-03-28 14:34:02.408 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Hi!] +25-03-28 14:34:02.408 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.209962400Z] +25-03-28 14:34:02.408 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.209962400Z] +25-03-28 14:34:02.408 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [304ea0ad-c23a-454e-9a16-0f06d3254b1c] +25-03-28 14:34:02.412 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.413 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [015f8d3a-5a87-4c4f-8e9e-5176660eac0f] +25-03-28 14:34:02.413 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [b8418454-b60d-4c33-bffa-3b03a1ba82b9] +25-03-28 14:34:02.413 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Latest] +25-03-28 14:34:02.413 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.229552500Z] +25-03-28 14:34:02.414 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.229552500Z] +25-03-28 14:34:02.414 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [7096a5ee-72ae-4bf9-b1ea-67618a538d31] +25-03-28 14:34:02.454 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 14:34:02.459 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [b8418454-b60d-4c33-bffa-3b03a1ba82b9] +25-03-28 14:34:02.699 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.701 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.652870400Z] +25-03-28 14:34:02.701 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:34:02.702 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:34:02.702 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:34:02.702 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.652870400Z] +25-03-28 14:34:02.702 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [52455b2d-c5d2-47cf-a2cb-81ae5ff0cd1e] +25-03-28 14:34:02.705 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.706 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.653872900Z] +25-03-28 14:34:02.706 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:34:02.706 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [pass] +25-03-28 14:34:02.707 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:34:02.707 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.653872900Z] +25-03-28 14:34:02.708 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:34:02.708 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [b46f223c-6d9b-4c72-a1ee-a8977ee5b7c0] +25-03-28 14:34:02.709 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 14:34:02.712 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.654870800Z] +25-03-28 14:34:02.712 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.654870800Z] +25-03-28 14:34:02.713 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.654870800Z] +25-03-28 14:34:02.713 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [b46f223c-6d9b-4c72-a1ee-a8977ee5b7c0] +25-03-28 14:34:02.713 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [e02869d6-1cc3-407c-a2c7-888416937baf] +25-03-28 14:34:02.715 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.716 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [b46f223c-6d9b-4c72-a1ee-a8977ee5b7c0] +25-03-28 14:34:02.716 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [52455b2d-c5d2-47cf-a2cb-81ae5ff0cd1e] +25-03-28 14:34:02.716 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Msg1] +25-03-28 14:34:02.717 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.655871400Z] +25-03-28 14:34:02.717 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.655871400Z] +25-03-28 14:34:02.717 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [580c3e90-55aa-4ba8-a768-f88562c6c4df] +25-03-28 14:34:02.718 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.719 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [b46f223c-6d9b-4c72-a1ee-a8977ee5b7c0] +25-03-28 14:34:02.720 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [52455b2d-c5d2-47cf-a2cb-81ae5ff0cd1e] +25-03-28 14:34:02.720 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Msg2] +25-03-28 14:34:02.721 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.656865700Z] +25-03-28 14:34:02.722 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.656865700Z] +25-03-28 14:34:02.723 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [ab83295d-5248-4afc-bafd-9fe653e29881] +25-03-28 14:34:02.724 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + where + m1_0.channel_id=? +25-03-28 14:34:02.726 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [52455b2d-c5d2-47cf-a2cb-81ae5ff0cd1e] +25-03-28 14:34:02.776 [Test worker] DEBUG org.hibernate.SQL - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-03-28 14:34:02.777 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [580c3e90-55aa-4ba8-a768-f88562c6c4df] +25-03-28 14:34:02.783 [Test worker] DEBUG org.hibernate.SQL - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-03-28 14:34:02.783 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [ab83295d-5248-4afc-bafd-9fe653e29881] +25-03-28 14:34:02.785 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 +25-03-28 14:34:02.848 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.849 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.829284700Z] +25-03-28 14:34:02.850 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [설명] +25-03-28 14:34:02.851 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test] +25-03-28 14:34:02.851 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 14:34:02.852 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.829284700Z] +25-03-28 14:34:02.852 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [9b058980-dc5f-40f9-8d6f-1754bd468039] +25-03-28 14:34:02.856 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.857 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.831118900Z] +25-03-28 14:34:02.858 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 14:34:02.859 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [pass] +25-03-28 14:34:02.860 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [null] +25-03-28 14:34:02.860 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.831118900Z] +25-03-28 14:34:02.861 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 14:34:02.861 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (7:UUID) <- [6e04c698-1c44-4eca-8f49-5122e0fab5bb] +25-03-28 14:34:02.863 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 14:34:02.866 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.831118900Z] +25-03-28 14:34:02.866 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.831118900Z] +25-03-28 14:34:02.867 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.831118900Z] +25-03-28 14:34:02.867 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:UUID) <- [6e04c698-1c44-4eca-8f49-5122e0fab5bb] +25-03-28 14:34:02.868 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:UUID) <- [d0f5ca17-dd64-4a6d-9a4e-90d8e2ec99c4] +25-03-28 14:34:02.870 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.873 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [6e04c698-1c44-4eca-8f49-5122e0fab5bb] +25-03-28 14:34:02.874 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [9b058980-dc5f-40f9-8d6f-1754bd468039] +25-03-28 14:34:02.874 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Hello 1] +25-03-28 14:34:02.874 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.832319900Z] +25-03-28 14:34:02.875 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.832319900Z] +25-03-28 14:34:02.875 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [f3a0bbc8-e182-48c0-9098-84ae587ee3a5] +25-03-28 14:34:02.875 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 14:34:02.876 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [6e04c698-1c44-4eca-8f49-5122e0fab5bb] +25-03-28 14:34:02.876 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [9b058980-dc5f-40f9-8d6f-1754bd468039] +25-03-28 14:34:02.876 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [Hello 2] +25-03-28 14:34:02.878 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.833316800Z] +25-03-28 14:34:02.878 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T05:34:02.833316800Z] +25-03-28 14:34:02.878 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [d387234e-d6e1-4c40-ad4d-67e07d3027ea] +25-03-28 14:34:02.879 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id=:channelId + AND m.createdAt < :createdAt */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 14:35:31.570 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 14:35:31.571 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:UUID) <- [a5f16aff-46af-49b0-9c96-0462cc7681fd] +25-03-28 14:35:31.863 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 14:41:06.097 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:41:06.240 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Starting UserControllerTest using Java 17.0.14 with PID 16100 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:41:06.243 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - The following 1 profile is active: "test" +25-03-28 14:41:07.644 [Test worker] WARN org.springframework.web.context.support.GenericWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main\com\sprint\mission\discodeit\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} +25-03-28 14:41:07.689 [Test worker] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-03-28 14:41:07.773 [Test worker] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Parameter 0 of constructor in com.sprint.mission.discodeit.controller.UserController required a bean of type 'com.sprint.mission.discodeit.service.UserService' that could not be found. + + +Action: + +Consider defining a bean of type 'com.sprint.mission.discodeit.service.UserService' in your configuration. + +25-03-28 14:41:07.782 [Test worker] WARN org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@47198524] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@674aa626 testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@79145d5a, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@6821ea29, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@501721a1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2870503a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@60f7cc1d, [ImportsContextCustomizer@4dd1d2bb key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fc44dec, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2692b61e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@63192798, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@4cdaaf00], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main\com\sprint\mission\discodeit\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1371) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1208) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:2139) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1589) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1514) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 115 common frames omitted +25-03-28 14:41:07.823 [Test worker] WARN org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@69d2e517] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@674aa626 testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@79145d5a, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@6821ea29, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@501721a1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2870503a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@60f7cc1d, [ImportsContextCustomizer@4dd1d2bb key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fc44dec, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2692b61e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@63192798, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@4cdaaf00], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 14:41:07.828 [Test worker] WARN org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@3d71e10b] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@674aa626 testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@79145d5a, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@6821ea29, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@501721a1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2870503a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@60f7cc1d, [ImportsContextCustomizer@4dd1d2bb key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fc44dec, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2692b61e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@63192798, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@4cdaaf00], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 14:41:07.833 [Test worker] WARN org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@16cf7fd0] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@674aa626 testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@79145d5a, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@6821ea29, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@501721a1, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2870503a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@60f7cc1d, [ImportsContextCustomizer@4dd1d2bb key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7fc44dec, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2692b61e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@63192798, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@4cdaaf00], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 14:41:28.450 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:41:28.553 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Starting UserControllerTest using Java 17.0.14 with PID 6016 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:41:28.555 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - The following 1 profile is active: "test" +25-03-28 14:41:31.394 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:41:32.172 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:41:32.173 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:41:32.176 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 14:41:32.259 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Started UserControllerTest in 4.553 seconds (process running for 6.442) +25-03-28 14:41:51.350 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:41:51.463 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Starting UserControllerTest using Java 17.0.14 with PID 14724 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:41:51.465 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - The following 1 profile is active: "test" +25-03-28 14:41:54.237 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:41:54.966 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:41:54.967 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:41:54.971 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 4 ms +25-03-28 14:41:55.048 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Started UserControllerTest in 4.329 seconds (process running for 6.154) +25-03-28 14:44:50.913 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:44:51.015 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Starting UserControllerTest using Java 17.0.14 with PID 1568 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:44:51.017 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - The following 1 profile is active: "test" +25-03-28 14:44:54.105 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:44:54.899 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:44:54.900 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:44:54.902 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 1 ms +25-03-28 14:44:54.996 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Started UserControllerTest in 4.73 seconds (process running for 6.627) +25-03-28 14:45:01.192 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:45:01.297 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Starting UserControllerTest using Java 17.0.14 with PID 24880 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:45:01.299 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - The following 1 profile is active: "test" +25-03-28 14:45:04.162 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:45:04.907 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:45:04.908 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:45:04.910 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 14:45:04.991 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest - Started UserControllerTest in 4.543 seconds (process running for 6.346) +25-03-28 14:48:12.474 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:48:12.573 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 24716 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:48:12.575 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:48:15.302 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:48:16.023 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:48:16.024 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:48:16.026 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 14:48:16.103 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.281 seconds (process running for 6.114) +25-03-28 14:49:12.007 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:49:12.101 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 22680 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:49:12.104 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:49:15.198 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:49:16.052 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:49:16.053 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:49:16.056 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 14:49:16.142 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.876 seconds (process running for 6.845) +25-03-28 14:49:34.902 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:49:34.999 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 6500 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:49:35.001 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:49:37.821 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:49:38.611 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:49:38.611 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:49:38.614 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 1 ms +25-03-28 14:49:38.687 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.467 seconds (process running for 6.391) +25-03-28 14:49:57.662 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:49:57.766 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 1900 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:49:57.768 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:50:00.945 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:50:01.763 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:50:01.764 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:50:01.767 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 14:50:01.850 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.888 seconds (process running for 6.745) +25-03-28 14:50:07.446 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:50:07.551 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 18320 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:50:07.554 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:50:10.759 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:50:11.498 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:50:11.499 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:50:11.503 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 4 ms +25-03-28 14:50:11.580 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.819 seconds (process running for 6.705) +25-03-28 14:50:54.078 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:50:54.182 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 21944 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:50:54.184 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:50:56.999 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:50:57.773 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:50:57.773 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:50:57.776 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 14:50:57.858 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.472 seconds (process running for 6.346) +25-03-28 14:51:11.498 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 14:51:11.609 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Starting ChannelControllerTest using Java 17.0.14 with PID 21260 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 14:51:11.611 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - The following 1 profile is active: "test" +25-03-28 14:51:14.319 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 14:51:15.160 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 14:51:15.161 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 14:51:15.165 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 3 ms +25-03-28 14:51:15.248 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest - Started ChannelControllerTest in 4.491 seconds (process running for 6.325) +25-03-28 15:01:25.438 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:01:25.626 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Starting MessageControllerTest using Java 17.0.14 with PID 11916 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:01:25.629 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - The following 1 profile is active: "test" +25-03-28 15:01:28.830 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:01:30.573 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 15:01:30.982 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown - Graceful shutdown complete +25-03-28 15:01:31.016 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:01:31.033 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:01:31.041 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:01:38.582 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:01:38.706 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Starting MessageControllerTest using Java 17.0.14 with PID 23404 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:01:38.708 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - The following 1 profile is active: "test" +25-03-28 15:01:41.710 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:01:42.471 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:01:42.472 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:01:42.477 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 5 ms +25-03-28 15:01:42.560 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Started MessageControllerTest in 4.724 seconds (process running for 6.617) +25-03-28 15:01:58.311 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:01:58.426 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Starting MessageControllerTest using Java 17.0.14 with PID 25288 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:01:58.429 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - The following 1 profile is active: "test" +25-03-28 15:02:01.800 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:02:02.598 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:02:02.599 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:02:02.602 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 3 ms +25-03-28 15:02:02.680 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Started MessageControllerTest in 4.987 seconds (process running for 6.941) +25-03-28 15:02:08.569 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:02:08.676 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Starting MessageControllerTest using Java 17.0.14 with PID 1272 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:02:08.678 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - The following 1 profile is active: "test" +25-03-28 15:02:12.125 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:02:13.048 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:02:13.049 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:02:13.051 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 2 ms +25-03-28 15:02:13.146 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Started MessageControllerTest in 5.283 seconds (process running for 7.419) +25-03-28 15:02:27.116 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:02:27.216 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Starting MessageControllerTest using Java 17.0.14 with PID 16156 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:02:27.218 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - The following 1 profile is active: "test" +25-03-28 15:02:29.854 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:02:30.592 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:02:30.592 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:02:30.594 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 1 ms +25-03-28 15:02:30.669 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Started MessageControllerTest in 4.244 seconds (process running for 6.288) +25-03-28 15:03:45.101 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:03:45.187 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Starting MessageControllerTest using Java 17.0.14 with PID 21964 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:03:45.189 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - The following 1 profile is active: "test" +25-03-28 15:03:48.131 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:03:48.918 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:03:48.918 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:03:48.921 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 1 ms +25-03-28 15:03:48.990 [Test worker] INFO com.sprint.mission.discodeit.controller.MessageControllerTest - Started MessageControllerTest in 4.586 seconds (process running for 6.377) +25-03-28 15:09:10.560 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:09:10.634 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 14012 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:09:10.636 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:09:12.567 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:09:12.763 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 176 ms. Found 6 JPA repository interfaces. +25-03-28 15:09:14.164 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:09:14.474 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:09:14.478 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:09:14.737 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:09:14.846 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:09:14.906 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:09:15.383 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:09:15.502 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:09:17.323 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:09:17.351 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:09:17.356 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:09:17.359 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:09:17.362 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:09:17.363 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:09:17.364 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:09:17.366 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:09:17.377 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:09:17.380 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:09:17.383 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:09:17.385 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:09:17.388 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:09:17.391 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:09:17.394 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:09:17.399 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:09:17.401 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:09:17.404 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:09:17.406 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:09:17.409 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:09:17.411 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:09:17.413 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:09:17.416 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:09:17.422 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:09:18.056 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:09:20.013 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:09:21.732 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:09:21.796 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:09:21.956 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 12.047 seconds (process running for 14.009) +25-03-28 15:09:22.084 [Test worker] WARN org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.IntegrationTests@53e2e561] +org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.sprint.mission.discodeit.IntegrationTests': Unsatisfied dependency expressed through field 'mockMvc': No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:788) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:768) + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:509) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1435) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:399) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:143) + at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:2139) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1589) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1514) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:785) + ... 93 common frames omitted +25-03-28 15:09:22.193 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:09:22.196 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:09:22.202 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:10:41.131 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:10:41.251 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 4056 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:10:41.252 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:10:43.119 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:10:43.301 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 158 ms. Found 6 JPA repository interfaces. +25-03-28 15:10:44.517 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:10:44.925 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:10:44.930 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:10:45.233 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:10:45.365 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:10:45.437 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:10:45.996 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:10:46.100 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:10:47.947 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:10:47.972 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:10:47.976 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:10:47.978 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:10:47.980 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:10:47.981 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:10:47.983 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:10:47.986 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:10:47.999 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:10:48.004 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:10:48.007 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:10:48.009 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:10:48.011 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:10:48.016 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:10:48.020 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:10:48.024 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:10:48.027 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:10:48.030 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:10:48.033 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:10:48.037 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:10:48.040 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:10:48.043 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:10:48.046 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:10:48.054 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:10:48.720 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:10:50.707 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:10:52.429 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:10:52.543 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:10:52.544 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:10:52.561 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:10:52.598 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 54 ms +25-03-28 15:10:52.822 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 12.259 seconds (process running for 14.063) +25-03-28 15:10:54.361 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:10:54.365 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:10:54.373 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:14:03.275 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:14:03.417 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 18972 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:14:03.419 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:14:05.428 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:14:05.611 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 156 ms. Found 6 JPA repository interfaces. +25-03-28 15:14:06.790 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:14:07.112 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:14:07.116 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:14:07.402 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:14:07.560 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:14:07.647 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:14:08.126 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:14:08.238 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:14:09.993 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:14:10.018 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:14:10.021 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:14:10.022 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:14:10.024 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:14:10.026 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:14:10.027 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:14:10.028 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:14:10.037 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:14:10.040 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:14:10.043 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:14:10.046 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:14:10.048 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:14:10.050 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:14:10.051 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:14:10.053 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:14:10.055 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:14:10.058 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:14:10.059 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:14:10.061 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:14:10.063 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:14:10.066 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:14:10.067 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:14:10.073 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:14:10.672 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:14:12.560 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:14:14.389 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:14:14.511 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:14:14.512 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:14:14.529 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:14:14.565 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 53 ms +25-03-28 15:14:14.742 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 12.089 seconds (process running for 14.146) +25-03-28 15:14:15.819 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 요청] username: testuser, email: test@email.com +25-03-28 15:14:16.018 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 15:14:16.034 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [test@email.com] +25-03-28 15:14:16.036 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 15:14:16.138 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 15:14:16.140 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [testuser] +25-03-28 15:14:16.141 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 15:14:16.244 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 완료] username: testuser, id: d7385ed4-9e29-42e8-8920-61c8a098e358 +25-03-28 15:14:16.526 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:14:16.532 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:14:16.544 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:18:45.440 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:18:45.581 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 9748 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:18:45.583 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:18:47.863 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:18:48.064 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 174 ms. Found 6 JPA repository interfaces. +25-03-28 15:18:49.445 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:18:49.856 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:18:49.859 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:18:50.178 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:18:50.361 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:18:50.478 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:18:51.139 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:18:51.274 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:18:53.240 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:18:53.266 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:18:53.270 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:18:53.272 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:18:53.273 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:18:53.274 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:18:53.277 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:18:53.278 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:18:53.292 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:18:53.297 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:18:53.301 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:18:53.305 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:18:53.312 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:18:53.317 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:18:53.321 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:18:53.324 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:18:53.327 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:18:53.329 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:18:53.332 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:18:53.336 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:18:53.340 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:18:53.343 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:18:53.346 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:18:53.351 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:18:54.031 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:18:56.129 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:18:58.139 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:18:58.258 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:18:58.259 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:18:58.274 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:18:58.308 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 49 ms +25-03-28 15:18:58.489 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 13.762 seconds (process running for 16.007) +25-03-28 15:18:59.664 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 시도] type: PUBLIC, name: test-channel +25-03-28 15:18:59.758 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 성공] id: 213cd84a-e526-49f4-bada-c94c21e6d5e4 +25-03-28 15:18:59.951 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 15:18:59.963 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [213cd84a-e526-49f4-bada-c94c21e6d5e4] +25-03-28 15:19:00.273 [Test worker] DEBUG org.hibernate.SQL - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 15:19:00.280 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:18:59.712677300Z] +25-03-28 15:19:00.283 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:VARCHAR) <- [desc] +25-03-28 15:19:00.283 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (3:VARCHAR) <- [test-channel] +25-03-28 15:19:00.284 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 15:19:00.284 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T06:18:59.712677300Z] +25-03-28 15:19:00.284 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (6:UUID) <- [213cd84a-e526-49f4-bada-c94c21e6d5e4] +25-03-28 15:19:00.293 [Test worker] DEBUG org.hibernate.SQL - + /* select + count(*) + from + Channel x + WHERE + x.id = :id */ select + count(*) + from + channels c1_0 + where + c1_0.id=? +25-03-28 15:19:00.296 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [213cd84a-e526-49f4-bada-c94c21e6d5e4] +25-03-28 15:19:00.351 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + where + m1_0.channel_id=? +25-03-28 15:19:00.352 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [213cd84a-e526-49f4-bada-c94c21e6d5e4] +25-03-28 15:19:00.383 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.channel_id=? +25-03-28 15:19:00.385 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [213cd84a-e526-49f4-bada-c94c21e6d5e4] +25-03-28 15:19:00.414 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [채널 삭제 완료] id: 213cd84a-e526-49f4-bada-c94c21e6d5e4 +25-03-28 15:19:00.687 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:19:00.693 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:19:00.698 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:19:11.809 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:19:11.940 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 22176 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:19:11.943 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:19:14.521 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:19:14.751 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 206 ms. Found 6 JPA repository interfaces. +25-03-28 15:19:16.184 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:19:16.598 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:19:16.602 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:19:16.954 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:19:17.119 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:19:17.202 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:19:17.756 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:19:17.881 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:19:19.900 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:19:19.941 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:19:19.944 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:19:19.947 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:19:19.948 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:19:19.950 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:19:19.952 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:19:19.953 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:19:19.964 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:19:19.968 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:19:19.972 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:19:19.975 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:19:19.979 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:19:19.983 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:19:19.986 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:19:19.992 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:19:19.994 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:19:19.999 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:19:20.002 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:19:20.005 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:19:20.008 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:19:20.011 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:19:20.013 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:19:20.021 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:19:20.690 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:19:22.731 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:19:24.776 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:19:24.896 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:19:24.897 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:19:24.916 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:19:24.953 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 55 ms +25-03-28 15:19:25.128 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 14.101 seconds (process running for 16.448) +25-03-28 15:19:26.380 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:19:26.386 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:19:26.396 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:22:21.809 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:22:21.985 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 18660 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:22:21.986 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:22:23.961 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:22:24.144 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 163 ms. Found 6 JPA repository interfaces. +25-03-28 15:22:25.311 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:22:25.667 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:22:25.669 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:22:25.952 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:22:26.111 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:22:26.203 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:22:26.772 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:22:26.877 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:22:28.486 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:22:28.504 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:22:28.507 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:22:28.508 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:22:28.509 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:22:28.510 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:22:28.511 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:22:28.513 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:22:28.527 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:22:28.533 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:22:28.536 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:22:28.539 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:22:28.541 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:22:28.545 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:22:28.547 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:22:28.551 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:22:28.552 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:22:28.554 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:22:28.557 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:22:28.558 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:22:28.560 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:22:28.562 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:22:28.566 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:22:28.574 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:22:29.216 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:22:31.102 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:22:32.763 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:22:32.860 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:22:32.860 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:22:32.886 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:22:32.920 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 60 ms +25-03-28 15:22:33.057 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 11.848 seconds (process running for 13.767) +25-03-28 15:22:34.132 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 요청] username: msguser, email: msg@email.com +25-03-28 15:22:34.289 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 15:22:34.306 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [msg@email.com] +25-03-28 15:22:34.306 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 15:22:34.401 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 15:22:34.402 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [msguser] +25-03-28 15:22:34.402 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 15:22:34.503 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 완료] username: msguser, id: bc2960f8-4034-45d8-adc5-11ad730d8914 +25-03-28 15:22:34.569 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 시도] type: PUBLIC, name: msg-channel +25-03-28 15:22:34.576 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 성공] id: 4e54cca7-980d-46b5-a9bc-c25886d6cd70 +25-03-28 15:22:34.616 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 15:22:34.618 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [4e54cca7-980d-46b5-a9bc-c25886d6cd70] +25-03-28 15:22:34.696 [Test worker] DEBUG org.hibernate.SQL - + select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.id=? +25-03-28 15:22:34.697 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [49b3fb53-3e0d-4c29-9943-0b0c201bf4ef] +25-03-28 15:22:34.716 [Test worker] WARN com.sprint.mission.discodeit.service.basic.BasicMessageService - [메시지 생성 오류] 채널을 찾을 수 없습니다 +25-03-28 15:22:34.810 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:22:34.814 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:22:34.822 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:26:15.133 [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:26:15.248 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Starting IntegrationTests using Java 17.0.14 with PID 22680 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:26:15.250 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - The following 1 profile is active: "test" +25-03-28 15:26:17.340 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:26:17.556 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 193 ms. Found 6 JPA repository interfaces. +25-03-28 15:26:18.799 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +25-03-28 15:26:19.134 [Test worker] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:26:19.137 [Test worker] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +25-03-28 15:26:19.402 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:26:19.557 [Test worker] INFO org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:26:19.653 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator - HHH000026: Second-level cache disabled +25-03-28 15:26:20.176 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:26:20.281 [Test worker] INFO org.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:26:22.879 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:26:22.919 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists binary_contents cascade +25-03-28 15:26:22.923 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists channels cascade +25-03-28 15:26:22.924 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists message_attachments cascade +25-03-28 15:26:22.926 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists messages cascade +25-03-28 15:26:22.928 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists read_statuses cascade +25-03-28 15:26:22.929 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists user_statuses cascade +25-03-28 15:26:22.931 [Test worker] DEBUG org.hibernate.SQL - + drop table if exists users cascade +25-03-28 15:26:22.942 [Test worker] DEBUG org.hibernate.SQL - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:26:22.946 [Test worker] DEBUG org.hibernate.SQL - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:26:22.951 [Test worker] DEBUG org.hibernate.SQL - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:26:22.953 [Test worker] DEBUG org.hibernate.SQL - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:26:22.955 [Test worker] DEBUG org.hibernate.SQL - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:26:22.958 [Test worker] DEBUG org.hibernate.SQL - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:26:22.961 [Test worker] DEBUG org.hibernate.SQL - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:26:22.966 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:26:22.968 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:26:22.972 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:26:22.976 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:26:22.979 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:26:22.983 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:26:22.987 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:26:22.990 [Test worker] DEBUG org.hibernate.SQL - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:26:23.001 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:26:23.806 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:26:26.409 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html] +25-03-28 15:26:28.527 [Test worker] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:26:28.644 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext - Initializing Spring TestDispatcherServlet '' +25-03-28 15:26:28.644 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Initializing Servlet '' +25-03-28 15:26:28.660 [Test worker] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:26:28.699 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet - Completed initialization in 55 ms +25-03-28 15:26:28.875 [Test worker] INFO com.sprint.mission.discodeit.IntegrationTests - Started IntegrationTests in 14.334 seconds (process running for 16.337) +25-03-28 15:26:30.411 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 요청] username: msguser, email: msg@email.com +25-03-28 15:26:30.609 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 15:26:30.633 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [msg@email.com] +25-03-28 15:26:30.635 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 15:26:30.733 [Test worker] DEBUG org.hibernate.SQL - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 15:26:30.735 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:VARCHAR) <- [msguser] +25-03-28 15:26:30.735 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (2:INTEGER) <- [1] +25-03-28 15:26:30.856 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicUserService - [회원 생성 완료] username: msguser, id: 95a053bb-a065-4355-8e19-2abe06f47249 +25-03-28 15:26:30.945 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 시도] type: PUBLIC, name: msg-channel +25-03-28 15:26:30.953 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService - [공개 채널 생성 성공] id: cf23a3fd-d066-446e-9bff-44d9af3cd496 +25-03-28 15:26:30.985 [Test worker] DEBUG org.hibernate.SQL - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 15:26:30.986 [Test worker] TRACE org.hibernate.orm.jdbc.bind - binding parameter (1:UUID) <- [cf23a3fd-d066-446e-9bff-44d9af3cd496] +25-03-28 15:26:31.096 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService - [메시지 생성 성공] 생성된 메시지 id: 0f5c949d-c556-4bdd-9b85-f0d99dd971ae +25-03-28 15:26:31.126 [Test worker] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService - [메시지 업데이트 성공] +25-03-28 15:26:31.318 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:26:31.326 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +25-03-28 15:26:31.333 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +25-03-28 15:48:05.376 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:48:05.449 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 4212 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:48:05.450 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "test" +25-03-28 15:48:06.862 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:48:06.973 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 99 ms. Found 6 JPA repository interfaces. +25-03-28 15:48:07.876 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-28 15:48:07.893 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 15:48:07.895 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-28 15:48:07.896 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 15:48:07.981 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-28 15:48:07.982 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2480 ms +25-03-28 15:48:08.144 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-28 15:48:08.406 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:48:08.408 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-28 15:48:08.418 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:48:08.719 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:48:08.793 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:48:08.836 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 15:48:09.243 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:48:09.347 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:48:10.667 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:48:10.687 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-28 15:48:10.691 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-28 15:48:10.692 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-28 15:48:10.693 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-28 15:48:10.694 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-28 15:48:10.694 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-28 15:48:10.696 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-28 15:48:10.702 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:48:10.704 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:48:10.706 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:48:10.707 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:48:10.708 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:48:10.710 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:48:10.711 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:48:10.712 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:48:10.713 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:48:10.714 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:48:10.716 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:48:10.719 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:48:10.721 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:48:10.724 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:48:10.728 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:48:10.733 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:48:11.169 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:48:12.007 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 15:48:13.036 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:48:13.132 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 15:48:13.161 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-28 15:48:13.186 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 8.663 seconds (process running for 9.558) +25-03-28 15:48:13.677 [RMI TCP Connection(1)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 15:48:13.678 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-28 15:48:13.680 [RMI TCP Connection(1)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-28 15:49:29.799 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-28 15:49:29.906 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 15:49:29.912 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-28 15:49:29.912 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 15:49:29.970 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 15:49:29.971 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-28 15:49:29.971 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 15:49:29.973 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-28 15:49:30.016 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - [회원 생성 완료] username: rex, id: 1111eb79-f139-4afb-8df9-09dc57edd826 +25-03-28 15:49:30.054 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 15:49:30.061 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-28 15:49:30.061 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [null] +25-03-28 15:49:30.061 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-28 15:49:30.062 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-28 15:49:30.062 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - binding parameter (5:UUID) <- [c4ebdb3c-8709-48ef-b01d-04a29278cc1e] +25-03-28 15:49:30.075 [http-nio-8081-exec-5] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - SQL Error: 23502, SQLState: 23502 +25-03-28 15:49:30.075 [http-nio-8081-exec-5] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper [f2e3da08-e2c2-48e3-b228-efbb674d6967 | POST | /api/users] - NULL not allowed for column "CREATED_AT"; SQL statement: +/* insert for com.sprint.mission.discodeit.entity.BinaryContent */insert into binary_conte [23502-232] +25-03-28 15:49:53.659 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 15:49:53.929 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-28 15:49:53.937 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:49:53.941 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-28 15:49:53.947 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-28 15:50:00.848 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 15:50:00.923 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 10428 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 15:50:00.926 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "test" +25-03-28 15:50:02.239 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 15:50:02.334 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 83 ms. Found 6 JPA repository interfaces. +25-03-28 15:50:03.133 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-28 15:50:03.146 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 15:50:03.151 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-28 15:50:03.151 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 15:50:03.243 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-28 15:50:03.243 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2262 ms +25-03-28 15:50:03.391 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-28 15:50:03.631 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 15:50:03.634 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-28 15:50:03.644 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 15:50:03.925 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 15:50:03.992 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 15:50:04.033 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 15:50:04.379 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 15:50:04.474 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 15:50:05.773 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 15:50:05.793 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-28 15:50:05.795 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-28 15:50:05.796 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-28 15:50:05.797 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-28 15:50:05.798 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-28 15:50:05.800 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-28 15:50:05.802 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-28 15:50:05.809 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 15:50:05.811 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 15:50:05.813 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 15:50:05.814 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 15:50:05.814 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 15:50:05.816 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 15:50:05.818 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 15:50:05.819 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 15:50:05.820 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 15:50:05.822 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 15:50:05.823 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 15:50:05.824 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 15:50:05.824 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 15:50:05.828 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 15:50:05.830 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 15:50:05.837 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:50:06.201 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 15:50:07.212 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 15:50:08.930 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 15:50:09.090 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 15:50:09.136 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-28 15:50:09.179 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.402 seconds (process running for 10.346) +25-03-28 15:50:09.302 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 15:50:09.302 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-28 15:50:09.304 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-28 15:50:20.431 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-28 15:50:20.582 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 15:50:20.591 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-28 15:50:20.591 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 15:50:20.653 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 15:50:20.654 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-28 15:50:20.654 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 15:50:20.656 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-28 15:50:20.775 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - [회원 생성 완료] username: rex, id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:20.806 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 15:50:20.809 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-28 15:50:20.809 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.700709700Z] +25-03-28 15:50:20.818 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-28 15:50:20.818 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-28 15:50:20.819 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (5:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:20.827 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 15:50:20.828 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.764918600Z] +25-03-28 15:50:20.828 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-28 15:50:20.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 15:50:20.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (4:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:20.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.764918600Z] +25-03-28 15:50:20.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-28 15:50:20.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (7:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:20.830 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 15:50:20.830 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.772266300Z] +25-03-28 15:50:20.830 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.757078600Z] +25-03-28 15:50:20.831 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.772266300Z] +25-03-28 15:50:20.831 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (4:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:20.831 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [682c5c3a-e519-48e6-94c7-2a2d9b76b951 | POST | /api/users] - binding parameter (5:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:50:20.903 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:20.904 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:20.920 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:50:20.920 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:50:20.921 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:20.922 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:20.973 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:50:20.881Z +25-03-28 15:50:20.974 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:50:20.877Z +25-03-28 15:50:20.990 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:50:20.991 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:50:20.998 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.877Z] +25-03-28 15:50:20.998 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.976185800Z] +25-03-28 15:50:20.998 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.881Z] +25-03-28 15:50:20.998 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:20.998 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:50:20.974664900Z] +25-03-28 15:50:20.999 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [855aadc8-7b71-420f-9458-aecff33d9048 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:50:20.999 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:20.999 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e09eefd7-b29e-4b1c-ab76-2ae2304a4b97 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:50:21.067 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f52391f7-daf6-4828-bbc2-6fee1d8b7582 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:50:21.094 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [0bfea5e6-c120-40d2-8173-7606f446e9b2 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - [파일 조회] id: bd76f4ec-a49e-4c1f-a38c-678219ed7743 +25-03-28 15:50:21.099 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [2061249a-763c-4292-ad58-cc71d0c334dc | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:21.100 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ac78e017-93ae-450e-89be-d343e74c4450 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:50:21.100 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [2061249a-763c-4292-ad58-cc71d0c334dc | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:21.100 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [974ae1be-bbd2-40af-98b0-dbeb74207045 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:21.101 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [974ae1be-bbd2-40af-98b0-dbeb74207045 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:21.104 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2061249a-763c-4292-ad58-cc71d0c334dc | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:21.122 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [2061249a-763c-4292-ad58-cc71d0c334dc | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:21.126 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [2061249a-763c-4292-ad58-cc71d0c334dc | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:21.126 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [2061249a-763c-4292-ad58-cc71d0c334dc | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:21.127 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0bfea5e6-c120-40d2-8173-7606f446e9b2 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:50:21.128 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0bfea5e6-c120-40d2-8173-7606f446e9b2 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:21.140 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [e88b20c3-7f7c-4a96-b5fe-0348da05fe73 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - [파일 조회] id: bd76f4ec-a49e-4c1f-a38c-678219ed7743 +25-03-28 15:50:21.141 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e88b20c3-7f7c-4a96-b5fe-0348da05fe73 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:50:21.142 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [cd637860-9826-47b7-a0a6-b689cf50652b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:21.142 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8c04cb5d-ff8b-4a4e-ab44-956dc04254f5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:21.142 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e88b20c3-7f7c-4a96-b5fe-0348da05fe73 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:21.142 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cd637860-9826-47b7-a0a6-b689cf50652b | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:21.142 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8c04cb5d-ff8b-4a4e-ab44-956dc04254f5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:21.143 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cd637860-9826-47b7-a0a6-b689cf50652b | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:21.144 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a063247e-6892-4592-88ba-41074e92f5b8 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743/download] - [파일 조회] id: bd76f4ec-a49e-4c1f-a38c-678219ed7743 +25-03-28 15:50:21.144 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [cd637860-9826-47b7-a0a6-b689cf50652b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:21.146 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a063247e-6892-4592-88ba-41074e92f5b8 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:50:21.146 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cd637860-9826-47b7-a0a6-b689cf50652b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:21.146 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cd637860-9826-47b7-a0a6-b689cf50652b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:21.146 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a063247e-6892-4592-88ba-41074e92f5b8 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743/download] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:21.149 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [536d401f-1a63-4b3b-b66c-079beb794288 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - [파일 조회] id: bd76f4ec-a49e-4c1f-a38c-678219ed7743 +25-03-28 15:50:21.150 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [536d401f-1a63-4b3b-b66c-079beb794288 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:50:21.151 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [536d401f-1a63-4b3b-b66c-079beb794288 | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:21.155 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [11eebf58-bde7-452d-860e-e46e7cfd7c62 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:21.156 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [11eebf58-bde7-452d-860e-e46e7cfd7c62 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:21.162 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [cae7ac0e-8ee1-43bf-9ff6-efcd339ec99c | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - [파일 조회] id: bd76f4ec-a49e-4c1f-a38c-678219ed7743 +25-03-28 15:50:21.163 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [cae7ac0e-8ee1-43bf-9ff6-efcd339ec99c | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:50:21.164 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [cae7ac0e-8ee1-43bf-9ff6-efcd339ec99c | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:21.172 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [80d5d43d-2b85-48c3-9427-1442f7eafd40 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:21.172 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [80d5d43d-2b85-48c3-9427-1442f7eafd40 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:21.174 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [d95655f3-9dd9-4360-8c54-f274a2504b6b | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - [파일 조회] id: bd76f4ec-a49e-4c1f-a38c-678219ed7743 +25-03-28 15:50:21.176 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d95655f3-9dd9-4360-8c54-f274a2504b6b | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:50:21.177 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d95655f3-9dd9-4360-8c54-f274a2504b6b | GET | /api/binaryContents/bd76f4ec-a49e-4c1f-a38c-678219ed7743] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:50:24.146 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4f5ea047-0e07-4ec4-aade-43eeace4ec57 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:24.147 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4f5ea047-0e07-4ec4-aade-43eeace4ec57 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:24.148 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4f5ea047-0e07-4ec4-aade-43eeace4ec57 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:24.150 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4f5ea047-0e07-4ec4-aade-43eeace4ec57 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:24.151 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4f5ea047-0e07-4ec4-aade-43eeace4ec57 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:24.151 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4f5ea047-0e07-4ec4-aade-43eeace4ec57 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:24.163 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b68f1200-043f-47e6-b66c-80cd825f1a45 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:24.163 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b68f1200-043f-47e6-b66c-80cd825f1a45 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:27.151 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8dbc4ba4-393e-490c-ba13-68f046b502a4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:27.151 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8dbc4ba4-393e-490c-ba13-68f046b502a4 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:27.152 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8dbc4ba4-393e-490c-ba13-68f046b502a4 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:27.156 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8dbc4ba4-393e-490c-ba13-68f046b502a4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:27.158 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8dbc4ba4-393e-490c-ba13-68f046b502a4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:27.158 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8dbc4ba4-393e-490c-ba13-68f046b502a4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:27.174 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [63b526ea-8a7f-4823-bd9b-6a1275e285ee | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:27.175 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [63b526ea-8a7f-4823-bd9b-6a1275e285ee | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:30.146 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0bea8c4e-b81d-4d6e-9602-2720f33cd187 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:30.146 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0bea8c4e-b81d-4d6e-9602-2720f33cd187 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:30.147 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0bea8c4e-b81d-4d6e-9602-2720f33cd187 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:30.149 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0bea8c4e-b81d-4d6e-9602-2720f33cd187 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:30.149 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0bea8c4e-b81d-4d6e-9602-2720f33cd187 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:30.150 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0bea8c4e-b81d-4d6e-9602-2720f33cd187 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:30.161 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [68698cda-e0ac-4fe8-a757-d24ecb8040fd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:30.162 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [68698cda-e0ac-4fe8-a757-d24ecb8040fd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:33.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3e94a108-c433-442e-9bbb-7b08793afe2b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:33.342 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3e94a108-c433-442e-9bbb-7b08793afe2b | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:33.342 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3e94a108-c433-442e-9bbb-7b08793afe2b | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:33.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3e94a108-c433-442e-9bbb-7b08793afe2b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:33.346 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3e94a108-c433-442e-9bbb-7b08793afe2b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:33.347 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3e94a108-c433-442e-9bbb-7b08793afe2b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:33.361 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [7ee9884a-4d8e-4cfb-ae48-28284ad4dd36 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:33.362 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7ee9884a-4d8e-4cfb-ae48-28284ad4dd36 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:36.340 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [37c278f5-200d-4659-9aa1-72aac42989b1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:36.341 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [37c278f5-200d-4659-9aa1-72aac42989b1 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:36.341 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [37c278f5-200d-4659-9aa1-72aac42989b1 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:36.343 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [37c278f5-200d-4659-9aa1-72aac42989b1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:36.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [37c278f5-200d-4659-9aa1-72aac42989b1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:36.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [37c278f5-200d-4659-9aa1-72aac42989b1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:36.357 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [9b1544df-6cf8-4f8e-b745-b235fe62d7ec | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:36.358 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [9b1544df-6cf8-4f8e-b745-b235fe62d7ec | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:39.332 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3bfb331e-be05-4080-a073-9f591cf7fbd6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:39.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3bfb331e-be05-4080-a073-9f591cf7fbd6 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:39.334 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3bfb331e-be05-4080-a073-9f591cf7fbd6 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:39.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3bfb331e-be05-4080-a073-9f591cf7fbd6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:39.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3bfb331e-be05-4080-a073-9f591cf7fbd6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:39.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3bfb331e-be05-4080-a073-9f591cf7fbd6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:39.347 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ba6d51eb-df0f-486a-828e-0c902497cc88 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:39.348 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ba6d51eb-df0f-486a-828e-0c902497cc88 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:42.341 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [140476e5-cc06-4034-a63f-a6c11811e71c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:42.342 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [140476e5-cc06-4034-a63f-a6c11811e71c | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:42.344 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [140476e5-cc06-4034-a63f-a6c11811e71c | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:42.348 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [140476e5-cc06-4034-a63f-a6c11811e71c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:42.349 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [140476e5-cc06-4034-a63f-a6c11811e71c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:42.350 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [140476e5-cc06-4034-a63f-a6c11811e71c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:42.383 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1b893fa9-99b4-4d35-b721-cfca81d1c131 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:42.384 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1b893fa9-99b4-4d35-b721-cfca81d1c131 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:45.331 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [91b564c0-0bba-4952-9cdc-4b45f3dbc325 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:45.331 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [91b564c0-0bba-4952-9cdc-4b45f3dbc325 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:45.333 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [91b564c0-0bba-4952-9cdc-4b45f3dbc325 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:45.334 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [91b564c0-0bba-4952-9cdc-4b45f3dbc325 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:45.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [91b564c0-0bba-4952-9cdc-4b45f3dbc325 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:45.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [91b564c0-0bba-4952-9cdc-4b45f3dbc325 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:45.346 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ec1c4600-021d-402a-a0e3-b52ed36c787a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:45.347 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ec1c4600-021d-402a-a0e3-b52ed36c787a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:48.342 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [65f6ff66-4b0b-4aaf-9bb8-29bec1cbe230 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:48.342 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [65f6ff66-4b0b-4aaf-9bb8-29bec1cbe230 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:48.343 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [65f6ff66-4b0b-4aaf-9bb8-29bec1cbe230 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:48.346 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [65f6ff66-4b0b-4aaf-9bb8-29bec1cbe230 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:48.347 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [65f6ff66-4b0b-4aaf-9bb8-29bec1cbe230 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:48.347 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [65f6ff66-4b0b-4aaf-9bb8-29bec1cbe230 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:48.360 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [9d9438eb-c5b1-4fed-a087-4d82fbfe52f0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:48.361 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [9d9438eb-c5b1-4fed-a087-4d82fbfe52f0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:51.339 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:51.340 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:50:51.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [afb1d2f7-e1a3-44a7-a983-2ac7387f48fb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:51.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [afb1d2f7-e1a3-44a7-a983-2ac7387f48fb | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:51.341 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:51.341 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [afb1d2f7-e1a3-44a7-a983-2ac7387f48fb | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:51.341 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:50:51.331Z +25-03-28 15:50:51.343 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:50:51.343 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [afb1d2f7-e1a3-44a7-a983-2ac7387f48fb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:51.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:50:51.331Z] +25-03-28 15:50:51.344 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [afb1d2f7-e1a3-44a7-a983-2ac7387f48fb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:51.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:50:51.342361800Z] +25-03-28 15:50:51.345 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [afb1d2f7-e1a3-44a7-a983-2ac7387f48fb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:51.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:51.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [05b9936f-247c-48e8-bf4d-2c2943f55a7a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:50:51.362 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [bf276f7a-cbdd-4ea0-971f-a1958f1835d1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:51.362 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [bf276f7a-cbdd-4ea0-971f-a1958f1835d1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:54.353 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4254e558-c3d4-4e40-8c50-346dba377ee3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:54.353 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [4254e558-c3d4-4e40-8c50-346dba377ee3 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:54.354 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4254e558-c3d4-4e40-8c50-346dba377ee3 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:54.358 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4254e558-c3d4-4e40-8c50-346dba377ee3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:54.359 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [4254e558-c3d4-4e40-8c50-346dba377ee3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:54.359 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [4254e558-c3d4-4e40-8c50-346dba377ee3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:54.376 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7dd08333-e5a0-4ed5-b646-c67c3aba9016 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:54.377 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7dd08333-e5a0-4ed5-b646-c67c3aba9016 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:57.351 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [93e6a2b7-10ae-429c-9c8a-f8df06186e55 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:57.352 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [93e6a2b7-10ae-429c-9c8a-f8df06186e55 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:50:57.354 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [93e6a2b7-10ae-429c-9c8a-f8df06186e55 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:50:57.361 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [93e6a2b7-10ae-429c-9c8a-f8df06186e55 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:50:57.362 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [93e6a2b7-10ae-429c-9c8a-f8df06186e55 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:50:57.362 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [93e6a2b7-10ae-429c-9c8a-f8df06186e55 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:50:57.390 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4c3f84e4-d9b7-497c-940d-3f52b19f3490 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:50:57.391 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4c3f84e4-d9b7-497c-940d-3f52b19f3490 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:00.334 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8a185b22-1775-4bfc-9dd0-1c99f4e6cce7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:00.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8a185b22-1775-4bfc-9dd0-1c99f4e6cce7 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:00.337 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8a185b22-1775-4bfc-9dd0-1c99f4e6cce7 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:00.342 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8a185b22-1775-4bfc-9dd0-1c99f4e6cce7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:00.343 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8a185b22-1775-4bfc-9dd0-1c99f4e6cce7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:00.343 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8a185b22-1775-4bfc-9dd0-1c99f4e6cce7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:00.357 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5363995a-05d2-4d70-a4a6-5c5e7fea41a3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:00.358 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5363995a-05d2-4d70-a4a6-5c5e7fea41a3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:03.347 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [70c37499-0bed-4085-bf22-8f814d0358e6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:03.347 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c37499-0bed-4085-bf22-8f814d0358e6 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:03.347 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [70c37499-0bed-4085-bf22-8f814d0358e6 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:03.349 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [70c37499-0bed-4085-bf22-8f814d0358e6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:03.350 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c37499-0bed-4085-bf22-8f814d0358e6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:03.350 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c37499-0bed-4085-bf22-8f814d0358e6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:03.363 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [412eaa01-29aa-4621-9a36-1d97d335d346 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:03.363 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [412eaa01-29aa-4621-9a36-1d97d335d346 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:06.337 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [41cc6736-bcb9-4221-a271-636c5ed785b7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:06.337 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [41cc6736-bcb9-4221-a271-636c5ed785b7 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:06.338 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [41cc6736-bcb9-4221-a271-636c5ed785b7 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:06.342 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [41cc6736-bcb9-4221-a271-636c5ed785b7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:06.342 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [41cc6736-bcb9-4221-a271-636c5ed785b7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:06.342 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [41cc6736-bcb9-4221-a271-636c5ed785b7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:06.355 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0dc26dc0-c299-4f68-95f7-05cdf39cca93 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:06.355 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0dc26dc0-c299-4f68-95f7-05cdf39cca93 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:09.356 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [738800a2-af88-4b1e-b16d-3ad060cdff7d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:09.357 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [738800a2-af88-4b1e-b16d-3ad060cdff7d | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:09.359 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [738800a2-af88-4b1e-b16d-3ad060cdff7d | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:09.363 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [738800a2-af88-4b1e-b16d-3ad060cdff7d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:09.364 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [738800a2-af88-4b1e-b16d-3ad060cdff7d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:09.365 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [738800a2-af88-4b1e-b16d-3ad060cdff7d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:09.384 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9b5232bb-9970-4e91-86da-e86fd8ccc821 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:09.384 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9b5232bb-9970-4e91-86da-e86fd8ccc821 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:12.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [94882e19-1ddf-4a59-a8f7-3ac126953899 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:12.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [94882e19-1ddf-4a59-a8f7-3ac126953899 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:12.334 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [94882e19-1ddf-4a59-a8f7-3ac126953899 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:12.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [94882e19-1ddf-4a59-a8f7-3ac126953899 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:12.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [94882e19-1ddf-4a59-a8f7-3ac126953899 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:12.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [94882e19-1ddf-4a59-a8f7-3ac126953899 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:12.350 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1299fe25-09ab-4257-afac-ae821ee7cbad | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:12.350 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1299fe25-09ab-4257-afac-ae821ee7cbad | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:15.340 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2293935a-2483-4d93-988b-a8a5d27ed81e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:15.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2293935a-2483-4d93-988b-a8a5d27ed81e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:15.341 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2293935a-2483-4d93-988b-a8a5d27ed81e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:15.342 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2293935a-2483-4d93-988b-a8a5d27ed81e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:15.343 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2293935a-2483-4d93-988b-a8a5d27ed81e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:15.343 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2293935a-2483-4d93-988b-a8a5d27ed81e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:15.355 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bea6b47c-1b87-44d2-9240-9135d29029f5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:15.356 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [bea6b47c-1b87-44d2-9240-9135d29029f5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:18.332 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a695dd76-9a98-40e3-9908-3472368124de | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:18.332 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a695dd76-9a98-40e3-9908-3472368124de | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:18.333 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a695dd76-9a98-40e3-9908-3472368124de | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:18.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a695dd76-9a98-40e3-9908-3472368124de | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:18.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a695dd76-9a98-40e3-9908-3472368124de | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:18.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a695dd76-9a98-40e3-9908-3472368124de | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:18.348 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [59d74d9a-3672-4df4-84da-3288d39558dc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:18.349 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [59d74d9a-3672-4df4-84da-3288d39558dc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.333 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:21.336 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:51:21.336 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b8446212-e557-44f5-8edb-e2b793a52c91 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:51:21.337 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:51:21.328Z +25-03-28 15:51:21.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:51:21.339 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3d3e4fbc-1734-4f3e-8b5e-c29e82bf0c47 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:21.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:51:21.328Z] +25-03-28 15:51:21.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3d3e4fbc-1734-4f3e-8b5e-c29e82bf0c47 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:51:21.338919Z] +25-03-28 15:51:21.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ba411602-2ca9-4dab-8a17-790002d3a13a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:51:21.340 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3d3e4fbc-1734-4f3e-8b5e-c29e82bf0c47 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:21.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3d3e4fbc-1734-4f3e-8b5e-c29e82bf0c47 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:21.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3d3e4fbc-1734-4f3e-8b5e-c29e82bf0c47 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:21.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3d3e4fbc-1734-4f3e-8b5e-c29e82bf0c47 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:21.358 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e4655e42-2445-435d-b288-72ce9f61296a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:21.359 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e4655e42-2445-435d-b288-72ce9f61296a | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.360 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e4655e42-2445-435d-b288-72ce9f61296a | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:21.360 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1c5b1cc4-1c0e-472c-9b4f-3650392a53e9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:21.360 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1c5b1cc4-1c0e-472c-9b4f-3650392a53e9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.362 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e4655e42-2445-435d-b288-72ce9f61296a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:21.362 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e4655e42-2445-435d-b288-72ce9f61296a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:21.362 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e4655e42-2445-435d-b288-72ce9f61296a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:21.369 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [38cb77c2-8cc7-4f74-86f2-61ef284efe3f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:21.370 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [38cb77c2-8cc7-4f74-86f2-61ef284efe3f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:21.380 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [cc839e54-b5b3-4cbb-89a1-c7e448d28cdb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:21.381 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [cc839e54-b5b3-4cbb-89a1-c7e448d28cdb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:25.343 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0276cc3f-a8db-458f-aa44-f665304360b5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:25.344 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0276cc3f-a8db-458f-aa44-f665304360b5 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:25.344 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0276cc3f-a8db-458f-aa44-f665304360b5 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:25.348 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0276cc3f-a8db-458f-aa44-f665304360b5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:25.349 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0276cc3f-a8db-458f-aa44-f665304360b5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:25.349 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0276cc3f-a8db-458f-aa44-f665304360b5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:25.361 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [1dac3727-b746-4afd-ad27-19e5f730350c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:25.362 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [1dac3727-b746-4afd-ad27-19e5f730350c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:28.326 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [fb579ece-80c0-4655-950a-e804eba0c2ee | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:28.326 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [fb579ece-80c0-4655-950a-e804eba0c2ee | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:28.327 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fb579ece-80c0-4655-950a-e804eba0c2ee | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:28.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [fb579ece-80c0-4655-950a-e804eba0c2ee | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:28.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [fb579ece-80c0-4655-950a-e804eba0c2ee | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:28.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [fb579ece-80c0-4655-950a-e804eba0c2ee | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:28.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [99e2a782-be0d-4b04-b28d-6cf88dce970d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:28.341 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [99e2a782-be0d-4b04-b28d-6cf88dce970d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:31.339 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d52fe4f0-968a-4916-8016-e8ccc16076ca | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:31.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d52fe4f0-968a-4916-8016-e8ccc16076ca | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:31.340 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d52fe4f0-968a-4916-8016-e8ccc16076ca | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:31.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d52fe4f0-968a-4916-8016-e8ccc16076ca | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:31.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d52fe4f0-968a-4916-8016-e8ccc16076ca | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:31.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d52fe4f0-968a-4916-8016-e8ccc16076ca | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:31.357 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [853d9b0d-aa85-4fe9-9d27-fb8437128496 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:31.357 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [853d9b0d-aa85-4fe9-9d27-fb8437128496 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:34.336 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [11dd976c-aade-4a72-a328-3bc117a6aefe | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:34.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [11dd976c-aade-4a72-a328-3bc117a6aefe | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:34.337 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [11dd976c-aade-4a72-a328-3bc117a6aefe | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:34.339 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [11dd976c-aade-4a72-a328-3bc117a6aefe | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:51:34.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [11dd976c-aade-4a72-a328-3bc117a6aefe | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:51:34.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [11dd976c-aade-4a72-a328-3bc117a6aefe | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:51:34.351 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [82444ca9-780a-45c6-9e48-1aed3bbf3127 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:51:34.352 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [82444ca9-780a-45c6-9e48-1aed3bbf3127 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:51.342 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:51:51.344 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:51:51.346 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:51.347 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:51:51.334Z +25-03-28 15:51:51.349 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:51:51.349 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:51:51.334Z] +25-03-28 15:51:51.350 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:51:51.348293400Z] +25-03-28 15:51:51.350 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:51:51.350 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6d9b6d7b-54ee-423c-aff0-76d55cfe02a4 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:52:21.348 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:21.350 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e7626c60-5052-4de4-a288-21b75e720615 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:52:21.352 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:52:21.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:21.354 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:52:21.332Z +25-03-28 15:52:21.356 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:52:21.357 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:52:21.332Z] +25-03-28 15:52:21.357 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:52:21.355279Z] +25-03-28 15:52:21.358 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:21.358 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c30d65ec-d624-4934-a121-b1423591c796 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:52:21.377 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [51efb1fb-8523-45db-b4ac-c357b139c61e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:21.377 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [51efb1fb-8523-45db-b4ac-c357b139c61e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:21.377 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3d0ed242-1540-42b1-8536-1def94c4f20e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:21.378 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3d0ed242-1540-42b1-8536-1def94c4f20e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:21.379 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [51efb1fb-8523-45db-b4ac-c357b139c61e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:21.382 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [51efb1fb-8523-45db-b4ac-c357b139c61e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:52:21.384 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [51efb1fb-8523-45db-b4ac-c357b139c61e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:52:21.384 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [51efb1fb-8523-45db-b4ac-c357b139c61e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:52:21.403 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3c67bd64-7554-48a2-b25e-c6f55706eac1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:21.403 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3c67bd64-7554-48a2-b25e-c6f55706eac1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:25.342 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [14fcc5b6-d451-4ffb-b7d2-db14ecf56a81 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:25.342 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [14fcc5b6-d451-4ffb-b7d2-db14ecf56a81 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:25.343 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [14fcc5b6-d451-4ffb-b7d2-db14ecf56a81 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:25.346 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [14fcc5b6-d451-4ffb-b7d2-db14ecf56a81 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:52:25.346 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [14fcc5b6-d451-4ffb-b7d2-db14ecf56a81 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:52:25.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [14fcc5b6-d451-4ffb-b7d2-db14ecf56a81 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:52:25.364 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [317db45e-a43e-4111-b11f-432dd55b5391 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:25.364 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [317db45e-a43e-4111-b11f-432dd55b5391 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:28.340 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fa0b8e60-9414-44df-8176-70b700464f20 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:28.340 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fa0b8e60-9414-44df-8176-70b700464f20 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:28.342 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fa0b8e60-9414-44df-8176-70b700464f20 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:28.344 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fa0b8e60-9414-44df-8176-70b700464f20 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:52:28.344 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fa0b8e60-9414-44df-8176-70b700464f20 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:52:28.346 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fa0b8e60-9414-44df-8176-70b700464f20 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:52:28.364 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b0ee78f0-66c1-4fdc-ba22-fadc86e57806 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:28.366 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [b0ee78f0-66c1-4fdc-ba22-fadc86e57806 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:31.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [850ca744-fbe5-4a91-8cea-cffd2fa26fa8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:31.328 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [850ca744-fbe5-4a91-8cea-cffd2fa26fa8 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:31.328 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [850ca744-fbe5-4a91-8cea-cffd2fa26fa8 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:31.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [850ca744-fbe5-4a91-8cea-cffd2fa26fa8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:52:31.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [850ca744-fbe5-4a91-8cea-cffd2fa26fa8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:52:31.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [850ca744-fbe5-4a91-8cea-cffd2fa26fa8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:52:31.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [10984c78-aec0-4438-a4b9-57e0f3ce7cd0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:31.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [10984c78-aec0-4438-a4b9-57e0f3ce7cd0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:34.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [664d6978-32d3-4c3b-b0fa-fba8516e9622 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:34.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [664d6978-32d3-4c3b-b0fa-fba8516e9622 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:34.341 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [664d6978-32d3-4c3b-b0fa-fba8516e9622 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:34.348 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [664d6978-32d3-4c3b-b0fa-fba8516e9622 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:52:34.349 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [664d6978-32d3-4c3b-b0fa-fba8516e9622 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:52:34.349 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [664d6978-32d3-4c3b-b0fa-fba8516e9622 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:52:34.375 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [8923fa59-fc06-4797-a6ff-445b0dce9cac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:34.376 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8923fa59-fc06-4797-a6ff-445b0dce9cac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:37.348 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0e09e555-d5fc-482c-a886-81d1488335b6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:37.349 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0e09e555-d5fc-482c-a886-81d1488335b6 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:52:37.351 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0e09e555-d5fc-482c-a886-81d1488335b6 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:52:37.354 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0e09e555-d5fc-482c-a886-81d1488335b6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:52:37.354 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0e09e555-d5fc-482c-a886-81d1488335b6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:52:37.356 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0e09e555-d5fc-482c-a886-81d1488335b6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:52:37.383 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [64e9c8bb-9473-48d5-9b38-e20473bfca14 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:52:37.384 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [64e9c8bb-9473-48d5-9b38-e20473bfca14 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:21.328 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d357f407-fbe8-417b-bec8-4e54b41a7b62 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:53:21.343 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1644264e-34a5-4a17-8621-dd254105cf9c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:21.343 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [82c0e676-99df-4130-a7d6-54c85c490659 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:21.344 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1644264e-34a5-4a17-8621-dd254105cf9c | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:21.344 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [82c0e676-99df-4130-a7d6-54c85c490659 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:21.344 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1644264e-34a5-4a17-8621-dd254105cf9c | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:53:21.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1644264e-34a5-4a17-8621-dd254105cf9c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:53:21.347 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1644264e-34a5-4a17-8621-dd254105cf9c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:53:21.347 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1644264e-34a5-4a17-8621-dd254105cf9c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:53:21.357 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b0786976-74d5-4304-96e3-0a92b5dd06ea | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:21.357 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [b0786976-74d5-4304-96e3-0a92b5dd06ea | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:24.329 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:53:24.331 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:53:24.331 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:24.332 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:53:24.322Z +25-03-28 15:53:24.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:53:24.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:53:24.322Z] +25-03-28 15:53:24.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:53:24.333799100Z] +25-03-28 15:53:24.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:24.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [899e9549-b844-43d4-a820-cc8e9abfc7d6 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:53:25.331 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d4ec0c81-5358-4821-8491-4a4d4b740a35 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:25.331 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d4ec0c81-5358-4821-8491-4a4d4b740a35 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:25.332 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d4ec0c81-5358-4821-8491-4a4d4b740a35 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:53:25.334 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d4ec0c81-5358-4821-8491-4a4d4b740a35 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:53:25.334 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d4ec0c81-5358-4821-8491-4a4d4b740a35 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:53:25.334 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d4ec0c81-5358-4821-8491-4a4d4b740a35 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:53:25.348 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [60abbc3e-5d49-4f7f-aab6-51cb023257b4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:25.349 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [60abbc3e-5d49-4f7f-aab6-51cb023257b4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:28.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [35aacb3d-1bcb-4a34-8926-386cd1f87d5f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:28.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [35aacb3d-1bcb-4a34-8926-386cd1f87d5f | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:28.334 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [35aacb3d-1bcb-4a34-8926-386cd1f87d5f | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:53:28.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [35aacb3d-1bcb-4a34-8926-386cd1f87d5f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:53:28.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [35aacb3d-1bcb-4a34-8926-386cd1f87d5f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:53:28.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [35aacb3d-1bcb-4a34-8926-386cd1f87d5f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:53:28.346 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3f05ccc0-f5c6-4612-9da1-249fa989ddb7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:28.347 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3f05ccc0-f5c6-4612-9da1-249fa989ddb7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:31.344 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1fbae871-129b-4286-8c74-54cfbe690f90 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:31.345 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1fbae871-129b-4286-8c74-54cfbe690f90 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:31.347 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1fbae871-129b-4286-8c74-54cfbe690f90 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:53:31.352 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1fbae871-129b-4286-8c74-54cfbe690f90 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:53:31.353 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1fbae871-129b-4286-8c74-54cfbe690f90 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:53:31.353 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1fbae871-129b-4286-8c74-54cfbe690f90 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:53:31.388 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [faa36d33-572f-474c-a550-ad133385b0fa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:31.388 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [faa36d33-572f-474c-a550-ad133385b0fa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:34.327 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6162e1c0-15eb-478f-a838-fdb498fc600a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:34.328 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6162e1c0-15eb-478f-a838-fdb498fc600a | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:53:34.328 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6162e1c0-15eb-478f-a838-fdb498fc600a | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:53:34.329 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6162e1c0-15eb-478f-a838-fdb498fc600a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:53:34.330 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6162e1c0-15eb-478f-a838-fdb498fc600a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:53:34.330 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6162e1c0-15eb-478f-a838-fdb498fc600a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:53:34.341 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4c85ff68-1346-46e3-b487-9986b20964e9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:53:34.342 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4c85ff68-1346-46e3-b487-9986b20964e9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:21.334 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0a7942dd-67e6-4ec0-bb8e-3c4b2177b0ad | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:54:21.348 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b9d18124-cd2b-4cf8-b9b9-7e20ca25c988 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:21.348 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [fac6f7a7-d83e-40c8-9b69-01924038ca8a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:21.349 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b9d18124-cd2b-4cf8-b9b9-7e20ca25c988 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:21.349 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [fac6f7a7-d83e-40c8-9b69-01924038ca8a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:21.349 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b9d18124-cd2b-4cf8-b9b9-7e20ca25c988 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:54:21.351 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b9d18124-cd2b-4cf8-b9b9-7e20ca25c988 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:54:21.352 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b9d18124-cd2b-4cf8-b9b9-7e20ca25c988 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:54:21.352 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b9d18124-cd2b-4cf8-b9b9-7e20ca25c988 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:54:21.364 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4d0267c7-7271-4bb2-b1f7-88661830b49f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:21.364 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4d0267c7-7271-4bb2-b1f7-88661830b49f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:24.342 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:54:24.344 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:54:24.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:24.347 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:54:24.334Z +25-03-28 15:54:24.348 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:54:24.349 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:54:24.334Z] +25-03-28 15:54:24.349 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:54:24.347353200Z] +25-03-28 15:54:24.349 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:24.349 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [50e47ce7-2e6b-48a8-814c-4341b02283a2 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:54:25.334 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0f2a3598-f4d0-40d8-98fe-0227b8ab8f20 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:25.334 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0f2a3598-f4d0-40d8-98fe-0227b8ab8f20 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:25.336 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0f2a3598-f4d0-40d8-98fe-0227b8ab8f20 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:54:25.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0f2a3598-f4d0-40d8-98fe-0227b8ab8f20 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:54:25.338 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0f2a3598-f4d0-40d8-98fe-0227b8ab8f20 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:54:25.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0f2a3598-f4d0-40d8-98fe-0227b8ab8f20 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:54:25.355 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b5739791-e328-4025-9c2b-5f8656241503 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:25.355 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b5739791-e328-4025-9c2b-5f8656241503 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:28.341 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [56930f75-69d3-45fc-9d1f-45d9035ad8ef | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:28.342 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [56930f75-69d3-45fc-9d1f-45d9035ad8ef | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:28.343 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [56930f75-69d3-45fc-9d1f-45d9035ad8ef | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:54:28.347 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [56930f75-69d3-45fc-9d1f-45d9035ad8ef | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:54:28.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [56930f75-69d3-45fc-9d1f-45d9035ad8ef | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:54:28.348 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [56930f75-69d3-45fc-9d1f-45d9035ad8ef | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:54:28.364 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [681014b9-684c-4d55-a4f1-0900cc7cbbc0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:28.364 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [681014b9-684c-4d55-a4f1-0900cc7cbbc0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:31.329 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [627c9c00-883c-48b1-a44e-c6979284a3c9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:31.330 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [627c9c00-883c-48b1-a44e-c6979284a3c9 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:31.330 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [627c9c00-883c-48b1-a44e-c6979284a3c9 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:54:31.331 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [627c9c00-883c-48b1-a44e-c6979284a3c9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:54:31.331 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [627c9c00-883c-48b1-a44e-c6979284a3c9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:54:31.331 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [627c9c00-883c-48b1-a44e-c6979284a3c9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:54:31.345 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [637cd448-7b29-4d71-b78b-f59dbadc2afd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:31.346 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [637cd448-7b29-4d71-b78b-f59dbadc2afd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:34.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [084e4bc1-5c10-47d2-a71d-0ce5d4add158 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:34.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [084e4bc1-5c10-47d2-a71d-0ce5d4add158 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:54:34.339 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [084e4bc1-5c10-47d2-a71d-0ce5d4add158 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:54:34.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [084e4bc1-5c10-47d2-a71d-0ce5d4add158 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:54:34.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [084e4bc1-5c10-47d2-a71d-0ce5d4add158 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:54:34.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [084e4bc1-5c10-47d2-a71d-0ce5d4add158 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:54:34.353 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0f1849a7-40da-4292-af23-c4d053dc1153 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:54:34.354 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0f1849a7-40da-4292-af23-c4d053dc1153 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:15.655 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:15.656 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c0862271-b54f-4222-8fc6-0efd131c25ee | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:15.656 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c0862271-b54f-4222-8fc6-0efd131c25ee | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:15.656 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:55:15.656 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:15.657 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c0862271-b54f-4222-8fc6-0efd131c25ee | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:15.658 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:55:15.628Z +25-03-28 15:55:15.659 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:55:15.659 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c0862271-b54f-4222-8fc6-0efd131c25ee | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:15.659 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:55:15.628Z] +25-03-28 15:55:15.659 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c0862271-b54f-4222-8fc6-0efd131c25ee | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:15.660 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c0862271-b54f-4222-8fc6-0efd131c25ee | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:15.660 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:55:15.658985Z] +25-03-28 15:55:15.660 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:15.660 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c0fc3d0b-b2fe-4564-bc3f-7d565ed95cac | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:55:15.685 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [53065956-14ee-431f-a6c1-c85c7294d04c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:15.685 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [53065956-14ee-431f-a6c1-c85c7294d04c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:18.353 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a32680a7-b315-4fdf-a794-105579d21b11 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:18.353 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a32680a7-b315-4fdf-a794-105579d21b11 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:18.353 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a32680a7-b315-4fdf-a794-105579d21b11 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:18.354 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a32680a7-b315-4fdf-a794-105579d21b11 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:18.354 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a32680a7-b315-4fdf-a794-105579d21b11 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:18.354 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a32680a7-b315-4fdf-a794-105579d21b11 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:18.362 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1816a844-85d2-4b5d-afcc-a23c717e062f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:18.363 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1816a844-85d2-4b5d-afcc-a23c717e062f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:20.898 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:20.899 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [332aa263-5a86-485b-bc23-dcbf2e657150 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:55:20.900 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:55:20.900 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:20.902 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:55:20.889Z +25-03-28 15:55:20.903 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:55:20.904 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:55:20.889Z] +25-03-28 15:55:20.904 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:55:20.902003700Z] +25-03-28 15:55:20.904 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:20.904 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22a0b293-4789-4f30-a0ef-11cb4491e922 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:55:20.913 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [cf7824f7-8b3b-4c96-ac56-b8d230f8b7a3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:20.913 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [cf7824f7-8b3b-4c96-ac56-b8d230f8b7a3 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:20.914 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [aa303078-2bf8-4972-8ff7-59c6ec00e7dd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:20.914 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cf7824f7-8b3b-4c96-ac56-b8d230f8b7a3 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:20.914 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [aa303078-2bf8-4972-8ff7-59c6ec00e7dd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:20.915 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [cf7824f7-8b3b-4c96-ac56-b8d230f8b7a3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:20.916 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [cf7824f7-8b3b-4c96-ac56-b8d230f8b7a3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:20.916 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [cf7824f7-8b3b-4c96-ac56-b8d230f8b7a3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:20.927 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [4e0afd95-d9e5-42ed-ab13-8d2bd9247717 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:20.927 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [4e0afd95-d9e5-42ed-ab13-8d2bd9247717 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:23.922 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a4e756bf-0135-466a-a3a1-a63e63fed393 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:23.922 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a4e756bf-0135-466a-a3a1-a63e63fed393 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:23.923 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a4e756bf-0135-466a-a3a1-a63e63fed393 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:23.925 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a4e756bf-0135-466a-a3a1-a63e63fed393 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:23.925 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a4e756bf-0135-466a-a3a1-a63e63fed393 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:23.925 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a4e756bf-0135-466a-a3a1-a63e63fed393 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:23.936 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9cfdb949-09be-48c5-a5f4-c256e29e63ad | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:23.936 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9cfdb949-09be-48c5-a5f4-c256e29e63ad | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:26.920 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [db1d56c5-ab41-4418-a5bb-1e78af34a521 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:26.920 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [db1d56c5-ab41-4418-a5bb-1e78af34a521 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:26.921 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [db1d56c5-ab41-4418-a5bb-1e78af34a521 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:26.923 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [db1d56c5-ab41-4418-a5bb-1e78af34a521 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:26.924 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [db1d56c5-ab41-4418-a5bb-1e78af34a521 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:26.924 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [db1d56c5-ab41-4418-a5bb-1e78af34a521 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:26.936 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [72979714-9a20-425f-9ec2-d35f85f25b1d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:26.936 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [72979714-9a20-425f-9ec2-d35f85f25b1d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:29.922 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8a2f1e35-ff91-4218-bfd1-f8d7d6ffae59 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:29.922 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a2f1e35-ff91-4218-bfd1-f8d7d6ffae59 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:29.923 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8a2f1e35-ff91-4218-bfd1-f8d7d6ffae59 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:29.927 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8a2f1e35-ff91-4218-bfd1-f8d7d6ffae59 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:29.927 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a2f1e35-ff91-4218-bfd1-f8d7d6ffae59 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:29.927 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a2f1e35-ff91-4218-bfd1-f8d7d6ffae59 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:29.940 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5a49590b-99bd-4b7b-9d29-455ff8e09238 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:29.940 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5a49590b-99bd-4b7b-9d29-455ff8e09238 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:32.725 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - [회원 수정 요청] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:32.726 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-03-28 15:55:32.727 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:32.733 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 15:55:32.733 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:VARCHAR) <- [woody@naver.com] +25-03-28 15:55:32.733 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (2:INTEGER) <- [1] +25-03-28 15:55:32.734 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 15:55:32.734 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:VARCHAR) <- [woody] +25-03-28 15:55:32.734 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (2:INTEGER) <- [1] +25-03-28 15:55:32.735 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - [프로필 이미지 업데이트] 파일명: woody.jpeg, 타입: image/jpeg, 크기: 9296 bytes +25-03-28 15:55:32.737 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - [회원 수정 완료] id: a0fe74aa-0a63-404f-ace9-810993e34ad5, 새로운 이름: woody, 새로운 이메일: woody@naver.com +25-03-28 15:55:32.739 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:55:32.739 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:55:32.746 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 15:55:32.747 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:VARCHAR) <- [image/jpeg] +25-03-28 15:55:32.747 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:55:32.735749Z] +25-03-28 15:55:32.747 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (3:VARCHAR) <- [woody.jpeg] +25-03-28 15:55:32.747 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (4:BIGINT) <- [9296] +25-03-28 15:55:32.747 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (5:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:32.749 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + /* update + for com.sprint.mission.discodeit.entity.User */update users + set + email=?, + password=?, + profile_id=?, + updated_at=?, + username=? + where + id=? +25-03-28 15:55:32.749 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:VARCHAR) <- [woody@naver.com] +25-03-28 15:55:32.749 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (2:VARCHAR) <- [Rlawnsdn12!] +25-03-28 15:55:32.749 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (3:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:32.749 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T06:55:32.745682100Z] +25-03-28 15:55:32.749 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (5:VARCHAR) <- [woody] +25-03-28 15:55:32.749 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (6:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:32.753 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - + /* delete for com.sprint.mission.discodeit.entity.BinaryContent */delete + from + binary_contents + where + id=? +25-03-28 15:55:32.753 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e8901525-6c24-4054-8062-72b0cd0a268d | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5] - binding parameter (1:UUID) <- [bd76f4ec-a49e-4c1f-a38c-678219ed7743] +25-03-28 15:55:32.923 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4bf9a507-38d5-471a-95d8-2ebe1d5d8c36 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:32.924 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4bf9a507-38d5-471a-95d8-2ebe1d5d8c36 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:32.924 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4bf9a507-38d5-471a-95d8-2ebe1d5d8c36 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:32.925 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4bf9a507-38d5-471a-95d8-2ebe1d5d8c36 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:32.926 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4bf9a507-38d5-471a-95d8-2ebe1d5d8c36 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:32.926 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4bf9a507-38d5-471a-95d8-2ebe1d5d8c36 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:32.933 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [485b8886-b0fe-449c-a246-2368463f892b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:32.933 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [485b8886-b0fe-449c-a246-2368463f892b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:35.923 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [accfd2bc-febe-4ae8-ae0c-abf89ca3df55 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:35.925 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [accfd2bc-febe-4ae8-ae0c-abf89ca3df55 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:35.926 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [accfd2bc-febe-4ae8-ae0c-abf89ca3df55 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:35.927 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [accfd2bc-febe-4ae8-ae0c-abf89ca3df55 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:35.927 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [accfd2bc-febe-4ae8-ae0c-abf89ca3df55 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:35.927 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [accfd2bc-febe-4ae8-ae0c-abf89ca3df55 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:35.939 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0d47799b-36b8-4c74-b67d-375125046b55 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:35.939 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0d47799b-36b8-4c74-b67d-375125046b55 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:38.932 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [39bc45f0-856d-40d3-b1dd-b1af2750068f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:38.933 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [39bc45f0-856d-40d3-b1dd-b1af2750068f | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:38.933 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [39bc45f0-856d-40d3-b1dd-b1af2750068f | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:38.934 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [39bc45f0-856d-40d3-b1dd-b1af2750068f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:38.934 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [39bc45f0-856d-40d3-b1dd-b1af2750068f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:38.934 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [39bc45f0-856d-40d3-b1dd-b1af2750068f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:38.947 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0e229648-2e42-405c-83b7-df95e7e9140f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:38.947 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0e229648-2e42-405c-83b7-df95e7e9140f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:41.923 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8671264d-75d8-4ea4-8046-8f4f0f0cd51e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:41.924 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8671264d-75d8-4ea4-8046-8f4f0f0cd51e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:41.925 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8671264d-75d8-4ea4-8046-8f4f0f0cd51e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:41.928 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8671264d-75d8-4ea4-8046-8f4f0f0cd51e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:41.928 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8671264d-75d8-4ea4-8046-8f4f0f0cd51e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:41.928 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8671264d-75d8-4ea4-8046-8f4f0f0cd51e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:41.943 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [26ffe9f8-abbb-4bf7-a58a-c9bfc6586df1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:41.943 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [26ffe9f8-abbb-4bf7-a58a-c9bfc6586df1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:43.615 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:43.618 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:55:43.618 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:43.619 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:55:43.610Z +25-03-28 15:55:43.621 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:55:43.621 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:55:43.610Z] +25-03-28 15:55:43.621 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:55:43.620934600Z] +25-03-28 15:55:43.621 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:43.621 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7261ba7e-00ff-4c9e-b8c7-e8d68e01cf51 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:55:47.701 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - [로그인 시도] username: woody +25-03-28 15:55:47.703 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-28 15:55:47.705 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [woody] +25-03-28 15:55:47.718 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:55:47.718 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.720 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - [로그인 성공] username: woody +25-03-28 15:55:47.720 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:55:47.720 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e05b7503-64ef-495e-9066-e1acef587dd1 | POST | /api/auth/login] - binding parameter (1:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:47.728 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2df68ccd-133b-4988-854e-797656f5b5f9 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:55:47.741 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a34a406b-07b0-45f1-96c2-9771520fa8e5 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - [파일 조회] id: 305533ac-0fe0-46ae-911d-e2ddee97a9e3 +25-03-28 15:55:47.742 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a34a406b-07b0-45f1-96c2-9771520fa8e5 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:55:47.743 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a34a406b-07b0-45f1-96c2-9771520fa8e5 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - binding parameter (1:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:47.745 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:47.745 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:47.746 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [63a2e575-a9b9-4451-9e8d-629a8658d6ec | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:55:47.747 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:55:47.747 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:55:47.747 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.747 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [afe8250a-4cbb-481e-9846-8d5f1ba73c3e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.747 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.747 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [311d0961-c66c-4554-ad40-9149360b4d49 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.747 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [afe8250a-4cbb-481e-9846-8d5f1ba73c3e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.747 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [311d0961-c66c-4554-ad40-9149360b4d49 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.748 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [afe8250a-4cbb-481e-9846-8d5f1ba73c3e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:47.748 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:55:47.737Z +25-03-28 15:55:47.748 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:55:47.737Z +25-03-28 15:55:47.749 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:55:47.749 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:55:47.737Z] +25-03-28 15:55:47.750 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:55:47.748150200Z] +25-03-28 15:55:47.749 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [afe8250a-4cbb-481e-9846-8d5f1ba73c3e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:47.750 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.750 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [afe8250a-4cbb-481e-9846-8d5f1ba73c3e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:47.750 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d845f3c0-e2d0-4872-aebd-e064ec1e24db | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:55:47.750 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:55:47.750 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [afe8250a-4cbb-481e-9846-8d5f1ba73c3e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:47.750 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:55:47.737Z] +25-03-28 15:55:47.750 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [7e0294f8-a138-497a-89ba-8f09e784c6e4 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - [파일 조회] id: 305533ac-0fe0-46ae-911d-e2ddee97a9e3 +25-03-28 15:55:47.751 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:55:47.749151500Z] +25-03-28 15:55:47.751 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.751 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [973e8f52-766a-4db8-8025-5d377820151a | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:55:47.751 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7e0294f8-a138-497a-89ba-8f09e784c6e4 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:55:47.751 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7e0294f8-a138-497a-89ba-8f09e784c6e4 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - binding parameter (1:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:47.758 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [bf51dc3d-fea9-47bd-89d2-5be606ed0973 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - [파일 조회] id: 305533ac-0fe0-46ae-911d-e2ddee97a9e3 +25-03-28 15:55:47.759 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [bf51dc3d-fea9-47bd-89d2-5be606ed0973 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:55:47.759 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bf51dc3d-fea9-47bd-89d2-5be606ed0973 | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3] - binding parameter (1:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:47.796 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [09d26a96-f3f8-4572-87b8-443d800d58bd | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3/download] - [파일 조회] id: 305533ac-0fe0-46ae-911d-e2ddee97a9e3 +25-03-28 15:55:47.797 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [09d26a96-f3f8-4572-87b8-443d800d58bd | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 15:55:47.798 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09d26a96-f3f8-4572-87b8-443d800d58bd | GET | /api/binaryContents/305533ac-0fe0-46ae-911d-e2ddee97a9e3/download] - binding parameter (1:UUID) <- [305533ac-0fe0-46ae-911d-e2ddee97a9e3] +25-03-28 15:55:47.800 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4aafd698-febf-4aef-a9b4-b255b8c956a9 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:55:47.808 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [090a66f2-bba6-403e-808a-de6b6d3941a4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.808 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [19f22d60-c839-489c-a0ba-16c738dfafa1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.808 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [090a66f2-bba6-403e-808a-de6b6d3941a4 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.808 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [19f22d60-c839-489c-a0ba-16c738dfafa1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.808 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [090a66f2-bba6-403e-808a-de6b6d3941a4 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:47.810 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [090a66f2-bba6-403e-808a-de6b6d3941a4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:47.810 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [090a66f2-bba6-403e-808a-de6b6d3941a4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:47.811 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [090a66f2-bba6-403e-808a-de6b6d3941a4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:47.816 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [39bcc365-e7ba-449b-aacf-c1945a735cd0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.816 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [39bcc365-e7ba-449b-aacf-c1945a735cd0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.820 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [27c14e6c-d7a0-4df4-9613-60615fdde510 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.820 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [27c14e6c-d7a0-4df4-9613-60615fdde510 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.821 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [27c14e6c-d7a0-4df4-9613-60615fdde510 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:47.822 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [38e4de2d-babd-4df2-ac71-0b64c2fb69d2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.822 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [27c14e6c-d7a0-4df4-9613-60615fdde510 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:47.822 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [38e4de2d-babd-4df2-ac71-0b64c2fb69d2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.822 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [27c14e6c-d7a0-4df4-9613-60615fdde510 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:47.822 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [27c14e6c-d7a0-4df4-9613-60615fdde510 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:47.829 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2cd3d0f6-39d2-48b9-b6cb-f2218d95c94e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.829 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2cd3d0f6-39d2-48b9-b6cb-f2218d95c94e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:47.835 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b1db3fab-a50c-4c4f-8bad-f32363aa9266 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:47.836 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b1db3fab-a50c-4c4f-8bad-f32363aa9266 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:50.822 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [60cb22e4-83e8-4dd7-b546-730be71379f1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:50.823 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [60cb22e4-83e8-4dd7-b546-730be71379f1 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:50.824 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [60cb22e4-83e8-4dd7-b546-730be71379f1 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:50.827 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [60cb22e4-83e8-4dd7-b546-730be71379f1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:50.827 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [60cb22e4-83e8-4dd7-b546-730be71379f1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:50.827 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [60cb22e4-83e8-4dd7-b546-730be71379f1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:50.839 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a84391db-4e08-40c8-9935-5d5cdf1b739b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:50.839 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a84391db-4e08-40c8-9935-5d5cdf1b739b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:53.822 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2f15446d-1a25-41ff-a8d4-fde61269b840 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:53.823 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f15446d-1a25-41ff-a8d4-fde61269b840 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:53.823 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2f15446d-1a25-41ff-a8d4-fde61269b840 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:53.826 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2f15446d-1a25-41ff-a8d4-fde61269b840 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:53.826 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f15446d-1a25-41ff-a8d4-fde61269b840 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:53.826 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f15446d-1a25-41ff-a8d4-fde61269b840 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:53.834 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [819d9e01-3343-4831-bf40-247b3eb42015 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:53.835 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [819d9e01-3343-4831-bf40-247b3eb42015 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:56.824 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c7e24a89-8416-4a4f-8b94-d3f8593f9c5e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:56.825 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c7e24a89-8416-4a4f-8b94-d3f8593f9c5e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:56.825 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c7e24a89-8416-4a4f-8b94-d3f8593f9c5e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:56.828 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c7e24a89-8416-4a4f-8b94-d3f8593f9c5e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:56.828 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c7e24a89-8416-4a4f-8b94-d3f8593f9c5e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:56.828 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c7e24a89-8416-4a4f-8b94-d3f8593f9c5e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:56.839 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6af4f5b1-68b6-4c64-9819-33597f754c60 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:56.839 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6af4f5b1-68b6-4c64-9819-33597f754c60 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:59.824 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [82e573df-99ed-473b-8ee6-302d6b96e561 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:59.825 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [82e573df-99ed-473b-8ee6-302d6b96e561 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:55:59.825 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [82e573df-99ed-473b-8ee6-302d6b96e561 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:55:59.827 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [82e573df-99ed-473b-8ee6-302d6b96e561 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:55:59.827 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [82e573df-99ed-473b-8ee6-302d6b96e561 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:55:59.827 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [82e573df-99ed-473b-8ee6-302d6b96e561 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:55:59.845 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [bcf9ba6d-27b6-49d7-a644-f3381f82e382 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:55:59.846 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [bcf9ba6d-27b6-49d7-a644-f3381f82e382 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:03.332 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7c8849ce-f11a-4afc-ae5e-eb727e24ad22 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:03.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7c8849ce-f11a-4afc-ae5e-eb727e24ad22 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:03.333 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7c8849ce-f11a-4afc-ae5e-eb727e24ad22 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:03.335 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7c8849ce-f11a-4afc-ae5e-eb727e24ad22 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:03.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7c8849ce-f11a-4afc-ae5e-eb727e24ad22 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:03.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7c8849ce-f11a-4afc-ae5e-eb727e24ad22 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:03.349 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [90f9d04d-f345-49b1-9a7b-2532e9129c2b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:03.349 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [90f9d04d-f345-49b1-9a7b-2532e9129c2b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:06.343 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [399d74c6-d386-4495-b53b-60744b3d1921 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:06.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [399d74c6-d386-4495-b53b-60744b3d1921 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:06.344 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [399d74c6-d386-4495-b53b-60744b3d1921 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:06.345 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [399d74c6-d386-4495-b53b-60744b3d1921 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:06.345 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [399d74c6-d386-4495-b53b-60744b3d1921 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:06.345 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [399d74c6-d386-4495-b53b-60744b3d1921 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:06.358 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9ac90a59-1b76-487f-babe-64a3393664cf | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:06.358 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9ac90a59-1b76-487f-babe-64a3393664cf | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:09.328 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [d1ad36f3-fdaf-47e0-a05d-751a0c192eb8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:09.328 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [d1ad36f3-fdaf-47e0-a05d-751a0c192eb8 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:09.329 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d1ad36f3-fdaf-47e0-a05d-751a0c192eb8 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:09.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [d1ad36f3-fdaf-47e0-a05d-751a0c192eb8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:09.331 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [d1ad36f3-fdaf-47e0-a05d-751a0c192eb8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:09.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [d1ad36f3-fdaf-47e0-a05d-751a0c192eb8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:09.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [15ce097b-cf0d-4db6-a03e-1bc01e5d1dc5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:09.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [15ce097b-cf0d-4db6-a03e-1bc01e5d1dc5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:12.335 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ac46a125-80bc-4f93-aff3-3576d7f71c9e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:12.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac46a125-80bc-4f93-aff3-3576d7f71c9e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:12.337 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ac46a125-80bc-4f93-aff3-3576d7f71c9e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:12.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ac46a125-80bc-4f93-aff3-3576d7f71c9e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:12.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac46a125-80bc-4f93-aff3-3576d7f71c9e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:12.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac46a125-80bc-4f93-aff3-3576d7f71c9e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:12.357 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ff9b7d50-4f96-4045-8044-7f8cf2304de7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:12.357 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ff9b7d50-4f96-4045-8044-7f8cf2304de7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:15.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [dd8f4fa9-e976-4462-aa33-7c2226349817 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:15.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [dd8f4fa9-e976-4462-aa33-7c2226349817 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:15.330 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [dd8f4fa9-e976-4462-aa33-7c2226349817 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:15.331 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [dd8f4fa9-e976-4462-aa33-7c2226349817 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:15.331 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [dd8f4fa9-e976-4462-aa33-7c2226349817 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:15.332 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [dd8f4fa9-e976-4462-aa33-7c2226349817 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:15.343 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [effa1ab2-b751-4bce-b6db-4282d8e7612f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:15.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [effa1ab2-b751-4bce-b6db-4282d8e7612f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:18.334 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:18.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [16a36980-cb57-4a46-be5a-df20c093b563 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:18.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:56:18.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [16a36980-cb57-4a46-be5a-df20c093b563 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:18.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:18.338 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [16a36980-cb57-4a46-be5a-df20c093b563 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:18.338 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:56:18.325Z +25-03-28 15:56:18.341 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [16a36980-cb57-4a46-be5a-df20c093b563 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:18.341 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [16a36980-cb57-4a46-be5a-df20c093b563 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:18.341 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [16a36980-cb57-4a46-be5a-df20c093b563 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:18.341 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:56:18.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:56:18.325Z] +25-03-28 15:56:18.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:56:18.339714400Z] +25-03-28 15:56:18.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:18.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c92fbeba-8145-4d2b-8491-5303348da94f | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:56:18.353 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4283833a-fba8-4613-b02d-27b584d9130e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:18.354 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4283833a-fba8-4613-b02d-27b584d9130e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:21.340 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fb4ea3ed-2f4f-477e-b59d-82fb65cdeb98 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:21.340 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fb4ea3ed-2f4f-477e-b59d-82fb65cdeb98 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:21.341 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fb4ea3ed-2f4f-477e-b59d-82fb65cdeb98 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:21.344 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fb4ea3ed-2f4f-477e-b59d-82fb65cdeb98 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:21.345 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fb4ea3ed-2f4f-477e-b59d-82fb65cdeb98 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:21.345 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fb4ea3ed-2f4f-477e-b59d-82fb65cdeb98 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:21.358 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c7ffaf40-ee6e-4ada-b241-9624a88a9ba7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:21.358 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c7ffaf40-ee6e-4ada-b241-9624a88a9ba7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:24.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e727fea5-cf9a-46a6-a131-dba0635b4463 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:24.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e727fea5-cf9a-46a6-a131-dba0635b4463 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:24.338 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e727fea5-cf9a-46a6-a131-dba0635b4463 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:24.340 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e727fea5-cf9a-46a6-a131-dba0635b4463 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:24.341 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e727fea5-cf9a-46a6-a131-dba0635b4463 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:24.341 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e727fea5-cf9a-46a6-a131-dba0635b4463 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:24.354 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b5712699-a65f-485b-b6f7-4c00438014a6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:24.354 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b5712699-a65f-485b-b6f7-4c00438014a6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:27.336 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [54999396-1545-4072-a4be-51ad39d18fde | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:27.336 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [54999396-1545-4072-a4be-51ad39d18fde | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:27.338 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [54999396-1545-4072-a4be-51ad39d18fde | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:27.341 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [54999396-1545-4072-a4be-51ad39d18fde | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:27.341 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [54999396-1545-4072-a4be-51ad39d18fde | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:27.341 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [54999396-1545-4072-a4be-51ad39d18fde | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:27.353 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [058b8f99-e7e4-44a3-a71a-2e61e1ba731f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:27.355 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [058b8f99-e7e4-44a3-a71a-2e61e1ba731f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:30.348 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [997b8c72-c0af-4080-a687-4f8761c3658f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:30.349 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [997b8c72-c0af-4080-a687-4f8761c3658f | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:30.350 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [997b8c72-c0af-4080-a687-4f8761c3658f | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:30.354 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [997b8c72-c0af-4080-a687-4f8761c3658f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:30.354 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [997b8c72-c0af-4080-a687-4f8761c3658f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:30.354 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [997b8c72-c0af-4080-a687-4f8761c3658f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:30.372 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [6ce4e0a5-3449-426c-9d36-02cd6fc34f56 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:30.372 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [6ce4e0a5-3449-426c-9d36-02cd6fc34f56 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:33.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [38f7c508-7076-40c0-8e69-ad12c9dfd8fe | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:33.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [38f7c508-7076-40c0-8e69-ad12c9dfd8fe | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:33.341 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [38f7c508-7076-40c0-8e69-ad12c9dfd8fe | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:33.343 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [38f7c508-7076-40c0-8e69-ad12c9dfd8fe | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:33.343 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [38f7c508-7076-40c0-8e69-ad12c9dfd8fe | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:33.344 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [38f7c508-7076-40c0-8e69-ad12c9dfd8fe | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:33.361 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [c4442fb2-fa71-4f7d-b869-65abb6fb48d2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:33.361 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [c4442fb2-fa71-4f7d-b869-65abb6fb48d2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:36.346 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [727148e4-bbb7-45bd-a0c1-f3cdb87b5626 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:36.346 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [727148e4-bbb7-45bd-a0c1-f3cdb87b5626 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:36.346 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [727148e4-bbb7-45bd-a0c1-f3cdb87b5626 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:36.348 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [727148e4-bbb7-45bd-a0c1-f3cdb87b5626 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:36.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [727148e4-bbb7-45bd-a0c1-f3cdb87b5626 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:36.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [727148e4-bbb7-45bd-a0c1-f3cdb87b5626 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:36.360 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [44f64a5b-406b-4d31-accb-5d4c829adbae | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:36.360 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [44f64a5b-406b-4d31-accb-5d4c829adbae | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:39.338 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [cf22b919-0f38-422b-a761-4f8aec705f93 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:39.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [cf22b919-0f38-422b-a761-4f8aec705f93 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:39.338 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cf22b919-0f38-422b-a761-4f8aec705f93 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:39.340 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [cf22b919-0f38-422b-a761-4f8aec705f93 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:39.340 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [cf22b919-0f38-422b-a761-4f8aec705f93 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:39.340 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [cf22b919-0f38-422b-a761-4f8aec705f93 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:39.352 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5aeaf164-787b-4747-9efe-d6f7b117ef8b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:39.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5aeaf164-787b-4747-9efe-d6f7b117ef8b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:42.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8841be3f-6630-4984-abfc-5a124b5c9cc2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:42.338 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8841be3f-6630-4984-abfc-5a124b5c9cc2 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:42.338 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8841be3f-6630-4984-abfc-5a124b5c9cc2 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:42.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8841be3f-6630-4984-abfc-5a124b5c9cc2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:42.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8841be3f-6630-4984-abfc-5a124b5c9cc2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:42.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8841be3f-6630-4984-abfc-5a124b5c9cc2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:42.350 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [37edb4d5-f132-4af2-b9eb-2a7dbdf58c89 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:42.351 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [37edb4d5-f132-4af2-b9eb-2a7dbdf58c89 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:45.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0212fa04-4076-4aed-85de-3b86061b9503 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:45.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0212fa04-4076-4aed-85de-3b86061b9503 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:45.337 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0212fa04-4076-4aed-85de-3b86061b9503 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:45.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0212fa04-4076-4aed-85de-3b86061b9503 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:45.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0212fa04-4076-4aed-85de-3b86061b9503 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:45.340 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0212fa04-4076-4aed-85de-3b86061b9503 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:45.353 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f5f8999a-cd5d-46f3-a74c-99fb64c517aa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:45.354 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f5f8999a-cd5d-46f3-a74c-99fb64c517aa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.345 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:48.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [88c50891-467e-4a92-8387-2f42a7a7dc67 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 15:56:48.347 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 15:56:48.347 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.348 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [58217cc4-b16c-409b-8cd6-c788e232650e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:48.348 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a0fe74aa-0a63-404f-ace9-810993e34ad5, newLastActiveAt: 2025-03-28T06:56:48.332Z +25-03-28 15:56:48.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [58217cc4-b16c-409b-8cd6-c788e232650e | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.349 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [58217cc4-b16c-409b-8cd6-c788e232650e | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:48.350 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 15:56:48.350 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T06:56:48.332Z] +25-03-28 15:56:48.350 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T06:56:48.349567500Z] +25-03-28 15:56:48.350 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (3:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.350 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [58217cc4-b16c-409b-8cd6-c788e232650e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:48.350 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [386420e1-aff6-4533-af9a-e109e9b3ac64 | PATCH | /api/users/a0fe74aa-0a63-404f-ace9-810993e34ad5/userStatus] - binding parameter (4:UUID) <- [61986bef-4cb5-40dd-874e-6f518c6474e0] +25-03-28 15:56:48.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [58217cc4-b16c-409b-8cd6-c788e232650e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:48.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [58217cc4-b16c-409b-8cd6-c788e232650e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:48.361 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [73ff8822-fd3f-4f53-b9a2-ba82ec0be8d3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:48.361 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7cfaaa46-b72f-4cf3-ac63-1674b9f4002f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:48.361 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [73ff8822-fd3f-4f53-b9a2-ba82ec0be8d3 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.361 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7cfaaa46-b72f-4cf3-ac63-1674b9f4002f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.362 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [73ff8822-fd3f-4f53-b9a2-ba82ec0be8d3 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:48.366 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [73ff8822-fd3f-4f53-b9a2-ba82ec0be8d3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:48.366 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [73ff8822-fd3f-4f53-b9a2-ba82ec0be8d3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:48.366 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [73ff8822-fd3f-4f53-b9a2-ba82ec0be8d3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:48.373 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8a115b1f-2d49-463e-a464-3c11a9a04547 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:48.373 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8a115b1f-2d49-463e-a464-3c11a9a04547 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:48.383 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a78511ec-d43a-4f32-bfd2-a45f435e9d69 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:48.384 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a78511ec-d43a-4f32-bfd2-a45f435e9d69 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:52.335 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d04c5ef8-6702-407d-9848-240a5efde1e6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:52.335 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d04c5ef8-6702-407d-9848-240a5efde1e6 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:52.336 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d04c5ef8-6702-407d-9848-240a5efde1e6 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:52.337 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d04c5ef8-6702-407d-9848-240a5efde1e6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:52.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d04c5ef8-6702-407d-9848-240a5efde1e6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:52.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d04c5ef8-6702-407d-9848-240a5efde1e6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:52.347 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [61f6f0a9-2539-4712-a9ce-beb6c1be141b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:52.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [61f6f0a9-2539-4712-a9ce-beb6c1be141b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:55.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [98852907-99b3-4bc9-82cb-e57e660b11c9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:55.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [98852907-99b3-4bc9-82cb-e57e660b11c9 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:55.339 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [98852907-99b3-4bc9-82cb-e57e660b11c9 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:55.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [98852907-99b3-4bc9-82cb-e57e660b11c9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:55.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [98852907-99b3-4bc9-82cb-e57e660b11c9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:55.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [98852907-99b3-4bc9-82cb-e57e660b11c9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:55.350 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c169b2a7-ca45-43d8-8315-769e236866a7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:55.350 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c169b2a7-ca45-43d8-8315-769e236866a7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:58.340 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [883c411f-05df-432a-bddd-e35d86604b7d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:58.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [883c411f-05df-432a-bddd-e35d86604b7d | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:56:58.341 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [883c411f-05df-432a-bddd-e35d86604b7d | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:56:58.342 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [883c411f-05df-432a-bddd-e35d86604b7d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:56:58.342 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [883c411f-05df-432a-bddd-e35d86604b7d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:56:58.342 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [883c411f-05df-432a-bddd-e35d86604b7d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:56:58.353 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8d224033-e267-4eb4-8370-a1f39815880f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:56:58.353 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8d224033-e267-4eb4-8370-a1f39815880f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:57:01.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5f646a91-02b9-4d73-a12e-360505a57aa4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:57:01.338 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5f646a91-02b9-4d73-a12e-360505a57aa4 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:57:01.338 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5f646a91-02b9-4d73-a12e-360505a57aa4 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:57:01.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5f646a91-02b9-4d73-a12e-360505a57aa4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:57:01.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5f646a91-02b9-4d73-a12e-360505a57aa4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:57:01.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5f646a91-02b9-4d73-a12e-360505a57aa4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:57:01.349 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [931e09c0-25c2-4dde-b033-91995be57ba4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:57:01.350 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [931e09c0-25c2-4dde-b033-91995be57ba4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:57:03.372 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [4f53fb78-14b8-4fa3-97ba-b3096a43b6c2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:57:03.372 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4f53fb78-14b8-4fa3-97ba-b3096a43b6c2 | GET | /api/channels] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:57:03.373 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4f53fb78-14b8-4fa3-97ba-b3096a43b6c2 | GET | /api/channels] - [채널 조회 성공] id: a0fe74aa-0a63-404f-ace9-810993e34ad5 +25-03-28 15:57:03.374 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [4f53fb78-14b8-4fa3-97ba-b3096a43b6c2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 15:57:03.375 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4f53fb78-14b8-4fa3-97ba-b3096a43b6c2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 15:57:03.375 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4f53fb78-14b8-4fa3-97ba-b3096a43b6c2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 15:57:03.385 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ce453cfd-6a9a-411d-b66a-18de4a278e6f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 15:57:03.385 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ce453cfd-6a9a-411d-b66a-18de4a278e6f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a0fe74aa-0a63-404f-ace9-810993e34ad5] +25-03-28 15:57:06.229 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 15:57:06.578 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-28 15:57:06.596 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 15:57:06.600 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-28 15:57:06.603 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-28 16:14:05.014 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:14:05.117 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 21620 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:14:05.118 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "test" +25-03-28 16:14:06.897 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 16:14:06.999 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 89 ms. Found 6 JPA repository interfaces. +25-03-28 16:14:08.081 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-28 16:14:08.098 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-28 16:14:08.101 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-28 16:14:08.102 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 16:14:08.212 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-28 16:14:08.213 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 3017 ms +25-03-28 16:14:08.454 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-28 16:14:08.797 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-28 16:14:08.800 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-28 16:14:08.812 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-28 16:14:09.225 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 16:14:09.352 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 16:14:09.419 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 16:14:09.915 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 16:14:10.037 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 16:14:11.515 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 16:14:11.545 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-28 16:14:11.548 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-28 16:14:11.549 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-28 16:14:11.550 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-28 16:14:11.550 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-28 16:14:11.550 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-28 16:14:11.551 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-28 16:14:11.562 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 16:14:11.564 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 16:14:11.565 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 16:14:11.566 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 16:14:11.568 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 16:14:11.568 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 16:14:11.570 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 16:14:11.572 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 16:14:11.574 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 16:14:11.575 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 16:14:11.576 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 16:14:11.578 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 16:14:11.580 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 16:14:11.581 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 16:14:11.582 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 16:14:11.588 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 16:14:12.107 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 16:14:13.155 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 16:14:15.069 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 16:14:15.223 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-28 16:14:15.247 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-28 16:14:15.277 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 11.137 seconds (process running for 12.025) +25-03-28 16:14:15.548 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.23.140:8081/actuator, healthUrl=http://10.3.23.140:8081/actuator/health, serviceUrl=http://10.3.23.140:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-28 16:14:15.971 [RMI TCP Connection(2)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 16:14:15.972 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-28 16:14:15.976 [RMI TCP Connection(2)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 4 ms +25-03-28 16:14:25.559 [registrationTask1] INFO de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Application registered itself as 9acece57d09f +25-03-28 16:17:09.711 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-28 16:17:09.856 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 16:17:09.868 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-28 16:17:09.870 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 16:17:09.937 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 16:17:09.938 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-28 16:17:09.939 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 16:17:09.940 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-28 16:17:10.045 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - [회원 생성 완료] username: rex, id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:10.075 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 16:17:10.078 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-28 16:17:10.079 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:09.986103Z] +25-03-28 16:17:10.088 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-28 16:17:10.088 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-28 16:17:10.089 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (5:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.097 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 16:17:10.098 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.032311200Z] +25-03-28 16:17:10.099 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-28 16:17:10.099 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 16:17:10.101 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (4:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.103 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.032311200Z] +25-03-28 16:17:10.104 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-28 16:17:10.104 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (7:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.107 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 16:17:10.108 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.040385700Z] +25-03-28 16:17:10.108 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.031308100Z] +25-03-28 16:17:10.108 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.040385700Z] +25-03-28 16:17:10.108 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (4:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.108 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4328e4be-7a6a-4898-9426-f083dc1d994a | POST | /api/users] - binding parameter (5:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:17:10.141 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:10.141 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:10.156 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:17:10.156 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:17:10.157 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.158 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.198 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:17:10.131Z +25-03-28 16:17:10.198 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:17:10.130Z +25-03-28 16:17:10.208 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:17:10.208 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:17:10.213 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.131Z] +25-03-28 16:17:10.213 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.130Z] +25-03-28 16:17:10.213 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.199527200Z] +25-03-28 16:17:10.213 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:10.199527200Z] +25-03-28 16:17:10.213 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.213 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.213 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e829783-be97-480e-b1c8-09ea69bb1bbb | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:17:10.213 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d2ce2a60-2f79-4058-bbdb-d1c50b27b4d1 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:17:10.312 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0f9df6df-b775-41ee-8ac8-9b39e0dbafbf | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:17:10.350 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [7fe336d3-effd-4d20-8ee3-28ccd4de4617 | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - [파일 조회] id: 9be05887-24c3-4480-964b-2dd4c23bc5fb +25-03-28 16:17:10.355 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [62cc4ecd-c042-4296-affb-db6b23bcfe91 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:10.356 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62cc4ecd-c042-4296-affb-db6b23bcfe91 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.358 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9cfb6c6e-2de1-4a63-a434-d04a2abab837 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:17:10.359 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [62cc4ecd-c042-4296-affb-db6b23bcfe91 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:10.360 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [7b756ed7-6c08-403a-9058-4c153f6f5d74 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:10.362 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7b756ed7-6c08-403a-9058-4c153f6f5d74 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.372 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7fe336d3-effd-4d20-8ee3-28ccd4de4617 | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:17:10.372 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [62cc4ecd-c042-4296-affb-db6b23bcfe91 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:10.373 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7fe336d3-effd-4d20-8ee3-28ccd4de4617 | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - binding parameter (1:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.373 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62cc4ecd-c042-4296-affb-db6b23bcfe91 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:10.373 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62cc4ecd-c042-4296-affb-db6b23bcfe91 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:10.383 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [9c896e9f-2325-4f78-b8ae-f906d6cc948e | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - [파일 조회] id: 9be05887-24c3-4480-964b-2dd4c23bc5fb +25-03-28 16:17:10.384 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9c896e9f-2325-4f78-b8ae-f906d6cc948e | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:17:10.385 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9c896e9f-2325-4f78-b8ae-f906d6cc948e | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - binding parameter (1:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.390 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [9da10720-ee56-48ab-b6a0-f0520828aa8f | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - [파일 조회] id: 9be05887-24c3-4480-964b-2dd4c23bc5fb +25-03-28 16:17:10.391 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [9da10720-ee56-48ab-b6a0-f0520828aa8f | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:17:10.391 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [9da10720-ee56-48ab-b6a0-f0520828aa8f | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - binding parameter (1:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.400 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [c13b9efa-042b-4b7f-abcd-41c310cb6bfd | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - [파일 조회] id: 9be05887-24c3-4480-964b-2dd4c23bc5fb +25-03-28 16:17:10.401 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c13b9efa-042b-4b7f-abcd-41c310cb6bfd | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:17:10.401 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2a739a91-cb6f-4414-ab50-f70e6353adf7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:10.401 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c13b9efa-042b-4b7f-abcd-41c310cb6bfd | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - binding parameter (1:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.402 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2a739a91-cb6f-4414-ab50-f70e6353adf7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.402 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bb96a723-3f83-4fde-ac6d-e1d9d29938aa | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:10.403 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [bb96a723-3f83-4fde-ac6d-e1d9d29938aa | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.403 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [98e69744-c329-45f2-8dff-f73ac4954d5c | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb/download] - [파일 조회] id: 9be05887-24c3-4480-964b-2dd4c23bc5fb +25-03-28 16:17:10.405 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [98e69744-c329-45f2-8dff-f73ac4954d5c | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:17:10.405 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bb96a723-3f83-4fde-ac6d-e1d9d29938aa | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:10.405 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [98e69744-c329-45f2-8dff-f73ac4954d5c | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb/download] - binding parameter (1:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.408 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bb96a723-3f83-4fde-ac6d-e1d9d29938aa | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:10.408 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [aada3d33-61f5-4b34-baa8-63683b5b152e | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - [파일 조회] id: 9be05887-24c3-4480-964b-2dd4c23bc5fb +25-03-28 16:17:10.409 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [bb96a723-3f83-4fde-ac6d-e1d9d29938aa | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:10.409 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [bb96a723-3f83-4fde-ac6d-e1d9d29938aa | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:10.409 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [aada3d33-61f5-4b34-baa8-63683b5b152e | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:17:10.410 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [aada3d33-61f5-4b34-baa8-63683b5b152e | GET | /api/binaryContents/9be05887-24c3-4480-964b-2dd4c23bc5fb] - binding parameter (1:UUID) <- [9be05887-24c3-4480-964b-2dd4c23bc5fb] +25-03-28 16:17:10.411 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [75bdc4b8-b0be-4035-8e60-390b796cfa6b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:10.411 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [75bdc4b8-b0be-4035-8e60-390b796cfa6b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:10.423 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [598a275d-d284-4a08-a926-a5e865ec032d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:10.425 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [598a275d-d284-4a08-a926-a5e865ec032d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:13.421 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [296e0ef3-f56e-497e-8248-9095721bf6c8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:13.422 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [296e0ef3-f56e-497e-8248-9095721bf6c8 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:13.423 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [296e0ef3-f56e-497e-8248-9095721bf6c8 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:13.426 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [296e0ef3-f56e-497e-8248-9095721bf6c8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:13.427 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [296e0ef3-f56e-497e-8248-9095721bf6c8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:13.427 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [296e0ef3-f56e-497e-8248-9095721bf6c8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:13.447 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [20318126-0258-4160-80f7-a148577b01cf | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:13.448 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [20318126-0258-4160-80f7-a148577b01cf | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:16.406 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [21a4b200-f169-4450-a867-8db4efa6404b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:16.407 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [21a4b200-f169-4450-a867-8db4efa6404b | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:16.407 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [21a4b200-f169-4450-a867-8db4efa6404b | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:16.409 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [21a4b200-f169-4450-a867-8db4efa6404b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:16.409 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [21a4b200-f169-4450-a867-8db4efa6404b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:16.409 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [21a4b200-f169-4450-a867-8db4efa6404b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:16.418 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [a8d068dd-49f2-4fd3-a062-48b26456373c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:16.419 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a8d068dd-49f2-4fd3-a062-48b26456373c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:19.409 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [38a078bc-e5be-4fb2-85f9-97de358a30df | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:19.409 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [38a078bc-e5be-4fb2-85f9-97de358a30df | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:19.410 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [38a078bc-e5be-4fb2-85f9-97de358a30df | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:19.413 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [38a078bc-e5be-4fb2-85f9-97de358a30df | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:19.414 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [38a078bc-e5be-4fb2-85f9-97de358a30df | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:19.414 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [38a078bc-e5be-4fb2-85f9-97de358a30df | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:19.424 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7e7a1327-d65c-49b9-9bc2-71d509cb7fb2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:19.425 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7e7a1327-d65c-49b9-9bc2-71d509cb7fb2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:19.731 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - [공개 채널 생성 시도] type: PUBLIC, name: hello +25-03-28 16:17:19.738 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - [공개 채널 생성 성공] id: a6e45f5f-bb7f-42ef-91f6-2b1e75a55676 +25-03-28 16:17:19.746 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:19.748 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:19.753 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 16:17:19.753 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:17:19.734450500Z] +25-03-28 16:17:19.754 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (2:VARCHAR) <- [안녕하세요] +25-03-28 16:17:19.754 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (3:VARCHAR) <- [hello] +25-03-28 16:17:19.754 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 16:17:19.754 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T07:17:19.734450500Z] +25-03-28 16:17:19.754 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c31bc665-303e-4b1f-99b2-db6dc551a175 | POST | /api/channels/public] - binding parameter (6:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:19.769 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:19.769 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:19.770 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:19.772 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:19.773 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:19.773 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:19.775 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:19.776 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bf1fbdc9-a6e9-40af-acee-3e796ac2f92e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:19.786 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [cc8f8a4d-46e1-4ee1-b334-6c739782c0c1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:19.786 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [cc8f8a4d-46e1-4ee1-b334-6c739782c0c1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:19.823 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b1cac195-59f8-4c39-8f18-04c4dfb9e234 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:22.409 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:22.410 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:22.413 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:22.413 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:22.413 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:17:22.416 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:22.416 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [fac8d961-faa5-4d66-b889-b37839c2758a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:22.433 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [def50579-bc51-4d17-8206-2ecff6b7fab0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:22.435 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [def50579-bc51-4d17-8206-2ecff6b7fab0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:22.716 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a3a7e047-6950-44a9-9f20-6421b4fe3fc3 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id + from + read_statuses rs1_0 + where + rs1_0.user_id=? + and rs1_0.channel_id=? + fetch + first ? rows only +25-03-28 16:17:25.365 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:25.365 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:25.365 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (3:INTEGER) <- [1] +25-03-28 16:17:25.377 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - [읽기 정보 생성 완료] 읽기 정보가 생성되었습니다 id: dc3ec9f7-2f7a-451c-92d5-9add7c464eef +25-03-28 16:17:25.381 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - + /* insert for + com.sprint.mission.discodeit.entity.ReadStatus */insert + into + read_statuses (channel_id, created_at, last_read_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 16:17:25.381 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:25.381 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:25.372503800Z] +25-03-28 16:17:25.381 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T07:17:25.342Z] +25-03-28 16:17:25.381 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T07:17:25.372503800Z] +25-03-28 16:17:25.381 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (5:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:25.381 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83da7462-aace-4501-a81a-e590981a2435 | POST | /api/readStatuses] - binding parameter (6:UUID) <- [dc3ec9f7-2f7a-451c-92d5-9add7c464eef] +25-03-28 16:17:25.422 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:25.423 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:25.426 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:25.429 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:25.429 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:25.429 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:25.431 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:25.431 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4bb40676-104c-44df-9c9e-93b8365e6b9f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:25.442 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bf0c59af-e8a5-4534-bad1-ede8d57cfbfd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:25.442 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bf0c59af-e8a5-4534-bad1-ede8d57cfbfd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:25.590 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [43c07840-93b9-4682-9d17-c324d33b431f | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:29.330 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:29.331 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:29.333 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:29.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:29.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:29.335 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:29.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f0877043-70bb-44af-af3a-d7f2f17e9bc9 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:29.350 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [48a770e9-2d6f-47bd-9df4-c6235a57ef18 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:29.350 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [48a770e9-2d6f-47bd-9df4-c6235a57ef18 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:30.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [50a941e4-c096-41fa-9a82-407b9f82082a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:32.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:32.339 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:32.342 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:32.344 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:32.344 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:32.348 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:32.348 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f290c396-6c5a-4c1c-b99c-4c487dfc5919 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:32.364 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [b4dade76-e5b7-4c25-a77f-13ec09c6f340 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:32.365 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [b4dade76-e5b7-4c25-a77f-13ec09c6f340 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:33.338 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ecc8a321-37ac-4fb0-93d1-3a8602d41e7d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:35.343 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:35.343 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:35.345 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:35.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:35.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:35.346 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:35.347 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [35888afb-68de-4007-a0f1-841bdb7b4fef | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:35.357 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0da14a99-3c32-43f7-87f4-a9766d2c8783 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:35.357 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0da14a99-3c32-43f7-87f4-a9766d2c8783 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:37.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2e6abcd1-2ddb-4a19-9639-e85c158c43fe | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:38.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:38.336 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:38.337 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:38.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:38.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:38.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:38.340 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ac50d1bb-842a-40ff-86cf-d0b211aa7e89 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:38.350 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [080605d9-2ae1-4cd1-9e4b-59dcced8f3b5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:38.351 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [080605d9-2ae1-4cd1-9e4b-59dcced8f3b5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:40.333 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:40.335 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:17:40.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:40.337 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:17:40.323Z +25-03-28 16:17:40.338 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:17:40.338 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:17:40.323Z] +25-03-28 16:17:40.338 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:40.337141300Z] +25-03-28 16:17:40.338 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:40.338 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3927185d-c4e4-454c-9bda-bae2cc051829 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:17:41.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [df35320f-bce0-4c6a-b7ef-11162141bd4a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:41.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [df35320f-bce0-4c6a-b7ef-11162141bd4a | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:41.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [df35320f-bce0-4c6a-b7ef-11162141bd4a | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:17:41.338623300Z] +25-03-28 16:17:41.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:41.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [df35320f-bce0-4c6a-b7ef-11162141bd4a | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:17:41.340 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:41.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [df35320f-bce0-4c6a-b7ef-11162141bd4a | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:17:41.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [df35320f-bce0-4c6a-b7ef-11162141bd4a | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:17:41.342 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:41.343 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:41.343 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:41.347 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:41.347 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [677c0310-1ee1-40cd-aa21-46ef2a76c267 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:41.360 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7d64107b-ef24-4bab-88b8-b52a42f4a9fb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:41.360 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7d64107b-ef24-4bab-88b8-b52a42f4a9fb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:44.333 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:44.333 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:44.334 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:44.337 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:44.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:44.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:44.338 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:44.338 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7d42f8df-2217-460c-961b-e84f58154608 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:44.354 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [39329f45-0271-44b2-ac2c-f788881f1a5d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:44.355 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [39329f45-0271-44b2-ac2c-f788881f1a5d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:45.334 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1b6d2a97-1cf1-49cb-8ef3-ddc368029ddf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:47.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:47.342 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:47.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:47.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:47.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:47.347 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:47.347 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [75b24716-ad54-4a08-8dcc-6a075a4f6f14 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:47.357 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [15000eb6-5134-49c8-a22b-2fd963200eec | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:47.358 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [15000eb6-5134-49c8-a22b-2fd963200eec | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:49.327 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f09f71ae-37a2-4977-b902-8d749743ffdf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:50.332 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:50.334 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:50.335 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:50.336 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:50.336 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:50.337 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:50.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e6f3764d-4a42-4d62-9030-0aa38fbe95fd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:50.345 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4aaf6bd6-b41b-4cb3-ac21-463e2c929579 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:50.345 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4aaf6bd6-b41b-4cb3-ac21-463e2c929579 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:53.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [98a49dec-d309-47ad-91ce-5da34f2261a1 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:53.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [98a49dec-d309-47ad-91ce-5da34f2261a1 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:17:53.342 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:53.342 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:53.343 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [98a49dec-d309-47ad-91ce-5da34f2261a1 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:17:53.343 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [98a49dec-d309-47ad-91ce-5da34f2261a1 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:17:53.344 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:53.344 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:53.344 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:53.345 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:53.346 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ae288fa9-ed57-4320-bb5c-c9e4d0c0365d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:53.363 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a08877f4-85f2-48eb-b55d-2bb14fdffc5d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:53.363 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a08877f4-85f2-48eb-b55d-2bb14fdffc5d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:56.333 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:56.334 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:56.335 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:56.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:56.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:56.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:56.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:56.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8691a57a-e37e-4650-b158-15e40cd46ef0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:56.351 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [00c64494-f345-42fe-8ca7-53bda19171de | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:56.351 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [00c64494-f345-42fe-8ca7-53bda19171de | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:57.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [bf5030e5-bd94-4b79-87a4-e54e671498a1 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:59.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:17:59.342 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:17:59.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:17:59.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:17:59.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:59.346 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:17:59.346 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [46387a9b-92fb-4f6f-81bd-2ee10559eb81 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:17:59.359 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fc71e320-efdc-4757-a5e9-9243b414311c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:17:59.359 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fc71e320-efdc-4757-a5e9-9243b414311c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:01.329 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5fb7cfa9-9f77-405d-8993-330e7bbf5e8a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:02.336 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:02.338 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:02.341 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:02.341 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:02.341 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:02.343 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:02.344 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7dcf8f5b-5adb-4159-bb2d-33b2e76679a1 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:02.357 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [51275f10-0b53-4279-aabc-4a4e545b586c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:02.357 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [51275f10-0b53-4279-aabc-4a4e545b586c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:05.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [394bcf26-ca9b-492f-b3be-ab4539b60061 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:05.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [394bcf26-ca9b-492f-b3be-ab4539b60061 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:18:05.334805200Z] +25-03-28 16:18:05.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:05.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [394bcf26-ca9b-492f-b3be-ab4539b60061 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:18:05.337 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:05.338 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [394bcf26-ca9b-492f-b3be-ab4539b60061 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:18:05.338 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [394bcf26-ca9b-492f-b3be-ab4539b60061 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:18:05.339 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:05.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:05.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:05.340 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:05.341 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ba62f89a-66c7-4a7b-a54d-d41f81a0a0fa | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:05.351 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [915805e9-a132-4f05-a0d1-1e640fb55d6e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:05.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [915805e9-a132-4f05-a0d1-1e640fb55d6e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:08.332 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:08.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:08.333 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:08.335 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:08.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:08.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:08.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:08.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [24f900ea-301b-4334-8803-bc707b2b1a4c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:08.344 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e6cd3deb-31f4-478c-a7ac-323275c6df82 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:08.345 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e6cd3deb-31f4-478c-a7ac-323275c6df82 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:09.331 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7c9893da-0026-4f0c-bd15-a9a0052f4e7e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:18:10.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:10.340 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:18:10.331Z +25-03-28 16:18:10.341 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:18:10.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:18:10.331Z] +25-03-28 16:18:10.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:18:10.341464200Z] +25-03-28 16:18:10.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:10.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53e3bded-ae5b-451b-8224-39ae6b125d80 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:18:10.350 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6ac627bd-8aea-4c00-920c-daa8aab4e6ac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:10.350 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:10.350 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6ac627bd-8aea-4c00-920c-daa8aab4e6ac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:10.350 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:10.352 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:10.355 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:10.355 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:10.356 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:10.359 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:10.360 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [39a49a0d-1f7f-47af-b7c1-76de2a4f9ebd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:10.369 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [183ef353-8f54-412a-9afb-7ea7f4ec4961 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:10.369 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [183ef353-8f54-412a-9afb-7ea7f4ec4961 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:13.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6cf9999f-a6d1-4209-bf80-9722a9a1a006 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:14.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:14.340 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:14.342 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:14.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:14.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:14.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:14.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5db434be-50ef-4346-a7f6-0aca14b7280a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:14.355 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [677fc21d-07e0-4e90-b795-1b057df10f6c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:14.356 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [677fc21d-07e0-4e90-b795-1b057df10f6c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:17.336 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [26a7f91e-5028-4cbc-8e31-607d955848a8 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:17.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:17.336 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:17.346 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [26a7f91e-5028-4cbc-8e31-607d955848a8 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:18:17.347 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [26a7f91e-5028-4cbc-8e31-607d955848a8 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:18:17.348 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:17.348 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:17.348 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:17.350 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:17.351 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c30edb1b-11a1-4e7e-a2f8-db0a6a362e57 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:17.359 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [971c68dc-f5d0-45fb-a220-a08a913e8666 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:17.360 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [971c68dc-f5d0-45fb-a220-a08a913e8666 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:20.335 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:20.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:20.336 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:20.337 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:20.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:20.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:20.338 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:20.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1124782-6f1b-4d5c-b978-17df4f2c8a2a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:20.351 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [dca96be6-b0fe-45d1-a049-3bf49fec747a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:20.351 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [dca96be6-b0fe-45d1-a049-3bf49fec747a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:21.328 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3fb524ca-dc7f-44e3-9d2c-fb6d05145510 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:23.334 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:23.335 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:23.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:23.337 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:23.337 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:23.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:23.337 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fdb19d2d-5ee5-4f42-ab7d-b403fa7dfbe1 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:23.346 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a0786846-9b4c-44f5-b399-7f40f7fe7b81 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:23.346 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a0786846-9b4c-44f5-b399-7f40f7fe7b81 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:25.336 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [84be3e12-c1cb-467c-a201-4fab6378b040 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:26.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:26.339 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:18:26.342 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:18:26.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:18:26.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:26.344 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:18:26.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3b0ae47-0cc4-48bc-aa87-d20b0e23f182 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:18:26.355 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [433fccbf-97da-4804-89d1-2f9caeefa385 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:18:26.355 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [433fccbf-97da-4804-89d1-2f9caeefa385 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:29.329 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [27c0cbc1-3c44-4ad0-94eb-89ce738ebc5e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:18:40.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:40.336 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:18:40.326Z +25-03-28 16:18:40.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:18:40.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:18:40.326Z] +25-03-28 16:18:40.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:18:40.336070Z] +25-03-28 16:18:40.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:18:40.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4849f508-5c40-4de1-b7f6-46ef2477e7a2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:18:41.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [305550e6-fbc3-4504-8a5b-256d81076711 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:19:10.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:10.340 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:19:10.328Z +25-03-28 16:19:10.343 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:19:10.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:19:10.328Z] +25-03-28 16:19:10.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:19:10.341304500Z] +25-03-28 16:19:10.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:10.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c5219fdf-7a68-4338-88f0-1f15bac91337 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:19:10.362 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a51072e4-17f8-4075-a1f0-0e30a54ad5fa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:10.362 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:10.362 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a51072e4-17f8-4075-a1f0-0e30a54ad5fa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:10.362 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:10.363 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:19:10.367 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:19:10.368 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:19:10.368 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:10.370 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:19:10.370 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0a3724ca-c9b3-42d2-acb9-bf345771763f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:10.380 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2c1c1f18-399f-4244-a218-2e4bbf63c28e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:10.380 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2c1c1f18-399f-4244-a218-2e4bbf63c28e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:13.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [75657976-9c12-48bc-8a16-f925301ed9b2 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:14.330 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:14.332 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:19:14.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:19:14.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:19:14.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:14.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:19:14.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e4639cd2-5dcc-46f7-837e-f46b9d979535 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:14.344 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [02a34f3b-ba4d-4de7-be30-850cd8201059 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:14.345 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [02a34f3b-ba4d-4de7-be30-850cd8201059 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:17.330 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [27e4830f-3a72-4f97-aec0-64efc106075b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:17.332 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:17.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [27e4830f-3a72-4f97-aec0-64efc106075b | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:19:17.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [27e4830f-3a72-4f97-aec0-64efc106075b | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:19:17.334 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:19:17.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:19:17.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:19:17.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:17.338 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:19:17.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5cd66db3-6237-45ca-88fb-18d3f47bed47 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:17.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b70d94a1-17c4-4f80-84fc-9b94238e1151 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:17.346 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b70d94a1-17c4-4f80-84fc-9b94238e1151 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:20.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:20.342 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:20.343 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:19:20.346 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:19:20.346 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:19:20.346 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:20.348 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:19:20.348 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [45a194f2-3736-4a5d-abe3-48d2bba0050f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:20.360 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [df39a042-afe4-4896-accd-b7f461e83659 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:20.360 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [df39a042-afe4-4896-accd-b7f461e83659 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:21.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [18614ef1-80ba-49dc-bd6d-2dd29a61629b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:23.333 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:23.334 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:19:23.337 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:19:23.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:19:23.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:23.339 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:19:23.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [09d9dc65-35ac-40aa-9573-670aeaf645df | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:23.347 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ec66e621-9cf3-4581-803d-a15373b1c642 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:23.348 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ec66e621-9cf3-4581-803d-a15373b1c642 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:25.349 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [10bb5796-3e90-419d-9810-f4369109c731 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:27.330 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:27.330 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:19:27.333 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:19:27.334 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:19:27.334 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:27.335 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:19:27.335 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7fbf13a4-8f87-4f59-b020-8311a6333670 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:19:27.343 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6585dc1b-9e21-4993-bae4-f46231fa4124 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:19:27.343 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6585dc1b-9e21-4993-bae4-f46231fa4124 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:19:29.333 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f8546bd3-9cc7-4db0-8f9a-8ea315a165dd | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:10.359 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ea227130-bc2c-4333-8ac7-3616adea5eb9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:10.359 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:10.360 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ea227130-bc2c-4333-8ac7-3616adea5eb9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:10.360 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:20:10.366 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:20:10.366 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:20:10.367 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:10.370 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:20:10.371 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [253ca8a0-8f02-42c2-b08f-540131abe8d0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:10.383 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [9a318cbb-9ccc-43e5-8d18-4859268e115b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:10.384 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [9a318cbb-9ccc-43e5-8d18-4859268e115b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:13.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c3227dc0-5fa2-4a3f-a8df-e3e319a662e7 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:14.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:14.334 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:20:14.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:20:14.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:20:14.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:14.337 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:20:14.337 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e57b36f0-d8bd-4551-86e5-356d467e18f3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:14.350 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8105d316-5260-4b08-86a7-d2f84a97cfba | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:14.351 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8105d316-5260-4b08-86a7-d2f84a97cfba | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:17.329 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5dda9ee9-81c6-489b-9082-328a4ecf0e1e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:17.330 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:17.331 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5dda9ee9-81c6-489b-9082-328a4ecf0e1e | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:20:17.331 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:20:17.332 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5dda9ee9-81c6-489b-9082-328a4ecf0e1e | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:20:17.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:20:17.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:20:17.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:17.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:20:17.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [08e1abe6-2022-460a-a0d7-d001298b5475 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:17.359 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3124283d-eb8c-457c-9c51-8191afa31684 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:17.359 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3124283d-eb8c-457c-9c51-8191afa31684 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:20.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:20.327 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:20.328 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:20:20.329 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:20:20.329 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:20:20.329 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:20.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:20:20.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [cf828808-8a81-45ef-a540-87a0b605fca7 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:20.338 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7e0c9d50-7e05-47a1-a7d8-485ee95cbe0e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:20.338 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7e0c9d50-7e05-47a1-a7d8-485ee95cbe0e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:21.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c46c7977-4420-47f3-a3bb-cc18ffb84fba | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:23.329 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:23.330 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:20:23.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:20:23.331 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:20:23.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:23.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:20:23.334 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6c1109bc-34d1-4cd5-bd9b-a8be18a028fd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:20:23.345 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [66ab5959-c834-4d3e-ab2b-841f1fa0bfa5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:20:23.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [66ab5959-c834-4d3e-ab2b-841f1fa0bfa5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:24.334 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:20:24.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:20:24.337 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:24.338 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:20:24.329Z +25-03-28 16:20:24.339 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:20:24.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:20:24.329Z] +25-03-28 16:20:24.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:20:24.338722500Z] +25-03-28 16:20:24.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:20:24.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [00e263f9-1ba6-4e24-88bc-3292fa1fc15d | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:20:25.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0463596f-a44b-4616-9aa1-70e3c8508ed5 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:10.347 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:10.348 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [25ac1c1b-569f-4298-a217-043c933552c3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:10.348 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [25ac1c1b-569f-4298-a217-043c933552c3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:10.349 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:21:10.353 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:21:10.353 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:21:10.353 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:10.355 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:21:10.355 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1e157081-936d-4e25-958f-edec1b3c74dd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:10.368 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0e454abb-d6a4-4a3b-9a28-28f54bece722 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:10.368 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0e454abb-d6a4-4a3b-9a28-28f54bece722 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:13.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [68992a0b-6de6-41da-b82a-7967235f0e10 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:14.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:14.337 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:21:14.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:21:14.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:21:14.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:14.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:21:14.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c47cc8a7-7764-4688-943e-1fa3f9b8a56e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:14.348 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3c5d8fe5-f489-42c2-9cbb-a4c72e98c872 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:14.348 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3c5d8fe5-f489-42c2-9cbb-a4c72e98c872 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:17.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [88002c1e-e501-4af4-bf22-c57b6fa87ec4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:17.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [88002c1e-e501-4af4-bf22-c57b6fa87ec4 | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:17.334 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:17.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [88002c1e-e501-4af4-bf22-c57b6fa87ec4 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:21:17.333732900Z] +25-03-28 16:21:17.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [88002c1e-e501-4af4-bf22-c57b6fa87ec4 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:21:17.336 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:21:17.337 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [88002c1e-e501-4af4-bf22-c57b6fa87ec4 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:21:17.337 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [88002c1e-e501-4af4-bf22-c57b6fa87ec4 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:21:17.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:21:17.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:21:17.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:17.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:21:17.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a85f1175-3c5e-47c5-89e9-b991dd98cf05 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:17.350 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b4395017-770e-44f7-8bbf-95684c809c73 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:17.350 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b4395017-770e-44f7-8bbf-95684c809c73 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:20.331 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:20.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:20.332 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:21:20.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:21:20.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:21:20.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:20.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:21:20.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ca5056c6-54e8-4292-b118-78c972c59948 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:20.343 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [9de1b05e-380f-4574-bac9-2056aca5d618 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:20.344 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [9de1b05e-380f-4574-bac9-2056aca5d618 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:21.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f5a08b0a-ea29-4e34-ad82-9b8c1a7db1ec | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:23.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:23.340 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:21:23.342 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:21:23.342 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:21:23.342 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:23.343 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:21:23.344 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9831576b-81c2-472e-abfc-58a46d897273 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:21:23.357 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [950500f7-7066-4db8-9f42-7238d7fdeb77 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:21:23.358 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [950500f7-7066-4db8-9f42-7238d7fdeb77 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:24.337 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:21:24.339 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:21:24.341 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:24.341 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:21:24.332Z +25-03-28 16:21:24.342 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:21:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:21:24.332Z] +25-03-28 16:21:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:21:24.342058Z] +25-03-28 16:21:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:21:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ec34fa33-ae6d-4739-abde-5d47ed776567 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:21:25.324 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bed3b5bd-5883-4522-8beb-f9b892f855d6 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:24.346 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:24.348 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:24.348 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:24.350 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b3650a1d-6a76-4a22-b9da-db7a6c4302ea | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:22:24.351 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:22:24.351 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:22:24.351 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:24.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:22:24.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:24.353 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:22:24.332Z +25-03-28 16:22:24.354 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:22:24.354 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [203fac4d-1c5e-4f02-ad2d-01db3b72344d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:24.355 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:22:24.355 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:22:24.332Z] +25-03-28 16:22:24.356 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:22:24.354099300Z] +25-03-28 16:22:24.356 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:24.356 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [59eeb5d4-3449-4468-a812-2b90fe4e3a69 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:22:24.375 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a2bf29b4-52ea-4c49-83f1-0e9bc0d40e46 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:24.375 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:24.375 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a2bf29b4-52ea-4c49-83f1-0e9bc0d40e46 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:24.375 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:24.377 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:24.380 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:22:24.380 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:22:24.383 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:24.387 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:22:24.387 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [74bbdf73-7a9b-45e2-bc51-f65f17cc25e4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:24.389 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3f3d9d88-01cf-478d-9f62-6b8887e6551d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:24.389 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3f3d9d88-01cf-478d-9f62-6b8887e6551d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:24.399 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d91176c5-cb05-4ce1-b8dc-e04296996969 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:24.399 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d91176c5-cb05-4ce1-b8dc-e04296996969 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:25.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2d6d4681-ced6-4566-b760-8b6369db1f7e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:28.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:28.327 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:28.329 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:22:28.329 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:22:28.329 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:28.330 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:22:28.330 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e01c4603-4c47-472f-944c-8a24234cdb0c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:28.342 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [3fd861a8-7e41-4e26-9afc-3339355383c5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:28.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3fd861a8-7e41-4e26-9afc-3339355383c5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:29.335 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f72958d4-abab-4cbe-bebd-94415a1cc411 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:31.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:31.340 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:31.343 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:22:31.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:22:31.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:31.345 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:22:31.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9b6fec22-6c6a-461a-82d3-455f1b96a570 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:31.355 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [ae32202c-adcc-4cd0-a920-e18b572c2c07 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:31.355 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [ae32202c-adcc-4cd0-a920-e18b572c2c07 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:33.327 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [43b23a32-0d87-4283-8cf8-2e5dcd5024b1 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:34.324 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:34.325 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:34.326 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:22:34.326 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:22:34.326 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:34.327 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:22:34.327 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [19ea77de-0c23-4531-9294-f06a7853b04d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:34.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f486b538-09cb-40e5-8976-fe50715549c6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:34.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f486b538-09cb-40e5-8976-fe50715549c6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:37.326 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0a9b3d30-ea08-4e61-aa92-b02cad01bd51 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:37.327 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0a9b3d30-ea08-4e61-aa92-b02cad01bd51 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:22:37.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:37.327 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:22:37.327 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0a9b3d30-ea08-4e61-aa92-b02cad01bd51 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:22:37.327 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0a9b3d30-ea08-4e61-aa92-b02cad01bd51 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:22:37.329 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:22:37.329 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:22:37.329 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:37.330 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:22:37.330 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6892dc38-80c3-4988-ac1e-fe8416bb24e4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:22:37.341 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [864afb0c-f9c5-4b05-bf30-2e47b9512483 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:22:37.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [864afb0c-f9c5-4b05-bf30-2e47b9512483 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:22:41.340 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [53332628-1009-4901-a6c3-a7a6dabbe687 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:24.327 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:24.327 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:23:24.327 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:24.327 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:24.327 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:23:24.323Z +25-03-28 16:23:24.329 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:23:24.329 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:23:24.323Z] +25-03-28 16:23:24.329 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:23:24.328707700Z] +25-03-28 16:23:24.329 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:24.329 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:24.329 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:24.329 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a85a8bdf-59ef-4757-90cd-5793b0aa1a7a | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:23:24.329 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:24.331 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:24.331 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2eaf5469-d0cc-4cc6-8e10-e6d6b87b5343 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:24.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:24.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:24.339 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:24.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [845c15b4-3a12-4a65-9508-580b2b70f0a2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:24.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [845c15b4-3a12-4a65-9508-580b2b70f0a2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:24.341 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:24.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:24.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:24.344 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:24.345 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1122cd02-6a31-4e73-b50f-e1b97d8d943b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:24.348 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [53a7f532-19cf-4cd1-8ace-1a33fb570cee | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:24.348 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [53a7f532-19cf-4cd1-8ace-1a33fb570cee | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:24.354 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a114116e-1950-4830-842a-2046c9a273bc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:24.354 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a114116e-1950-4830-842a-2046c9a273bc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:25.332 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d7614d43-3607-4e44-b1e5-8283c1a376bf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:28.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:28.340 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:28.341 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:28.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:28.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:28.342 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:28.342 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [728ca37e-f018-44b3-99b0-a53e1ff1d50d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:28.351 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [e024c5e5-3cca-4ce9-bc1e-94d07ef2cb56 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:28.352 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e024c5e5-3cca-4ce9-bc1e-94d07ef2cb56 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:29.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [575de455-d31a-4f62-a6a5-de41f37c3605 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:31.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:31.334 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:31.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:31.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:31.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:31.338 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:31.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6c25f9-cb6c-4c07-bf40-351f00b53ee2 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:31.348 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1f98abd7-229e-41e4-aa3d-ac13853793f8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:31.349 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1f98abd7-229e-41e4-aa3d-ac13853793f8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:33.336 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3b65ee7d-45cf-4eb4-a09e-1e279b90f65f | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:33.347 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:33.348 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:33.349 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:33.349 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:33.349 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:33.350 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:33.350 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [07d7a689-6173-413c-b2b0-dace3e55ad3c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:33.361 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [c524b493-612c-4e34-a4ff-6b67cb7e7caa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:33.361 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [c524b493-612c-4e34-a4ff-6b67cb7e7caa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:37.338 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:37.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:37.339 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:37.340 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ebd3b10e-1591-4570-8b32-eb7b6666f128 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:37.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:37.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:37.344 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:37.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a073f636-2678-43b7-a414-00dbf888da5d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:37.358 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6fe9c086-1906-433d-a3c7-2546d3b153c6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:37.359 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6fe9c086-1906-433d-a3c7-2546d3b153c6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:39.341 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:39.341 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:39.341 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:39.342 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:39.342 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:39.343 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:39.343 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:39.343 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c9eae8c7-1373-43bf-8a7b-e3ebd1cce69e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:39.351 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3aac4ab3-9503-4fb5-a79f-c4c203e38313 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:39.351 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3aac4ab3-9503-4fb5-a79f-c4c203e38313 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:40.327 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:40.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:23:40.331 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:40.332 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:23:40.321Z +25-03-28 16:23:40.335 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:23:40.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:23:40.321Z] +25-03-28 16:23:40.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:23:40.333363900Z] +25-03-28 16:23:40.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:40.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01bc9b8c-a797-4c52-b5fb-1500322308cd | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:23:40.718 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a4af6b9-4d73-4ca9-99ce-6d692d7e2e97 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:43.328 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:43.329 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:43.332 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:43.332 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:43.332 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:43.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:43.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [45842d13-fdeb-472d-bfff-e6818fcbbc7c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:43.348 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [dc116bd4-b7e9-45a8-ad59-1f8ecdbfa295 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:43.348 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [dc116bd4-b7e9-45a8-ad59-1f8ecdbfa295 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:44.328 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [355589f9-ee77-46f4-9965-a9a2a2065b96 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:46.326 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:46.326 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:46.327 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:46.328 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:46.328 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:46.329 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:46.329 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [694783cc-6ca1-47cb-9026-a976ab7014b3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:46.341 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1c4fd6c9-9dd9-4113-a4c5-1501de830627 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:46.342 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1c4fd6c9-9dd9-4113-a4c5-1501de830627 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:48.340 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [5c4c4a9d-7aed-418c-afab-dc1be9df8782 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:49.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:49.336 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:49.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:49.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:49.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:49.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:49.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3b4ede48-02d6-41dc-8f18-0b8e6ad9081e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:49.353 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9d72c1ec-8be0-4b03-b2b4-73f01cc51f8e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:49.353 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9d72c1ec-8be0-4b03-b2b4-73f01cc51f8e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:51.353 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:51.353 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:51.354 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:51.357 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:51.357 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:51.357 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:51.358 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:51.358 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2fd563-6331-45bc-a74d-71b34eee5f41 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:51.368 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5738c96a-a49a-4a41-82bd-d267f50e0e3f | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:51.368 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5738c96a-a49a-4a41-82bd-d267f50e0e3f | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:23:51.368 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [41f37a26-d207-489c-9f79-b9c6c347b325 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:51.369 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5738c96a-a49a-4a41-82bd-d267f50e0e3f | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:23:51.369 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5738c96a-a49a-4a41-82bd-d267f50e0e3f | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:23:55.335 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:55.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:55.335 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:55.336 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [78c69229-a809-42f7-953a-c4a88cbc2d33 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:55.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:55.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:55.338 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [78c69229-a809-42f7-953a-c4a88cbc2d33 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:23:55.338 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [78c69229-a809-42f7-953a-c4a88cbc2d33 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:23:55.338 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:55.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d29c680c-deb3-4af9-87bb-1e9a1bc9e028 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:55.352 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [293b5c10-d57b-4529-a47c-5a8f13ba2133 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:55.353 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [293b5c10-d57b-4529-a47c-5a8f13ba2133 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:58.338 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:58.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:58.339 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:23:58.341 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:23:58.341 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:23:58.341 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:58.342 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:23:58.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6632da36-6a29-45e7-ac81-0261d9f5164d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:23:58.355 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8e519f40-66ed-4be0-b9d8-ab6e00129750 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:23:58.356 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8e519f40-66ed-4be0-b9d8-ab6e00129750 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:23:59.324 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [49fbafff-6100-4d3f-a1f3-5ca48a386adb | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:01.331 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:01.332 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:01.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:01.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:01.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:01.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:01.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [893a1998-c5d7-4dcc-bf23-130af62a7f8b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:01.345 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ce991c92-009a-4370-861c-363926bf0494 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:01.345 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ce991c92-009a-4370-861c-363926bf0494 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:03.339 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [20f9580b-f2d0-4222-86c3-2e548a7f47ae | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:04.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:04.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:04.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:04.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:04.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:04.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:04.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2154f6a9-ae25-4a76-81d5-01c0eb78e1a9 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:04.344 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bbe07bad-a745-4362-8d8f-ea5b3155278a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:04.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bbe07bad-a745-4362-8d8f-ea5b3155278a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:07.340 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [11155f6d-bc87-41e8-8e63-62983e560570 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:07.340 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fa9d65e3-96c5-4947-85af-f5c003fdb0a0 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:07.344 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [11155f6d-bc87-41e8-8e63-62983e560570 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:07.344 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [11155f6d-bc87-41e8-8e63-62983e560570 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:07.347 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [11155f6d-bc87-41e8-8e63-62983e560570 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:07.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [11155f6d-bc87-41e8-8e63-62983e560570 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:07.361 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [3b2b9247-d587-4219-8c27-2d4ec631adb5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:07.362 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3b2b9247-d587-4219-8c27-2d4ec631adb5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:10.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:24:10.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:10.333 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.334 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:10.334 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:24:10.325Z +25-03-28 16:24:10.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [aeb64408-7861-4b4f-b3f8-b1a6b89e8e20 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:24:10.335 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:24:10.335 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:10.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:24:10.325Z] +25-03-28 16:24:10.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:10.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:10.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:24:10.334567900Z] +25-03-28 16:24:10.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55ad25e0-dcd7-47fd-9ce1-94b27f63b6b2 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:24:10.337 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:10.337 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cd0d9d43-67b6-47c2-ae77-f04a2614fa8f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:10.347 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:10.347 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.347 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:10.348 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [3b310c9a-8dbb-43e5-81ca-91e0f977f759 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:10.348 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3b310c9a-8dbb-43e5-81ca-91e0f977f759 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.349 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:10.349 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:10.349 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:10.350 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:10.350 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [71049ac9-d1c2-46b0-b2a6-63ffb69a284c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:10.353 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c54fdf34-2db8-4f04-9a15-e61d8f514779 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:10.354 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c54fdf34-2db8-4f04-9a15-e61d8f514779 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:10.359 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d157570e-622b-4447-95a4-f2beb60f2c55 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:10.359 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d157570e-622b-4447-95a4-f2beb60f2c55 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:11.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a38168db-4625-4b34-be18-0d8fb6ddf0ce | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:14.331 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:14.332 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:14.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:14.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:14.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:14.337 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:14.337 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [996f9d09-296c-4d93-8ce1-10e0bb4e5c63 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:14.348 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9e96fd0b-2988-4296-a82d-430c80d866d5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:14.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9e96fd0b-2988-4296-a82d-430c80d866d5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:15.341 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c463cf7e-9861-4612-b711-52e4bd21ba94 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:17.338 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:17.339 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:17.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:17.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:17.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:17.340 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:17.340 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1aac9988-ca8e-43f7-9cd1-756e1eec6c69 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:17.348 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6c1c05e9-603c-4244-952e-3b375b488da6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:17.348 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6c1c05e9-603c-4244-952e-3b375b488da6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:19.340 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [7aa1303a-28e5-46da-88e8-97c436a3b126 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:20.340 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:20.341 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:20.343 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:20.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:20.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:20.344 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:20.344 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f3de5521-be88-4cce-800c-31ea232b4501 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:20.356 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9bbbcd60-e94e-4204-96cd-f3ad9cd90335 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:20.358 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9bbbcd60-e94e-4204-96cd-f3ad9cd90335 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:23.331 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:23.331 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:23.332 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:23.333 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [9f6d5177-2f4d-4436-8f25-2f131f98b78b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:23.334 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:23.334 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:23.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [9f6d5177-2f4d-4436-8f25-2f131f98b78b | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:24:23.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [9f6d5177-2f4d-4436-8f25-2f131f98b78b | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:24:23.335 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:23.335 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1a329ba8-50be-44b2-acd2-9a765b9a87c0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:23.350 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c137f1eb-58df-42b3-baeb-9663d4e7510e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:23.350 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c137f1eb-58df-42b3-baeb-9663d4e7510e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:26.325 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:26.325 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:26.326 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:26.327 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:26.327 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:26.327 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:26.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:26.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b1d9f3f4-a1a6-432b-b0fd-75858ccd0337 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:26.338 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8eeea2b8-760e-42a6-9c9b-72723670e597 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:26.339 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8eeea2b8-760e-42a6-9c9b-72723670e597 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:27.335 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [663dc251-f82d-499b-849d-11bb1ad297ee | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:29.325 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:29.325 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:29.327 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:29.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:29.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:29.328 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:29.328 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [69cc11d6-147c-4f51-883b-3c1300e1105c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:29.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [06a13bf2-1b78-4c2d-bf44-e7013b0dd21f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:29.338 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [06a13bf2-1b78-4c2d-bf44-e7013b0dd21f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:31.339 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [29e0908e-1802-4baf-8474-e223f59d9910 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:32.338 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:32.339 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:32.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:32.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:32.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:32.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:32.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d2f411a-542b-4b0b-9e77-7380a2db988b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:32.349 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ed19b7f0-3dc3-42dc-9882-907a5557aa1f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:32.349 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ed19b7f0-3dc3-42dc-9882-907a5557aa1f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:35.331 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:35.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:35.333 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:35.333 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [57bfac8d-4968-42d0-b0c9-322afcac684a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:35.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:35.335 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [57bfac8d-4968-42d0-b0c9-322afcac684a | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:24:35.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:35.335 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [57bfac8d-4968-42d0-b0c9-322afcac684a | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:24:35.336 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:35.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [dff11bb4-e775-4d2a-83e1-053553644484 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:35.347 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [eabdfb79-c6b6-45ff-b235-045ca435a275 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:35.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [eabdfb79-c6b6-45ff-b235-045ca435a275 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:38.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:38.333 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:38.334 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:38.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:38.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:38.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:38.337 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:38.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f02aafb2-5162-40c5-85c6-288bf865fce4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:38.346 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [f14278e6-0084-441d-894d-b0febde80cc0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:38.346 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [f14278e6-0084-441d-894d-b0febde80cc0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:39.339 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [3e60e55a-2b93-41a7-b1e1-3f3d107c28c0 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:24:40.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:40.340 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:24:40.330Z +25-03-28 16:24:40.342 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:24:40.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:24:40.330Z] +25-03-28 16:24:40.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:24:40.341347200Z] +25-03-28 16:24:40.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:40.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [dd05981b-82b0-4d5a-8478-e6087c68da54 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:24:41.329 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:41.329 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:41.330 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:41.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:41.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:41.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:41.335 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:41.335 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [172c5a46-06ad-40f8-9b56-aa861da371a3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:41.349 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b8462cf7-b65e-4908-9607-9ce29379c1a7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:41.349 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [b8462cf7-b65e-4908-9607-9ce29379c1a7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:43.325 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c52a9acb-02d1-496b-89b6-f5330ac542b2 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:44.332 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:44.333 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:44.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:44.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:44.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:44.336 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:44.337 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [da141339-5e33-450d-af90-c6c24a92b3d5 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:44.345 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e901bbfa-486e-41a8-b342-eb73d64254de | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:44.345 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e901bbfa-486e-41a8-b342-eb73d64254de | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:47.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1ab55d19-bbc6-44f2-9b53-dfba6d8d7890 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:47.332 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [68d1855e-5f7a-4729-b598-63a1da2ad491 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:47.335 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1ab55d19-bbc6-44f2-9b53-dfba6d8d7890 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:47.335 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1ab55d19-bbc6-44f2-9b53-dfba6d8d7890 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:47.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1ab55d19-bbc6-44f2-9b53-dfba6d8d7890 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:47.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1ab55d19-bbc6-44f2-9b53-dfba6d8d7890 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:47.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b4b41a10-7a90-4ce4-aef5-c810feb87e9b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:47.346 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b4b41a10-7a90-4ce4-aef5-c810feb87e9b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:50.325 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:50.325 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:50.326 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:24:50.327 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:24:50.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:24:50.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:50.327 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:24:50.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [34a856c9-7621-45cb-a74f-6ff406bf8042 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:24:50.336 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f0dbb65b-c91d-4144-a498-7871bda37fff | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:24:50.336 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f0dbb65b-c91d-4144-a498-7871bda37fff | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:24:51.334 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bde4cc1f-64d7-44dc-abe1-b0092ab7d8ca | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:24.332 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:25:24.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:24.332 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:24.333 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:25:24.333 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:25:24.324Z +25-03-28 16:25:24.333 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [bd4d3fec-b0a2-43e1-8dcd-1b06199f051b | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:25:24.335 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:25:24.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:25:24.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:24.335 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:25:24.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:25:24.324Z] +25-03-28 16:25:24.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:25:24.333183900Z] +25-03-28 16:25:24.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:25:24.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:24.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d69cc057-aeb8-45ee-9a19-bdfdc4c60fb5 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:24.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e080485e-0ad5-419e-a4c2-618976e78872 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:25:24.351 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:24.351 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bd12ebc9-2b04-4a6f-9e66-53690e158dca | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:24.351 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:24.351 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bd12ebc9-2b04-4a6f-9e66-53690e158dca | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:24.351 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:25:24.353 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:25:24.353 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:25:24.353 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:24.355 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:25:24.355 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a96e7751-08ee-44df-890d-c961b8cdefdf | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:24.359 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [fa828804-b261-435c-b5d5-ab0555c2cd38 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:24.359 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [fa828804-b261-435c-b5d5-ab0555c2cd38 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:24.365 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [07d5c593-7799-44f7-b567-a608d11deadd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:24.365 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [07d5c593-7799-44f7-b567-a608d11deadd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:27.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b2891771-ff1e-40e4-9882-294d237a11ba | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:28.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:28.328 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:25:28.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:25:28.331 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:25:28.331 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:28.332 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:25:28.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a15a7de3-bde3-4077-9c45-d5ae80e737c4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:28.349 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [0a424c96-6499-494c-b62a-b55908579a8d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:28.349 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [0a424c96-6499-494c-b62a-b55908579a8d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:31.330 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [bdfd58f6-88c5-4697-9755-681a45fbc983 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:31.331 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bdfd58f6-88c5-4697-9755-681a45fbc983 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:25:31.331 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:31.331 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:25:31.332 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [bdfd58f6-88c5-4697-9755-681a45fbc983 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:25:31.332 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bdfd58f6-88c5-4697-9755-681a45fbc983 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:25:31.332 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:25:31.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:25:31.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:31.332 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:25:31.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [547bacb7-579b-42fb-a7b9-cedc7a2c4bc4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:31.347 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [50af9ee2-7a4e-414e-97ac-e831559e9bf2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:31.347 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [50af9ee2-7a4e-414e-97ac-e831559e9bf2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:34.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:34.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:34.339 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:25:34.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:25:34.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:25:34.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:34.341 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:25:34.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [342237ab-a0ab-40a0-9689-0753f47e9dc1 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:34.350 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [459288b0-3d91-4e2c-be89-370bb95799da | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:34.350 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [459288b0-3d91-4e2c-be89-370bb95799da | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:35.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d9e5b799-7c6e-45e4-9eeb-ecb57b511c58 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:37.341 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:37.342 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:25:37.343 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:25:37.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:25:37.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:37.344 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:25:37.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [475a9faa-a779-43dc-b686-8c8933282fc7 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:25:37.352 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [38edade9-271e-4f88-86bf-5b8a36be7c66 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:25:37.352 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [38edade9-271e-4f88-86bf-5b8a36be7c66 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:25:39.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bc86c0f4-dbdc-419b-a723-7e4295ceddab | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:24.327 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:24.327 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:26:24.327 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:26:24.327 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:24.328 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:26:24.323Z +25-03-28 16:26:24.328 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:26:24.328 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:26:24.328 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:24.329 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:26:24.329 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:26:24.323Z] +25-03-28 16:26:24.329 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:26:24.328966200Z] +25-03-28 16:26:24.329 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:24.329 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4587083e-b478-489a-a38f-7e177e040c6b | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:26:24.329 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:26:24.329 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d55c359d-3696-4884-a71d-3dfe62d45541 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:24.340 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [53822286-f932-4fb2-92e3-f15f25f51d22 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:24.340 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [53822286-f932-4fb2-92e3-f15f25f51d22 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:24.340 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:24.341 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:24.342 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:26:24.344 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:26:24.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:26:24.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:24.345 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:26:24.345 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2f3b919f-7c59-4323-b8d6-0af270c99788 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:24.347 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3acc5e02-fc6e-49ed-8a9d-0a856822cad4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:24.347 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3acc5e02-fc6e-49ed-8a9d-0a856822cad4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:24.356 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b0f4921d-477b-4853-8a95-d583dcd5f815 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:24.356 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0f4921d-477b-4853-8a95-d583dcd5f815 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:27.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [90d7aff9-532d-4efc-b476-4e885cd71966 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:28.323 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:28.324 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:26:28.325 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:26:28.325 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:26:28.325 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:28.326 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:26:28.326 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b026332f-26b9-4238-b2ff-dfed8ee98950 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:28.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [04569b94-5bc0-4a75-9cde-6e976e60a41e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:28.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [04569b94-5bc0-4a75-9cde-6e976e60a41e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:31.335 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c240bc35-7721-45f4-a91c-a4202afbca27 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:31.335 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c240bc35-7721-45f4-a91c-a4202afbca27 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:26:31.335781800Z] +25-03-28 16:26:31.335 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:31.335 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c240bc35-7721-45f4-a91c-a4202afbca27 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:26:31.336 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:26:31.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c240bc35-7721-45f4-a91c-a4202afbca27 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:26:31.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c240bc35-7721-45f4-a91c-a4202afbca27 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:26:31.337 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:26:31.337 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:26:31.337 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:31.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:26:31.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [51cddb5a-53a9-4779-be38-0c89307b4a02 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:31.350 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [eec5874f-5fc6-4cde-8e26-640213377e2d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:31.351 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [eec5874f-5fc6-4cde-8e26-640213377e2d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:34.326 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:34.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:34.327 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:26:34.328 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:26:34.328 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:26:34.328 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:34.329 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:26:34.330 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [39030a9a-3f6f-43e1-8aed-af080da38ee7 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:34.337 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a28307cd-9f85-42c2-ae6f-f015ba526659 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:34.338 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a28307cd-9f85-42c2-ae6f-f015ba526659 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:35.334 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [fb3e1378-2d19-439a-83ba-dd95f56f96c0 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:37.330 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:37.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:26:37.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:26:37.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:26:37.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:37.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:26:37.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8a67db9b-cd7a-441c-b1ef-68dbc3d85ae3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:26:37.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [497fcd28-8174-44b2-8c7c-9b70f53aaa96 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:26:37.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [497fcd28-8174-44b2-8c7c-9b70f53aaa96 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:26:39.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ddd518f9-3e26-4533-b1bb-5387aea65499 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:02.467 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:02.468 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:27:02.468 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:27:02.468 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:02.469 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:02.469 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:02.469 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:02.469 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:27:02.454Z +25-03-28 16:27:02.469 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:02.469 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0fc56b37-d590-4bd3-b305-760017f053d3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:02.470 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:27:02.470 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:02.454Z] +25-03-28 16:27:02.470 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:02.469276800Z] +25-03-28 16:27:02.470 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:02.470 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5989f36d-1ba3-48ac-ac35-cf02fe1e43ca | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:27:02.476 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4c3a2256-57c0-4f3e-91bc-5e2d846f248a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:02.484 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2654b61a-1d21-461f-b500-0d75ea095c78 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:03.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:03.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:03.342 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - [채널 조회 성공] id: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:27:03.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:03.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:03.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - binding parameter (2:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:03.346 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:03.346 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [34125536-f4e9-4211-8257-5747dba29378 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:03.352 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0a3afd9d-5cfa-4446-9ccc-6a9e3f1d58ab | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:03.354 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0a3afd9d-5cfa-4446-9ccc-6a9e3f1d58ab | GET | /api/readStatuses] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:04.877 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14 +25-03-28 16:27:04.879 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:27:04.879 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:04.879 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 3f23b8de-4bb4-468b-8c26-bde0c825cf14, newLastActiveAt: 2025-03-28T07:27:04.870Z +25-03-28 16:27:04.880 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:27:04.881 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:04.870Z] +25-03-28 16:27:04.881 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:04.880190800Z] +25-03-28 16:27:04.881 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (3:UUID) <- [3f23b8de-4bb4-468b-8c26-bde0c825cf14] +25-03-28 16:27:04.881 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c5af7412-8543-4838-bd97-79032c27f054 | PATCH | /api/users/3f23b8de-4bb4-468b-8c26-bde0c825cf14/userStatus] - binding parameter (4:UUID) <- [47a45de8-016e-401d-9e3f-97c74ba93aff] +25-03-28 16:27:20.411 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - [회원 생성 요청] username: woody, email: woody@naver.com +25-03-28 16:27:20.413 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 16:27:20.413 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (1:VARCHAR) <- [woody@naver.com] +25-03-28 16:27:20.413 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 16:27:20.414 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 16:27:20.414 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (1:VARCHAR) <- [woody] +25-03-28 16:27:20.414 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-28 16:27:20.414 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - [프로필 이미지 업로드] 파일명: woody.jpeg, 타입: image/jpeg, 크기: 9296 bytes +25-03-28 16:27:20.418 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - [회원 생성 완료] username: woody, id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:20.419 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-28 16:27:20.419 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/jpeg] +25-03-28 16:27:20.420 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.415674900Z] +25-03-28 16:27:20.420 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (3:VARCHAR) <- [woody.jpeg] +25-03-28 16:27:20.420 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (4:BIGINT) <- [9296] +25-03-28 16:27:20.420 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (5:UUID) <- [a838eb67-048c-4cc3-996c-f181d129e334] +25-03-28 16:27:20.420 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 16:27:20.420 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.418192600Z] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (2:VARCHAR) <- [woody@naver.com] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (4:UUID) <- [a838eb67-048c-4cc3-996c-f181d129e334] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.418192600Z] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (6:VARCHAR) <- [woody] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (7:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.421 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 16:27:20.422 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.418192600Z] +25-03-28 16:27:20.422 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.417184300Z] +25-03-28 16:27:20.422 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.418192600Z] +25-03-28 16:27:20.422 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (4:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.422 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d35a7808-b745-4d48-921c-2a62db80306a | POST | /api/users] - binding parameter (5:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:27:20.430 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:20.430 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:20.431 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:27:20.431 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:27:20.431 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.431 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.432 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:27:20.427Z +25-03-28 16:27:20.432 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:27:20.427Z +25-03-28 16:27:20.433 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:27:20.433 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:27:20.433 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.427Z] +25-03-28 16:27:20.433 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.427Z] +25-03-28 16:27:20.433 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.432240500Z] +25-03-28 16:27:20.433 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:20.432240500Z] +25-03-28 16:27:20.433 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.433 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.433 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2fee041-5721-45e7-8ed6-124368f2db2e | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:27:20.433 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e7ac6462-61e6-4dbe-9224-18d3ac434eb0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:27:20.471 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [dfc92a29-d3ef-4e94-bc22-fa893dd5a90d | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:27:20.482 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3a91ba9f-362c-43d3-94a3-ed8581786396 | GET | /api/binaryContents/a838eb67-048c-4cc3-996c-f181d129e334] - [파일 조회] id: a838eb67-048c-4cc3-996c-f181d129e334 +25-03-28 16:27:20.483 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [3a91ba9f-362c-43d3-94a3-ed8581786396 | GET | /api/binaryContents/a838eb67-048c-4cc3-996c-f181d129e334] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-28 16:27:20.484 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3a91ba9f-362c-43d3-94a3-ed8581786396 | GET | /api/binaryContents/a838eb67-048c-4cc3-996c-f181d129e334] - binding parameter (1:UUID) <- [a838eb67-048c-4cc3-996c-f181d129e334] +25-03-28 16:27:20.484 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [0a82d5b9-0c18-4854-a0d9-20788972df70 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:20.484 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [211fa30c-f19b-406c-a2d0-bc2abcb6630b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:20.484 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0a82d5b9-0c18-4854-a0d9-20788972df70 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.484 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [211fa30c-f19b-406c-a2d0-bc2abcb6630b | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.484 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [211fa30c-f19b-406c-a2d0-bc2abcb6630b | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:20.485 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4437acbd-daea-47ef-83a2-dfd775bcb0ac | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:27:20.486 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [211fa30c-f19b-406c-a2d0-bc2abcb6630b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:20.486 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a442b170-c025-4647-85a8-396062793559 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:20.495 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.495 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:20.496 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0f47c63f-00a6-46e6-9ed6-16ae19121477 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:27:20.496 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [42de5d95-3b96-427c-b6b2-6a7c3f418a27 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:20.496 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [42de5d95-3b96-427c-b6b2-6a7c3f418a27 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.496 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:20.496 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:20.496 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:20.498 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:20.498 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [917a472c-c8aa-4a85-b230-749e75eff68f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:20.502 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ec7b68b5-2d45-41d5-a09e-60184cdc09d6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:20.502 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ec7b68b5-2d45-41d5-a09e-60184cdc09d6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.507 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [42114553-9a97-408a-98c7-513e2af87efb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:20.507 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [42114553-9a97-408a-98c7-513e2af87efb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:20.958 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3242032b-6b44-43eb-a22f-5a93c49bd48d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:23.501 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:23.501 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:23.502 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:23.502 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:23.502 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:23.502 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:23.502 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [82fd5273-7182-4144-bd41-93b188a10bc7 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:23.508 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [66a1f11f-94e9-4b09-8b16-eb5e6da0a8b2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:23.508 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [66a1f11f-94e9-4b09-8b16-eb5e6da0a8b2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:24.222 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [6541fb6b-3d9b-4395-9e8b-855762b2214f | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:26.514 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:26.515 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:26.517 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:26.517 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:26.517 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:26.518 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:26.518 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b92657e1-56d7-49e7-adbe-a1df34c6ad76 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:26.523 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d48613fe-83ca-4e66-a666-6b1ce2729335 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:26.526 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a47f8005-1c69-45b2-8e9d-7f0d61f28758 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:29.502 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:29.502 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:29.503 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:29.504 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:29.504 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:29.505 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:29.506 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:29.506 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf0c0af7-b7c9-4c16-bee3-45f7f19539a8 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:29.514 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [50139702-351a-47a2-807b-a7254fa11ebc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:29.515 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [50139702-351a-47a2-807b-a7254fa11ebc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:29.546 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [ad3425c1-b71d-479a-92e1-46e6c62f6953 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:33.343 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09b2e529-cab8-4b78-bd48-5e5670ef99a3 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:33.343 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [09b2e529-cab8-4b78-bd48-5e5670ef99a3 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:33.346 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b25a718a-0793-4e6b-8b2b-180c45d0ea40 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:33.346 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b25a718a-0793-4e6b-8b2b-180c45d0ea40 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:33.345051400Z] +25-03-28 16:27:33.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b25a718a-0793-4e6b-8b2b-180c45d0ea40 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:27:33.347 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09b2e529-cab8-4b78-bd48-5e5670ef99a3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:33.347 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09b2e529-cab8-4b78-bd48-5e5670ef99a3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:33.348 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b25a718a-0793-4e6b-8b2b-180c45d0ea40 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:27:33.348 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [09b2e529-cab8-4b78-bd48-5e5670ef99a3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:33.348 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b25a718a-0793-4e6b-8b2b-180c45d0ea40 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:27:33.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09b2e529-cab8-4b78-bd48-5e5670ef99a3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:33.368 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [65aac388-9084-4e4d-b361-a7d00eaeb020 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:33.368 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [65aac388-9084-4e4d-b361-a7d00eaeb020 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:36.337 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:36.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:36.337 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:36.338 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:36.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:36.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:36.339 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:36.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [22d6b3e0-b725-4780-a355-f5c842587820 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:36.348 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [79e21702-3bcb-46f9-a576-9153cfbb9dc3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:36.348 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [79e21702-3bcb-46f9-a576-9153cfbb9dc3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:37.329 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5e8fca72-0f9b-4823-8f45-f01a592f6c1b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:39.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:39.337 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:39.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:39.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:39.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:39.340 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:39.341 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [47e78ed2-884a-49b9-a36f-f77192c00d13 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:39.348 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f38b584e-03d6-49a3-b82e-c1e8122d9d66 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:39.348 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f38b584e-03d6-49a3-b82e-c1e8122d9d66 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:41.331 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [93cbb104-654f-4931-86e2-bf9bc0117d01 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:42.330 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:42.330 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:42.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:42.331 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:42.331 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:42.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:42.331 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [541c76ef-ca77-4e79-86de-92dae378ede2 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:42.337 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8198d36c-9499-4aed-bae1-6d00214596fa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:42.338 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8198d36c-9499-4aed-bae1-6d00214596fa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:45.333 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b5f90d30-dfb8-45fc-855b-8b4ea3519739 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:45.333 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b5f90d30-dfb8-45fc-855b-8b4ea3519739 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:45.333109400Z] +25-03-28 16:27:45.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:45.333 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b5f90d30-dfb8-45fc-855b-8b4ea3519739 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:27:45.334 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:45.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:45.334 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b5f90d30-dfb8-45fc-855b-8b4ea3519739 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:27:45.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:45.334 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b5f90d30-dfb8-45fc-855b-8b4ea3519739 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:27:45.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:45.335 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:45.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2fa9a273-4c60-4b73-ae15-62e9dbfa88b4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:45.346 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c68bee6e-74cd-441c-b3f5-4f7c5c420205 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:45.346 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c68bee6e-74cd-441c-b3f5-4f7c5c420205 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:48.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:48.332 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:48.332 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:48.334 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:48.334 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:48.334 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:48.334 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:48.335 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [113cdaa8-dce8-469b-a242-3069ed50c4ed | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:48.345 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c70519fd-de56-4667-84d7-22fc89689afa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:48.346 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c70519fd-de56-4667-84d7-22fc89689afa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:49.341 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c40a74a6-531a-4dd1-bad2-759f0853b53e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:27:51.330 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:51.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:51.331 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:51.331 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:27:51.325Z +25-03-28 16:27:51.331 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:51.332 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:27:51.332 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:51.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:51.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:27:51.325Z] +25-03-28 16:27:51.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:51.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:27:51.331192900Z] +25-03-28 16:27:51.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:51.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [db3b8524-e75c-42b1-8958-e6b5d78f8e4c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:27:51.333 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:51.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [97d86273-140f-403a-b16f-a007cbd83a7f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:51.340 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [16d4faa0-41e7-4acd-a358-6f403db7ab68 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:51.340 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [16d4faa0-41e7-4acd-a358-6f403db7ab68 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:53.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [82329f1c-79ce-4098-ae03-4e1d3ef4aea5 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:54.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:54.334 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:54.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:54.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:54.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:54.338 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:54.339 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fa206907-6a7c-47b1-b784-f96f51cf8d6c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:54.348 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2ee2d02a-91f0-411b-aeda-6523936e61ac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:54.348 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2ee2d02a-91f0-411b-aeda-6523936e61ac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:57.331 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [eb9cbed5-be96-42b4-8b63-d3cc8ecc9cec | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:57.332 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:27:57.332 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:27:57.332 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [eb9cbed5-be96-42b4-8b63-d3cc8ecc9cec | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:27:57.332 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [eb9cbed5-be96-42b4-8b63-d3cc8ecc9cec | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:27:57.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:27:57.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:27:57.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:27:57.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:27:57.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [79242169-6cba-49c1-83aa-9e432149944d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:27:57.342 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [03dff9bd-eb84-4931-a0ce-c7503d816a90 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:27:57.342 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [03dff9bd-eb84-4931-a0ce-c7503d816a90 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:00.330 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:00.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:00.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:00.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:00.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:00.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:00.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:00.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bbe732a0-83d3-4f0a-99f9-1ead5fad9f97 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:00.345 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [3dffe3d3-17b7-48d1-9ca0-e8869f3be23a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:00.345 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3dffe3d3-17b7-48d1-9ca0-e8869f3be23a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:01.330 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [75f33e9d-e058-4cca-b4bd-1e2cfdb0c756 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:03.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:03.337 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:03.338 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:03.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:03.338 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:03.339 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:03.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [eeb67bb2-c9a8-41d7-b024-ac6229df9903 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:03.350 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ef9b37a8-fedd-418d-9996-9a6a052971d3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:03.350 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ef9b37a8-fedd-418d-9996-9a6a052971d3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:05.339 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [34fbb728-c53a-4440-a648-c902b30843bf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:06.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:06.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:06.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:06.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:06.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:06.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:06.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [931bc53f-5289-403c-9825-5829e6452dc0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:06.341 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [509c05f4-2a15-4dd4-922c-ff550080e5d9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:06.341 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [509c05f4-2a15-4dd4-922c-ff550080e5d9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:09.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c0f3dfbd-1b98-4cf3-9848-1eef5fd33b0e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:09.333 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:09.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0f3dfbd-1b98-4cf3-9848-1eef5fd33b0e | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:09.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0f3dfbd-1b98-4cf3-9848-1eef5fd33b0e | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:28:09.333069400Z] +25-03-28 16:28:09.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0f3dfbd-1b98-4cf3-9848-1eef5fd33b0e | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:28:09.333 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:09.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c0f3dfbd-1b98-4cf3-9848-1eef5fd33b0e | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:28:09.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0f3dfbd-1b98-4cf3-9848-1eef5fd33b0e | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:28:09.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:09.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:09.335 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:09.336 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:09.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2ff7632c-9b11-4e90-918c-007ec3cdf60e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:09.344 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1ac4811e-7bb4-4ffa-ad4d-ad270e3b9508 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:09.344 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1ac4811e-7bb4-4ffa-ad4d-ad270e3b9508 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:12.329 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:12.329 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:12.329 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:12.330 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:12.330 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:12.330 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:12.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:12.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e338144c-61d1-43ef-9b89-1d5c17b82cc6 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:12.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3b4287c9-9eb7-45af-b8b4-5339ff7576a9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:12.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3b4287c9-9eb7-45af-b8b4-5339ff7576a9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:13.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef5cd338-40c1-429b-8bf0-0aaaccc0dac5 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:15.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:15.340 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:15.341 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:15.341 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:15.341 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:15.341 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:15.342 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [9054e2fb-b889-45d5-9f3f-29143b09ee63 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:15.364 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [93db18a8-5242-494c-949a-ddd6a524a01d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:15.364 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [93db18a8-5242-494c-949a-ddd6a524a01d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:17.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [d9370257-25e6-4150-9b92-e6b7b42832ae | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:18.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:18.337 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:18.339 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:18.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:18.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:18.339 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:18.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [90e935b5-c36c-4229-8953-b843c786d080 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:18.347 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [2ac10db8-6b68-404a-a2a3-6978fefb3211 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:18.347 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [2ac10db8-6b68-404a-a2a3-6978fefb3211 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.332 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:21.332 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [76c31e33-c04c-4fea-aca4-9b3d6fbe5780 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:28:21.334 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.334 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [76c31e33-c04c-4fea-aca4-9b3d6fbe5780 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:28:21.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [76c31e33-c04c-4fea-aca4-9b3d6fbe5780 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:28:21.334 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:28:21.324Z +25-03-28 16:28:21.336 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:21.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.336 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:28:21.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:28:21.324Z] +25-03-28 16:28:21.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:28:21.335399700Z] +25-03-28 16:28:21.337 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:21.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0a041468-a96d-4b72-ab29-b0df91fac270 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:28:21.338 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:21.338 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:21.338 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:21.339 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:21.340 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b1c09117-3d27-4a87-8889-0640cfd674e4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:21.347 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:21.347 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f7020ca8-085b-4912-943b-3c0d34356aad | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:21.348 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.348 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f7020ca8-085b-4912-943b-3c0d34356aad | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.348 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:21.349 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:21.350 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:21.350 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:21.351 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:21.352 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c92cbd88-9c05-492d-b307-079d11f35359 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:21.353 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [19a52dc4-ec96-46e7-8a00-f9c0b23f0e5c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:21.353 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [19a52dc4-ec96-46e7-8a00-f9c0b23f0e5c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:21.360 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1fb2522f-bb85-424b-b64a-658391fe34ca | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:21.360 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1fb2522f-bb85-424b-b64a-658391fe34ca | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:25.327 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a20f4ee-3513-4503-9f08-363fd2930584 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:25.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a20f4ee-3513-4503-9f08-363fd2930584 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:25.327 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2a14b7f4-b34f-491d-a034-c8618ff01517 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:25.329 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a20f4ee-3513-4503-9f08-363fd2930584 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:25.329 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a20f4ee-3513-4503-9f08-363fd2930584 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:25.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a20f4ee-3513-4503-9f08-363fd2930584 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:25.331 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a20f4ee-3513-4503-9f08-363fd2930584 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:25.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b3280eed-4e41-4ddd-baec-579b0d60b07f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:25.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b3280eed-4e41-4ddd-baec-579b0d60b07f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:28.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:28.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:28.337 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:28.338 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:28.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:28.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:28.339 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:28.339 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a1426d56-9801-4ba3-98d3-de7e43a7809f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:28.353 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4612a082-2188-4e4b-8742-b4585221ac9c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:28.353 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4612a082-2188-4e4b-8742-b4585221ac9c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:28.357 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8f40d544-f999-4d15-87a0-aabd31d8fef6 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:31.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:31.335 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:31.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:31.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:31.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:31.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:31.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a608a2c8-5371-42d8-832f-e9296b2da433 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:31.347 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [099b29c8-7320-4c69-bd15-bdd8db776aed | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:31.347 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [099b29c8-7320-4c69-bd15-bdd8db776aed | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:32.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [acd26572-d680-425d-8bd7-706cd94e9a9d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:34.325 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:34.325 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:28:34.326 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:28:34.326 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:28:34.326 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:28:34.326 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:28:34.326 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [065acd9a-9da2-4a05-b24f-80758a41981a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:28:34.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [bcbe2524-2500-4bbe-ba64-ac2221da75d7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:28:34.336 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bcbe2524-2500-4bbe-ba64-ac2221da75d7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:36.323 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7ca16990-d650-4a38-9033-84d0824e5e81 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:28:51.344 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:51.345 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:28:51.333Z +25-03-28 16:28:51.347 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:28:51.347 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:28:51.333Z] +25-03-28 16:28:51.348 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:28:51.346365Z] +25-03-28 16:28:51.348 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:28:51.348 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1fb62051-6900-4d93-9798-da6dbb401491 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:28:52.339 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [9f99cc29-0267-4990-8f52-2156913e96fb | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:29:21.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:21.339 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:29:21.332Z +25-03-28 16:29:21.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6d236b6d-56a1-4528-8e2c-4af511f435b0 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:29:21.340 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:29:21.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:29:21.332Z] +25-03-28 16:29:21.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:29:21.339660300Z] +25-03-28 16:29:21.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:21.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [892a7daa-34dc-4924-b206-6d0c33dfe220 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:29:21.360 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:21.360 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:21.360 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:29:21.360 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9398c367-7fa1-44a7-ab23-89a5f415c7ff | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:21.361 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9398c367-7fa1-44a7-ab23-89a5f415c7ff | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:21.361 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:29:21.361 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:29:21.361 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:29:21.362 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:29:21.362 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2064921e-f7f2-4554-ac0e-852c8915684e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:29:21.383 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [de7de079-bbea-43ce-ba81-205c3761e19a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:21.384 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [de7de079-bbea-43ce-ba81-205c3761e19a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:24.341 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [46990a24-68d9-4194-ae1f-aea15ef36525 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:25.326 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:25.326 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:29:25.326 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:29:25.327 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:29:25.327 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:29:25.327 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:29:25.327 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [40b88d45-852b-4333-84eb-edff7e62d9f9 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:29:25.333 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [cae43246-bad2-4633-8119-aa522956ab4d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:25.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [cae43246-bad2-4633-8119-aa522956ab4d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:28.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [94fb08d7-a444-472f-8f70-b134c935062e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:28.340 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:28.340 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:29:28.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [94fb08d7-a444-472f-8f70-b134c935062e | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:29:28.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [94fb08d7-a444-472f-8f70-b134c935062e | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:29:28.342 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:29:28.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:29:28.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:29:28.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:29:28.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9be2292f-a839-48fa-8d87-5596f54cd312 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:29:28.370 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6c681f4c-d3fd-4739-bf7c-e6666f49d555 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:28.370 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6c681f4c-d3fd-4739-bf7c-e6666f49d555 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:31.339 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:31.340 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:31.340 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:29:31.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:29:31.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:29:31.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:29:31.347 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:29:31.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ce48900c-3904-43d2-aca4-b512169a4196 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:29:31.382 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e1aebdfb-acda-457a-bc48-43e7d83d640b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:31.382 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e1aebdfb-acda-457a-bc48-43e7d83d640b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:32.327 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [03bfb46a-ee1a-4d12-abbf-c98442e7e999 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:34.327 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:34.327 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:29:34.328 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:29:34.328 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:29:34.328 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:29:34.328 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:29:34.328 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5159d6eb-ebca-47d9-ac56-ed55c4d2a34d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:29:34.335 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [19ba0f3d-ad03-4e7b-891e-2a4afe550af7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:34.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [19ba0f3d-ad03-4e7b-891e-2a4afe550af7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:36.329 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f89a7050-c491-4a42-952d-5fd3840f8b85 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:37.324 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:37.325 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:29:37.326 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:29:37.326 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:29:37.326 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:29:37.326 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:29:37.326 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5c6392df-d072-4684-b823-1a94495277c1 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:29:37.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [2757e4b1-1eee-4e03-8e8e-144d2836410d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:29:37.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [2757e4b1-1eee-4e03-8e8e-144d2836410d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:29:40.331 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d4eadf2c-b00e-4eb1-a163-e5d0a883eb48 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:21.338 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:21.339 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:30:21.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:30:21.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:30:21.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:30:21.341 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [7765d1ae-9452-4bb9-adb9-8b095004475f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:21.341 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7765d1ae-9452-4bb9-adb9-8b095004475f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:21.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:30:21.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [531eea80-6212-4b67-8466-e48f7bb0b4c0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:30:21.349 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [987c7d79-e8e5-424d-82e7-6977e5c1ef28 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:21.349 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [987c7d79-e8e5-424d-82e7-6977e5c1ef28 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:24.329 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:30:24.331 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:30:24.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:24.332 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:30:24.321Z +25-03-28 16:30:24.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:30:24.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:30:24.321Z] +25-03-28 16:30:24.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:30:24.333030400Z] +25-03-28 16:30:24.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:24.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f3d318f5-67b3-4756-aa19-31f7ba342735 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:30:24.350 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [eb3a8a84-3ea6-4a4d-ab02-877c7024bb1e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:25.330 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:25.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:30:25.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:30:25.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:30:25.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:30:25.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:30:25.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a45e56f8-246c-483a-ad9f-813cc01a4bb8 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:30:25.351 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [dda0dab8-3e0e-4110-a177-8a0e42de6d7a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:25.351 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [dda0dab8-3e0e-4110-a177-8a0e42de6d7a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:28.338 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [18566311-02e0-43b5-8782-4d4cad67fd45 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:28.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [18566311-02e0-43b5-8782-4d4cad67fd45 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:28.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [6c8c5320-dd04-499b-b155-759bf12491da | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:30:28.344 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [18566311-02e0-43b5-8782-4d4cad67fd45 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:30:28.344 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [18566311-02e0-43b5-8782-4d4cad67fd45 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:30:28.345 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [18566311-02e0-43b5-8782-4d4cad67fd45 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:30:28.346 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [18566311-02e0-43b5-8782-4d4cad67fd45 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:30:28.356 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [73dd6c9a-85ba-433b-aeaf-0f03714129b7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:28.356 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [73dd6c9a-85ba-433b-aeaf-0f03714129b7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:31.341 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:31.341 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:31.341 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:30:31.342 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:30:31.342 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:30:31.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:30:31.343 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:30:31.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [073b4c58-569c-44a2-839b-1edf715756a3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:30:31.355 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [98a11826-8ad6-4b23-b407-78f2930adaa4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:31.356 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [98a11826-8ad6-4b23-b407-78f2930adaa4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:32.335 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6388f855-12b8-4d1a-b12e-6b05da7f3b7e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:34.328 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:34.328 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:30:34.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:30:34.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:30:34.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:30:34.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:30:34.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9112a6dc-3920-4fce-b941-563142f5470d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:30:34.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0abee4c4-fdef-49ff-b249-20c9e1bcce77 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:30:34.337 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0abee4c4-fdef-49ff-b249-20c9e1bcce77 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:30:36.335 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4a8f861b-df99-4a96-a10f-0bc4582e0baa | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:21.341 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:21.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7ca2f51d-c360-4bbf-8d51-4ae4aafb5753 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:21.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7ca2f51d-c360-4bbf-8d51-4ae4aafb5753 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:21.341 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:31:21.342 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:31:21.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:31:21.342 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:31:21.343 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:31:21.343 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bfd668aa-1e87-4f43-ad8d-f1e970da6c57 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:31:21.350 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [684c7645-1b8f-40e1-ac7a-2f91638bd14b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:21.350 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [684c7645-1b8f-40e1-ac7a-2f91638bd14b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:24.334 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:31:24.336 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:31:24.336 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:24.337 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:31:24.330Z +25-03-28 16:31:24.338 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:31:24.339 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:31:24.330Z] +25-03-28 16:31:24.339 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:31:24.337196400Z] +25-03-28 16:31:24.339 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [eb55e8d1-9ecd-466e-bbea-684c638c0e41 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:24.339 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3fe0b27c-4e90-46c1-abc4-806eb7dddcae | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:25.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:25.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:31:25.331 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:31:25.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:31:25.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:31:25.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:31:25.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e314b41e-b412-46a1-b78f-da9c62df8997 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:31:25.342 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [b930888b-d681-4f61-aa7b-6618ed5f42b9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:25.342 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [b930888b-d681-4f61-aa7b-6618ed5f42b9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:28.325 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4ecb4afd-b115-4bfc-93d0-024994533f71 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:28.325 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0b7cd837-407b-49f8-9db6-6e5f51ab878d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:31:28.326 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4ecb4afd-b115-4bfc-93d0-024994533f71 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:31:28.326 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4ecb4afd-b115-4bfc-93d0-024994533f71 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:31:28.328 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4ecb4afd-b115-4bfc-93d0-024994533f71 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:31:28.328 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4ecb4afd-b115-4bfc-93d0-024994533f71 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:31:28.342 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8226eb9f-e3ac-45f7-903a-89a7db3c2754 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:28.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8226eb9f-e3ac-45f7-903a-89a7db3c2754 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:31.328 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:31.328 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:31.329 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:31:31.329 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:31:31.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:31:31.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:31:31.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:31:31.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [71b3ab1d-2027-4b7d-a870-5755a1f6eeb4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:31:31.339 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b33e8175-46db-4c66-bcfe-f6e11e0a2810 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:31.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [b33e8175-46db-4c66-bcfe-f6e11e0a2810 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:32.325 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [88f7e3e1-a250-47f8-b617-988433495bde | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:34.331 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:34.331 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:31:34.331 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:31:34.332 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:31:34.332 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:31:34.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:31:34.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [11b30883-44f6-4965-a3fe-6ddbb827e8e3 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:31:34.341 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [70364ced-500f-4334-8ae4-d4991585d244 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:31:34.342 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [70364ced-500f-4334-8ae4-d4991585d244 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:31:36.345 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [79878e4a-763d-434f-917e-585635031457 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:32:24.333 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:24.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:24.333 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:24.334 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:32:24.334 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:32:24.323Z +25-03-28 16:32:24.335 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:32:24.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:32:24.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:32:24.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:32:24.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [537c33bf-c760-448d-85ed-ced568215e4d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:32:24.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:32:24.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:32:24.323Z] +25-03-28 16:32:24.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:32:24.335676800Z] +25-03-28 16:32:24.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:24.336 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4cca330b-3fcc-4377-9025-ec7330011800 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:32:24.345 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [83d0c5b0-3357-4f66-a84d-1f3b9824617a | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:32:24.350 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0776d4d2-c332-4d47-822e-48d3dbab0b69 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:24.369 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3144e5bf-fd8d-4c50-9883-80488147a1cf | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:24.383 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8bc3994f-a32d-4329-bbc9-6dc0b4dd053d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:24.383 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:24.384 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8bc3994f-a32d-4329-bbc9-6dc0b4dd053d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:24.384 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:24.384 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:32:24.385 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:32:24.386 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:32:24.386 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:32:24.387 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:32:24.387 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f61bb8c0-9f07-4e36-8ea3-084025d177ec | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:32:24.394 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [06fe9429-e579-40da-b765-3483e29a1bed | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:24.394 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [06fe9429-e579-40da-b765-3483e29a1bed | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:28.323 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [15b9cc97-67c0-4513-95f3-e403e37d8104 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:28.323 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7eaa73c0-b22a-440e-b39d-a7adf93a122d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:32:28.326 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7eaa73c0-b22a-440e-b39d-a7adf93a122d | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:32:28.326 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [15b9cc97-67c0-4513-95f3-e403e37d8104 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:32:28.326 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [15b9cc97-67c0-4513-95f3-e403e37d8104 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:32:28.327 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [15b9cc97-67c0-4513-95f3-e403e37d8104 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:32:28.327 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [15b9cc97-67c0-4513-95f3-e403e37d8104 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:32:28.336 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [940862c7-f8bc-432d-9a61-ae7eb1b9171a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:28.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [940862c7-f8bc-432d-9a61-ae7eb1b9171a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:31.331 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:31.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:31.332 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:32:31.333 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:32:31.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:32:31.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:32:31.334 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:32:31.334 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [934748e6-5fb3-4fe3-b414-98e947f3ed68 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:32:31.340 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [99ffc992-521c-4918-a1a5-e128d439af2c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:31.340 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [99ffc992-521c-4918-a1a5-e128d439af2c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:32.339 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4df7d17c-241f-4a1c-8493-89af6ea08691 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:34.329 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:34.329 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:32:34.330 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:32:34.330 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:32:34.330 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:32:34.330 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:32:34.330 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [596463fa-50b2-41c5-b54c-e800dac78e5d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:32:34.338 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [305e1ab4-ff36-4218-a7b9-f8b9a827d8db | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:34.339 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [305e1ab4-ff36-4218-a7b9-f8b9a827d8db | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:36.326 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3024ce43-a1da-47a9-b4a7-dcdeca263ae7 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:37.323 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:37.323 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:32:37.324 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:32:37.324 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:32:37.324 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:32:37.324 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:32:37.324 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c05dc64e-7d0b-46df-b404-f20dfa8ce98d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:32:37.332 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a54cc71f-97fa-435d-9c44-a4d535068a7d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:32:37.332 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a54cc71f-97fa-435d-9c44-a4d535068a7d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:32:39.272 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:32:39.395 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Starting ChannelControllerTest using Java 17.0.14 with PID 22544 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:32:39.398 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 16:32:40.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [dca4db04-b6ae-408d-8f83-fa300ae56649 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:32:43.911 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@5d55eb7a] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@63100783 testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2da3b078, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@1a96d94c, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@21daa9d7, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@3080ea1a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@68ac9ec5, [ImportsContextCustomizer@34f636a5 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7e7f3cfd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@65ddee5a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@6f9c5048, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@2863846c, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@e7dacd28], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:32:43.982 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@5d9ac1ff] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@63100783 testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2da3b078, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@1a96d94c, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@21daa9d7, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@3080ea1a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@68ac9ec5, [ImportsContextCustomizer@34f636a5 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7e7f3cfd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@65ddee5a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@6f9c5048, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@2863846c, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@e7dacd28], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 16:32:44.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2f41b9f8-fd2d-404a-a93f-7b46bb4ce93e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:24.346 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:33:24.346 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:24.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:24.347 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:33:24.349 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:33:24.334Z +25-03-28 16:33:24.350 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:33:24.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:33:24.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:33:24.352 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:33:24.353 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a5d15a05-0d3d-436b-92d8-96e6d0d71144 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:24.353 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:33:24.354 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:33:24.334Z] +25-03-28 16:33:24.354 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:33:24.352510700Z] +25-03-28 16:33:24.355 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:24.355 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [45c2552f-3321-4898-81e0-f4f274279f89 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:33:24.357 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [24cbf915-b8e6-4f50-860a-849579f5b4a4 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:33:24.365 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [af067678-279d-4ac8-b449-42cd50459a36 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:24.402 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2df868d8-a994-4057-bac3-6746206bb647 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:24.409 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:24.409 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:24.409 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:33:24.410 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [24162623-127b-4457-b062-3424f4855339 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:24.410 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:33:24.410 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [24162623-127b-4457-b062-3424f4855339 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:24.410 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:33:24.410 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:33:24.411 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:33:24.411 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8719055c-9c03-43e2-86f4-ecb8559a5243 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:24.422 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c5ea82a2-cb53-4c8a-bf04-3082a5535c1f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:24.422 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c5ea82a2-cb53-4c8a-bf04-3082a5535c1f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:28.332 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4c007ac2-410f-491b-b08a-8e8bb0f6e5c9 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:28.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4c007ac2-410f-491b-b08a-8e8bb0f6e5c9 | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:28.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4c007ac2-410f-491b-b08a-8e8bb0f6e5c9 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:33:28.332631800Z] +25-03-28 16:33:28.332 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:28.332 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4c007ac2-410f-491b-b08a-8e8bb0f6e5c9 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:33:28.333 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:33:28.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4c007ac2-410f-491b-b08a-8e8bb0f6e5c9 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:33:28.333 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4c007ac2-410f-491b-b08a-8e8bb0f6e5c9 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:33:28.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:33:28.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:33:28.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:33:28.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:33:28.334 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3062a02b-840c-4de6-8ec7-b0fbeed7011a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:28.344 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5032ffde-a5ab-4b0e-9326-1d6296d2594f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:28.344 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5032ffde-a5ab-4b0e-9326-1d6296d2594f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:31.327 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:31.328 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:31.328 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:33:31.328 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:33:31.328 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:33:31.328 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:33:31.330 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:33:31.330 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ff2e7654-7eac-44eb-8666-6204806dcf0b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:31.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d75af181-cfbb-4f98-8794-d1c9efc9ae27 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:31.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d75af181-cfbb-4f98-8794-d1c9efc9ae27 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:32.354 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [04846dff-5e90-4477-b0e1-624c8d7f97e9 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:34.711 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:34.727 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:33:34.731 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:33:34.732 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:33:34.732 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:33:34.736 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:33:34.736 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [6f0e7b57-edfe-4caa-8f0c-46c4bfb98624 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:34.907 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [0414de8f-d958-4cc5-a469-756d78b9959f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:34.908 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [0414de8f-d958-4cc5-a469-756d78b9959f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:36.503 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [9d2fc742-c60d-4820-b6f8-0c84119145d6 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:37.353 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:37.353 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:33:37.355 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:33:37.355 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:33:37.355 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:33:37.356 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:33:37.356 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8f591cae-0fcd-4c16-8f01-6a556b144436 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:33:37.373 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [047bae01-44a0-42b7-bc29-6ac96cc14873 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:33:37.373 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [047bae01-44a0-42b7-bc29-6ac96cc14873 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:33:40.326 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d9659107-53bb-4837-aba0-2bf2f4da6d0c | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:24.342 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:24.343 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:34:24.343 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:34:24.343 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:24.343 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:34:24.333Z +25-03-28 16:34:24.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:34:24.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:34:24.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:34:24.345 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:34:24.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ea571b16-3545-425c-9ced-d1e7b4722bc0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:34:24.346 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:34:24.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:34:24.333Z] +25-03-28 16:34:24.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:34:24.344726600Z] +25-03-28 16:34:24.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:24.347 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e5ed2886-0af8-4dd2-b6c1-c2ef43d62609 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:34:24.349 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [109d46e5-7d8d-4a97-ad30-2f52176a4b3c | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:34:24.354 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [80d56ff3-85d3-4819-a696-82eabfe836a5 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:24.384 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [58f2ebf8-2f1f-457c-9528-60e663c3f762 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:24.386 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:24.386 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:24.386 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:34:24.387 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:34:24.387 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:34:24.387 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:34:24.389 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:34:24.389 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [62697a2b-5b50-4d86-8a0f-22b1dbbdb49e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:34:24.393 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [5d63a9d8-b568-47b0-b4ce-0a36b848f65f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:24.394 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [5d63a9d8-b568-47b0-b4ce-0a36b848f65f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:24.405 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4f99570a-2d2a-4314-89d7-9ea866c6def2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:24.405 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4f99570a-2d2a-4314-89d7-9ea866c6def2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:28.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e1d97901-0675-4fb4-b204-eb7474f7c5c9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:28.331 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [80db7090-b8b4-4cda-a30a-3762826eeb42 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:34:28.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e1d97901-0675-4fb4-b204-eb7474f7c5c9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:34:28.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e1d97901-0675-4fb4-b204-eb7474f7c5c9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:34:28.333 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e1d97901-0675-4fb4-b204-eb7474f7c5c9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:34:28.333 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e1d97901-0675-4fb4-b204-eb7474f7c5c9 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:34:28.338 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [eb4be7ae-523d-4e9b-a889-e80c29a19402 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:28.339 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [eb4be7ae-523d-4e9b-a889-e80c29a19402 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:31.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:31.342 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:31.342 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:34:31.343 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:34:31.343 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:34:31.343 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:34:31.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:34:31.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b24de7b-3f05-422a-85ef-b445cdec3417 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:34:31.350 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [53a587e0-5c69-4cfa-ba0d-fd6567e80d87 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:31.351 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [53a587e0-5c69-4cfa-ba0d-fd6567e80d87 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:31.352 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [83cff322-7f96-4ad3-9e68-d6c3c5030083 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:34.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:34.334 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:34:34.334 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:34:34.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:34:34.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:34:34.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:34:34.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4e0ddf79-ad17-4cce-b5d0-491f863a4dcb | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:34:34.347 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f4d42c28-5c79-4b67-b995-abe5a057072a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:34.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f4d42c28-5c79-4b67-b995-abe5a057072a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:35.337 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [97695812-8f85-467f-a65d-f67c8eb8b0f3 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:37.329 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:37.329 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:34:37.331 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:34:37.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:34:37.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:34:37.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:34:37.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [807b04d2-8ed8-4169-b5a5-07b33d29f58d | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:34:37.344 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [2788c171-d211-4737-9e45-c453511d0abe | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:34:37.344 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [2788c171-d211-4737-9e45-c453511d0abe | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:34:39.334 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a70f19c7-b0f2-4f73-87a1-203bd2628a65 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:24.324 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:35:24.325 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:24.325 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:35:24.325 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [539c34de-30ff-4fc7-ba0a-c14d92f89bba | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:35:24.325 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:35:24.325 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:24.325 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:35:24.325 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:35:24.320Z +25-03-28 16:35:24.326 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:35:24.326 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:35:24.326 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:35:24.326 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [73e4868c-0771-4077-b897-87b292b8b143 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:35:24.327 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:35:24.327 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:35:24.320Z] +25-03-28 16:35:24.327 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:35:24.326646300Z] +25-03-28 16:35:24.327 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:24.327 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [20b450c5-156e-45eb-bdfa-49117469cf5c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:35:24.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2323c232-57e4-4f30-9627-345d7d78c34e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:24.333 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:24.333 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2323c232-57e4-4f30-9627-345d7d78c34e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:24.333 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:24.333 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:35:24.334 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:35:24.334 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:35:24.334 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:35:24.335 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:35:24.335 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [27d7e41e-10e0-4e15-94b4-148d7b25d650 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:35:24.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e2c39793-18cc-40fa-9716-457e97cb2d3f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:24.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2c39793-18cc-40fa-9716-457e97cb2d3f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:24.344 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0dfb14c5-bb36-4ca5-9976-b15f386ec028 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:24.344 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0dfb14c5-bb36-4ca5-9976-b15f386ec028 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:27.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [53d2c392-3270-45a6-9ca3-44d2da8cbe7e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:27.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ba952bfa-1c0e-4eb3-a809-9a19eb7aa931 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:35:27.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53d2c392-3270-45a6-9ca3-44d2da8cbe7e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:35:27.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53d2c392-3270-45a6-9ca3-44d2da8cbe7e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:35:27.338 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [53d2c392-3270-45a6-9ca3-44d2da8cbe7e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:35:27.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [53d2c392-3270-45a6-9ca3-44d2da8cbe7e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:35:27.344 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [0a46de77-65de-48ef-9eba-46332cf85fa1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:27.344 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [0a46de77-65de-48ef-9eba-46332cf85fa1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:31.327 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [bd67a9bb-6530-4bb8-b4d4-2f7b14a48ce8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:31.327 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bd67a9bb-6530-4bb8-b4d4-2f7b14a48ce8 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:31.327 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [79d41ce4-8210-4bcf-8649-a049aa81acc4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:35:31.328 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bd67a9bb-6530-4bb8-b4d4-2f7b14a48ce8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:35:31.328 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bd67a9bb-6530-4bb8-b4d4-2f7b14a48ce8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:35:31.329 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [bd67a9bb-6530-4bb8-b4d4-2f7b14a48ce8 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:35:31.329 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [bd67a9bb-6530-4bb8-b4d4-2f7b14a48ce8 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:35:31.329 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [79d41ce4-8210-4bcf-8649-a049aa81acc4 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:35:31.329 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [79d41ce4-8210-4bcf-8649-a049aa81acc4 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:35:31.339 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [31f6b971-0a8d-426d-8830-4d25ceafb9e9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:31.339 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [31f6b971-0a8d-426d-8830-4d25ceafb9e9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:33.466 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:35:33.583 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Starting ChannelControllerTest using Java 17.0.14 with PID 26204 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:35:33.584 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 16:35:34.338 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:34.338 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:34.338 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:35:34.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:35:34.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:35:34.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:35:34.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:35:34.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9ba09802-d340-41f9-ab26-8ab308cf9d4f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:35:34.348 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f1551bec-a73a-4896-8f40-9ac87bcee90f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:34.348 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f1551bec-a73a-4896-8f40-9ac87bcee90f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:34.349 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [04bf9eff-c8ed-47f0-b41c-03d946d640c4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:37.325 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:37.326 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:35:37.326 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:35:37.326 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:35:37.326 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:35:37.327 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:35:37.327 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f76fabde-eece-4c61-8ed3-866aa15e8e66 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:35:37.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [5cdaf82c-c836-4bfd-be1f-07d6b9cd35d0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:35:37.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [5cdaf82c-c836-4bfd-be1f-07d6b9cd35d0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:35:38.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4abc07f4-08c4-4acf-940d-7acf0040b837 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:24.330 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:24.330 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:24.330 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:24.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:36:24.330 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:24.330 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:36:24.331 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:36:24.331 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:36:24.331 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:36:24.326Z +25-03-28 16:36:24.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:36:24.331 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [83f55e20-6773-4f5d-90f0-35181e3a27b8 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:36:24.332 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:36:24.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:36:24.326Z] +25-03-28 16:36:24.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:36:24.331936300Z] +25-03-28 16:36:24.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:24.332 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a89c99-3aea-49fb-9fc0-266f27367bd9 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:36:24.342 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:24.343 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:24.343 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7acab4ed-5974-40b6-9106-6f44f2a31639 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:24.343 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7acab4ed-5974-40b6-9106-6f44f2a31639 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:24.343 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:36:24.343 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:36:24.343 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:36:24.344 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:36:24.345 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [998da023-7d64-463a-a02c-6c4ba6c5a0cd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:36:24.348 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6c3aa419-a3d6-4715-a68e-aed75dfad0c6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:24.348 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6c3aa419-a3d6-4715-a68e-aed75dfad0c6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:24.356 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [95234c6a-7c08-4ee4-bc2b-1e49ccd7b255 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:24.356 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [95234c6a-7c08-4ee4-bc2b-1e49ccd7b255 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:26.330 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [16a54ede-51fa-4880-b349-184b5b5eba7b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:28.327 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:28.328 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:28.329 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:36:28.329 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:36:28.329 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:36:28.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:36:28.330 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25443d7f-474b-4a6d-b5d3-35b007421f96 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:36:28.336 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [72721f61-9b85-4551-8371-76956bf6a7cc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:28.336 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [72721f61-9b85-4551-8371-76956bf6a7cc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:28.980 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:36:29.159 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Starting ChannelControllerTest using Java 17.0.14 with PID 16128 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:36:29.161 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 16:36:30.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [9f766e80-7a5a-40fb-90e6-2d764d26be27 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:31.326 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:31.326 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:31.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:36:31.327 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:36:31.327 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:36:31.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:36:31.327 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7ad806e0-6b30-4f2a-ae6a-44eda045ca08 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:36:31.334 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e11980f2-0214-43b5-9862-2a4977fb4033 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:31.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e11980f2-0214-43b5-9862-2a4977fb4033 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:33.377 [Test worker] WARN org.springframework.web.context.support.GenericWebApplicationContext [ | | ] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument +25-03-28 16:36:33.439 [Test worker] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger [ | | ] - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-03-28 16:36:33.585 [Test worker] ERROR org.springframework.boot.SpringApplication [ | | ] - Application run failed +org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:36:33.633 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@69c00140] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@52f9a620 testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2da3b078, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@1a96d94c, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@111ee980, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@3080ea1a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@68ac9ec5, [ImportsContextCustomizer@6d575cd8 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7e7f3cfd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@65ddee5a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@6f9c5048, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@2863846c, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@2089d4fa], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:36:33.716 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@8f2513c] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@52f9a620 testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2da3b078, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@1a96d94c, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@111ee980, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@3080ea1a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@68ac9ec5, [ImportsContextCustomizer@6d575cd8 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7e7f3cfd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@65ddee5a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@6f9c5048, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@2863846c, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@2089d4fa], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 16:36:34.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:34.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:34.338 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:34.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0f46a729-8917-4281-b9b0-3a5c57b51273 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:36:34.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:36:34.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:36:34.339 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0f46a729-8917-4281-b9b0-3a5c57b51273 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:36:34.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0f46a729-8917-4281-b9b0-3a5c57b51273 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:36:34.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:36:34.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2a7b0422-e017-4bf8-b00b-534dfc7648e6 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:36:34.348 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5c0e72ce-d53e-44a3-891e-5dda65a54ac3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:34.348 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5c0e72ce-d53e-44a3-891e-5dda65a54ac3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:37.335 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:37.335 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:37.336 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:36:37.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:36:37.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:36:37.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:36:37.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:36:37.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ebc900d1-2797-4d6e-9f93-5112295ec5da | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:36:37.345 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4e57f25c-6590-4787-87c3-3cb98f91f035 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:36:37.345 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4e57f25c-6590-4787-87c3-3cb98f91f035 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:36:38.341 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [36c0b0f6-b6cc-4119-9efb-bdccc02eb8ea | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:24.325 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:24.325 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:37:24.325 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:37:24.327 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:24.327 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:37:24.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:37:24.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:37:24.327 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:37:24.320Z +25-03-28 16:37:24.327 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:37:24.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7641582c-6040-4df7-a4ff-a01d347c446f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:37:24.328 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:37:24.328 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:37:24.320Z] +25-03-28 16:37:24.328 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:37:24.327231200Z] +25-03-28 16:37:24.328 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:24.328 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f855d457-dfdf-4406-aec6-9859a94cd166 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:37:24.336 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [da67dd53-3b0e-4a14-9bf0-092a242c8ef6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:24.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:24.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [da67dd53-3b0e-4a14-9bf0-092a242c8ef6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:24.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:24.337 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:37:24.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:37:24.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:37:24.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:37:24.340 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:37:24.340 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [c3c0f4ec-beed-4457-bee6-b67cbb0e6b0b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:37:24.348 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [63110e8c-ccac-4b38-9a9e-21ee3ae8bc6b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:24.349 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [63110e8c-ccac-4b38-9a9e-21ee3ae8bc6b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:24.358 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5481b728-991c-4f3c-9880-79cfecff2c40 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:24.358 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5481b728-991c-4f3c-9880-79cfecff2c40 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:26.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [390b98c5-d05c-432a-9a97-a1c8f832b74d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:28.330 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:28.331 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:37:28.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:37:28.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:37:28.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:37:28.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:37:28.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3dd131c4-dded-4625-b020-3ff143b77549 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:37:28.340 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [282bd75d-1717-41f4-b239-f6a022ecfcf3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:28.340 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [282bd75d-1717-41f4-b239-f6a022ecfcf3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:30.333 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [64811021-1631-428f-bf9d-5aef82cc8c7d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:30.343 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:30.344 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:37:30.344 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:37:30.344 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:37:30.344 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:37:30.345 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:37:30.345 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20c645b6-e0bc-4189-8d35-506cb9432045 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:37:30.353 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5123d33c-8101-4997-acf6-7c25f7132d20 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:30.353 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5123d33c-8101-4997-acf6-7c25f7132d20 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:34.337 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e24549ad-250e-4c2d-8ce6-6fd163d5ab69 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:34.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e24549ad-250e-4c2d-8ce6-6fd163d5ab69 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:34.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [382b8545-bd3b-4880-b573-f166d7331c13 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:37:34.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e24549ad-250e-4c2d-8ce6-6fd163d5ab69 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:37:34.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e24549ad-250e-4c2d-8ce6-6fd163d5ab69 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:37:34.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [382b8545-bd3b-4880-b573-f166d7331c13 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:37:34.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [382b8545-bd3b-4880-b573-f166d7331c13 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:37:34.340 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e24549ad-250e-4c2d-8ce6-6fd163d5ab69 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:37:34.340 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e24549ad-250e-4c2d-8ce6-6fd163d5ab69 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:37:34.349 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [acb69250-6a6f-411d-aa96-83ac3477a8ae | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:34.350 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [acb69250-6a6f-411d-aa96-83ac3477a8ae | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:37.335 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:37.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:37.336 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:37:37.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:37:37.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:37:37.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:37:37.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:37:37.337 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9e2ac2e5-378e-4b22-8e25-4eb89a3068be | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:37:37.348 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e686a8e8-e5ce-4fd7-b2f0-be787f5c0125 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:37:37.348 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e686a8e8-e5ce-4fd7-b2f0-be787f5c0125 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:37:38.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [846b25ce-b109-4518-adb1-4091ba9f2ddf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:24.331 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:38:24.332 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:24.332 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:24.332 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:38:24.332 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:38:24.326Z +25-03-28 16:38:24.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:38:24.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:38:24.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:38:24.333 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:38:24.333 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:38:24.326Z] +25-03-28 16:38:24.333 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:38:24.332193400Z] +25-03-28 16:38:24.333 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:24.334 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3c98d73a-fb5a-4c02-969b-9d3aeb6ea72b | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:38:24.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:38:24.335 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [75d61749-dd2f-40d2-8ab3-0554fdd484bd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:24.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1ddcc618-9913-4af9-a5ac-e42155445f95 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:38:24.360 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:24.360 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:24.361 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:38:24.361 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:38:24.362 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:38:24.362 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:38:24.362 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [d4983094-8396-476a-9896-77f1532de2de | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:24.362 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:38:24.362 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [d4983094-8396-476a-9896-77f1532de2de | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:24.362 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [474d2ef1-17b3-4833-bcd1-3b62258d6f76 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:24.368 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [dc92f398-42a2-47f7-ac4b-93e5afc68934 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:24.368 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [dc92f398-42a2-47f7-ac4b-93e5afc68934 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:24.376 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e516eef0-cdfb-4887-a9f1-020c46b45182 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:24.377 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e516eef0-cdfb-4887-a9f1-020c46b45182 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:26.333 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [192b9432-0b69-420b-a36a-4ed5c6a31649 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:28.331 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:28.332 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:38:28.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:38:28.333 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:38:28.333 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:38:28.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:38:28.333 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [434e2e7a-2cbc-4d63-8c5e-fcf3ecd8ea71 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:28.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [836049ca-0544-48af-9916-748ec6c4bebb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:28.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [836049ca-0544-48af-9916-748ec6c4bebb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:30.335 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a323b524-ee49-4609-bd45-223c9d397c98 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:31.331 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:31.331 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:38:31.332 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:38:31.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:38:31.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:38:31.333 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:38:31.333 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b7560edb-947b-4f46-80fa-1809316a919a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:31.340 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [348aa2fb-9216-4385-bbcc-087de43e10d3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:31.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [348aa2fb-9216-4385-bbcc-087de43e10d3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:32.305 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:38:32.470 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Starting ChannelControllerTest using Java 17.0.14 with PID 10992 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:38:32.472 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 16:38:34.335 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [74ca6bbd-ec77-4ef5-8d23-3f0b5b797f6d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:34.335 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [74ca6bbd-ec77-4ef5-8d23-3f0b5b797f6d | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:34.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:34.335 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [74ca6bbd-ec77-4ef5-8d23-3f0b5b797f6d | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:38:34.335042400Z] +25-03-28 16:38:34.335 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [74ca6bbd-ec77-4ef5-8d23-3f0b5b797f6d | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:38:34.336 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:38:34.336 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [74ca6bbd-ec77-4ef5-8d23-3f0b5b797f6d | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:38:34.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [74ca6bbd-ec77-4ef5-8d23-3f0b5b797f6d | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:38:34.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:38:34.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:38:34.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:38:34.338 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:38:34.339 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [5ff1d6c2-f32a-4f3f-bbf3-fc8ced494ca4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:34.349 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a009bc0f-090e-4769-969a-b8eedda04de9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:34.349 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a009bc0f-090e-4769-969a-b8eedda04de9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:37.336 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:37.336 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:37.337 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:38:37.337 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:38:37.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:38:37.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:38:37.339 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:38:37.339 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ad5592c-6c65-46a5-b2bf-b47a4cd3f604 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:38:37.346 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [136e4635-27f5-4009-b48a-d8cec1c87a70 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:38:37.346 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [136e4635-27f5-4009-b48a-d8cec1c87a70 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:38:37.610 [Test worker] WARN org.springframework.web.context.support.GenericWebApplicationContext [ | | ] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument +25-03-28 16:38:37.682 [Test worker] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger [ | | ] - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-03-28 16:38:37.829 [Test worker] ERROR org.springframework.boot.SpringApplication [ | | ] - Application run failed +org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:38:37.868 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@250988e5] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@5ce1b67b testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2da3b078, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@1a96d94c, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@111ee980, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@3080ea1a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@68ac9ec5, [ImportsContextCustomizer@d05d8c3 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7e7f3cfd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@65ddee5a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@6f9c5048, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@2863846c, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@2089d4fa], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:38:37.947 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@ceb4f91] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@5ce1b67b testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@2da3b078, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@1a96d94c, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@111ee980, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@3080ea1a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@68ac9ec5, [ImportsContextCustomizer@d05d8c3 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7e7f3cfd, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@65ddee5a, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@6f9c5048, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@2863846c, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@2089d4fa], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 16:38:38.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a578cba2-8dc4-468d-831a-76226cecf7c6 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:24.327 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:24.327 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:39:24.327 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:39:24.327 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:24.327 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:39:24.328 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:39:24.328 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:39:24.323Z +25-03-28 16:39:24.328 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:39:24.328 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:39:24.328 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2e447166-53f5-4f8c-abe1-f0ecadf613d5 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:39:24.329 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:39:24.329 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:39:24.323Z] +25-03-28 16:39:24.329 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:39:24.328362500Z] +25-03-28 16:39:24.329 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:24.329 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c94466df-db0b-4847-85d4-0a9581c1fde1 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:39:24.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fcaa72c9-50fd-42d8-ae8d-03a66185e412 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:39:24.342 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [02d652b5-532b-44a6-8776-f183c8a94a28 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:24.342 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [02d652b5-532b-44a6-8776-f183c8a94a28 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:24.350 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [59a8f3d3-1ca0-4690-99c2-fc5726c91c06 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:24.350 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:24.350 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [59a8f3d3-1ca0-4690-99c2-fc5726c91c06 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:24.350 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:24.351 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:39:24.351 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:39:24.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:39:24.352 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:39:24.352 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:39:24.353 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ae8ac1ed-83bb-4240-a0fe-4ff38cbfc56f | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:39:24.360 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [97a89875-f062-4d80-aab9-f0cff08158b3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:24.361 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [97a89875-f062-4d80-aab9-f0cff08158b3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:26.332 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0ed57f57-6da7-4751-9584-3a78ea91ac39 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:28.335 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:28.336 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:39:28.336 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:39:28.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:39:28.336 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:39:28.337 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:39:28.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [775f6241-ec62-4c41-96b0-b16d66f3077a | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:39:28.345 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2b4c12be-c274-4ad5-8741-e349504777b4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:28.346 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2b4c12be-c274-4ad5-8741-e349504777b4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:30.337 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [91c0c769-8d26-47a7-b793-83d4ae957a11 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:31.331 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:31.331 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:39:31.333 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:39:31.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:39:31.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:39:31.334 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:39:31.334 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5c37dca3-f4fa-4336-bf39-6da1df7716c2 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:39:31.343 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [40be4f12-d182-4be2-9d57-d1b478c1f230 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:31.343 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [40be4f12-d182-4be2-9d57-d1b478c1f230 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:34.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c02da254-43a1-4f27-a615-78a56f33827e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:34.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c02da254-43a1-4f27-a615-78a56f33827e | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:34.336 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5e1e5a40-d628-45a1-b6e5-fb14352c6d09 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:39:34.339 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5e1e5a40-d628-45a1-b6e5-fb14352c6d09 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:39:34.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c02da254-43a1-4f27-a615-78a56f33827e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:39:34.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c02da254-43a1-4f27-a615-78a56f33827e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:39:34.340 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c02da254-43a1-4f27-a615-78a56f33827e | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:39:34.340 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c02da254-43a1-4f27-a615-78a56f33827e | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:39:34.351 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [dd0d9f4d-818c-49f8-bd01-ac46f92e6c54 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:34.351 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [dd0d9f4d-818c-49f8-bd01-ac46f92e6c54 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:37.325 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:37.325 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:37.325 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:39:37.325 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:39:37.326 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:39:37.326 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:39:37.326 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:39:37.326 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f85b5af5-d6bc-4074-bcfb-5f82a8ff19d4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:39:37.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [5b556b93-c966-409f-91e3-6c80009aca0d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:39:37.333 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5b556b93-c966-409f-91e3-6c80009aca0d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:39:38.333 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [215d04e5-0e15-4d4a-a892-8b51e7f743c7 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:40:23.140 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@14426256] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@3662dc9b testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@46aa712c, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@6e7c351d, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@ed7a9241, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@d7474c5a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@1f1ff879, [ImportsContextCustomizer@5f453412 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@34b9eb03, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@28bdbe88, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@3a894088, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@149524f0, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@7aea5afc], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:40:23.212 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@39ae0bff] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@3662dc9b testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@46aa712c, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@6e7c351d, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@ed7a9241, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@d7474c5a, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@1f1ff879, [ImportsContextCustomizer@5f453412 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@34b9eb03, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@28bdbe88, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@3a894088, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@149524f0, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@7aea5afc], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 16:40:24.338 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:40:24.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:40:24.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:24.340 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:40:24.335Z +25-03-28 16:40:24.341 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:24.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:24.341 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:40:24.341 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:40:24.335Z] +25-03-28 16:40:24.341 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:40:24.340592400Z] +25-03-28 16:40:24.341 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:40:24.341 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:24.341 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6cb4178c-ce0c-4e9a-b2c1-6ec056a2a0c4 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:40:24.342 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:40:24.342 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:40:24.342 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:40:24.343 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:40:24.343 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [5651b9af-74c7-410d-b044-1f7396f41cf9 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:40:24.352 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a94728b6-5b15-4fb7-82dd-6c9a280dc7a0 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:40:24.374 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [7c18005f-6950-4699-bd5b-cd64b57643d5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:24.374 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [7c18005f-6950-4699-bd5b-cd64b57643d5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:24.380 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:24.380 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:24.381 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:40:24.382 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:40:24.382 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:40:24.382 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:40:24.384 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:40:24.384 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b2626589-ca14-4a69-a6b4-e05df4355dbb | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:40:24.388 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b3dc35d4-5823-4465-9928-5adca38dc4cb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:24.389 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b3dc35d4-5823-4465-9928-5adca38dc4cb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:24.403 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [33ead972-04bf-4a7a-b529-85605ae77759 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:24.403 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [33ead972-04bf-4a7a-b529-85605ae77759 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:26.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [327eabad-98ae-4d3e-a3a1-ce2286276ff8 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:28.335 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:28.335 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:40:28.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:40:28.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:40:28.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:40:28.338 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:40:28.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c931a96b-7f50-4215-a484-e081b0a33521 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:40:28.345 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d7944033-924f-4707-9776-a365d5f079e0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:28.345 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d7944033-924f-4707-9776-a365d5f079e0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:30.325 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0c0cea72-4aba-4756-99af-54b6f492281c | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:31.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:31.335 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:40:31.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:40:31.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:40:31.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:40:31.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:40:31.336 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cb42ab6d-7901-4509-ba16-c32aacc07990 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:40:31.344 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [446bae8e-82bd-41a2-b2d7-d8ee7c1f991f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:31.344 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [446bae8e-82bd-41a2-b2d7-d8ee7c1f991f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:34.331 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [794716d6-8089-43c6-9ef6-5e4bb2c020de | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:34.331 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [dd9ef1de-ee5d-4a28-8902-7b404158a1d4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:40:34.333 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [dd9ef1de-ee5d-4a28-8902-7b404158a1d4 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:40:34.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [794716d6-8089-43c6-9ef6-5e4bb2c020de | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:40:34.333 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [794716d6-8089-43c6-9ef6-5e4bb2c020de | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:40:34.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [794716d6-8089-43c6-9ef6-5e4bb2c020de | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:40:34.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [794716d6-8089-43c6-9ef6-5e4bb2c020de | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:40:34.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4e838dde-1005-41bd-ae8b-fdd139b7d568 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:34.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4e838dde-1005-41bd-ae8b-fdd139b7d568 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:37.331 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:37.331 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:37.332 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:40:37.334 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:40:37.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:40:37.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:40:37.335 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:40:37.335 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a70b300b-12a3-4b8f-8161-178bf7eaac27 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:40:37.344 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [45d54acd-0588-4695-aef5-a707af067688 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:40:37.344 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [45d54acd-0588-4695-aef5-a707af067688 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:40:38.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e4a770f8-4bb9-4efd-93ef-e8ff118957f4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:20.184 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:20.185 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [f0cc4e4f-1694-4977-869d-71064ca76a17] +25-03-28 16:41:20.459 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 16:41:22.333 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [33f0b8c5-e318-41c9-a5a4-ab27a2d640b0 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:41:24.335 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:24.335 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:41:24.324Z +25-03-28 16:41:24.338 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:24.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:24.338 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:41:24.338 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [b9642bd4-3d54-4975-b095-e0d07c056309 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:41:24.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:24.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:24.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:41:24.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:41:24.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b928a427-7467-4774-90f8-eee366f17a97 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:41:24.338 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:41:24.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:41:24.324Z] +25-03-28 16:41:24.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:41:24.336988500Z] +25-03-28 16:41:24.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:24.343 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2a479f0b-8476-4fdd-82d1-17187da81766 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:41:24.390 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:24.390 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:24.391 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:41:24.392 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:24.392 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:24.392 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:41:24.393 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:41:24.393 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [640daf5b-af27-4b17-bef7-763ed0594d58 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:41:24.401 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [42af294e-ea9f-4ec7-a8d6-628b53cedfc3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:24.401 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [42af294e-ea9f-4ec7-a8d6-628b53cedfc3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:24.434 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [47b6e16c-cbff-48ee-a1db-41bbdedb4fb0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:24.434 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [47b6e16c-cbff-48ee-a1db-41bbdedb4fb0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:24.442 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9ab07734-fa2b-4320-be2f-e07b0db7361c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:24.442 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9ab07734-fa2b-4320-be2f-e07b0db7361c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:26.327 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f662d28a-be04-45ba-8aa9-8ef506b371c3 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:28.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:28.332 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:41:28.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:28.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:28.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:41:28.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:41:28.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2bfa8c8b-3454-4de1-986c-8517ac471443 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:41:28.341 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [958bbd9c-37c2-48d4-9ecf-1e8c96caa3dd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:28.341 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [958bbd9c-37c2-48d4-9ecf-1e8c96caa3dd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:30.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [592e49d1-e684-44ef-9d47-9f39ba1812e1 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:31.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:31.332 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:41:31.333 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:31.333 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:31.333 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:41:31.333 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:41:31.333 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [1191c16c-3b5d-4d0a-a789-da2da236d580 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:41:31.341 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ad408ac7-2694-4855-aa57-320a70c9787a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:31.341 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ad408ac7-2694-4855-aa57-320a70c9787a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:33.418 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:41:33.616 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Starting ChannelControllerTest using Java 17.0.14 with PID 26360 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:41:33.619 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 16:41:34.330 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [100b15c7-be59-40e9-8074-f62189e7e7cf | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:34.330 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [100b15c7-be59-40e9-8074-f62189e7e7cf | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:34.330 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [c9d09b1f-a14c-468d-bb2a-afb9ef8989c4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:34.332 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [100b15c7-be59-40e9-8074-f62189e7e7cf | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:34.332 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [100b15c7-be59-40e9-8074-f62189e7e7cf | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:41:34.332 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [100b15c7-be59-40e9-8074-f62189e7e7cf | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:41:34.333 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [100b15c7-be59-40e9-8074-f62189e7e7cf | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:41:34.340 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [993aee30-59f5-4f81-bc92-a98c6294de62 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:34.340 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [993aee30-59f5-4f81-bc92-a98c6294de62 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:37.337 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:37.337 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:37.338 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:41:37.338 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:41:37.338 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:41:37.338 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:41:37.339 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:41:37.339 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6188a1ee-9358-4134-b06c-779fe0c6e520 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:41:37.346 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7930dfa9-d3d8-4dc1-a539-7bce2ad50669 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:41:37.346 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7930dfa9-d3d8-4dc1-a539-7bce2ad50669 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:41:37.347 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2a7a22d9-c915-4a97-9f18-d34ff8de8979 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:24.335 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:42:24.335 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:24.335 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:24.335 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:42:24.336 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:42:24.328Z +25-03-28 16:42:24.336 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:42:24.336 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:42:24.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:42:24.337 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a0f6d855-e646-4e93-b636-a04bac5226c2 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:42:24.337 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:42:24.337 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:42:24.337 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e92657b0-576a-43f5-8538-7467a48763e0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:42:24.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:42:24.328Z] +25-03-28 16:42:24.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:42:24.336558900Z] +25-03-28 16:42:24.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:24.337 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d0c2c99f-33a6-4032-9245-486976b9d6e0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:42:24.354 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:24.354 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [2744138a-3d82-4fab-85a6-d356e1f1af91 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:24.354 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:24.354 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [2744138a-3d82-4fab-85a6-d356e1f1af91 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:24.354 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:42:24.355 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:42:24.355 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:42:24.355 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:42:24.356 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:42:24.356 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a68fa45d-c08d-4ac1-b455-370f6b9f5dd2 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:42:24.359 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e0a61e20-f044-444f-b867-96715039e527 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:24.359 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e0a61e20-f044-444f-b867-96715039e527 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:24.367 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [1a5dc2f0-1033-48b0-8191-f23f17671ca9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:24.368 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [1a5dc2f0-1033-48b0-8191-f23f17671ca9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:25.329 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9d024f99-14a5-4dc3-b5e2-843ebda4c4c4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:28.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:28.338 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:42:28.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:42:28.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:42:28.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:42:28.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:42:28.339 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b0a3b226-efa0-4201-936a-97c390466101 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:42:28.347 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e90c45b7-805d-4a21-9fb9-b14d1625282f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:28.347 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e90c45b7-805d-4a21-9fb9-b14d1625282f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:29.327 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [905d82f0-aead-4881-b55a-6eb983ff9785 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:31.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:31.340 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:42:31.341 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:42:31.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:42:31.341 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:42:31.342 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:42:31.342 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [0259a5c1-a232-4344-9306-9fa37ab0ab97 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:42:31.350 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a5a8493e-9e33-40a0-b43a-18fa497ad236 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:31.351 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a5a8493e-9e33-40a0-b43a-18fa497ad236 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:33.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [16ee2831-fd82-43f4-9bbf-75d6ac4b3340 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:34.327 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:34.327 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:42:34.328 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:42:34.328 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:42:34.328 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:42:34.328 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:42:34.329 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b0b24a65-3a9e-4fd8-bdf0-5bdc6e0d688b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:42:34.335 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [58ee4682-b8f7-4446-9643-a0fc86a3633b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:34.335 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [58ee4682-b8f7-4446-9643-a0fc86a3633b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:37.327 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b064d7e2-5561-4bbd-9dcc-0baa8d9ed5d8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:37.327 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b064d7e2-5561-4bbd-9dcc-0baa8d9ed5d8 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:37.327 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d69887cd-f9ee-42ec-ac74-7b40c1d7b7b2 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:42:37.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b064d7e2-5561-4bbd-9dcc-0baa8d9ed5d8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:42:37.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b064d7e2-5561-4bbd-9dcc-0baa8d9ed5d8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:42:37.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b064d7e2-5561-4bbd-9dcc-0baa8d9ed5d8 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:42:37.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b064d7e2-5561-4bbd-9dcc-0baa8d9ed5d8 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:42:37.337 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [990f806d-a125-4887-9b9b-a1604244a700 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:42:37.337 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [990f806d-a125-4887-9b9b-a1604244a700 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:42:41.337 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [20bdb761-5a27-4227-a59d-c7756d03f894 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:43:17.360 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@c4ef770] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@369773fd testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@298f0a0b, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@37b52340, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@6b67d99, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@3bbf6abe, [ImportsContextCustomizer@47d0127f key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@5e1fc42f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@4288d98e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@54067fdc, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@f9cc9cce, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@7751b67c], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135) + at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:513) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1351) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1181) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': JPA metamodel must not be empty + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365) + ... 117 common frames omitted +Caused by: java.lang.IllegalArgumentException: JPA metamodel must not be empty + at org.springframework.util.Assert.notEmpty(Assert.java:398) + at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.(JpaMetamodelMappingContext.java:57) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:68) + at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:1) + at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:142) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 124 common frames omitted +25-03-28 16:43:17.422 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.ChannelControllerTest@7b276a08] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@369773fd testClass = com.sprint.mission.discodeit.controller.ChannelControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@298f0a0b, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@37b52340, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@6b67d99, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@3bbf6abe, [ImportsContextCustomizer@47d0127f key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@5e1fc42f, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@4288d98e, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@54067fdc, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@f9cc9cce, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@7751b67c], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-03-28 16:43:21.330 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [1fc164a3-1866-45fc-9f8d-deec325c78a1 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:43:24.345 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:24.346 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:43:24.329Z +25-03-28 16:43:24.347 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:24.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:24.349 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:43:24.349 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3646b261-1839-4858-a3fc-33b2c7df2271 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:43:24.350 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:43:24.350 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:43:24.350 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:43:24.351 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:43:24.351 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3cf2cb38-25b4-4a62-96bd-20ef033d0cb1 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:24.353 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:43:24.353 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:43:24.329Z] +25-03-28 16:43:24.353 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:43:24.347558700Z] +25-03-28 16:43:24.353 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:24.353 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6fafeab2-db8c-43d2-a2a5-be300f78ce11 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:43:24.375 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:24.375 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:24.376 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:43:24.377 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:43:24.377 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:43:24.377 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:43:24.378 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [5a9c337e-fad2-4727-9303-ad1a5da9dcfd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:24.378 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5a9c337e-fad2-4727-9303-ad1a5da9dcfd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:24.378 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:43:24.378 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [737c3ad4-9fe1-4ce0-9bc9-c88488294a88 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:24.388 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2b207b28-2434-40a0-8648-c87b01de68e1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:24.389 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2b207b28-2434-40a0-8648-c87b01de68e1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:24.393 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a550b189-0f2f-4e00-8016-c71fcd1c7d5c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:24.394 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a550b189-0f2f-4e00-8016-c71fcd1c7d5c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:25.327 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [27a0941f-1942-4666-bcd0-b1f3b4ba663b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:28.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:28.329 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:43:28.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:43:28.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:43:28.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:43:28.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:43:28.330 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [75fa4d6f-2108-4d96-8ffc-e36db9df5613 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:28.341 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [92bca1be-41ba-423c-abab-676cb4f9b6f3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:28.341 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [92bca1be-41ba-423c-abab-676cb4f9b6f3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:29.327 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8acda085-1cb8-4ce4-a7bd-b2c328d03653 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:31.328 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:31.329 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:43:31.329 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:43:31.330 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:43:31.330 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:43:31.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:43:31.330 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b68d8773-c3b8-43dc-9167-595815127ed4 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:31.343 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [5294d380-6520-4082-8037-29ad02d1d266 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:31.343 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [5294d380-6520-4082-8037-29ad02d1d266 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:33.329 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [46de2500-f20c-45ac-8e57-e37ce3cf04f6 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:34.337 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:34.338 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:43:34.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:43:34.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:43:34.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:43:34.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:43:34.340 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [4f6df7a1-c407-4d7a-b4a2-41e4c4f7e234 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:34.347 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a128a89d-5259-4fcf-a002-c90328cf5435 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:34.349 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a128a89d-5259-4fcf-a002-c90328cf5435 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:37.334 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0092085e-41b6-417e-8240-e5ed21226d01 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:37.335 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:37.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0092085e-41b6-417e-8240-e5ed21226d01 | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:37.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0092085e-41b6-417e-8240-e5ed21226d01 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:43:37.334141100Z] +25-03-28 16:43:37.335 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:43:37.335 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0092085e-41b6-417e-8240-e5ed21226d01 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:43:37.336 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0092085e-41b6-417e-8240-e5ed21226d01 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:43:37.336 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:43:37.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:43:37.337 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0092085e-41b6-417e-8240-e5ed21226d01 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:43:37.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:43:37.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:43:37.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [65176d27-038c-41e5-bf15-992a095b3858 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:43:37.346 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [00ab6b7c-5914-44da-a15d-b42b1a63e003 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:43:37.346 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [00ab6b7c-5914-44da-a15d-b42b1a63e003 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:43:41.338 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f0f01430-a395-4fff-ac8d-bb5ba3a6f20b | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:44:24.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:24.337 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:44:24.326Z +25-03-28 16:44:24.339 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:44:24.339 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:24.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:44:24.326Z] +25-03-28 16:44:24.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:44:24.338219600Z] +25-03-28 16:44:24.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:24.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [610d30fb-d0a9-4011-a3a3-4e6437babd51 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:44:24.339 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [89ad6362-5132-44ac-b186-623db3a530fc | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:44:24.340 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:24.343 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:44:24.344 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:44:24.345 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:44:24.345 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:44:24.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:44:24.347 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [893aecb9-4cdf-470a-a862-2fad3e99c6dd | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:44:24.362 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3a668dba-4366-487b-acfa-57d226807304 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:24.362 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3a668dba-4366-487b-acfa-57d226807304 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:24.362 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:24.362 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:24.363 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:44:24.364 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:44:24.365 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:44:24.365 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:44:24.366 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:44:24.366 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [27f0c6ba-ee87-4211-ad30-3dbcf743d3af | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:44:24.367 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8e46f982-0f0e-4aa6-966b-e4a8a173f865 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:24.367 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8e46f982-0f0e-4aa6-966b-e4a8a173f865 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:24.379 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3f74ede2-6b26-43c5-bb63-378995a1937e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:24.379 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f74ede2-6b26-43c5-bb63-378995a1937e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:25.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ada50309-1d7d-4376-adde-7b86853e1b09 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:28.337 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:28.337 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:44:28.338 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:44:28.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:44:28.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:44:28.338 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:44:28.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [675351fb-3e0b-4d31-abdc-d4bba31822ed | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:44:28.351 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d456c9ed-09ca-4ffc-92a1-af0be8110192 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:28.351 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d456c9ed-09ca-4ffc-92a1-af0be8110192 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:29.330 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e32f81cc-2be5-4f55-b9ef-bc2a23fc2d1d | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:31.331 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:31.332 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:44:31.332 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:44:31.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:44:31.332 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:44:31.333 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:44:31.333 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [711414a4-9357-4aec-a8a0-3716fcd4e83b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:44:31.339 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8fd7f7fd-15f0-4988-9824-30fd097a33fc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:31.339 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8fd7f7fd-15f0-4988-9824-30fd097a33fc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:33.337 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bef12c65-e42e-49b9-8873-232de162f63a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:34.333 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:34.333 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:44:34.333 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:44:34.333 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:44:34.334 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:44:34.334 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:44:34.334 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a64d87a7-ec88-4adf-9a5a-943e437e18a7 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:44:34.341 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [8ee49c2c-66e9-4817-80a5-51e98bdc671c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:34.341 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [8ee49c2c-66e9-4817-80a5-51e98bdc671c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:37.328 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [8357d12d-8d54-46be-8255-4df2e9f8e003 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:37.328 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0bc35981-db75-4bbc-9926-d95590325faf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:44:37.330 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8357d12d-8d54-46be-8255-4df2e9f8e003 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:44:37.331 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8357d12d-8d54-46be-8255-4df2e9f8e003 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:44:37.331 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [8357d12d-8d54-46be-8255-4df2e9f8e003 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:44:37.331 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8357d12d-8d54-46be-8255-4df2e9f8e003 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:44:37.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [26984dbf-a622-431d-aaf7-637492297339 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:44:37.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [26984dbf-a622-431d-aaf7-637492297339 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:44:41.336 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d211cef5-c3ce-4274-8ffe-21be8b5ae053 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:24.328 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:24.329 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:45:24.330 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:45:24.330 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:45:24.330 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:45:24.332 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:45:24.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f314dcc3-1297-4daa-a389-a43ba29c91db | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:45:24.336 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b23f1580-b320-4925-8d24-7ca9ed7b1834 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 16:45:24.336 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:45:24.338 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:45:24.338 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:24.338 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:45:24.323Z +25-03-28 16:45:24.341 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:45:24.341 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:45:24.323Z] +25-03-28 16:45:24.341 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:45:24.339999100Z] +25-03-28 16:45:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:24.342 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a50f286a-3bd1-4c3a-b789-7f1dccfc7f8c | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:45:24.348 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [28379de2-ae08-4ab3-8ecc-26f7fad26c96 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:24.348 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [28379de2-ae08-4ab3-8ecc-26f7fad26c96 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:24.354 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:24.354 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:24.355 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:45:24.355 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f0df55ba-15e9-4037-90d4-04c92527ecbe | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:24.355 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:45:24.355 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f0df55ba-15e9-4037-90d4-04c92527ecbe | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:24.355 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:45:24.356 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:45:24.356 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:45:24.356 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d601bfc7-138d-4469-bfa3-7d192e1e5fd6 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:45:24.365 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4989e208-f8cf-4fc3-8787-ca7511298f50 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:24.365 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4989e208-f8cf-4fc3-8787-ca7511298f50 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:25.334 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [46af83c7-e689-4a37-af9f-8196802f60bb | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:28.328 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:28.329 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:45:28.330 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:45:28.330 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:45:28.330 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:45:28.330 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:45:28.330 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c0e73c49-8c5b-4a15-8c7a-4e00aee4f66c | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:45:28.338 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e01c1ecf-423b-4874-b5aa-286393f8525f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:28.339 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e01c1ecf-423b-4874-b5aa-286393f8525f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:29.326 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [78858df8-f4fe-4ed3-bc3f-8398ba527593 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:31.338 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:31.338 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:45:31.339 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:45:31.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:45:31.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:45:31.340 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:45:31.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [af8421e9-fa30-41f6-9de2-c5edb62438a0 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:45:31.349 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ca653f08-c872-4f93-9558-9b34e8cca0e2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:31.349 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ca653f08-c872-4f93-9558-9b34e8cca0e2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:33.333 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f48f983a-90ef-49d0-8c6f-f5ac01b2bfe8 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:34.338 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:34.338 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:45:34.339 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:45:34.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:45:34.339 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:45:34.340 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:45:34.340 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [62d979cf-e591-432d-bed3-e0bd18e51670 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:45:34.347 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4b3a4686-c186-4463-b2ff-5a2c6f0395c3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:34.347 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4b3a4686-c186-4463-b2ff-5a2c6f0395c3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:37.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8b64620c-8f23-4de6-9a39-bbae63017cde | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:37.334 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8b64620c-8f23-4de6-9a39-bbae63017cde | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:37.334 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d88ded92-8117-4e1f-a4b4-e45ed9e80ddd | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:45:37.335 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d88ded92-8117-4e1f-a4b4-e45ed9e80ddd | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:45:37.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8b64620c-8f23-4de6-9a39-bbae63017cde | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:45:37.335 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d88ded92-8117-4e1f-a4b4-e45ed9e80ddd | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:45:37.335 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8b64620c-8f23-4de6-9a39-bbae63017cde | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:45:37.336 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8b64620c-8f23-4de6-9a39-bbae63017cde | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:45:37.336 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8b64620c-8f23-4de6-9a39-bbae63017cde | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:45:37.349 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [1ccfc73b-0a6d-405e-89e9-48ebe780ed00 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:45:37.349 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [1ccfc73b-0a6d-405e-89e9-48ebe780ed00 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:45:41.328 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7619d9cc-1f8d-4039-b647-44655c8b06c4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:20.486 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:20.486 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [8db9c0fe-9d28-40d9-9e61-29b8478b28e4] +25-03-28 16:46:20.702 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 16:46:21.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [3dfd7024-5719-495a-bbb4-6707a889a935 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-28 16:46:24.569 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:24.569 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:24.569 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:24.570 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:46:24.570 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: a64b7564-7841-4168-91c2-fb3938ffaee4, newLastActiveAt: 2025-03-28T07:46:24.322Z +25-03-28 16:46:24.571 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:24.571 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:24.571 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-28 16:46:24.571 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:46:24.571 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T07:46:24.322Z] +25-03-28 16:46:24.571 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:46:24.570042300Z] +25-03-28 16:46:24.572 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (3:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:24.572 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [14ccfa6e-5883-4466-8317-e0017d6144f0 | PATCH | /api/users/a64b7564-7841-4168-91c2-fb3938ffaee4/userStatus] - binding parameter (4:UUID) <- [49a0e37d-bff4-42e7-ab2e-4910e9d451ea] +25-03-28 16:46:24.572 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:46:24.572 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1b9edddc-e10a-4c14-b652-6bb1563c0199 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:24.581 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:24.582 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:24.582 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:46:24.582 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [5c133047-acb7-414b-882f-67c605e55165 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:24.582 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5c133047-acb7-414b-882f-67c605e55165 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:24.583 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:24.583 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:24.583 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:46:24.583 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:46:24.584 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f48adfac-c4b9-406b-a786-a6449bbf487b | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:24.591 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e1b7ec65-bb6b-45c1-b22a-908fc4908ea7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:24.591 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e1b7ec65-bb6b-45c1-b22a-908fc4908ea7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:24.598 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4c7f5987-9478-47cc-9efe-00ac275f6406 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:24.598 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4c7f5987-9478-47cc-9efe-00ac275f6406 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:25.333 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [95f99519-6397-4acf-827c-2f8771b177ee | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:28.327 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:28.328 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:46:28.329 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:28.329 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:28.329 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:46:28.330 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:46:28.330 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [adc2bb9b-76a9-4b49-8072-91b02d75a196 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:28.335 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [01889373-8ca7-4d2b-91dd-204a4d8a900e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:28.335 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [01889373-8ca7-4d2b-91dd-204a4d8a900e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:29.326 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d92d2037-41be-4d79-9f34-ccc971f59718 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:31.328 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:31.329 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:46:31.329 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:31.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:31.329 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:46:31.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:46:31.330 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e5e70145-f2c1-4536-8980-108c844ae0e9 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:31.335 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7b1c9561-d287-41c9-8f28-e6cdd888ba4e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:31.335 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7b1c9561-d287-41c9-8f28-e6cdd888ba4e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:31.890 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 16:46:32.068 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Starting ChannelControllerTest using Java 17.0.14 with PID 26040 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 16:46:32.070 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 16:46:33.332 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [d1e125ed-e93f-4bcc-a00c-64ff7a91ded6 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:34.326 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:34.326 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:46:34.327 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:34.327 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:34.327 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:46:34.327 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:46:34.327 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6eb62de2-b227-4c2f-a358-40956fb82815 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:34.333 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3f8af9bf-dbec-461d-b788-0ae04a4cb613 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:34.333 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3f8af9bf-dbec-461d-b788-0ae04a4cb613 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:36.713 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 16:46:37.331 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a140be86-5bfd-408c-8219-2f17cf8382a4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:37.331 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a140be86-5bfd-408c-8219-2f17cf8382a4 | GET | /api/messages] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:37.331 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:37.331 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a140be86-5bfd-408c-8219-2f17cf8382a4 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T07:46:37.331390900Z] +25-03-28 16:46:37.331 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a140be86-5bfd-408c-8219-2f17cf8382a4 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-28 16:46:37.332 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - [채널 조회 성공] id: a64b7564-7841-4168-91c2-fb3938ffaee4 +25-03-28 16:46:37.332 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a140be86-5bfd-408c-8219-2f17cf8382a4 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-28 16:46:37.332 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a140be86-5bfd-408c-8219-2f17cf8382a4 | GET | /api/messages] - binding parameter (1:UUID) <- [0607d089-8469-4f7c-bf8c-3356550f43a6] +25-03-28 16:46:37.332 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 16:46:37.332 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 16:46:37.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-28 16:46:37.333 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 16:46:37.333 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [914641e7-37ee-4e17-aa36-90a020db7376 | GET | /api/channels] - binding parameter (1:UUID) <- [a6e45f5f-bb7f-42ef-91f6-2b1e75a55676] +25-03-28 16:46:37.340 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [1a4efb4e-7bb0-4a82-807e-94dab28cfb3f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-28 16:46:37.340 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [1a4efb4e-7bb0-4a82-807e-94dab28cfb3f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [a64b7564-7841-4168-91c2-fb3938ffaee4] +25-03-28 16:46:37.897 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext [ | | ] - Initializing Spring TestDispatcherServlet '' +25-03-28 16:46:37.898 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Initializing Servlet '' +25-03-28 16:46:37.900 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-28 16:46:38.004 [Test worker] INFO com.sprint.mission.discodeit.controller.ChannelControllerTest [ | | ] - Started ChannelControllerTest in 7.607 seconds (process running for 11.318) +25-03-28 16:46:41.336 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bf131429-9469-4cc0-bbac-902f0af0b0ec | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-28 17:09:39.121 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo@email.com] +25-03-28 17:09:39.122 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-03-28 17:09:39.158 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-28 17:09:39.159 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo] +25-03-28 17:09:39.160 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-03-28 17:09:39.309 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 17:09:39.310 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.290202200Z] +25-03-28 17:09:39.310 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 17:09:39.310 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-03-28 17:09:39.311 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-03-28 17:09:39.311 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.290202200Z] +25-03-28 17:09:39.311 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 17:09:39.312 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [f16cce1b-b95d-4eeb-b053-f7307c9128bc] +25-03-28 17:09:39.315 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 17:09:39.316 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.292204Z] +25-03-28 17:09:39.316 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.290202200Z] +25-03-28 17:09:39.317 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.292204Z] +25-03-28 17:09:39.317 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [f16cce1b-b95d-4eeb-b053-f7307c9128bc] +25-03-28 17:09:39.317 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [b8980801-324b-4e36-87b9-23c4e012a05e] +25-03-28 17:09:39.319 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-28 17:09:39.381 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 17:09:39.382 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.374245800Z] +25-03-28 17:09:39.383 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-28 17:09:39.383 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-28 17:09:39.383 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-03-28 17:09:39.384 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:09:39.374245800Z] +25-03-28 17:09:39.384 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [rex] +25-03-28 17:09:39.385 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [6e341fb3-7b3c-4842-83ee-8eb6af829425] +25-03-28 17:09:39.388 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-28 17:09:39.390 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [rex] +25-03-28 17:09:39.430 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:09:54.455 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 17:09:54.680 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - Starting ChannelRepositoryTest using Java 17.0.14 with PID 16072 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 17:09:54.683 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 17:09:56.208 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 17:09:56.560 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 311 ms. Found 6 JPA repository interfaces. +25-03-28 17:09:56.760 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 17:09:57.380 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:e823b129-519d-4fc9-b93a-f6d6bc17cede;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 17:09:58.621 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 17:09:58.860 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 17:09:58.991 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 17:10:00.038 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 17:10:00.297 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@3aac686f'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 17:10:02.951 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 17:10:02.982 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-28 17:10:02.988 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-28 17:10:02.992 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-28 17:10:02.994 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-28 17:10:02.995 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-28 17:10:02.996 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-28 17:10:02.998 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-28 17:10:03.011 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 17:10:03.017 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 17:10:03.022 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 17:10:03.026 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 17:10:03.030 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 17:10:03.035 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 17:10:03.041 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 17:10:03.046 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 17:10:03.049 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 17:10:03.053 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 17:10:03.057 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 17:10:03.061 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 17:10:03.065 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 17:10:03.069 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 17:10:03.072 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 17:10:03.084 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:10:03.890 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 17:10:05.115 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - Started ChannelRepositoryTest in 12.368 seconds (process running for 16.418) +25-03-28 17:10:06.134 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:06.143 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:05.940661100Z] +25-03-28 17:10:06.152 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [전체 공지] +25-03-28 17:10:06.153 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [공지사항] +25-03-28 17:10:06.153 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 17:10:06.153 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:05.940661100Z] +25-03-28 17:10:06.153 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [920a92b4-bd62-423e-ad9a-ce9c3b8c21c6] +25-03-28 17:10:06.175 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:06.176 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:05.991386900Z] +25-03-28 17:10:06.177 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [잡담방] +25-03-28 17:10:06.177 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [자유채팅] +25-03-28 17:10:06.178 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 17:10:06.178 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:05.991386900Z] +25-03-28 17:10:06.178 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [cf5ba7a9-27fa-4eac-8ebb-aa6130fd375d] +25-03-28 17:10:06.180 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:06.181 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:05.991386900Z] +25-03-28 17:10:06.182 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [null] +25-03-28 17:10:06.183 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [null] +25-03-28 17:10:06.183 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PRIVATE] +25-03-28 17:10:06.184 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:05.991386900Z] +25-03-28 17:10:06.184 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [d4c6cfda-b631-4817-a6ca-ed9cb1e931c5] +25-03-28 17:10:06.208 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-28 17:10:06.213 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-28 17:10:06.214 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [d4c6cfda-b631-4817-a6ca-ed9cb1e931c5] +25-03-28 17:10:06.441 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:10:19.117 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 17:10:19.346 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 12436 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 17:10:19.349 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-03-28 17:10:20.751 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 17:10:21.058 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 262 ms. Found 6 JPA repository interfaces. +25-03-28 17:10:21.235 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-03-28 17:10:21.756 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:367ae365-3695-45f7-95f5-05edb25ba605;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-03-28 17:10:23.187 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 17:10:23.433 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 17:10:23.566 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 17:10:24.703 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 17:10:24.950 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@3aac686f'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 17:10:27.395 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 17:10:27.429 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-28 17:10:27.435 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-28 17:10:27.438 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-28 17:10:27.439 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-28 17:10:27.441 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-28 17:10:27.443 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-28 17:10:27.444 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-28 17:10:27.456 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-28 17:10:27.461 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-28 17:10:27.468 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-28 17:10:27.471 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-28 17:10:27.475 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-28 17:10:27.479 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-28 17:10:27.481 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-28 17:10:27.487 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-28 17:10:27.490 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-28 17:10:27.494 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-28 17:10:27.498 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-28 17:10:27.501 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-28 17:10:27.503 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-28 17:10:27.505 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-28 17:10:27.509 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-28 17:10:27.521 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:10:28.303 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 17:10:29.396 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 12.022 seconds (process running for 15.715) +25-03-28 17:10:30.405 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.421 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.199844500Z] +25-03-28 17:10:30.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [설명] +25-03-28 17:10:30.433 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [test] +25-03-28 17:10:30.438 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 17:10:30.439 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.199844500Z] +25-03-28 17:10:30.439 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [37b2bc58-6429-4a1c-b28a-e3e18709fca4] +25-03-28 17:10:30.461 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.463 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.241527Z] +25-03-28 17:10:30.463 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 17:10:30.464 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [pass] +25-03-28 17:10:30.464 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-03-28 17:10:30.464 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.241527Z] +25-03-28 17:10:30.465 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 17:10:30.465 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [08105e1b-0255-4c72-9264-4a2925f84e3a] +25-03-28 17:10:30.466 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 17:10:30.469 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.256107900Z] +25-03-28 17:10:30.470 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.253033600Z] +25-03-28 17:10:30.470 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.256107900Z] +25-03-28 17:10:30.470 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [08105e1b-0255-4c72-9264-4a2925f84e3a] +25-03-28 17:10:30.471 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [55849aaa-5c48-40b9-bac7-b774093fbad6] +25-03-28 17:10:30.472 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [08105e1b-0255-4c72-9264-4a2925f84e3a] +25-03-28 17:10:30.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [37b2bc58-6429-4a1c-b28a-e3e18709fca4] +25-03-28 17:10:30.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Hi!] +25-03-28 17:10:30.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.262119600Z] +25-03-28 17:10:30.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.262119600Z] +25-03-28 17:10:30.474 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [c7a4ae91-5642-43bf-95df-08244bc33ea7] +25-03-28 17:10:30.476 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.477 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [08105e1b-0255-4c72-9264-4a2925f84e3a] +25-03-28 17:10:30.478 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [37b2bc58-6429-4a1c-b28a-e3e18709fca4] +25-03-28 17:10:30.478 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Latest] +25-03-28 17:10:30.478 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.283248100Z] +25-03-28 17:10:30.478 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.283248100Z] +25-03-28 17:10:30.479 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [51a6db78-2894-4bb8-9018-0fccce71e6b4] +25-03-28 17:10:30.504 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-28 17:10:30.506 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [37b2bc58-6429-4a1c-b28a-e3e18709fca4] +25-03-28 17:10:30.721 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.723 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.677887200Z] +25-03-28 17:10:30.724 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [설명] +25-03-28 17:10:30.724 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [test] +25-03-28 17:10:30.725 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 17:10:30.725 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.677887200Z] +25-03-28 17:10:30.725 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [c795ab54-a787-4987-a213-1107a76ca474] +25-03-28 17:10:30.729 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.730 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.679859900Z] +25-03-28 17:10:30.730 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 17:10:30.730 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [pass] +25-03-28 17:10:30.730 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-03-28 17:10:30.731 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.679859900Z] +25-03-28 17:10:30.731 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 17:10:30.732 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [7cb0293a-981b-480d-be0e-7562e3929887] +25-03-28 17:10:30.733 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 17:10:30.734 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.680911800Z] +25-03-28 17:10:30.735 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.679859900Z] +25-03-28 17:10:30.742 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.680911800Z] +25-03-28 17:10:30.742 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [7cb0293a-981b-480d-be0e-7562e3929887] +25-03-28 17:10:30.742 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [11708cb9-5ce2-4b40-a78d-f150ba2d9466] +25-03-28 17:10:30.745 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.745 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [7cb0293a-981b-480d-be0e-7562e3929887] +25-03-28 17:10:30.745 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [c795ab54-a787-4987-a213-1107a76ca474] +25-03-28 17:10:30.747 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Msg1] +25-03-28 17:10:30.747 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.681902300Z] +25-03-28 17:10:30.748 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.681902300Z] +25-03-28 17:10:30.748 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [bd6f94c4-0371-450e-b70f-ffaa60bf8968] +25-03-28 17:10:30.750 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.751 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [7cb0293a-981b-480d-be0e-7562e3929887] +25-03-28 17:10:30.751 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [c795ab54-a787-4987-a213-1107a76ca474] +25-03-28 17:10:30.752 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Msg2] +25-03-28 17:10:30.752 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.682896600Z] +25-03-28 17:10:30.753 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.682896600Z] +25-03-28 17:10:30.753 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [d2b7c69c-f8f8-48fc-9263-5002b7caa69b] +25-03-28 17:10:30.755 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + where + m1_0.channel_id=? +25-03-28 17:10:30.755 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [c795ab54-a787-4987-a213-1107a76ca474] +25-03-28 17:10:30.793 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-03-28 17:10:30.793 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [bd6f94c4-0371-450e-b70f-ffaa60bf8968] +25-03-28 17:10:30.796 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-03-28 17:10:30.797 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [d2b7c69c-f8f8-48fc-9263-5002b7caa69b] +25-03-28 17:10:30.797 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 +25-03-28 17:10:30.831 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.832 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.821109300Z] +25-03-28 17:10:30.832 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [설명] +25-03-28 17:10:30.832 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [test] +25-03-28 17:10:30.832 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-28 17:10:30.832 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.821109300Z] +25-03-28 17:10:30.834 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [702fbad4-6900-45a7-ad8c-c66728ba36e4] +25-03-28 17:10:30.836 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.837 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.821109300Z] +25-03-28 17:10:30.837 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-03-28 17:10:30.837 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [pass] +25-03-28 17:10:30.837 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-03-28 17:10:30.838 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.821109300Z] +25-03-28 17:10:30.838 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-03-28 17:10:30.838 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [e3e1f014-577c-487a-bea9-89674651e84f] +25-03-28 17:10:30.839 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-28 17:10:30.840 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.822110Z] +25-03-28 17:10:30.840 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.822110Z] +25-03-28 17:10:30.840 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.822110Z] +25-03-28 17:10:30.840 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [e3e1f014-577c-487a-bea9-89674651e84f] +25-03-28 17:10:30.840 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [a5e83651-f5cd-434f-8bc3-bc05db6fe892] +25-03-28 17:10:30.841 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.841 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [e3e1f014-577c-487a-bea9-89674651e84f] +25-03-28 17:10:30.842 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [702fbad4-6900-45a7-ad8c-c66728ba36e4] +25-03-28 17:10:30.842 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Hello 1] +25-03-28 17:10:30.842 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.822110Z] +25-03-28 17:10:30.842 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.822110Z] +25-03-28 17:10:30.842 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [9915615d-1823-4e9a-acd0-275b01529253] +25-03-28 17:10:30.843 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Message */insert + into + messages (author_id, channel_id, content, created_at, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-28 17:10:30.843 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [e3e1f014-577c-487a-bea9-89674651e84f] +25-03-28 17:10:30.843 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [702fbad4-6900-45a7-ad8c-c66728ba36e4] +25-03-28 17:10:30.843 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Hello 2] +25-03-28 17:10:30.843 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.823142200Z] +25-03-28 17:10:30.844 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-28T08:10:30.823142200Z] +25-03-28 17:10:30.844 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [7167cbd0-83c3-4a56-9be8-ab0dd08d68b6] +25-03-28 17:10:30.845 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id=:channelId + AND m.createdAt < :createdAt */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:194) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) + at com.sprint.mission.discodeit.DiscodeitApplication.main(DiscodeitApplication.java:11) +Caused by: org.postgresql.util.PSQLException: ġ��������: ����� "${DB_USERNAME}"�� password ������ �����߽��ϴ� + at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:711) + at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:213) + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:268) + at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54) + at org.postgresql.jdbc.PgConnection.(PgConnection.java:273) + at org.postgresql.Driver.makeConnection(Driver.java:446) + at org.postgresql.Driver.connect(Driver.java:298) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:137) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:98) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:126) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:467) + at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:61) + ... 35 common frames omitted +25-03-28 17:30:03.880 [main] ERROR org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Failed to initialize JPA EntityManagerFactory: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) +25-03-28 17:30:03.881 [main] WARN org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext [ | | ] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) +25-03-28 17:30:03.890 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Stopping service [Tomcat] +25-03-28 17:30:03.942 [main] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger [ | | ] - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-03-28 17:30:03.969 [main] ERROR org.springframework.boot.SpringApplication [ | | ] - Application run failed +org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1802) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) + at com.sprint.mission.discodeit.DiscodeitApplication.main(DiscodeitApplication.java:11) +Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:276) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:238) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:215) + at org.hibernate.boot.model.relational.Database.(Database.java:45) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:226) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:194) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:171) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1431) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1502) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1849) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1798) + ... 15 common frames omitted +Caused by: org.hibernate.HibernateException: Unable to determine Dialect without JDBC metadata (please set 'jakarta.persistence.jdbc.url' for common cases or 'hibernate.dialect' when a custom Dialect implementation must be provided) + at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:191) + at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:87) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentWithDefaults(JdbcEnvironmentInitiator.java:181) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:392) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:129) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:81) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:130) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) + ... 30 common frames omitted +25-03-28 17:30:29.564 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 17:30:29.637 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 15684 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 17:30:29.639 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "prod" +25-03-28 17:30:31.154 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 17:30:31.255 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 92 ms. Found 6 JPA repository interfaces. +25-03-28 17:30:32.182 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 80 (http) +25-03-28 17:30:32.197 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-80"] +25-03-28 17:30:32.200 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-28 17:30:32.200 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 17:30:32.281 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-28 17:30:32.282 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2595 ms +25-03-28 17:30:32.580 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-28 17:30:32.828 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@120d6cbf +25-03-28 17:30:32.830 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-28 17:30:32.930 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 17:30:33.003 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 17:30:33.043 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 17:30:33.457 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 17:30:33.600 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 17.4 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 17:30:33.608 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry [ | | ] - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@18bc1064) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@3cab07dd) +25-03-28 17:30:33.609 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry [ | | ] - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@68f264bf) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@77988c45) +25-03-28 17:30:35.025 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 17:30:35.030 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:30:35.452 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 17:30:36.388 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 17:30:37.915 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 17:30:38.025 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-80"] +25-03-28 17:30:38.040 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 80 (http) with context path '/' +25-03-28 17:30:38.059 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.221 seconds (process running for 10.038) +25-03-28 17:30:38.112 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.23.140:80/actuator, healthUrl=http://10.3.23.140:80/actuator/health, serviceUrl=http://10.3.23.140:80/) at spring-boot-admin ([${SPRING_BOOT_ADMIN_CLIENT_URL}/instances]): Not enough variable values available to expand 'SPRING_BOOT_ADMIN_CLIENT_URL'. Further attempts are logged on DEBUG level +java.lang.IllegalArgumentException: Not enough variable values available to expand 'SPRING_BOOT_ADMIN_CLIENT_URL' + at org.springframework.web.util.UriComponents$VarArgsTemplateVariables.getValue(UriComponents.java:370) + at org.springframework.web.util.UriComponents.expandUriComponent(UriComponents.java:263) + at org.springframework.web.util.HierarchicalUriComponents$FullPathComponent.expand(HierarchicalUriComponents.java:928) + at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:440) + at org.springframework.web.util.HierarchicalUriComponents.expandInternal(HierarchicalUriComponents.java:53) + at org.springframework.web.util.UriComponents.expand(UriComponents.java:172) + at org.springframework.web.util.DefaultUriBuilderFactory$DefaultUriBuilder.build(DefaultUriBuilderFactory.java:459) + at org.springframework.web.util.DefaultUriBuilderFactory.expand(DefaultUriBuilderFactory.java:204) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.uri(DefaultRestClient.java:317) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.uri(DefaultRestClient.java:288) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:41) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +25-03-28 17:30:38.521 [RMI TCP Connection(3)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 17:30:38.522 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-28 17:30:38.525 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-28 17:32:34.305 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 17:32:34.579 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-28 17:32:34.586 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:32:34.589 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-28 17:32:34.597 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-28 17:32:38.077 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 17:32:38.162 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 24144 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 17:32:38.164 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "prod" +25-03-28 17:32:39.771 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 17:32:39.902 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 119 ms. Found 6 JPA repository interfaces. +25-03-28 17:32:40.909 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 80 (http) +25-03-28 17:32:40.922 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-80"] +25-03-28 17:32:40.925 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-28 17:32:40.925 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 17:32:41.007 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-28 17:32:41.008 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2775 ms +25-03-28 17:32:41.311 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-28 17:32:41.551 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@120d6cbf +25-03-28 17:32:41.553 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-28 17:32:41.665 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 17:32:41.737 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 17:32:41.786 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 17:32:42.207 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 17:32:42.311 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 17.4 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 17:32:42.318 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry [ | | ] - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@18bc1064) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@3cab07dd) +25-03-28 17:32:42.319 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry [ | | ] - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@68f264bf) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@77988c45) +25-03-28 17:32:43.891 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 17:32:43.896 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:32:44.292 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 17:32:45.292 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 17:32:46.867 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 17:32:46.955 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-80"] +25-03-28 17:32:46.975 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 80 (http) with context path '/' +25-03-28 17:32:46.994 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.796 seconds (process running for 10.74) +25-03-28 17:32:47.278 [RMI TCP Connection(3)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 17:32:47.278 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-28 17:32:47.280 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-28 17:32:47.268 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.23.140:80/actuator, healthUrl=http://10.3.23.140:80/actuator/health, serviceUrl=http://10.3.23.140:80/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-28 17:33:11.227 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 17:33:22.065 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-28 17:33:22.149 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 26028 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-28 17:33:22.150 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "prod" +25-03-28 17:33:23.773 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-28 17:33:23.870 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 85 ms. Found 6 JPA repository interfaces. +25-03-28 17:33:24.813 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 80 (http) +25-03-28 17:33:24.830 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-80"] +25-03-28 17:33:24.832 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-28 17:33:24.832 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-28 17:33:24.923 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-28 17:33:24.924 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2712 ms +25-03-28 17:33:25.227 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-28 17:33:25.443 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@5d297d4d +25-03-28 17:33:25.446 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-28 17:33:25.548 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-28 17:33:25.621 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-28 17:33:25.666 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-28 17:33:26.041 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-28 17:33:26.146 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 17.4 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-28 17:33:26.157 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry [ | | ] - addDescriptor(2003, org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@74919649) replaced previous registration(org.hibernate.type.descriptor.sql.internal.ArrayDdlTypeImpl@7d07e04e) +25-03-28 17:33:26.158 [main] DEBUG org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry [ | | ] - addDescriptor(6, org.hibernate.type.descriptor.sql.internal.CapacityDependentDdlType@599310ab) replaced previous registration(org.hibernate.type.descriptor.sql.internal.DdlTypeImpl@770cbe5d) +25-03-28 17:33:27.567 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-28 17:33:27.570 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:33:27.932 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-28 17:33:28.912 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-28 17:33:30.184 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-28 17:33:30.267 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-80"] +25-03-28 17:33:30.279 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 80 (http) with context path '/' +25-03-28 17:33:30.300 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.092 seconds (process running for 9.99) +25-03-28 17:33:30.727 [registrationTask1] INFO de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Application registered itself as 8713fa41ba39 +25-03-28 17:33:30.787 [RMI TCP Connection(3)-10.3.23.140] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-28 17:33:30.787 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-28 17:33:30.790 [RMI TCP Connection(3)-10.3.23.140] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 3 ms +25-03-28 17:33:52.961 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [e5bba75a-d073-4776-abb8-21c3c6da8e68 | POST | /api/auth/login] - [로그인 시도] username: 우디 +25-03-28 17:33:53.267 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [e5bba75a-d073-4776-abb8-21c3c6da8e68 | POST | /api/auth/login] - [로그인 성공] username: 우디 +25-03-28 17:33:53.408 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [cb31c18f-1e47-4080-9d47-523dad80be24 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:33:53.425 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [33cab000-e33d-4cba-9dca-2e7dba86d642 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:33:53.426 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [744995af-dda3-4ccc-90af-5e817c9db211 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:33:53.428 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [75b54a6f-d127-41f4-910d-9c9cdd70c514 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:33:53.438 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [33cab000-e33d-4cba-9dca-2e7dba86d642 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:33:53.405Z +25-03-28 17:33:53.438 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [744995af-dda3-4ccc-90af-5e817c9db211 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:33:53.407Z +25-03-28 17:33:53.461 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3713caa4-3196-40ad-8e71-341bc6085149 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:33:53.470 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [757e2c6d-c59b-425c-ac95-acf019be4c9b | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:33:53.480 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9879166b-540f-4d51-8add-671663178a64 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:33:53.480 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [c7116ef8-cc15-438d-a601-2480f1264831 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:33:53.484 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [e8058174-02fc-4596-bf6c-f59b5d7013ec | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce/download] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:33:53.493 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [54c88313-468e-4aaa-a9f6-e86c5fa4f4b0 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:33:53.620 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ecdb5eec-cbb7-48be-b51e-dab14b21e71b | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:33:56.622 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [551cbb85-4dd4-495b-a485-7ed8f52bf499 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:33:59.621 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bb631c4e-0fa8-459d-8ef9-8fab944286d1 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:34:02.618 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [83de3b4f-3d72-459d-a8b8-54baca71e2da | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:34:05.628 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0f03210e-fbf2-41ba-8c76-2ee64aa70066 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:34:08.220 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a5dada29-7136-4981-9943-b6cfc3c0bca9 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:34:08.227 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a5dada29-7136-4981-9943-b6cfc3c0bca9 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:34:08.214Z +25-03-28 17:34:23.109 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [156255d1-f8f1-4110-9903-807a65085db5 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-28 17:34:23.123 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [156255d1-f8f1-4110-9903-807a65085db5 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-28 17:34:23.152 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [156255d1-f8f1-4110-9903-807a65085db5 | POST | /api/users] - [회원 생성 완료] username: rex, id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:23.182 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f6b44d6b-64bc-4aa1-9ea5-c53a1243c2c0 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:23.182 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4c7ab85-707f-4bdd-a06a-46c1a49cc91e | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:23.188 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4c7ab85-707f-4bdd-a06a-46c1a49cc91e | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:34:23.177Z +25-03-28 17:34:23.191 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f6b44d6b-64bc-4aa1-9ea5-c53a1243c2c0 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:34:23.178Z +25-03-28 17:34:23.215 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [1ed93998-88e2-44ef-bd14-6a848d47594a | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:34:23.219 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3531aaa5-d953-42fa-bf05-5bbfde42c3bc | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce/download] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:34:23.221 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a51b4bd3-0509-4413-b575-da6691f872ce | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:23.227 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [1819b3ce-29c0-41dd-8541-85aa7e76fd29 | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:34:23.230 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [2bdc3bb8-19fc-4f57-ab6f-056f8d915138 | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920/download] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:34:23.237 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [9a01a455-f538-497d-8cd8-c0fa973db96b | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:34:23.242 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [81cae9d0-4bc6-4a4a-a93b-ea5cbe9b7691 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:26.249 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fe123aec-18c7-4f30-afb5-52f67130220a | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:29.340 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b314665d-e418-445d-a18a-cf13d1a108fe | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:32.337 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [da6b5430-f7c4-4a77-ba9a-a3cbe45cfe6a | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:35.347 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [50a650a2-54fa-42f5-8189-b3bb1cb1c74e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:38.331 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [17579217-8a5e-42c8-9d20-f63fa9bc8057 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:41.338 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [514ee8d6-9325-4231-b56f-4eb50a230b5b | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:44.334 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e5866e3f-fd0f-4335-9fc4-983d13fb90b5 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:47.341 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [08e35fff-0928-43b9-8a86-d37b1b40d949 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:50.247 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fd3ea995-f486-4efa-b147-a32a223a8513 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:51.107 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c5d5505d-50ad-4b73-a2e6-ab10f0aec2fe | POST | /api/channels/private] - [개인 채널 생성 완료] id: 7c8e5324-f30f-4a43-9920-a8f211d0aca3 +25-03-28 17:34:51.133 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c5d5505d-50ad-4b73-a2e6-ab10f0aec2fe | POST | /api/channels/private] - [읽기 정보 생성 완료] count: 2 +25-03-28 17:34:51.196 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [08aef88d-899a-4ff6-b4a6-821e42fa76c4 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:53.198 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [cffdd989-f8a7-48ef-bbc2-63de27a31e35 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:53.202 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [cffdd989-f8a7-48ef-bbc2-63de27a31e35 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:34:53.185Z +25-03-28 17:34:53.245 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1c6073ef-2e20-4f74-a21c-ac33dbf108da | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:56.254 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [597ffb01-f131-4aa5-877b-94d970ff3805 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:34:57.875 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [afa83d3a-1f82-4523-a018-7db8a303a66b | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 11f3a175-9a56-4974-85d8-641be06ed02e +25-03-28 17:34:57.930 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [c3fe9b02-875d-4506-9244-8fc6ddf7b17f | PATCH | /api/readStatuses/9813c110-4cd8-4312-a7c1-7aeb384805f1] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: 9813c110-4cd8-4312-a7c1-7aeb384805f1 +25-03-28 17:34:59.245 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [eb4a717b-27a1-47e9-b9ec-40f7fdff1472 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:01.865 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4fd29769-79c8-4e6f-9c2f-b5b6b41f322a | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:01.869 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4fd29769-79c8-4e6f-9c2f-b5b6b41f322a | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:35:01.854Z +25-03-28 17:35:07.383 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [11c31028-5516-4219-bee2-803be5bf2d41 | POST | /api/auth/login] - [로그인 시도] username: 우디 +25-03-28 17:35:07.389 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [11c31028-5516-4219-bee2-803be5bf2d41 | POST | /api/auth/login] - [로그인 성공] username: 우디 +25-03-28 17:35:07.419 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0bff098c-08a8-4000-8bea-dd36deb711f4 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:07.422 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0bff098c-08a8-4000-8bea-dd36deb711f4 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:35:07.412Z +25-03-28 17:35:07.422 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d3123742-ae4f-417f-a57a-e563eae56598 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:07.426 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fce057ba-cae9-40b5-845b-07a4d42e1845 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:07.431 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d3123742-ae4f-417f-a57a-e563eae56598 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:35:07.412Z +25-03-28 17:35:07.446 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a2b3b528-cafd-4e97-af2e-e4adae3b7ab2 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:07.465 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [72755f85-704d-4290-a000-b1d1438393be | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:10.464 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e6cbfd0e-91e6-4803-966b-2fecff76839b | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:13.470 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4412935d-eadd-4ee6-a648-08afcb410e0d | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:16.461 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [eb04a261-bf21-4e2f-a6aa-e4555df6a23c | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:17.260 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [520aae4a-0b8e-446e-b8bd-5ccef9ae684d | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 51eac7d4-d39e-40d4-a9f4-ecd7bb0757de +25-03-28 17:35:17.279 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [68d90220-a161-4f7e-9bbb-8cb21b5141a0 | PATCH | /api/readStatuses/e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96 +25-03-28 17:35:19.465 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cf7ee802-a2f8-47b4-8ef9-ff82823d8dd7 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:20.014 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ece86a01-0396-4506-9c95-9497ba1b5a8d | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:35:20.021 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ece86a01-0396-4506-9c95-9497ba1b5a8d | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:35:20.008Z +25-03-28 17:35:23.403 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [c29e7d05-c554-4d92-98e2-bb2d42f4397f | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-28 17:35:23.411 [http-nio-80-exec-8] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [c29e7d05-c554-4d92-98e2-bb2d42f4397f | POST | /api/auth/login] - [로그인 실패} 잘못된 비밀번호 입니다: rex +25-03-28 17:35:24.764 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [9fdc4d4d-175e-4320-87ea-de48c5ff7d8c | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-28 17:35:24.770 [http-nio-80-exec-7] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [9fdc4d4d-175e-4320-87ea-de48c5ff7d8c | POST | /api/auth/login] - [로그인 실패} 잘못된 비밀번호 입니다: rex +25-03-28 17:35:29.762 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [db0751ff-ab53-4568-9a91-b90b81fc87bb | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-28 17:35:29.766 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [db0751ff-ab53-4568-9a91-b90b81fc87bb | POST | /api/auth/login] - [로그인 성공] username: rex +25-03-28 17:35:29.794 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ec0b2dcc-68c4-4462-9d7c-f6b55f96bb53 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:29.794 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [de638b00-bb41-42b5-95d9-e96cdb523623 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:29.797 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ec0b2dcc-68c4-4462-9d7c-f6b55f96bb53 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:35:29.783Z +25-03-28 17:35:29.800 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a4b856e2-f94a-4206-87ac-ce6433cc8787 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:29.808 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a4b856e2-f94a-4206-87ac-ce6433cc8787 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:35:29.783Z +25-03-28 17:35:29.822 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4dd1108c-1101-4a50-b3e8-ecc304b72476 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:29.838 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [44061be0-569e-46d6-8ac6-93a344cc427a | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:32.835 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d718d873-bda1-4930-9bf4-d69e25f8abbf | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:35.840 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [92522246-c152-4c2e-9078-eaee0a761803 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:38.843 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [54484f95-0fff-4481-8ec0-d46301ccdb73 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:41.831 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [047d8f53-46b8-4f76-be97-e90d5b94257e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:44.845 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5242f28d-e579-4d46-bc22-686b484e5fa5 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:47.839 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bee06db7-2b2f-4e32-826f-555be386eb23 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:50.838 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bed19cb5-4a73-4abb-84c7-f8ebbe837d3c | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:53.835 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [79ac624f-e1dd-4460-be06-ff62d7c40878 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:55.912 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b30ba866-dc80-45d9-b727-64955d67b723 | POST | /api/channels/public] - [공개 채널 생성 시도] type: PUBLIC, name: 스프링 백엔드 개발자방 +25-03-28 17:35:55.913 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b30ba866-dc80-45d9-b727-64955d67b723 | POST | /api/channels/public] - [공개 채널 생성 성공] id: c88077b0-bf50-4924-b3d5-a5c7e799cf07 +25-03-28 17:35:55.931 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4102817f-ced4-484b-a0fb-459cbd4924ff | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:56.837 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0d538e92-0a0c-42c3-a6c1-d1ee698b84f8 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:57.958 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [e3726bcc-d04e-44bf-b6cf-886c536d1595 | POST | /api/readStatuses] - [읽기 정보 생성 완료] 읽기 정보가 생성되었습니다 id: 7eddbcec-b5ce-40d4-9bad-de8b431dd534 +25-03-28 17:35:59.789 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [474afe84-3206-4de7-9f7b-311765ad6297 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:35:59.791 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [474afe84-3206-4de7-9f7b-311765ad6297 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:35:59.784Z +25-03-28 17:35:59.832 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ce283fd1-3d72-4100-a5c3-62a052193f8e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:36:02.838 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9824f394-5fa2-42da-90e7-632fcd36d32e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:36:05.016 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [b1ead53e-7b05-426d-a2d3-8dbaa70617ef | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 9f277b3e-9ff1-44d4-b3c8-1fef05ff8959 +25-03-28 17:36:05.041 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [e7351f38-15d6-449e-b2e1-f31e4669178a | PATCH | /api/readStatuses/7eddbcec-b5ce-40d4-9bad-de8b431dd534] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: 7eddbcec-b5ce-40d4-9bad-de8b431dd534 +25-03-28 17:36:05.829 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [02a0a08b-cc34-4c5f-81dd-516c4bad109c | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:36:07.354 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [cc515980-97d9-4c8a-934f-bdc2888f4958 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:36:07.357 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [cc515980-97d9-4c8a-934f-bdc2888f4958 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:36:07.349Z +25-03-28 17:36:13.009 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [55b9a80e-3558-4abf-b343-4014d4378c1b | POST | /api/auth/login] - [로그인 시도] username: 우디 +25-03-28 17:36:13.012 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [55b9a80e-3558-4abf-b343-4014d4378c1b | POST | /api/auth/login] - [로그인 성공] username: 우디 +25-03-28 17:36:13.033 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c676fca9-456f-4d36-b4cc-6f139e94870d | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:13.036 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [c676fca9-456f-4d36-b4cc-6f139e94870d | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:36:13.028Z +25-03-28 17:36:13.037 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [61d5a8d1-6500-49fe-b3fe-42d4041e2c8c | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:13.040 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [49aba351-c6fc-4167-8009-a31615e6cf68 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:13.042 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [61d5a8d1-6500-49fe-b3fe-42d4041e2c8c | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:36:13.028Z +25-03-28 17:36:13.058 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c661b773-a792-4ddf-b94d-884321ec9137 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:13.072 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fde8f39c-def4-45de-bb8f-92158188aa3c | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:16.062 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a2d970fa-4679-415b-9d2d-b76110cca475 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:16.118 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [21fdf0d0-5d3b-4233-98f4-f7a0f9de028c | POST | /api/readStatuses] - [읽기 정보 생성 완료] 읽기 정보가 생성되었습니다 id: b9662426-dbb2-474f-bdd1-bd8ac7937688 +25-03-28 17:36:19.073 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [09942020-bac0-489a-abe3-1bbadc62c450 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:22.065 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [908544c2-a12c-445d-8a4a-67a0420f300a | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:25.066 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [77fa18c4-2b56-4320-8980-a4a3285e4eca | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:26.123 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [261f14d6-a011-446b-b947-db9aee9a6829 | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 13056a8a-5fe6-49ad-903c-bb3dd8a71089 +25-03-28 17:36:26.135 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [dc574c4b-21eb-418e-8668-96bd4ca7b41e | PATCH | /api/readStatuses/b9662426-dbb2-474f-bdd1-bd8ac7937688] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: b9662426-dbb2-474f-bdd1-bd8ac7937688 +25-03-28 17:36:28.063 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6b25ba36-d34c-4dec-a8b4-e38801cec788 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:31.073 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8840ce1e-5919-497c-998c-ba258ad99633 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:34.077 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ea57c3da-8fe4-45c9-b532-bef161474ec5 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:37.077 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ef598c19-0fb2-4042-9bab-0ef7d1c467ea | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:37.198 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [134972c2-8db5-490e-8414-cfa92bd535c1 | PATCH | /api/readStatuses/e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96 +25-03-28 17:36:40.064 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [dd625eca-013f-4605-a012-1acae21fac65 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:43.035 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [061c4b1d-fc38-4ddf-88c5-eafd41b007e8 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:43.037 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [061c4b1d-fc38-4ddf-88c5-eafd41b007e8 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:36:43.030Z +25-03-28 17:36:43.062 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [46778fc6-51ca-4244-a941-eaab8e40e62c | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:46.069 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1ad7833d-966e-4bc1-8100-dd3ad9290f18 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:49.061 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5892a8fb-687c-405d-9888-ff7debab25fc | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:52.067 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d6c38436-0ef2-4ec0-860a-8b32cfa6bf51 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:52.183 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [7dfe9942-5176-4f9a-9f57-219178def013 | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 4097daed-201f-412d-a409-9188492773ce +25-03-28 17:36:52.199 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [383345cd-3a01-4a81-bf4e-4cf5c8da2801 | PATCH | /api/readStatuses/e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96 +25-03-28 17:36:52.228 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [27494c18-6140-4774-897d-ece20f07569e | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:36:52.244 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3ab82588-da33-47ba-bd53-cc904eb31068 | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578/download] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:36:55.061 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4beedffd-c1ad-4684-b88a-d91d14dd25cf | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:57.697 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ad1e161b-f52b-4ace-9968-cd4c0add081b | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:36:57.701 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ad1e161b-f52b-4ace-9968-cd4c0add081b | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:36:57.690Z +25-03-28 17:37:12.973 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [eb908e69-ee0f-41ba-8592-5e6272fce94d | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-28 17:37:12.977 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [eb908e69-ee0f-41ba-8592-5e6272fce94d | POST | /api/auth/login] - [로그인 성공] username: rex +25-03-28 17:37:13.001 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0fca7f2c-49d3-4e8c-bd99-192178ce7b75 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:13.002 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [5ca85d85-c1b2-4f32-be1a-cc079035eba1 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:13.002 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [7cb640ef-ecf5-47b8-97bc-9e5758e9e050 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:13.005 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [5ca85d85-c1b2-4f32-be1a-cc079035eba1 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:37:12.995Z +25-03-28 17:37:13.006 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [7cb640ef-ecf5-47b8-97bc-9e5758e9e050 | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:37:12.996Z +25-03-28 17:37:13.017 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b7eb2d16-78d5-48d3-9a1e-ae47c5a3f2bd | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:13.027 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6a67364f-31f4-4bb7-a262-a30c9a103cff | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:16.328 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [580d8688-b65e-4fdb-9c65-9ca7b199626b | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:19.336 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9c0bdddc-1c01-46e0-8b66-b896a08d614e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:19.411 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [8fc878b0-445f-447f-b3bf-5721f9a56eb3 | POST | /api/auth/login] - [로그인 시도] username: 우디 +25-03-28 17:37:19.414 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [8fc878b0-445f-447f-b3bf-5721f9a56eb3 | POST | /api/auth/login] - [로그인 성공] username: 우디 +25-03-28 17:37:19.437 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [151c0f92-b8a8-47c9-82f1-22f3dc0fded6 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:37:19.442 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4ef316b0-bd0d-4b52-95f9-6d9bb8373141 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:19.452 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [46c61a84-fd05-4ea6-9b20-32991b45921c | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:37:19.451 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [63c9ea13-b4b0-4593-a44d-21e35ea21503 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:19.453 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [96f8c449-1fc2-4afe-807a-c033c654b5b7 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:19.455 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [63c9ea13-b4b0-4593-a44d-21e35ea21503 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:37:19.440Z +25-03-28 17:37:19.456 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a9985aa8-a68f-4b84-b16b-e189aff8681b | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:37:19.456 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [96f8c449-1fc2-4afe-807a-c033c654b5b7 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:37:19.442Z +25-03-28 17:37:19.463 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [785ab086-04d1-44b6-bf4c-a8ee5720b0df | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:37:19.490 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [530ad602-2a92-401e-8f33-e31c28af8fcb | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce/download] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:37:19.490 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [701249ed-49e3-4165-8551-cc8fa8c6f41c | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:37:19.496 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [619d7481-ff53-4eac-9557-6250fff0b3d4 | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920/download] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:37:19.502 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [439d8131-a5a2-4e90-bc67-76d765fd955a | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:19.518 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [91c38682-fc4a-4869-a21d-259959d2690a | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:22.033 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [343c5ad5-d350-4daf-9b2a-d6d7f60b0649 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:22.521 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7058c878-e4a3-4b7e-ae41-147623ca5201 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:25.032 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3ce00fa4-7d4c-462d-b0ad-742aa735963e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:25.528 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fec2e2e8-3d15-4bde-8d86-b5905ebb944e | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:28.043 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [153c32d1-1469-4b3d-8a4f-e9269d4a8f9a | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:28.525 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bbbfba70-f2a3-4468-9aba-a766454ae922 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:29.402 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [ec39fe9a-58dc-4c17-ac2e-40a56d60c383 | PATCH | /api/readStatuses/e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96 +25-03-28 17:37:29.435 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [ed61235f-1d89-4a9c-8c0e-4468048973c8 | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:37:29.440 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [6754ed7a-71da-4b9d-825a-fc9ff8b3ff54 | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:37:29.446 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3f740a88-f273-4287-8246-48ebc7123851 | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578/download] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:37:31.032 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8d4c2f64-c9db-4d8a-b1fc-1b543125fba9 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:31.522 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [578cc712-ba28-4317-a894-15adf40ba9f3 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:34.032 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [77231688-efb6-44ad-aa8f-e620665402fc | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:34.137 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [98bd6a93-9483-4d7f-a0e5-3fd8531f46d8 | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: dafefe00-15a0-47cc-b250-049db66df400 +25-03-28 17:37:34.148 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [4cd6ffab-dc52-4529-b517-d3663f144ead | PATCH | /api/readStatuses/9813c110-4cd8-4312-a7c1-7aeb384805f1] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: 9813c110-4cd8-4312-a7c1-7aeb384805f1 +25-03-28 17:37:34.520 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0f5faa8e-4368-4c02-9df7-c9727362de46 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:37.043 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [686f4b89-6869-4fa8-b2d9-edd2aca6b056 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:37.534 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ead20257-8f8b-47af-9f81-49860778822a | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:40.037 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b96ed238-e278-4c95-9e0e-3e4f7e2513fd | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:40.520 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [57586baa-cca8-43ef-b95f-cd52141adc5a | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:41.696 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [7cec5c92-612f-4605-b188-86c21fafcb92 | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 3d761886-5bb5-4280-92f3-0c12742c14a3 +25-03-28 17:37:41.708 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [5a1dea00-bdd2-4e17-aa0a-552ad62655b6 | PATCH | /api/readStatuses/e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96 +25-03-28 17:37:43.011 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [82b97014-aa58-4509-9f38-8ea7934bd03a | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:43.013 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [82b97014-aa58-4509-9f38-8ea7934bd03a | PATCH | /api/users/06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e, newLastActiveAt: 2025-03-28T08:37:43.006Z +25-03-28 17:37:43.044 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [60127b22-c705-4ca4-a610-209cd2f44995 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:43.530 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [12c16aab-b74e-40d3-b2d1-c4b855ccefd1 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:46.036 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [91a636f2-8109-492f-baaa-b5702ab7deb8 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:46.524 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6665a4fe-2ed9-4cc4-89d2-11678868bf5d | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:47.285 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [ed8ab113-4410-489e-8b04-33544048e350 | PATCH | /api/readStatuses/b9662426-dbb2-474f-bdd1-bd8ac7937688] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: b9662426-dbb2-474f-bdd1-bd8ac7937688 +25-03-28 17:37:48.746 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [74631c36-beda-40ca-aca3-d8b4bc11a342 | PATCH | /api/readStatuses/7eddbcec-b5ce-40d4-9bad-de8b431dd534] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: 7eddbcec-b5ce-40d4-9bad-de8b431dd534 +25-03-28 17:37:49.028 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [dc7eebf5-5cee-40ce-b858-386a2f870e42 | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:49.454 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d317b066-5179-43f2-93e7-278b40446e28 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:49.457 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d317b066-5179-43f2-93e7-278b40446e28 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:37:49.449Z +25-03-28 17:37:49.531 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9cede14f-1d2c-4c67-ae2a-57a2992f23f1 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:52.033 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [dad76e1e-09ad-4709-befa-a40be7e7e9db | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:52.526 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2bbdb0ea-2834-4d59-84be-7d17be9dcc83 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:52.748 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [660f7e80-9572-454b-be3b-0af04c6e2d5d | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 04512504-8f72-47dc-ac5a-a3aa5d0180c4 +25-03-28 17:37:52.762 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [e7370acf-ab6f-4ca8-a654-db166642540f | PATCH | /api/readStatuses/7eddbcec-b5ce-40d4-9bad-de8b431dd534] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: 7eddbcec-b5ce-40d4-9bad-de8b431dd534 +25-03-28 17:37:55.037 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [594111f4-c9c4-44af-922d-e95bb8b84e8e | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:55.519 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ff945cbb-454a-419b-8939-cc7f88aadf06 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:58.043 [http-nio-80-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c6f64613-6ca6-4486-9320-c93e247c5c6d | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:37:58.535 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5b90fa18-99f4-4755-bc1e-533728da73d2 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:37:58.567 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicMessageService [1d0ebee3-d60c-471d-a757-6750d3027c3d | POST | /api/messages] - [메시지 생성 성공] 생성된 메시지 id: 31fa99ba-61fd-4f60-b19b-f0c997288533 +25-03-28 17:37:58.579 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [c537cab1-7c32-4357-8aff-23f7324fc11c | PATCH | /api/readStatuses/b9662426-dbb2-474f-bdd1-bd8ac7937688] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: b9662426-dbb2-474f-bdd1-bd8ac7937688 +25-03-28 17:38:01.041 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d4f0483d-4a80-4751-9bff-356256f2f3ba | GET | /api/channels] - [채널 조회 성공] id: 06b6f0ec-9ccf-4914-b9ce-26d8f82c7a2e +25-03-28 17:38:01.527 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d90d8ad4-dc58-40eb-8817-d53c27f66bc7 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:37.671 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [874b2f85-9fc8-42d5-b74f-b481e34bc21c | POST | /api/auth/login] - [로그인 시도] username: 우디 +25-03-28 17:38:37.675 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [874b2f85-9fc8-42d5-b74f-b481e34bc21c | POST | /api/auth/login] - [로그인 성공] username: 우디 +25-03-28 17:38:37.699 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3697c3a7-b8d2-4a40-b229-1b678f2b1fbd | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:38:37.703 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4f9beff7-ea73-480a-b935-da4872845177 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:37.708 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [f0597611-973d-4840-b303-14e27ec57cb2 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:38:37.709 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [9ae565e4-195d-4c61-90c8-f0b206e9b9f2 | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:38:37.710 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f0a1d355-58ad-4a7c-9e40-540c0369657b | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:37.710 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e32b3e83-c4d2-448d-8a24-cb6585bc3b9d | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:37.712 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e32b3e83-c4d2-448d-8a24-cb6585bc3b9d | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:38:37.704Z +25-03-28 17:38:37.712 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f0a1d355-58ad-4a7c-9e40-540c0369657b | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:38:37.703Z +25-03-28 17:38:37.714 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [eeceda07-afa5-497e-ac0c-cbaf8ef86899 | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:38:37.749 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [d6808d07-2957-4f66-ad49-407a9f84caef | GET | /api/binaryContents/d1f8e0d6-1b9b-44de-9110-d88fd76aefce/download] - [파일 조회] id: d1f8e0d6-1b9b-44de-9110-d88fd76aefce +25-03-28 17:38:37.749 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a69d51a0-336a-4df3-949c-93077b5a958c | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:38:37.754 [http-nio-80-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [0e0914c9-6712-44d9-a2c5-a97aab21dbf5 | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:38:37.756 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [70d438c7-60f4-469d-a78c-b182ccf4c063 | GET | /api/binaryContents/94062a14-d8ac-4f7e-89ed-7380b9d9f920/download] - [파일 조회] id: 94062a14-d8ac-4f7e-89ed-7380b9d9f920 +25-03-28 17:38:37.764 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e2d52c8a-0757-47bd-8e5e-678b6e4ef4ee | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:37.777 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4737698f-d078-4f40-b4ee-72db5d9a0d0f | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:40.779 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8b468811-7d8b-4ff9-be7d-2e540b5a4580 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:43.586 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [230909a8-2b60-4942-ae36-cbe0f7baece9 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be] - [회원 수정 요청] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:43.602 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [230909a8-2b60-4942-ae36-cbe0f7baece9 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be] - [회원 수정 완료] id: 7d9533d7-2197-4b9b-9296-f0bac78043be, 새로운 이름: woody, 새로운 이메일: null +25-03-28 17:38:43.775 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [be6c176f-0a69-40c9-a3d2-e242675371df | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:46.781 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [67da18ce-5bd5-4dfc-a959-3a816fe6f609 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:49.777 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b3c8d4e6-c2e7-47c9-a966-fdfd71156e9c | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:52.780 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [775370ea-99b4-40c6-85fb-93f841a2c139 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:55.785 [http-nio-80-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bbf7a6fa-029e-4e3f-b862-15e74a721ab4 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:38:58.781 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8f6b1c89-5500-4bde-84d7-89624330dfe9 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:39:01.775 [http-nio-80-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c8b0c8f4-4f7b-4bdd-843f-a3e0409d6207 | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:39:04.776 [http-nio-80-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6f81684d-f798-4f56-a2fb-04b31abab87a | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:39:05.096 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [8926747a-2eaf-4af8-967a-e0eb836b4291 | PATCH | /api/readStatuses/e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96] - [읽기 정보 업데이트 성공] 해당 정보를 업데이트 하였습니다 id: e4d7f6b9-fd30-49e5-8443-4cdcacdb0c96 +25-03-28 17:39:05.129 [http-nio-80-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [ad9f4302-0e35-47c8-a89b-bcefd320fd4f | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:39:05.134 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [c11e72ed-fb2f-4ad4-8ff4-c0795e8c3e51 | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:39:05.142 [http-nio-80-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [0c6bf797-e4bc-4cf1-a138-d37bd26ec290 | GET | /api/binaryContents/1c94ce9c-5323-466d-bfbf-3a0fb048f578/download] - [파일 조회] id: 1c94ce9c-5323-466d-bfbf-3a0fb048f578 +25-03-28 17:39:07.717 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [39ffa4b8-64a9-4b26-8cbc-d09cde2139a3 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:39:07.720 [http-nio-80-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [39ffa4b8-64a9-4b26-8cbc-d09cde2139a3 | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:39:07.712Z +25-03-28 17:39:07.782 [http-nio-80-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [72f546da-f72a-4d6b-ae43-6017030fc38d | GET | /api/channels] - [채널 조회 성공] id: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:39:09.714 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [af49ed7c-6eb4-469f-a3b8-2a91790f89de | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be +25-03-28 17:39:09.716 [http-nio-80-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [af49ed7c-6eb4-469f-a3b8-2a91790f89de | PATCH | /api/users/7d9533d7-2197-4b9b-9296-f0bac78043be/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 7d9533d7-2197-4b9b-9296-f0bac78043be, newLastActiveAt: 2025-03-28T08:39:09.711Z +25-03-28 17:39:20.351 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.23.140:80/actuator, healthUrl=http://10.3.23.140:80/actuator/health, serviceUrl=http://10.3.23.140:80/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-28 17:39:21.360 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-28 17:39:21.689 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-28 17:39:21.698 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-28 17:39:21.701 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-28 17:39:21.710 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. diff --git a/.logs/logfile-2025-03-29.log b/.logs/logfile-2025-03-29.log new file mode 100644 index 000000000..8c9b9ab82 --- /dev/null +++ b/.logs/logfile-2025-03-29.log @@ -0,0 +1,4610 @@ +25-03-29 15:42:45.375 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-29 15:42:45.449 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 5336 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-29 15:42:45.450 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-29 15:42:46.996 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-29 15:42:47.084 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 78 ms. Found 6 JPA repository interfaces. +25-03-29 15:42:47.889 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-29 15:42:47.902 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-29 15:42:47.904 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-29 15:42:47.904 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-29 15:42:47.982 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-29 15:42:47.983 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2484 ms +25-03-29 15:42:48.121 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-29 15:42:48.495 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-29 15:42:48.497 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-29 15:42:48.505 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-29 15:42:48.749 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-29 15:42:48.847 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-29 15:42:48.888 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-29 15:42:49.226 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-29 15:42:49.314 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-29 15:42:50.428 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-29 15:42:50.447 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-29 15:42:50.450 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-29 15:42:50.451 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-29 15:42:50.452 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-29 15:42:50.453 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-29 15:42:50.455 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-29 15:42:50.456 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-29 15:42:50.463 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-29 15:42:50.464 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-29 15:42:50.466 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-29 15:42:50.468 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-29 15:42:50.470 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-29 15:42:50.473 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-29 15:42:50.475 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-29 15:42:50.477 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-29 15:42:50.478 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-29 15:42:50.480 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-29 15:42:50.481 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-29 15:42:50.482 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-29 15:42:50.485 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-29 15:42:50.488 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-29 15:42:50.490 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-29 15:42:50.496 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-29 15:42:50.848 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-29 15:42:51.629 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-29 15:42:52.761 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-29 15:42:52.832 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-29 15:42:52.844 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-29 15:42:52.860 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 8.253 seconds (process running for 9.337) +25-03-29 15:42:53.052 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://192.168.219.66:8081/actuator, healthUrl=http://192.168.219.66:8081/actuator/health, serviceUrl=http://192.168.219.66:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-29 15:42:53.193 [RMI TCP Connection(3)-192.168.219.66] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-29 15:42:53.193 [RMI TCP Connection(3)-192.168.219.66] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-29 15:42:53.196 [RMI TCP Connection(3)-192.168.219.66] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-29 15:43:39.099 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-29 15:43:39.244 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-29 15:43:39.253 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-29 15:43:39.253 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-29 15:43:39.316 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-29 15:43:39.317 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-29 15:43:39.318 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-29 15:43:39.320 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-29 15:43:39.449 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - [회원 생성 완료] username: rex, id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:39.505 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-29 15:43:39.510 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-29 15:43:39.510 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.366439600Z] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (5:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.422471700Z] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (4:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.422471700Z] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-29 15:43:39.525 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (7:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.535 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-29 15:43:39.535 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.440274900Z] +25-03-29 15:43:39.535 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.419323500Z] +25-03-29 15:43:39.535 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.440274900Z] +25-03-29 15:43:39.535 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (4:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.538 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [897e3015-fbfb-4868-a246-9e2efafbc5dc | POST | /api/users] - binding parameter (5:UUID) <- [f32426b4-a423-435a-b72e-f5eb2b7b10a2] +25-03-29 15:43:39.572 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:39.573 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:39.586 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-29 15:43:39.586 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-29 15:43:39.587 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.587 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.610 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5, newLastActiveAt: 2025-03-29T06:43:39.559Z +25-03-29 15:43:39.624 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5, newLastActiveAt: 2025-03-29T06:43:39.560Z +25-03-29 15:43:39.649 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-29 15:43:39.649 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-29 15:43:39.649 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.559Z] +25-03-29 15:43:39.649 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.560Z] +25-03-29 15:43:39.649 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.624566Z] +25-03-29 15:43:39.649 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:43:39.624566Z] +25-03-29 15:43:39.649 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (3:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.658 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (3:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.658 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ac0c44d0-97d8-492f-bc7b-6d537d952377 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (4:UUID) <- [f32426b4-a423-435a-b72e-f5eb2b7b10a2] +25-03-29 15:43:39.658 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a9f9ed4e-2f6f-4b33-b1bb-ff9828963c05 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (4:UUID) <- [f32426b4-a423-435a-b72e-f5eb2b7b10a2] +25-03-29 15:43:39.721 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6aa7794c-9af4-481d-b15e-8d1b0e662bb4 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-29 15:43:39.761 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [88b17222-f564-40dd-8cb4-113698692646 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - [파일 조회] id: 06ae14f5-5b7b-42a7-8e54-8030749a0db2 +25-03-29 15:43:39.766 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9827d8b3-d7d6-471f-acf9-d314efb4cdf4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:39.767 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9827d8b3-d7d6-471f-acf9-d314efb4cdf4 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.767 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [69eceaa4-deae-4f7b-ae4e-f39e7fdbdd7a | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-29 15:43:39.770 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f28fb127-ed38-46d2-9ac0-28515d66f8f2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:39.771 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9827d8b3-d7d6-471f-acf9-d314efb4cdf4 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:39.772 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f28fb127-ed38-46d2-9ac0-28515d66f8f2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.781 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9827d8b3-d7d6-471f-acf9-d314efb4cdf4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:39.783 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9827d8b3-d7d6-471f-acf9-d314efb4cdf4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:39.784 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9827d8b3-d7d6-471f-acf9-d314efb4cdf4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:39.784 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [88b17222-f564-40dd-8cb4-113698692646 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:43:39.784 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [88b17222-f564-40dd-8cb4-113698692646 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.795 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [26717757-b37e-46d0-9256-6fa7fbb448ae | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - [파일 조회] id: 06ae14f5-5b7b-42a7-8e54-8030749a0db2 +25-03-29 15:43:39.797 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [bca828be-d4a4-4b4d-86a7-32cd1085d374 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:39.797 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [26717757-b37e-46d0-9256-6fa7fbb448ae | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:43:39.797 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1b44f3be-783e-4c94-9ba4-33d85f443251 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:39.797 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1b44f3be-783e-4c94-9ba4-33d85f443251 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.797 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [26717757-b37e-46d0-9256-6fa7fbb448ae | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.797 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [bca828be-d4a4-4b4d-86a7-32cd1085d374 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.797 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1b44f3be-783e-4c94-9ba4-33d85f443251 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:39.802 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1b44f3be-783e-4c94-9ba4-33d85f443251 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:39.802 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1b44f3be-783e-4c94-9ba4-33d85f443251 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:39.802 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [331fbff3-b4af-495f-848e-909314e3af5f | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2/download] - [파일 조회] id: 06ae14f5-5b7b-42a7-8e54-8030749a0db2 +25-03-29 15:43:39.803 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1b44f3be-783e-4c94-9ba4-33d85f443251 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:39.804 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [331fbff3-b4af-495f-848e-909314e3af5f | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:43:39.805 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [cf67fe55-6151-448a-9856-1a5c5fcc6f83 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - [파일 조회] id: 06ae14f5-5b7b-42a7-8e54-8030749a0db2 +25-03-29 15:43:39.805 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [331fbff3-b4af-495f-848e-909314e3af5f | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2/download] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.806 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [cf67fe55-6151-448a-9856-1a5c5fcc6f83 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:43:39.807 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [cf67fe55-6151-448a-9856-1a5c5fcc6f83 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.808 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [445b7b40-2c1d-411c-a50f-19f200361a53 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:39.808 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [445b7b40-2c1d-411c-a50f-19f200361a53 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.816 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [693ba0db-3d6a-4ae0-993c-5e67cc38fb94 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - [파일 조회] id: 06ae14f5-5b7b-42a7-8e54-8030749a0db2 +25-03-29 15:43:39.820 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [693ba0db-3d6a-4ae0-993c-5e67cc38fb94 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:43:39.822 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [693ba0db-3d6a-4ae0-993c-5e67cc38fb94 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:39.823 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0c1efec8-4636-4482-91c5-5738c79ccc5f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:39.824 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0c1efec8-4636-4482-91c5-5738c79ccc5f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:39.828 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [83a83a1c-17a0-453e-88a8-fa74d7ddbfa7 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - [파일 조회] id: 06ae14f5-5b7b-42a7-8e54-8030749a0db2 +25-03-29 15:43:39.828 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [83a83a1c-17a0-453e-88a8-fa74d7ddbfa7 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:43:39.828 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [83a83a1c-17a0-453e-88a8-fa74d7ddbfa7 | GET | /api/binaryContents/06ae14f5-5b7b-42a7-8e54-8030749a0db2] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:43:42.802 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [e7e5d5a0-edc5-402f-b2e6-510f5bae768c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:42.802 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e7e5d5a0-edc5-402f-b2e6-510f5bae768c | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:42.802 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e7e5d5a0-edc5-402f-b2e6-510f5bae768c | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:42.811 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [e7e5d5a0-edc5-402f-b2e6-510f5bae768c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:42.811 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e7e5d5a0-edc5-402f-b2e6-510f5bae768c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:42.811 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e7e5d5a0-edc5-402f-b2e6-510f5bae768c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:42.828 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7897b591-97a8-48dd-9d1e-6202ba9c29ac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:42.828 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7897b591-97a8-48dd-9d1e-6202ba9c29ac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:45.819 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [31dd4c9f-6010-4982-ab04-d11a06fa6bb6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:45.819 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [31dd4c9f-6010-4982-ab04-d11a06fa6bb6 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:45.819 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [31dd4c9f-6010-4982-ab04-d11a06fa6bb6 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:45.819 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [31dd4c9f-6010-4982-ab04-d11a06fa6bb6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:45.819 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [31dd4c9f-6010-4982-ab04-d11a06fa6bb6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:45.819 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [31dd4c9f-6010-4982-ab04-d11a06fa6bb6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:45.828 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4409344e-f7e7-4b17-a3c7-be82ea3a551e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:45.828 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4409344e-f7e7-4b17-a3c7-be82ea3a551e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:48.793 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [cc7148cf-cfca-45cb-9915-9b89f338e37d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:48.793 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [cc7148cf-cfca-45cb-9915-9b89f338e37d | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:48.793 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cc7148cf-cfca-45cb-9915-9b89f338e37d | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:48.809 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [cc7148cf-cfca-45cb-9915-9b89f338e37d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:48.809 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [cc7148cf-cfca-45cb-9915-9b89f338e37d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:48.809 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [cc7148cf-cfca-45cb-9915-9b89f338e37d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:48.819 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c3441b7f-7fc5-43da-8c23-e71ff2e3a3e3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:48.825 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c3441b7f-7fc5-43da-8c23-e71ff2e3a3e3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:51.803 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [09259eb6-da83-4ced-9985-6639f47168f3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:51.803 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09259eb6-da83-4ced-9985-6639f47168f3 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:51.803 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [09259eb6-da83-4ced-9985-6639f47168f3 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:51.811 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [09259eb6-da83-4ced-9985-6639f47168f3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:51.811 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09259eb6-da83-4ced-9985-6639f47168f3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:51.811 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [09259eb6-da83-4ced-9985-6639f47168f3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:51.830 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9f206a68-4ae8-4b0a-a22e-1646a4db307e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:51.830 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9f206a68-4ae8-4b0a-a22e-1646a4db307e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:54.807 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8bc7dd99-a3a5-469b-bae0-da981ff300cf | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:54.807 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8bc7dd99-a3a5-469b-bae0-da981ff300cf | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:54.807 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8bc7dd99-a3a5-469b-bae0-da981ff300cf | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:54.812 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8bc7dd99-a3a5-469b-bae0-da981ff300cf | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:54.812 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8bc7dd99-a3a5-469b-bae0-da981ff300cf | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:54.812 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8bc7dd99-a3a5-469b-bae0-da981ff300cf | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:54.830 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4d3e403e-102b-4707-8018-031f2844bd18 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:54.832 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [4d3e403e-102b-4707-8018-031f2844bd18 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:56.644 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - [공개 채널 생성 시도] type: PUBLIC, name: 일반채널이구나! +25-03-29 15:43:56.652 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - [공개 채널 생성 성공] id: 8ecb799c-19ad-4694-8c90-0219b97ef136 +25-03-29 15:43:56.661 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:43:56.661 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:43:56.644555900Z] +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (2:VARCHAR) <- [일반 채널입니다] +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (3:VARCHAR) <- [일반채널이구나!] +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (4:ENUM) <- [PUBLIC] +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-29T06:43:56.644555900Z] +25-03-29 15:43:56.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [eef09079-f275-4b0a-9018-0a0d1d87bb25 | POST | /api/channels/public] - binding parameter (6:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:43:56.680 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:56.686 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:56.687 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:56.690 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:56.690 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:56.690 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:56.694 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:43:56.697 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ebdbb624-78ae-4a9f-8ad3-ff41acde9966 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:43:56.712 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b33f8ae7-4f26-496e-b8e3-c3e7729b0d16 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:56.713 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b33f8ae7-4f26-496e-b8e3-c3e7729b0d16 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:56.743 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [bde52723-d67f-49fd-be18-6d2986d3e082 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:57.806 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:57.807 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:43:57.813 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:43:57.814 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:43:57.815 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:43:57.820 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:43:57.820 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8383c520-93c2-4e66-bb8d-9bc6aa888da2 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:43:57.832 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f3aecfb4-2da0-4ae6-b0ca-c0adcd92d29f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:43:57.832 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f3aecfb4-2da0-4ae6-b0ca-c0adcd92d29f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:43:58.064 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [2fbbf875-9a8f-4017-b2c2-b43b9c6fb36a | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:00.820 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:00.820 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:00.820 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:00.820 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:00.820 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-29 15:44:00.820 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:00.820 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d8ca709a-eea6-495e-8a50-a0a950a2745f | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:00.848 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [2c9eeadf-133b-4fc1-9795-73b960272f2e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:00.852 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [2c9eeadf-133b-4fc1-9795-73b960272f2e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:00.966 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5c122d06-f2d5-433d-9947-6365eb30487c | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id + from + read_statuses rs1_0 + where + rs1_0.user_id=? + and rs1_0.channel_id=? + fetch + first ? rows only +25-03-29 15:44:01.730 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:01.730 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:01.730 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (3:INTEGER) <- [1] +25-03-29 15:44:01.730 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicReadStatusService [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - [읽기 정보 생성 완료] 읽기 정보가 생성되었습니다 id: e264eb56-51ea-4a0e-959a-1314ef5d307b +25-03-29 15:44:01.730 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - + /* insert for + com.sprint.mission.discodeit.entity.ReadStatus */insert + into + read_statuses (channel_id, created_at, last_read_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?, ?) +25-03-29 15:44:01.746 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:01.746 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:44:01.730727400Z] +25-03-29 15:44:01.746 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-29T06:44:01.710Z] +25-03-29 15:44:01.746 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-29T06:44:01.730727400Z] +25-03-29 15:44:01.746 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (5:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:01.746 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5956e7f5-322b-4b5b-8857-aaed4205689a | POST | /api/readStatuses] - binding parameter (6:UUID) <- [e264eb56-51ea-4a0e-959a-1314ef5d307b] +25-03-29 15:44:01.938 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e00678e2-fd2b-48ee-a94f-2cd9b33a7377 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:03.810 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:03.810 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:03.824 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:03.824 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:03.824 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:03.824 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:03.824 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f8e8adcd-d6f5-4bfa-b846-9e2cfee04203 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:03.845 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [27622e57-51ed-4e36-af39-051f82e26b69 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:03.845 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [27622e57-51ed-4e36-af39-051f82e26b69 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:04.174 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [69a1f306-2bb3-45e7-9731-b8602b0a79d7 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:06.804 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:06.805 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:06.809 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:06.809 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:06.810 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:06.818 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:06.819 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [02eb8198-cc01-4f83-96e1-f5e71f8e16d1 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:06.836 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [9f7fcd1a-91f2-4e70-867a-2a26e07ed1df | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:06.836 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9f7fcd1a-91f2-4e70-867a-2a26e07ed1df | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:07.977 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:07.980 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-29 15:44:07.981 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:07.984 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5, newLastActiveAt: 2025-03-29T06:44:07.965Z +25-03-29 15:44:07.987 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-29 15:44:07.989 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:44:07.965Z] +25-03-29 15:44:07.989 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:44:07.986272400Z] +25-03-29 15:44:07.989 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (3:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:07.989 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [55a230c1-8bb3-4fe7-b36f-5c577343c865 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (4:UUID) <- [f32426b4-a423-435a-b72e-f5eb2b7b10a2] +25-03-29 15:44:13.895 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-29 15:44:13.899 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-29 15:44:13.899 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [rex] +25-03-29 15:44:13.911 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-29 15:44:13.911 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.911 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - [로그인 성공] username: rex +25-03-29 15:44:13.911 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-29 15:44:13.911 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [36b2e0aa-bb1a-4be1-a4ce-d0f20dc3a49f | POST | /api/auth/login] - binding parameter (1:UUID) <- [06ae14f5-5b7b-42a7-8e54-8030749a0db2] +25-03-29 15:44:13.927 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [c85f19cd-2b5a-4dbb-9012-778a6141e63b | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-29 15:44:13.947 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:13.949 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1caab994-4420-49b0-baa7-7287ab98c163 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-29 15:44:13.949 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:13.950 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.950 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.951 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d9115621-4b8c-4a66-b76d-18c17fc1d8c4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-29 15:44:13.952 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d631b74a-8860-40ee-9cf4-109a0bf8d0a3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.952 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.952 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:13.954 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d631b74a-8860-40ee-9cf4-109a0bf8d0a3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.954 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d9115621-4b8c-4a66-b76d-18c17fc1d8c4 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-29 15:44:13.954 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-29 15:44:13.955 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.955 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5, newLastActiveAt: 2025-03-29T06:44:13.939Z +25-03-29 15:44:13.956 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d9115621-4b8c-4a66-b76d-18c17fc1d8c4 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-29 15:44:13.956 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 198daf71-5bfb-4e41-8e04-e3e724dcffb5, newLastActiveAt: 2025-03-29T06:44:13.938Z +25-03-29 15:44:13.956 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d9115621-4b8c-4a66-b76d-18c17fc1d8c4 | GET | /api/messages] - binding parameter (1:UUID) <- [c410d069-fa91-439b-961c-dc1020d67565] +25-03-29 15:44:13.957 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:13.957 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:13.957 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.957 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-29 15:44:13.957 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:44:13.938Z] +25-03-29 15:44:13.958 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:44:13.957088700Z] +25-03-29 15:44:13.958 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-29 15:44:13.958 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (3:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.958 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-29T06:44:13.939Z] +25-03-29 15:44:13.958 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [048ed41b-2b28-4529-865d-785851bbdec1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (4:UUID) <- [f32426b4-a423-435a-b72e-f5eb2b7b10a2] +25-03-29 15:44:13.958 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:44:13.956061Z] +25-03-29 15:44:13.958 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (3:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.958 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0afe28bb-1203-4463-bde1-6c698a1ee1d1 | PATCH | /api/users/198daf71-5bfb-4e41-8e04-e3e724dcffb5/userStatus] - binding parameter (4:UUID) <- [f32426b4-a423-435a-b72e-f5eb2b7b10a2] +25-03-29 15:44:13.960 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:13.961 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e53bb6e4-a782-4788-b7c1-daece97ec407 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.968 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [daf54a87-9f1d-471d-b7be-81225023e09f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-29 15:44:13.968 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [84f38165-61a4-46dc-a2e2-397fec27a123 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.968 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [84f38165-61a4-46dc-a2e2-397fec27a123 | GET | /api/messages] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.968 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.968 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [9b584ad3-74db-4b69-8214-fd633e74c122 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.968 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [84f38165-61a4-46dc-a2e2-397fec27a123 | GET | /api/messages] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-29T06:44:13.968877700Z] +25-03-29 15:44:13.968 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.968 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [84f38165-61a4-46dc-a2e2-397fec27a123 | GET | /api/messages] - binding parameter (3:INTEGER) <- [51] +25-03-29 15:44:13.968 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:13.977 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [84f38165-61a4-46dc-a2e2-397fec27a123 | GET | /api/messages] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id=? +25-03-29 15:44:13.977 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:13.977 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [84f38165-61a4-46dc-a2e2-397fec27a123 | GET | /api/messages] - binding parameter (1:UUID) <- [c410d069-fa91-439b-961c-dc1020d67565] +25-03-29 15:44:13.977 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:13.977 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.979 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:13.979 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [705b074f-716b-4705-87c5-e620af6046fb | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.984 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3f0209d7-13b2-4019-b639-a4ccdca0850d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.984 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f0209d7-13b2-4019-b639-a4ccdca0850d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.984 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.984 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.988 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:13.988 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:13.988 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:13.988 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.988 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [15e7f34a-1726-47fb-9cc0-6fb8edaf097d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:13.988 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [15e7f34a-1726-47fb-9cc0-6fb8edaf097d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:13.988 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:13.988 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [71e3cb82-2d1d-49fa-a41f-5f9d97afc30d | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:13.999 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [9656029a-f075-47b4-bb65-df9ab0d5341b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:14.000 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [9656029a-f075-47b4-bb65-df9ab0d5341b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:14.000 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a17c1b78-c030-4ce5-adb0-0f1a562e2611 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:14.010 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a17c1b78-c030-4ce5-adb0-0f1a562e2611 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:14.450 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [db2a9e48-e9bf-4dfa-9dcd-4a61a8786bd5 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:17.000 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:17.000 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:17.000 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:17.000 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:17.000 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:17.011 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:17.011 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [5540e860-de59-4ae7-9fcf-649b23a77d84 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:17.011 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9ee5cd36-f5eb-4ed4-bca2-ef780754ea58 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:17.011 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9ee5cd36-f5eb-4ed4-bca2-ef780754ea58 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:17.744 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e984af2a-3c33-486b-bde7-d3c6eac466f4 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:19.994 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:19.998 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:20.000 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:20.000 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:20.001 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:20.002 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:20.002 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [85ba9206-b381-4007-a8dd-e63c69538263 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:20.012 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [82bb041a-e0f7-494d-9a96-b979a9b85ec5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:20.012 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [82bb041a-e0f7-494d-9a96-b979a9b85ec5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:20.047 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [991f9739-af4e-4176-a1cf-0df031a3d23f | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:22.992 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:22.995 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:22.995 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:22.995 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:23.001 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:23.001 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:23.001 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d1283bf3-50c7-4f89-bf11-b4f78e13e832 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:23.017 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [952484a2-88a4-43f7-914f-e6bd27a71063 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:23.017 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [952484a2-88a4-43f7-914f-e6bd27a71063 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:23.065 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4eebc548-1f94-4a6e-ad7b-93c0e04e241e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:25.999 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:25.999 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:25.999 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:25.999 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:25.999 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:26.010 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:26.010 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2ee256d0-f3f8-4192-ab46-09f745289f15 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:26.021 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [3902dee1-e016-4666-8e46-0db08f1a2f6f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:26.023 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [3902dee1-e016-4666-8e46-0db08f1a2f6f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:26.090 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2a874f82-e573-4761-a6e1-e0e912e8a591 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:28.989 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:28.989 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:28.989 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:28.989 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:28.989 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:28.989 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:28.989 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b7f0d5da-c7aa-4548-875e-75caf256dd91 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:29.003 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [dbf24585-a3ad-4205-a3c7-3e3b75bf0123 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:29.003 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [dbf24585-a3ad-4205-a3c7-3e3b75bf0123 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:29.115 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [c4d5ba41-ab1e-407d-a1f3-6f527e1c1bdf | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:31.993 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:31.995 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:31.995 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:31.997 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:31.997 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:31.997 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:31.999 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f7ba1401-7157-4f9f-b4d8-bab3b3d4e7d8 | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:32.006 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [4ed2dd09-b710-40af-9ff2-a66d9dad1276 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:32.006 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [4ed2dd09-b710-40af-9ff2-a66d9dad1276 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:32.135 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [72edb422-dcdb-46a7-b836-4c8c246b23b1 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:35.003 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:35.003 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - [채널 조회 성공] id: 198daf71-5bfb-4e41-8e04-e3e724dcffb5 +25-03-29 15:44:35.005 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-29 15:44:35.005 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-29 15:44:35.007 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - binding parameter (2:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:35.007 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-29 15:44:35.007 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [471cb107-07e8-4d60-a92c-a9a975b60c6c | GET | /api/channels] - binding parameter (1:UUID) <- [8ecb799c-19ad-4694-8c90-0219b97ef136] +25-03-29 15:44:35.021 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [70dd4c37-78d2-489e-82e5-b7cd5ef64a47 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-29 15:44:35.021 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [70dd4c37-78d2-489e-82e5-b7cd5ef64a47 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [198daf71-5bfb-4e41-8e04-e3e724dcffb5] +25-03-29 15:44:35.160 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b5b86dbe-26b3-4cb1-8485-5b7defdd58d8 | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:36:43.400 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:36:43.401 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:36:43.465 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 15:36:43.466 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 15:36:43.467 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:36:43.468 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-31 15:36:43.587 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - [회원 생성 완료] username: rex, id: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9 +25-03-31 15:36:43.639 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:36:43.645 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-31 15:36:43.646 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.521729700Z] +25-03-31 15:36:43.667 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-31 15:36:43.668 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-31 15:36:43.669 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (5:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:43.682 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 15:36:43.683 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.573898900Z] +25-03-31 15:36:43.684 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 15:36:43.684 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 15:36:43.685 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (4:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:43.685 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.573898900Z] +25-03-31 15:36:43.686 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 15:36:43.686 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (7:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.687 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:36:43.688 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.582997500Z] +25-03-31 15:36:43.688 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.570878300Z] +25-03-31 15:36:43.688 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.582997500Z] +25-03-31 15:36:43.689 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (4:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.689 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [515b023f-ed2b-4d1a-8ce4-f2ebc7c69d33 | POST | /api/users] - binding parameter (5:UUID) <- [36d16e77-f237-4bfe-8e40-146edfc2ad24] +25-03-31 15:36:43.762 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9 +25-03-31 15:36:43.763 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9 +25-03-31 15:36:43.778 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:36:43.778 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:36:43.779 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.779 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.815 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9, newLastActiveAt: 2025-03-31T06:36:43.743Z +25-03-31 15:36:43.816 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9, newLastActiveAt: 2025-03-31T06:36:43.744Z +25-03-31 15:36:43.826 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:36:43.826 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:36:43.830 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.744Z] +25-03-31 15:36:43.830 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.818035700Z] +25-03-31 15:36:43.829 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.743Z] +25-03-31 15:36:43.830 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (3:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.830 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:36:43.816503100Z] +25-03-31 15:36:43.830 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f08b2ad0-8cab-460a-b5f2-1ff8f39035bd | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (4:UUID) <- [36d16e77-f237-4bfe-8e40-146edfc2ad24] +25-03-31 15:36:43.830 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (3:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.831 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4ea497b4-7c7e-4fd7-8776-900dbc74824f | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (4:UUID) <- [36d16e77-f237-4bfe-8e40-146edfc2ad24] +25-03-31 15:36:43.924 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [69a7f3bd-23cb-454a-9828-8ecdfc1be659 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:36:43.948 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3f6d1165-2085-43f5-8db0-9f20fdbdae45 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - [파일 조회] id: 0656f382-788a-4f7f-9144-edf012f31310 +25-03-31 15:36:43.952 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [88dfeb77-417f-43cd-8a9d-f075e1bf1f3d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:36:43.954 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [88dfeb77-417f-43cd-8a9d-f075e1bf1f3d | GET | /api/channels] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.954 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1d78f903-30c6-4f5c-b6cb-6ac0d7448d32 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:36:43.954 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [f2b796fc-954c-41ae-a667-f989a803f67c | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:36:43.955 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1d78f903-30c6-4f5c-b6cb-6ac0d7448d32 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.956 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [88dfeb77-417f-43cd-8a9d-f075e1bf1f3d | GET | /api/channels] - [채널 조회 성공] id: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9 +25-03-31 15:36:43.969 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [88dfeb77-417f-43cd-8a9d-f075e1bf1f3d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:36:43.970 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [88dfeb77-417f-43cd-8a9d-f075e1bf1f3d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:36:43.971 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [88dfeb77-417f-43cd-8a9d-f075e1bf1f3d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:36:43.972 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3f6d1165-2085-43f5-8db0-9f20fdbdae45 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:36:43.972 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3f6d1165-2085-43f5-8db0-9f20fdbdae45 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - binding parameter (1:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:43.984 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [7bd4bc83-33d0-427c-904c-819d24b274f2 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - [파일 조회] id: 0656f382-788a-4f7f-9144-edf012f31310 +25-03-31 15:36:43.986 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [7bd4bc83-33d0-427c-904c-819d24b274f2 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:36:43.987 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [7bd4bc83-33d0-427c-904c-819d24b274f2 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - binding parameter (1:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:43.988 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [55af42ba-f40e-4229-90cd-edb512c5c4ad | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:36:43.988 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [61828ae4-7cc2-4618-bac4-d17cbc17c6c7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:36:43.988 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55af42ba-f40e-4229-90cd-edb512c5c4ad | GET | /api/channels] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.988 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [61828ae4-7cc2-4618-bac4-d17cbc17c6c7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:43.989 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [55af42ba-f40e-4229-90cd-edb512c5c4ad | GET | /api/channels] - [채널 조회 성공] id: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9 +25-03-31 15:36:43.991 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [55af42ba-f40e-4229-90cd-edb512c5c4ad | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:36:43.991 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55af42ba-f40e-4229-90cd-edb512c5c4ad | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:36:43.991 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [55af42ba-f40e-4229-90cd-edb512c5c4ad | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:36:43.993 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [5cec6ed6-4b74-4c4a-9c20-24e5a1170ece | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - [파일 조회] id: 0656f382-788a-4f7f-9144-edf012f31310 +25-03-31 15:36:43.994 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5cec6ed6-4b74-4c4a-9c20-24e5a1170ece | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:36:43.995 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5cec6ed6-4b74-4c4a-9c20-24e5a1170ece | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - binding parameter (1:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:43.995 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [44932e2e-8e43-4a9d-b8fa-ceed2de214fb | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310/download] - [파일 조회] id: 0656f382-788a-4f7f-9144-edf012f31310 +25-03-31 15:36:43.997 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [44932e2e-8e43-4a9d-b8fa-ceed2de214fb | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:36:43.998 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [44932e2e-8e43-4a9d-b8fa-ceed2de214fb | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310/download] - binding parameter (1:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:43.998 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c641e67a-b4fe-400a-a12c-17b7577ea65a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:36:43.998 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c641e67a-b4fe-400a-a12c-17b7577ea65a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:44.002 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [192689a2-8064-4267-8070-0a9dc09487f8 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - [파일 조회] id: 0656f382-788a-4f7f-9144-edf012f31310 +25-03-31 15:36:44.004 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [192689a2-8064-4267-8070-0a9dc09487f8 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:36:44.005 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [192689a2-8064-4267-8070-0a9dc09487f8 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - binding parameter (1:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:44.010 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ce832596-858f-489f-bcfb-c143daeeb2e8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:36:44.011 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ce832596-858f-489f-bcfb-c143daeeb2e8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:44.013 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [b8db657e-7324-4189-9bf5-b5bb3c8ffc93 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - [파일 조회] id: 0656f382-788a-4f7f-9144-edf012f31310 +25-03-31 15:36:44.014 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b8db657e-7324-4189-9bf5-b5bb3c8ffc93 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:36:44.015 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b8db657e-7324-4189-9bf5-b5bb3c8ffc93 | GET | /api/binaryContents/0656f382-788a-4f7f-9144-edf012f31310] - binding parameter (1:UUID) <- [0656f382-788a-4f7f-9144-edf012f31310] +25-03-31 15:36:46.495 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9 +25-03-31 15:36:46.498 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:36:46.498 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (1:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:46.500 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 8600bd79-9ef9-435d-a5f6-dd40a118f6e9, newLastActiveAt: 2025-03-31T06:36:46.490Z +25-03-31 15:36:46.501 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:36:46.502 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:36:46.490Z] +25-03-31 15:36:46.502 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:36:46.501849500Z] +25-03-31 15:36:46.502 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (3:UUID) <- [8600bd79-9ef9-435d-a5f6-dd40a118f6e9] +25-03-31 15:36:46.502 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a620d34b-ead5-4b93-8906-f153ac4867b1 | PATCH | /api/users/8600bd79-9ef9-435d-a5f6-dd40a118f6e9/userStatus] - binding parameter (4:UUID) <- [36d16e77-f237-4bfe-8e40-146edfc2ad24] +25-03-31 15:36:58.042 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [a139b85e-9189-4378-b512-d01f412794aa | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:36:58.044 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a139b85e-9189-4378-b512-d01f412794aa | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:36:58.045 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a139b85e-9189-4378-b512-d01f412794aa | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:36:58.045 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a139b85e-9189-4378-b512-d01f412794aa | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:36:58.048 [http-nio-8081-exec-3] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [a139b85e-9189-4378-b512-d01f412794aa | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 15:38:54.700 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 15:38:54.941 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-31 15:38:54.949 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-31 15:38:54.952 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-31 15:38:54.957 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-31 15:38:59.819 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-31 15:38:59.886 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 9696 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-31 15:38:59.887 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-31 15:39:01.293 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-31 15:39:01.389 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 86 ms. Found 6 JPA repository interfaces. +25-03-31 15:39:02.313 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-31 15:39:02.326 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-31 15:39:02.328 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-31 15:39:02.329 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-31 15:39:02.409 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-31 15:39:02.409 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2472 ms +25-03-31 15:39:02.585 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-31 15:39:02.816 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-31 15:39:02.819 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-31 15:39:02.830 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-31 15:39:03.127 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-31 15:39:03.190 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-31 15:39:03.231 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-31 15:39:03.578 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-31 15:39:03.687 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-31 15:39:04.995 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-31 15:39:05.013 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-31 15:39:05.015 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-31 15:39:05.016 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-31 15:39:05.017 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-31 15:39:05.017 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-31 15:39:05.019 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-31 15:39:05.020 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-31 15:39:05.027 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-31 15:39:05.030 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-31 15:39:05.035 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-31 15:39:05.038 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-31 15:39:05.040 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-31 15:39:05.042 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-31 15:39:05.043 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-31 15:39:05.046 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-31 15:39:05.048 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-31 15:39:05.050 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-31 15:39:05.051 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-31 15:39:05.053 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-31 15:39:05.054 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-31 15:39:05.056 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-31 15:39:05.057 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-31 15:39:05.061 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-31 15:39:05.471 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-31 15:39:06.391 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-31 15:39:08.437 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-31 15:39:08.540 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-31 15:39:08.552 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-31 15:39:08.576 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.417 seconds (process running for 10.17) +25-03-31 15:39:08.834 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.22.11:8081/actuator, healthUrl=http://10.3.22.11:8081/actuator/health, serviceUrl=http://10.3.22.11:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-31 15:39:08.920 [RMI TCP Connection(1)-10.3.22.11] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-31 15:39:08.920 [RMI TCP Connection(1)-10.3.22.11] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-31 15:39:08.923 [RMI TCP Connection(1)-10.3.22.11] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 3 ms +25-03-31 15:39:24.091 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:39:24.299 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:39:24.311 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:39:24.311 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:39:24.370 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 15:39:24.370 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 15:39:24.370 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:39:24.372 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-31 15:39:24.508 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - [회원 생성 완료] username: rex, id: 64459a11-7867-4999-9077-34df247e37c6 +25-03-31 15:39:24.538 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:39:24.543 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-31 15:39:24.544 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.431810400Z] +25-03-31 15:39:24.556 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-31 15:39:24.556 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-31 15:39:24.557 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (5:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.565 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 15:39:24.566 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.491512500Z] +25-03-31 15:39:24.566 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 15:39:24.566 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 15:39:24.567 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (4:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.567 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.491512500Z] +25-03-31 15:39:24.567 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 15:39:24.567 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (7:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.568 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:39:24.569 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.503098900Z] +25-03-31 15:39:24.569 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.487510800Z] +25-03-31 15:39:24.569 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.503098900Z] +25-03-31 15:39:24.569 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (4:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.569 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [84290189-d8d1-4cd4-a4d7-7a4404cc86ae | POST | /api/users] - binding parameter (5:UUID) <- [f05c7310-b779-471e-8e87-f179218cf9d7] +25-03-31 15:39:24.665 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 64459a11-7867-4999-9077-34df247e37c6 +25-03-31 15:39:24.665 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 64459a11-7867-4999-9077-34df247e37c6 +25-03-31 15:39:24.676 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:39:24.677 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:39:24.677 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.678 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.721 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 64459a11-7867-4999-9077-34df247e37c6, newLastActiveAt: 2025-03-31T06:39:24.648Z +25-03-31 15:39:24.722 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 64459a11-7867-4999-9077-34df247e37c6, newLastActiveAt: 2025-03-31T06:39:24.649Z +25-03-31 15:39:24.739 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:39:24.740 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:39:24.747 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.648Z] +25-03-31 15:39:24.747 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.649Z] +25-03-31 15:39:24.747 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.724633500Z] +25-03-31 15:39:24.748 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:39:24.724633500Z] +25-03-31 15:39:24.748 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (3:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.748 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (3:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.748 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [84d2b71a-971d-4fa9-be4f-3b957f55ade4 | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (4:UUID) <- [f05c7310-b779-471e-8e87-f179218cf9d7] +25-03-31 15:39:24.748 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [32eb1dbb-53d3-41c9-a07e-7609de775d1c | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (4:UUID) <- [f05c7310-b779-471e-8e87-f179218cf9d7] +25-03-31 15:39:24.819 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6c93e8f5-210b-4205-9550-36b652c6ec30 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:39:24.844 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [1b0b865e-da2e-4d61-b811-20e0431fb23b | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - [파일 조회] id: d11599e8-6874-4c29-81fb-3ebcf51ae123 +25-03-31 15:39:24.847 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f323a62a-ddf0-47e6-9079-35fdc23ed46e | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:39:24.848 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ffb8651c-2a60-4bf9-a68a-7efa11d0377c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:39:24.848 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fd2cbb33-789d-4e5e-ac29-9ed07018f87c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:39:24.849 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ffb8651c-2a60-4bf9-a68a-7efa11d0377c | GET | /api/channels] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.849 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fd2cbb33-789d-4e5e-ac29-9ed07018f87c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.853 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ffb8651c-2a60-4bf9-a68a-7efa11d0377c | GET | /api/channels] - [채널 조회 성공] id: 64459a11-7867-4999-9077-34df247e37c6 +25-03-31 15:39:24.866 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [8974cc71-8fc2-4451-8268-f33e61677dd6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:39:24.867 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [8974cc71-8fc2-4451-8268-f33e61677dd6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.869 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ffb8651c-2a60-4bf9-a68a-7efa11d0377c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:39:24.871 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ffb8651c-2a60-4bf9-a68a-7efa11d0377c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:39:24.871 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ffb8651c-2a60-4bf9-a68a-7efa11d0377c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:39:24.872 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [1b0b865e-da2e-4d61-b811-20e0431fb23b | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:39:24.873 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1b0b865e-da2e-4d61-b811-20e0431fb23b | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - binding parameter (1:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.884 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7484c5bf-0dad-41f3-a1f8-c0a78486b2b7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:39:24.885 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7484c5bf-0dad-41f3-a1f8-c0a78486b2b7 | GET | /api/channels] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.886 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2024123f-1d6b-4c76-b04c-c3a4cabd6361 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:39:24.886 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7484c5bf-0dad-41f3-a1f8-c0a78486b2b7 | GET | /api/channels] - [채널 조회 성공] id: 64459a11-7867-4999-9077-34df247e37c6 +25-03-31 15:39:24.886 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [6e7c0de0-c3b0-4288-8dbb-756448618681 | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - [파일 조회] id: d11599e8-6874-4c29-81fb-3ebcf51ae123 +25-03-31 15:39:24.886 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2024123f-1d6b-4c76-b04c-c3a4cabd6361 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.887 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6e7c0de0-c3b0-4288-8dbb-756448618681 | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:39:24.887 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6e7c0de0-c3b0-4288-8dbb-756448618681 | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - binding parameter (1:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.887 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7484c5bf-0dad-41f3-a1f8-c0a78486b2b7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:39:24.887 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7484c5bf-0dad-41f3-a1f8-c0a78486b2b7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:39:24.887 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7484c5bf-0dad-41f3-a1f8-c0a78486b2b7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:39:24.892 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [0475d975-0f8f-44f7-80d4-1db738b2e663 | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123/download] - [파일 조회] id: d11599e8-6874-4c29-81fb-3ebcf51ae123 +25-03-31 15:39:24.894 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [5cf863c3-8c2c-4f73-992a-d6c022af8f1b | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - [파일 조회] id: d11599e8-6874-4c29-81fb-3ebcf51ae123 +25-03-31 15:39:24.894 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [0475d975-0f8f-44f7-80d4-1db738b2e663 | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:39:24.895 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [5cf863c3-8c2c-4f73-992a-d6c022af8f1b | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:39:24.895 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [0475d975-0f8f-44f7-80d4-1db738b2e663 | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123/download] - binding parameter (1:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.896 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [5cf863c3-8c2c-4f73-992a-d6c022af8f1b | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - binding parameter (1:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.899 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [79f23bb2-f8f6-43d2-85bc-018525ee472a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:39:24.899 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [79f23bb2-f8f6-43d2-85bc-018525ee472a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:24.900 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [5f88085a-d056-4be7-9092-2f8c4194622e | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - [파일 조회] id: d11599e8-6874-4c29-81fb-3ebcf51ae123 +25-03-31 15:39:24.902 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [5f88085a-d056-4be7-9092-2f8c4194622e | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:39:24.903 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [5f88085a-d056-4be7-9092-2f8c4194622e | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - binding parameter (1:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:24.907 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [90fe749c-7395-4d06-a8b9-4aa4fbcc9ceb | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - [파일 조회] id: d11599e8-6874-4c29-81fb-3ebcf51ae123 +25-03-31 15:39:24.909 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [90fe749c-7395-4d06-a8b9-4aa4fbcc9ceb | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:39:24.909 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [90fe749c-7395-4d06-a8b9-4aa4fbcc9ceb | GET | /api/binaryContents/d11599e8-6874-4c29-81fb-3ebcf51ae123] - binding parameter (1:UUID) <- [d11599e8-6874-4c29-81fb-3ebcf51ae123] +25-03-31 15:39:26.665 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 64459a11-7867-4999-9077-34df247e37c6 +25-03-31 15:39:26.666 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:39:26.667 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (1:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:26.669 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 64459a11-7867-4999-9077-34df247e37c6, newLastActiveAt: 2025-03-31T06:39:26.659Z +25-03-31 15:39:26.671 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:39:26.671 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:39:26.659Z] +25-03-31 15:39:26.672 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:39:26.670025400Z] +25-03-31 15:39:26.672 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (3:UUID) <- [64459a11-7867-4999-9077-34df247e37c6] +25-03-31 15:39:26.672 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [bb4c22a6-3854-4127-92e3-86bbe2d96f2b | PATCH | /api/users/64459a11-7867-4999-9077-34df247e37c6/userStatus] - binding parameter (4:UUID) <- [f05c7310-b779-471e-8e87-f179218cf9d7] +25-03-31 15:39:42.604 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [ef06a643-402e-4175-b34c-ba85b3dd7d03 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:39:42.606 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef06a643-402e-4175-b34c-ba85b3dd7d03 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:39:42.606 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef06a643-402e-4175-b34c-ba85b3dd7d03 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:39:42.606 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef06a643-402e-4175-b34c-ba85b3dd7d03 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:39:42.608 [http-nio-8081-exec-3] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [ef06a643-402e-4175-b34c-ba85b3dd7d03 | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 15:40:17.066 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [099bc96d-78fa-48eb-b007-1a907de4fe8b | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:40:17.068 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [099bc96d-78fa-48eb-b007-1a907de4fe8b | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:40:17.070 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [099bc96d-78fa-48eb-b007-1a907de4fe8b | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:40:17.070 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [099bc96d-78fa-48eb-b007-1a907de4fe8b | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:40:17.071 [http-nio-8081-exec-2] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [099bc96d-78fa-48eb-b007-1a907de4fe8b | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 15:42:36.937 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 15:42:37.188 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-31 15:42:37.197 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-31 15:42:37.201 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-31 15:42:37.208 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-31 15:42:41.722 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-31 15:42:41.794 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 3708 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-31 15:42:41.795 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-31 15:42:43.211 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-31 15:42:43.344 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 118 ms. Found 6 JPA repository interfaces. +25-03-31 15:42:44.191 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-31 15:42:44.205 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-31 15:42:44.208 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-31 15:42:44.209 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-31 15:42:44.289 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-31 15:42:44.290 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2445 ms +25-03-31 15:42:44.460 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-31 15:42:44.711 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-31 15:42:44.715 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-31 15:42:44.725 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-31 15:42:44.989 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-31 15:42:45.061 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-31 15:42:45.105 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-31 15:42:45.448 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-31 15:42:45.545 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-31 15:42:46.795 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-31 15:42:46.815 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-31 15:42:46.817 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-31 15:42:46.818 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-31 15:42:46.819 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-31 15:42:46.820 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-31 15:42:46.821 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-31 15:42:46.821 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-31 15:42:46.829 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-31 15:42:46.831 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-31 15:42:46.833 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-31 15:42:46.835 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-31 15:42:46.836 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-31 15:42:46.837 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-31 15:42:46.838 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-31 15:42:46.840 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-31 15:42:46.841 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-31 15:42:46.842 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-31 15:42:46.844 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-31 15:42:46.845 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-31 15:42:46.846 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-31 15:42:46.847 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-31 15:42:46.848 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-31 15:42:46.853 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-31 15:42:47.217 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-31 15:42:48.125 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-31 15:42:50.265 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-31 15:42:50.478 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-31 15:42:50.511 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-31 15:42:50.561 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.516 seconds (process running for 10.209) +25-03-31 15:42:50.923 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.22.11:8081/actuator, healthUrl=http://10.3.22.11:8081/actuator/health, serviceUrl=http://10.3.22.11:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-31 15:42:50.957 [RMI TCP Connection(3)-10.3.22.11] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-31 15:42:50.957 [RMI TCP Connection(3)-10.3.22.11] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-31 15:42:50.960 [RMI TCP Connection(3)-10.3.22.11] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 3 ms +25-03-31 15:43:03.079 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:43:03.230 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:43:03.240 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:43:03.241 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:43:03.317 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 15:43:03.318 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 15:43:03.318 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:43:03.320 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-31 15:43:03.430 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - [회원 생성 완료] username: rex, id: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:03.468 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:43:03.472 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-03-31 15:43:03.473 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.371746800Z] +25-03-31 15:43:03.485 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-31 15:43:03.485 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-03-31 15:43:03.486 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (5:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.504 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 15:43:03.505 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.419772200Z] +25-03-31 15:43:03.505 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 15:43:03.505 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 15:43:03.505 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (4:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.506 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.419772200Z] +25-03-31 15:43:03.506 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 15:43:03.506 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (7:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.507 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:43:03.508 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.426555500Z] +25-03-31 15:43:03.510 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.416718200Z] +25-03-31 15:43:03.511 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.426555500Z] +25-03-31 15:43:03.512 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (4:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.513 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [efefa904-8676-4f45-a9b6-bf15a9f8d099 | POST | /api/users] - binding parameter (5:UUID) <- [e03e82c8-bcc9-4079-ada3-82458f555b39] +25-03-31 15:43:03.597 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:03.598 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:03.613 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:43:03.613 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:43:03.613 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.613 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.651 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 232b904a-5824-4715-9602-966b52299bcc, newLastActiveAt: 2025-03-31T06:43:03.579Z +25-03-31 15:43:03.652 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 232b904a-5824-4715-9602-966b52299bcc, newLastActiveAt: 2025-03-31T06:43:03.581Z +25-03-31 15:43:03.663 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:43:03.663 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:43:03.667 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.579Z] +25-03-31 15:43:03.667 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.581Z] +25-03-31 15:43:03.668 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.653455100Z] +25-03-31 15:43:03.668 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:43:03.653455100Z] +25-03-31 15:43:03.668 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (3:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.668 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (3:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.668 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [37570d6d-2a22-4364-9e77-d8181fc4d13f | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (4:UUID) <- [e03e82c8-bcc9-4079-ada3-82458f555b39] +25-03-31 15:43:03.668 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a83a86b8-0b11-46c2-83c2-cabcff52e44c | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (4:UUID) <- [e03e82c8-bcc9-4079-ada3-82458f555b39] +25-03-31 15:43:03.728 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [38373724-9a51-4524-a8c5-2de15f048494 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:43:03.759 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [996b677a-2724-4178-b18a-45f776fb96bc | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - [파일 조회] id: a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3 +25-03-31 15:43:03.766 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [dda9d41b-3f4c-40af-8aff-81bf1d953f00 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:43:03.766 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [5016c11a-486e-4b38-be77-3675bb8daa8a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:03.766 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [03e0535e-b272-47ee-80ab-216314b40d90 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:03.767 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [03e0535e-b272-47ee-80ab-216314b40d90 | GET | /api/channels] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.768 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [5016c11a-486e-4b38-be77-3675bb8daa8a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.772 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [03e0535e-b272-47ee-80ab-216314b40d90 | GET | /api/channels] - [채널 조회 성공] id: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:03.789 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [03e0535e-b272-47ee-80ab-216314b40d90 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:43:03.790 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [03e0535e-b272-47ee-80ab-216314b40d90 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:43:03.791 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [03e0535e-b272-47ee-80ab-216314b40d90 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:43:03.793 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [996b677a-2724-4178-b18a-45f776fb96bc | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:43:03.793 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [996b677a-2724-4178-b18a-45f776fb96bc | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - binding parameter (1:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.803 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [5d96564b-f132-4496-9781-3ee72b4f0181 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:03.803 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [27739088-58e8-4831-a205-4b6e1caddd46 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:03.803 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [6742f255-63dd-4ade-8181-431fa80ce0fd | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - [파일 조회] id: a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3 +25-03-31 15:43:03.804 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [5d96564b-f132-4496-9781-3ee72b4f0181 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.804 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [27739088-58e8-4831-a205-4b6e1caddd46 | GET | /api/channels] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.805 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6742f255-63dd-4ade-8181-431fa80ce0fd | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:43:03.805 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [27739088-58e8-4831-a205-4b6e1caddd46 | GET | /api/channels] - [채널 조회 성공] id: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:03.805 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6742f255-63dd-4ade-8181-431fa80ce0fd | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - binding parameter (1:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.807 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [27739088-58e8-4831-a205-4b6e1caddd46 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:43:03.809 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [27739088-58e8-4831-a205-4b6e1caddd46 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:43:03.809 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [27739088-58e8-4831-a205-4b6e1caddd46 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:43:03.810 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [30c724a4-f8a8-452e-b275-e20a344fb91c | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3/download] - [파일 조회] id: a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3 +25-03-31 15:43:03.811 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [30c724a4-f8a8-452e-b275-e20a344fb91c | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:43:03.813 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e4b8b93c-2439-4c7d-9f64-5207bd6aa475 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:03.813 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [30c724a4-f8a8-452e-b275-e20a344fb91c | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3/download] - binding parameter (1:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.814 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e4b8b93c-2439-4c7d-9f64-5207bd6aa475 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.816 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [8de070f7-4de3-40b5-9eea-91625ad83fc9 | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - [파일 조회] id: a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3 +25-03-31 15:43:03.818 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8de070f7-4de3-40b5-9eea-91625ad83fc9 | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:43:03.818 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8de070f7-4de3-40b5-9eea-91625ad83fc9 | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - binding parameter (1:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.825 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3c325588-518c-445a-80d8-1db129b52cf7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:03.826 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3c325588-518c-445a-80d8-1db129b52cf7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:03.826 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [f75c742c-e69d-445b-8fd0-e6ab73e928bd | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - [파일 조회] id: a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3 +25-03-31 15:43:03.828 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f75c742c-e69d-445b-8fd0-e6ab73e928bd | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:43:03.828 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f75c742c-e69d-445b-8fd0-e6ab73e928bd | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - binding parameter (1:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:03.847 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [6cca5a0a-91aa-4f90-89c7-72e2ec21e675 | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - [파일 조회] id: a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3 +25-03-31 15:43:03.848 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6cca5a0a-91aa-4f90-89c7-72e2ec21e675 | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 15:43:03.849 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6cca5a0a-91aa-4f90-89c7-72e2ec21e675 | GET | /api/binaryContents/a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] - binding parameter (1:UUID) <- [a04721f7-926b-4bd3-bd21-e4f1f6bbf8e3] +25-03-31 15:43:06.811 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f42af028-68e4-47f6-8ba5-6678fd84edfd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:06.812 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f42af028-68e4-47f6-8ba5-6678fd84edfd | GET | /api/channels] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:06.814 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f42af028-68e4-47f6-8ba5-6678fd84edfd | GET | /api/channels] - [채널 조회 성공] id: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:06.819 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [f42af028-68e4-47f6-8ba5-6678fd84edfd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:43:06.820 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f42af028-68e4-47f6-8ba5-6678fd84edfd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:43:06.820 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [f42af028-68e4-47f6-8ba5-6678fd84edfd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:43:06.835 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ea14769f-0ac7-4682-a85c-1f874061d3f7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:43:06.835 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ea14769f-0ac7-4682-a85c-1f874061d3f7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:07.253 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 232b904a-5824-4715-9602-966b52299bcc +25-03-31 15:43:07.255 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:43:07.255 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (1:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:07.256 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 232b904a-5824-4715-9602-966b52299bcc, newLastActiveAt: 2025-03-31T06:43:07.248Z +25-03-31 15:43:07.257 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:43:07.258 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:43:07.248Z] +25-03-31 15:43:07.258 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:43:07.257795600Z] +25-03-31 15:43:07.258 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (3:UUID) <- [232b904a-5824-4715-9602-966b52299bcc] +25-03-31 15:43:07.258 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b69a7e1a-8caa-4c7c-9479-d17ae2cd7655 | PATCH | /api/users/232b904a-5824-4715-9602-966b52299bcc/userStatus] - binding parameter (4:UUID) <- [e03e82c8-bcc9-4079-ada3-82458f555b39] +25-03-31 15:43:20.565 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [e2d2b48e-110e-4dd1-9b2e-d19b854139f9 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:43:20.567 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e2d2b48e-110e-4dd1-9b2e-d19b854139f9 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:43:20.567 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e2d2b48e-110e-4dd1-9b2e-d19b854139f9 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:43:20.568 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e2d2b48e-110e-4dd1-9b2e-d19b854139f9 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:43:20.570 [http-nio-8081-exec-2] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [e2d2b48e-110e-4dd1-9b2e-d19b854139f9 | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 15:51:10.606 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 15:51:10.857 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-31 15:51:10.868 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-31 15:51:10.870 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-31 15:51:10.874 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-31 15:51:16.975 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-31 15:51:17.033 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 7860 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-31 15:51:17.034 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-31 15:51:18.122 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-31 15:51:18.201 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 71 ms. Found 6 JPA repository interfaces. +25-03-31 15:51:18.873 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-31 15:51:18.884 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-31 15:51:18.885 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-31 15:51:18.886 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-31 15:51:18.947 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-31 15:51:18.947 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 1868 ms +25-03-31 15:51:19.052 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-31 15:51:19.246 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-31 15:51:19.249 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-31 15:51:19.259 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-31 15:51:19.490 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-31 15:51:19.548 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-31 15:51:19.579 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-31 15:51:19.855 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-31 15:51:19.925 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-31 15:51:20.937 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-31 15:51:20.953 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-31 15:51:20.955 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-31 15:51:20.957 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-31 15:51:20.957 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-31 15:51:20.958 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-31 15:51:20.960 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-31 15:51:20.961 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-31 15:51:20.966 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-31 15:51:20.967 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-31 15:51:20.969 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-31 15:51:20.970 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-31 15:51:20.971 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-31 15:51:20.973 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-31 15:51:20.974 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-31 15:51:20.976 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-31 15:51:20.977 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-31 15:51:20.978 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-31 15:51:20.979 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-31 15:51:20.980 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-31 15:51:20.982 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-31 15:51:20.983 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-31 15:51:20.984 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-31 15:51:20.988 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-31 15:51:21.324 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-31 15:51:22.025 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-31 15:51:23.016 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-31 15:51:23.089 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-31 15:51:23.100 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-31 15:51:23.116 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 6.727 seconds (process running for 7.5) +25-03-31 15:51:23.244 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.22.11:8081/actuator, healthUrl=http://10.3.22.11:8081/actuator/health, serviceUrl=http://10.3.22.11:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-31 15:51:23.346 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-31 15:51:23.346 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-31 15:51:23.348 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 2 ms +25-03-31 15:51:32.200 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:51:32.279 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:51:32.287 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:51:32.288 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:51:32.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 15:51:32.331 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 15:51:32.331 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:51:32.376 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - [회원 생성 완료] username: rex, id: 2a113f86-af70-4aa4-9d30-b2882d5c20a9 +25-03-31 15:51:32.391 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 15:51:32.393 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.353532900Z] +25-03-31 15:51:32.399 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 15:51:32.400 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 15:51:32.400 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (4:UUID) <- [null] +25-03-31 15:51:32.400 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.353532900Z] +25-03-31 15:51:32.400 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 15:51:32.400 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (7:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.405 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 15:51:32.406 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.374490Z] +25-03-31 15:51:32.406 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.332127600Z] +25-03-31 15:51:32.406 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.374490Z] +25-03-31 15:51:32.406 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (4:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.406 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [23f9353f-db95-4196-bfb3-cdf010ecfcf8 | POST | /api/users] - binding parameter (5:UUID) <- [939cc26f-dacd-4204-8875-6a042ac1f632] +25-03-31 15:51:32.469 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 2a113f86-af70-4aa4-9d30-b2882d5c20a9 +25-03-31 15:51:32.469 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 2a113f86-af70-4aa4-9d30-b2882d5c20a9 +25-03-31 15:51:32.482 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:51:32.483 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:51:32.483 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.484 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.521 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 2a113f86-af70-4aa4-9d30-b2882d5c20a9, newLastActiveAt: 2025-03-31T06:51:32.449Z +25-03-31 15:51:32.521 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 2a113f86-af70-4aa4-9d30-b2882d5c20a9, newLastActiveAt: 2025-03-31T06:51:32.450Z +25-03-31 15:51:32.535 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:51:32.535 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:51:32.540 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.450Z] +25-03-31 15:51:32.540 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.449Z] +25-03-31 15:51:32.540 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.522455500Z] +25-03-31 15:51:32.541 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:51:32.522455500Z] +25-03-31 15:51:32.541 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (3:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.541 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (3:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.541 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [13812910-9828-4b6a-8a46-370119da14f6 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (4:UUID) <- [939cc26f-dacd-4204-8875-6a042ac1f632] +25-03-31 15:51:32.541 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ced73050-a124-44db-887b-d21df30f9c61 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (4:UUID) <- [939cc26f-dacd-4204-8875-6a042ac1f632] +25-03-31 15:51:32.598 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [716e3840-125e-4cbd-b16e-fce3a246bcd5 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:51:32.630 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1c549e1a-fa2c-4be5-b597-da7abe27961b | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 15:51:32.636 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [78c034ba-6c77-4f7e-a0c0-9eea2cca99bc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:51:32.635 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [4f9d7997-4a65-48bc-be6f-e76243493ca3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:51:32.639 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [4f9d7997-4a65-48bc-be6f-e76243493ca3 | GET | /api/channels] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.639 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [78c034ba-6c77-4f7e-a0c0-9eea2cca99bc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.644 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4f9d7997-4a65-48bc-be6f-e76243493ca3 | GET | /api/channels] - [채널 조회 성공] id: 2a113f86-af70-4aa4-9d30-b2882d5c20a9 +25-03-31 15:51:32.659 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [4f9d7997-4a65-48bc-be6f-e76243493ca3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:51:32.660 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d64049ec-648b-47f5-bd3f-7167cde87a9b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:51:32.661 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d64049ec-648b-47f5-bd3f-7167cde87a9b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.663 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [4f9d7997-4a65-48bc-be6f-e76243493ca3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:51:32.663 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [4f9d7997-4a65-48bc-be6f-e76243493ca3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:51:32.688 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8e1e1c0c-2fbc-45ab-a1ff-130b5cf1ef05 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:51:32.689 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8e1e1c0c-2fbc-45ab-a1ff-130b5cf1ef05 | GET | /api/channels] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.692 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8e1e1c0c-2fbc-45ab-a1ff-130b5cf1ef05 | GET | /api/channels] - [채널 조회 성공] id: 2a113f86-af70-4aa4-9d30-b2882d5c20a9 +25-03-31 15:51:32.692 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [341d83fe-1028-41ac-baf7-b3f4ce4fedb2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:51:32.693 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [341d83fe-1028-41ac-baf7-b3f4ce4fedb2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:32.697 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8e1e1c0c-2fbc-45ab-a1ff-130b5cf1ef05 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 15:51:32.698 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8e1e1c0c-2fbc-45ab-a1ff-130b5cf1ef05 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 15:51:32.698 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8e1e1c0c-2fbc-45ab-a1ff-130b5cf1ef05 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 15:51:32.717 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [fc61ef8b-cfe5-4398-8ae3-5985075808ff | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 15:51:32.720 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [fc61ef8b-cfe5-4398-8ae3-5985075808ff | GET | /api/readStatuses] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:34.736 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 2a113f86-af70-4aa4-9d30-b2882d5c20a9 +25-03-31 15:51:34.741 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 15:51:34.742 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (1:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:34.744 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 2a113f86-af70-4aa4-9d30-b2882d5c20a9, newLastActiveAt: 2025-03-31T06:51:34.730Z +25-03-31 15:51:34.746 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 15:51:34.748 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T06:51:34.730Z] +25-03-31 15:51:34.748 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T06:51:34.746888600Z] +25-03-31 15:51:34.748 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (3:UUID) <- [2a113f86-af70-4aa4-9d30-b2882d5c20a9] +25-03-31 15:51:34.749 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [58b1b803-7fe4-4eb5-a97c-760dbb7666b3 | PATCH | /api/users/2a113f86-af70-4aa4-9d30-b2882d5c20a9/userStatus] - binding parameter (4:UUID) <- [939cc26f-dacd-4204-8875-6a042ac1f632] +25-03-31 15:51:42.301 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [1468bb61-a2a3-46e6-ba75-8744900021cd | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 15:51:42.303 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1468bb61-a2a3-46e6-ba75-8744900021cd | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 15:51:42.303 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1468bb61-a2a3-46e6-ba75-8744900021cd | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 15:51:42.304 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1468bb61-a2a3-46e6-ba75-8744900021cd | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 15:51:42.306 [http-nio-8081-exec-5] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [1468bb61-a2a3-46e6-ba75-8744900021cd | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 16:09:52.671 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 16:09:52.918 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-31 16:09:52.932 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-31 16:09:52.938 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-31 16:09:52.942 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-31 16:09:59.752 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-31 16:09:59.833 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 9004 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-31 16:09:59.834 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-31 16:10:01.258 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-31 16:10:01.348 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 82 ms. Found 6 JPA repository interfaces. +25-03-31 16:10:02.122 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-31 16:10:02.136 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-31 16:10:02.140 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-31 16:10:02.140 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-31 16:10:02.213 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-31 16:10:02.213 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2320 ms +25-03-31 16:10:02.347 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-31 16:10:02.578 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-31 16:10:02.582 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-31 16:10:02.597 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-31 16:10:02.864 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-31 16:10:02.922 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-31 16:10:02.959 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-31 16:10:03.273 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-31 16:10:03.361 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-31 16:10:04.550 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-31 16:10:04.568 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-31 16:10:04.570 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-31 16:10:04.571 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-31 16:10:04.572 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-31 16:10:04.573 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-31 16:10:04.574 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-31 16:10:04.574 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-31 16:10:04.580 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-31 16:10:04.582 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-31 16:10:04.585 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-31 16:10:04.586 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-31 16:10:04.588 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-31 16:10:04.589 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-31 16:10:04.591 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-31 16:10:04.593 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-31 16:10:04.595 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-31 16:10:04.597 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-31 16:10:04.599 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-31 16:10:04.601 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-31 16:10:04.603 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-31 16:10:04.604 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-31 16:10:04.606 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-31 16:10:04.615 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-31 16:10:04.959 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-31 16:10:05.880 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-31 16:10:07.058 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-31 16:10:07.143 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-31 16:10:07.153 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-31 16:10:07.175 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 8.185 seconds (process running for 8.879) +25-03-31 16:10:07.348 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.22.11:8081/actuator, healthUrl=http://10.3.22.11:8081/actuator/health, serviceUrl=http://10.3.22.11:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-31 16:10:07.394 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-31 16:10:07.395 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-31 16:10:07.396 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 1 ms +25-03-31 16:10:16.449 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 16:10:16.526 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 16:10:16.533 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 16:10:16.533 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:10:16.570 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 16:10:16.571 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:10:16.571 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:10:16.625 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - [회원 생성 완료] username: rex, id: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b +25-03-31 16:10:16.649 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 16:10:16.652 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.599034800Z] +25-03-31 16:10:16.662 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 16:10:16.662 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 16:10:16.662 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (4:UUID) <- [null] +25-03-31 16:10:16.662 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.599034800Z] +25-03-31 16:10:16.662 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 16:10:16.662 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (7:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.669 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 16:10:16.669 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.623992100Z] +25-03-31 16:10:16.670 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.572308100Z] +25-03-31 16:10:16.670 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.623992100Z] +25-03-31 16:10:16.670 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (4:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.670 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7f566ebc-d8ec-4ea1-ba47-d824ad9e28b0 | POST | /api/users] - binding parameter (5:UUID) <- [69b0b29d-abaa-4250-99b5-1c500ef48677] +25-03-31 16:10:16.719 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b +25-03-31 16:10:16.719 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b +25-03-31 16:10:16.729 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:10:16.729 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:10:16.729 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.729 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.753 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b, newLastActiveAt: 2025-03-31T07:10:16.709Z +25-03-31 16:10:16.753 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b, newLastActiveAt: 2025-03-31T07:10:16.707Z +25-03-31 16:10:16.762 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:10:16.762 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:10:16.765 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.707Z] +25-03-31 16:10:16.765 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.709Z] +25-03-31 16:10:16.765 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.754222500Z] +25-03-31 16:10:16.765 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:10:16.754222500Z] +25-03-31 16:10:16.766 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (3:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.766 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e4a52c88-24ff-4153-b762-e19cd9f4af7a | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (4:UUID) <- [69b0b29d-abaa-4250-99b5-1c500ef48677] +25-03-31 16:10:16.766 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (3:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.766 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [136544cc-16a9-48e4-99e9-ca249ead25d4 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (4:UUID) <- [69b0b29d-abaa-4250-99b5-1c500ef48677] +25-03-31 16:10:16.802 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [800d5a41-f615-4b7d-ae9d-27f7eb46832b | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:10:16.821 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e18559fb-fbe2-4523-9bd9-dfd53a20e044 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:10:16.823 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [42384ba6-b1c8-4813-bc63-2bfd0a31a6f1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:10:16.823 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [001c48f1-43f8-4de6-9a41-d0aa5b3af7f1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:10:16.823 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [42384ba6-b1c8-4813-bc63-2bfd0a31a6f1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.823 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [001c48f1-43f8-4de6-9a41-d0aa5b3af7f1 | GET | /api/channels] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.825 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [001c48f1-43f8-4de6-9a41-d0aa5b3af7f1 | GET | /api/channels] - [채널 조회 성공] id: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b +25-03-31 16:10:16.832 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [001c48f1-43f8-4de6-9a41-d0aa5b3af7f1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:10:16.834 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [001c48f1-43f8-4de6-9a41-d0aa5b3af7f1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:10:16.834 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [001c48f1-43f8-4de6-9a41-d0aa5b3af7f1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:10:16.846 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [29d09fca-ab35-47b1-8be6-15a843397ac6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:10:16.846 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [07f60287-08b7-4435-8e4d-dc7e23a40477 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:10:16.846 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [29d09fca-ab35-47b1-8be6-15a843397ac6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.846 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [07f60287-08b7-4435-8e4d-dc7e23a40477 | GET | /api/channels] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.847 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [07f60287-08b7-4435-8e4d-dc7e23a40477 | GET | /api/channels] - [채널 조회 성공] id: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b +25-03-31 16:10:16.850 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [07f60287-08b7-4435-8e4d-dc7e23a40477 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:10:16.850 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [07f60287-08b7-4435-8e4d-dc7e23a40477 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:10:16.850 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [07f60287-08b7-4435-8e4d-dc7e23a40477 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:10:16.856 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [42cce8c3-4fe0-4dda-a0af-a8c1950419b3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:10:16.856 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [42cce8c3-4fe0-4dda-a0af-a8c1950419b3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:16.863 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [65d50a94-fb15-4bd2-8955-a63c3ae81160 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:10:16.863 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [65d50a94-fb15-4bd2-8955-a63c3ae81160 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:18.626 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b +25-03-31 16:10:18.629 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:10:18.629 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:18.630 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b, newLastActiveAt: 2025-03-31T07:10:18.618Z +25-03-31 16:10:18.631 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:10:18.631 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:10:18.618Z] +25-03-31 16:10:18.631 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:10:18.630992300Z] +25-03-31 16:10:18.631 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (3:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:18.631 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f4401bcd-329f-4c6e-a0f1-a28cb1349948 | PATCH | /api/users/f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b/userStatus] - binding parameter (4:UUID) <- [69b0b29d-abaa-4250-99b5-1c500ef48677] +25-03-31 16:10:26.248 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [d378fe65-1b8e-4d1a-b73c-287918281995 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 16:10:26.249 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d378fe65-1b8e-4d1a-b73c-287918281995 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 16:10:26.250 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d378fe65-1b8e-4d1a-b73c-287918281995 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 16:10:26.250 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d378fe65-1b8e-4d1a-b73c-287918281995 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:10:26.251 [http-nio-8081-exec-4] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [d378fe65-1b8e-4d1a-b73c-287918281995 | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 16:10:41.227 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [307a5e77-8e62-4b8c-9102-a87559cee6ef | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-31 16:10:41.229 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [307a5e77-8e62-4b8c-9102-a87559cee6ef | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:10:41.229 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [307a5e77-8e62-4b8c-9102-a87559cee6ef | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:10:41.235 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [307a5e77-8e62-4b8c-9102-a87559cee6ef | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:10:41.237 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [307a5e77-8e62-4b8c-9102-a87559cee6ef | POST | /api/auth/login] - binding parameter (1:UUID) <- [f08f5d0b-eb0a-4dbb-93c1-b1ce0274877b] +25-03-31 16:10:41.238 [http-nio-8081-exec-2] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [307a5e77-8e62-4b8c-9102-a87559cee6ef | POST | /api/auth/login] - [로그인 실패} 잘못된 비밀번호 입니다: rex +25-03-31 16:18:33.450 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 16:18:33.712 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-31 16:18:33.729 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-31 16:18:33.733 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-31 16:18:33.736 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-31 16:18:40.033 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-31 16:18:40.119 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 4172 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-31 16:18:40.121 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-31 16:18:41.954 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-31 16:18:42.070 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 102 ms. Found 6 JPA repository interfaces. +25-03-31 16:18:42.885 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-31 16:18:42.898 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-31 16:18:42.901 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-31 16:18:42.901 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-31 16:18:42.977 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-31 16:18:42.977 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2793 ms +25-03-31 16:18:43.119 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-31 16:18:43.369 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-31 16:18:43.373 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-31 16:18:43.382 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-31 16:18:43.712 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-31 16:18:43.777 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-31 16:18:43.818 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-31 16:18:44.138 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-31 16:18:44.229 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-31 16:18:45.448 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-31 16:18:45.468 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-31 16:18:45.471 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-31 16:18:45.473 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-31 16:18:45.474 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-31 16:18:45.475 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-31 16:18:45.478 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-31 16:18:45.479 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-31 16:18:45.487 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-31 16:18:45.489 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-31 16:18:45.490 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-31 16:18:45.491 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-31 16:18:45.492 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-31 16:18:45.494 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-31 16:18:45.495 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-31 16:18:45.496 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-31 16:18:45.502 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-31 16:18:45.504 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-31 16:18:45.507 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-31 16:18:45.508 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-31 16:18:45.509 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-31 16:18:45.510 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-31 16:18:45.511 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-31 16:18:45.517 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-31 16:18:45.880 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-31 16:18:47.275 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-31 16:18:49.561 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-31 16:18:49.760 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-31 16:18:49.803 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-31 16:18:49.855 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 10.766 seconds (process running for 11.633) +25-03-31 16:18:49.954 [http-nio-8081-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-31 16:18:49.954 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-31 16:18:49.958 [http-nio-8081-exec-1] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 3 ms +25-03-31 16:18:50.130 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.22.11:8081/actuator, healthUrl=http://10.3.22.11:8081/actuator/health, serviceUrl=http://10.3.22.11:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-03-31 16:18:56.210 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [0147301e-c721-4609-91ac-d90b2a95b8f1 | POST | /api/auth/login] - [로그인 시도] username: dex +25-03-31 16:18:56.379 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0147301e-c721-4609-91ac-d90b2a95b8f1 | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:18:56.387 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0147301e-c721-4609-91ac-d90b2a95b8f1 | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [dex] +25-03-31 16:18:56.450 [http-nio-8081-exec-2] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [0147301e-c721-4609-91ac-d90b2a95b8f1 | POST | /api/auth/login] - [로그인 실패] 회원을 찾을 수 없습니다 dex +25-03-31 16:19:50.561 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 16:19:50.568 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 16:19:50.568 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 16:19:50.568 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:19:50.571 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 16:19:50.571 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:19:50.571 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:19:50.664 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - [회원 생성 완료] username: rex, id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:50.696 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 16:19:50.702 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.622521500Z] +25-03-31 16:19:50.712 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 16:19:50.713 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 16:19:50.713 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (4:UUID) <- [null] +25-03-31 16:19:50.713 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.622521500Z] +25-03-31 16:19:50.713 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 16:19:50.713 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (7:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.720 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 16:19:50.721 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.659327200Z] +25-03-31 16:19:50.722 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.572673900Z] +25-03-31 16:19:50.722 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.659327200Z] +25-03-31 16:19:50.722 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (4:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.722 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [22b33945-cf3c-4d69-9f0e-c8de1d24b0a8 | POST | /api/users] - binding parameter (5:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:19:50.747 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:50.747 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:50.754 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:19:50.754 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:19:50.755 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.755 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.776 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:19:50.735Z +25-03-31 16:19:50.776 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:19:50.734Z +25-03-31 16:19:50.788 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:19:50.788 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:19:50.792 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.735Z] +25-03-31 16:19:50.792 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.734Z] +25-03-31 16:19:50.792 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.777969100Z] +25-03-31 16:19:50.792 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:19:50.777969100Z] +25-03-31 16:19:50.792 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.792 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.792 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [80caeaf0-a37d-405e-87e0-004ae82dffea | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:19:50.792 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [401127aa-403e-4d10-b1f7-6326f0ac37f8 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:19:50.856 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2d111261-f149-496c-b6cb-12128dd3cabd | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:19:50.887 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d4a4dee3-b5f0-422f-b79f-6588b16a838d | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:19:50.890 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1ba984be-3a3f-497d-a84b-bd97359b3105 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:50.890 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [57f839f3-8779-4b40-9e03-93fcd488f2f6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:50.891 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1ba984be-3a3f-497d-a84b-bd97359b3105 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.892 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [57f839f3-8779-4b40-9e03-93fcd488f2f6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.895 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1ba984be-3a3f-497d-a84b-bd97359b3105 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:50.911 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1ba984be-3a3f-497d-a84b-bd97359b3105 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:19:50.913 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1ba984be-3a3f-497d-a84b-bd97359b3105 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:19:50.913 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1ba984be-3a3f-497d-a84b-bd97359b3105 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:19:50.922 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2d076296-dc29-4b01-b61d-892b4c5cfea7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:50.923 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2d076296-dc29-4b01-b61d-892b4c5cfea7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.928 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [60545811-cece-40f4-96a2-a52e82582ab2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:50.928 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [60545811-cece-40f4-96a2-a52e82582ab2 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.929 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [60545811-cece-40f4-96a2-a52e82582ab2 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:50.932 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [c1a13442-1222-4b45-a627-06bb27f8aa50 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:50.932 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [60545811-cece-40f4-96a2-a52e82582ab2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:19:50.932 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [60545811-cece-40f4-96a2-a52e82582ab2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:19:50.932 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [60545811-cece-40f4-96a2-a52e82582ab2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:19:50.932 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [c1a13442-1222-4b45-a627-06bb27f8aa50 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:50.942 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [054fc8ef-829e-4cba-8745-683c189b93d2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:50.942 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [054fc8ef-829e-4cba-8745-683c189b93d2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:53.927 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3bdcc5ab-3e47-4396-a02d-bfdefcbaf334 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:53.927 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3bdcc5ab-3e47-4396-a02d-bfdefcbaf334 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:53.928 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3bdcc5ab-3e47-4396-a02d-bfdefcbaf334 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:53.929 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3bdcc5ab-3e47-4396-a02d-bfdefcbaf334 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:19:53.930 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3bdcc5ab-3e47-4396-a02d-bfdefcbaf334 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:19:53.930 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3bdcc5ab-3e47-4396-a02d-bfdefcbaf334 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:19:53.945 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f28907d7-137c-44ad-9b25-7ca754a839d1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:53.945 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f28907d7-137c-44ad-9b25-7ca754a839d1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:56.932 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [58e33b8b-b801-4ee8-ab6e-91f73c22fd0c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:56.933 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [58e33b8b-b801-4ee8-ab6e-91f73c22fd0c | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:56.934 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [58e33b8b-b801-4ee8-ab6e-91f73c22fd0c | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:56.937 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [58e33b8b-b801-4ee8-ab6e-91f73c22fd0c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:19:56.937 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [58e33b8b-b801-4ee8-ab6e-91f73c22fd0c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:19:56.937 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [58e33b8b-b801-4ee8-ab6e-91f73c22fd0c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:19:56.947 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7c80858d-c21e-4159-a683-70c23b714d6e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:56.947 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7c80858d-c21e-4159-a683-70c23b714d6e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:59.928 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [46dc4279-9768-4cfa-977b-c9fac7ac0e08 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:59.929 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [46dc4279-9768-4cfa-977b-c9fac7ac0e08 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:19:59.930 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [46dc4279-9768-4cfa-977b-c9fac7ac0e08 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:19:59.934 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [46dc4279-9768-4cfa-977b-c9fac7ac0e08 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:19:59.935 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [46dc4279-9768-4cfa-977b-c9fac7ac0e08 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:19:59.935 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [46dc4279-9768-4cfa-977b-c9fac7ac0e08 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:19:59.949 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8e9eba8e-f492-44df-82c8-1dc5b754a211 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:19:59.949 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8e9eba8e-f492-44df-82c8-1dc5b754a211 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:02.924 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e0bac34b-1f22-4eb7-bbb6-528a12679c78 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:02.925 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e0bac34b-1f22-4eb7-bbb6-528a12679c78 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:02.926 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e0bac34b-1f22-4eb7-bbb6-528a12679c78 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:02.928 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e0bac34b-1f22-4eb7-bbb6-528a12679c78 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:20:02.929 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e0bac34b-1f22-4eb7-bbb6-528a12679c78 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:20:02.929 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e0bac34b-1f22-4eb7-bbb6-528a12679c78 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:20:02.949 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [55b456b9-5005-46eb-90d9-343d8ecc2f9a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:02.950 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [55b456b9-5005-46eb-90d9-343d8ecc2f9a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:05.929 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9ffef49c-ad23-4a26-9d57-5072361fc131 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:05.930 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9ffef49c-ad23-4a26-9d57-5072361fc131 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:05.931 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9ffef49c-ad23-4a26-9d57-5072361fc131 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:05.934 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9ffef49c-ad23-4a26-9d57-5072361fc131 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:20:05.935 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9ffef49c-ad23-4a26-9d57-5072361fc131 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:20:05.935 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9ffef49c-ad23-4a26-9d57-5072361fc131 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:20:05.949 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ffd9b1a7-78a6-4edb-8b22-a57f478517ab | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:05.950 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ffd9b1a7-78a6-4edb-8b22-a57f478517ab | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:06.793 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:06.798 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:20:06.799 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:06.801 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:20:06.784Z +25-03-31 16:20:06.803 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:20:06.804 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:20:06.784Z] +25-03-31 16:20:06.804 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:20:06.802468Z] +25-03-31 16:20:06.804 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:06.804 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0fb4827a-33d7-4639-ae48-864d4456cf45 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:20:10.995 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [7d411b65-fb13-4d74-979c-3ddb57d2a2b1 | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-31 16:20:10.998 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7d411b65-fb13-4d74-979c-3ddb57d2a2b1 | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:20:10.998 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7d411b65-fb13-4d74-979c-3ddb57d2a2b1 | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:20:11.002 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7d411b65-fb13-4d74-979c-3ddb57d2a2b1 | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:20:11.002 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7d411b65-fb13-4d74-979c-3ddb57d2a2b1 | POST | /api/auth/login] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.003 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [7d411b65-fb13-4d74-979c-3ddb57d2a2b1 | POST | /api/auth/login] - [로그인 성공] username: rex +25-03-31 16:20:11.011 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [5cc788b0-4219-44e5-80f7-f664e42aec24 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:20:11.025 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:11.026 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [896d8733-ee6d-4465-a946-346804a74c22 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.026 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:11.027 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [896d8733-ee6d-4465-a946-346804a74c22 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.028 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:20:11.028 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:20:11.030 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.028 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [896d8733-ee6d-4465-a946-346804a74c22 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:11.031 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.031 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:20:11.019Z +25-03-31 16:20:11.032 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [896d8733-ee6d-4465-a946-346804a74c22 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:20:11.032 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:20:11.032 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [896d8733-ee6d-4465-a946-346804a74c22 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:20:11.032 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:20:11.019Z] +25-03-31 16:20:11.032 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [896d8733-ee6d-4465-a946-346804a74c22 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:20:11.032 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:20:11.032225400Z] +25-03-31 16:20:11.032 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.032 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d08d9c1f-3ea5-4654-8bb3-f14a0d2afbb7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:20:11.033 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5caf1ca3-c9f7-4108-ad91-fdcabb937507 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:20:11.033 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:20:11.019Z +25-03-31 16:20:11.035 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [00f42333-bedb-40f9-b75d-b7953c51e7b4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.036 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:20:11.036 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [00f42333-bedb-40f9-b75d-b7953c51e7b4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.036 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:20:11.019Z] +25-03-31 16:20:11.036 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:20:11.035690200Z] +25-03-31 16:20:11.037 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.037 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [227c58db-d846-4b10-88b3-f15f4b8147a1 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:20:11.046 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f0eb7ea1-1ca8-4741-a4a6-81254b35c8de | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.046 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f0eb7ea1-1ca8-4741-a4a6-81254b35c8de | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.049 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [46bba9ae-86b0-4529-85f0-88cc60904932 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.049 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e69cb936-a8bd-4fe9-964c-38e8cf46d830 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:20:11.050 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [46bba9ae-86b0-4529-85f0-88cc60904932 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.050 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [46bba9ae-86b0-4529-85f0-88cc60904932 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:11.052 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [46bba9ae-86b0-4529-85f0-88cc60904932 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:20:11.052 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [46bba9ae-86b0-4529-85f0-88cc60904932 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:20:11.052 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [46bba9ae-86b0-4529-85f0-88cc60904932 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:20:11.053 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [169265a0-3557-42df-8b26-2632b087f274 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.054 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [169265a0-3557-42df-8b26-2632b087f274 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.060 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [88282011-422d-4119-9198-524713b44567 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.060 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2e8e190f-2306-4d11-b7b3-0436bded8a6e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.060 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2e8e190f-2306-4d11-b7b3-0436bded8a6e | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.060 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [88282011-422d-4119-9198-524713b44567 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.061 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2e8e190f-2306-4d11-b7b3-0436bded8a6e | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:11.063 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2e8e190f-2306-4d11-b7b3-0436bded8a6e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:20:11.064 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2e8e190f-2306-4d11-b7b3-0436bded8a6e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:20:11.064 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2e8e190f-2306-4d11-b7b3-0436bded8a6e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:20:11.067 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [4b8fa9d7-b745-43d9-b9b8-34333a3f92d3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.067 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [4b8fa9d7-b745-43d9-b9b8-34333a3f92d3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:11.074 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [de6a6830-235a-45b1-a211-cc07097c9f2a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:20:11.074 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [de6a6830-235a-45b1-a211-cc07097c9f2a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:13.242 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:20:13.244 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:20:13.244 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:13.245 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:20:13.237Z +25-03-31 16:20:13.246 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:20:13.247 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:20:13.237Z] +25-03-31 16:20:13.247 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:20:13.245628100Z] +25-03-31 16:20:13.247 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:13.247 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f4b3381f-035b-4810-a0f7-3a84b52e59da | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:20:16.377 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [bfb66597-9cb7-4c67-b11a-8694eadcc2be | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-31 16:20:16.379 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [bfb66597-9cb7-4c67-b11a-8694eadcc2be | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:20:16.380 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [bfb66597-9cb7-4c67-b11a-8694eadcc2be | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:20:16.381 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [bfb66597-9cb7-4c67-b11a-8694eadcc2be | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:20:16.381 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [bfb66597-9cb7-4c67-b11a-8694eadcc2be | POST | /api/auth/login] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:20:16.382 [http-nio-8081-exec-1] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [bfb66597-9cb7-4c67-b11a-8694eadcc2be | POST | /api/auth/login] - [로그인 실패} 잘못된 비밀번호 입니다: rex +25-03-31 16:20:24.716 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [6718a836-6429-4d9e-80a2-d9f011b93ecf | POST | /api/auth/login] - [로그인 시도] username: hi +25-03-31 16:20:24.720 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6718a836-6429-4d9e-80a2-d9f011b93ecf | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:20:24.721 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6718a836-6429-4d9e-80a2-d9f011b93ecf | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [hi] +25-03-31 16:20:24.723 [http-nio-8081-exec-4] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [6718a836-6429-4d9e-80a2-d9f011b93ecf | POST | /api/auth/login] - [로그인 실패] 회원을 찾을 수 없습니다 hi +25-03-31 16:20:38.658 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [072b2ad1-9434-47ce-b6f8-3c76b7ceb884 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 16:20:38.660 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [072b2ad1-9434-47ce-b6f8-3c76b7ceb884 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 16:20:38.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [072b2ad1-9434-47ce-b6f8-3c76b7ceb884 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 16:20:38.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [072b2ad1-9434-47ce-b6f8-3c76b7ceb884 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:20:38.662 [http-nio-8081-exec-8] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [072b2ad1-9434-47ce-b6f8-3c76b7ceb884 | POST | /api/users] - [회원 생성 실패] 중복된 이메일: rex@naver.com +25-03-31 16:20:43.364 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - [회원 생성 요청] username: rex, email: reex@naver.com +25-03-31 16:20:43.366 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 16:20:43.366 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - binding parameter (1:VARCHAR) <- [reex@naver.com] +25-03-31 16:20:43.366 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:20:43.369 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 16:20:43.370 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:20:43.370 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 16:20:43.371 [http-nio-8081-exec-6] WARN com.sprint.mission.discodeit.service.basic.BasicUserService [43606be5-7cc3-45d5-a915-35dea6fa32db | POST | /api/users] - [회원 생성 실패] 중복된 사용자 이름: rex +25-03-31 16:58:03.084 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [893209ea-dabc-4bb1-8792-9afa470c4a6e | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-31 16:58:03.098 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [893209ea-dabc-4bb1-8792-9afa470c4a6e | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:58:03.100 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [893209ea-dabc-4bb1-8792-9afa470c4a6e | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:58:03.104 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [893209ea-dabc-4bb1-8792-9afa470c4a6e | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:58:03.104 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [893209ea-dabc-4bb1-8792-9afa470c4a6e | POST | /api/auth/login] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:58:03.108 [http-nio-8081-exec-5] WARN com.sprint.mission.discodeit.service.basic.BasicAuthService [893209ea-dabc-4bb1-8792-9afa470c4a6e | POST | /api/auth/login] - [로그인 실패} 잘못된 비밀번호 입니다: rex +25-03-31 16:59:22.160 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [6814419f-69fc-4e78-b150-a633524bcf73 | POST | /api/auth/login] - [로그인 시도] username: rex +25-03-31 16:59:22.162 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6814419f-69fc-4e78-b150-a633524bcf73 | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-03-31 16:59:22.163 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6814419f-69fc-4e78-b150-a633524bcf73 | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 16:59:22.164 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6814419f-69fc-4e78-b150-a633524bcf73 | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:59:22.164 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6814419f-69fc-4e78-b150-a633524bcf73 | POST | /api/auth/login] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.166 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [6814419f-69fc-4e78-b150-a633524bcf73 | POST | /api/auth/login] - [로그인 성공] username: rex +25-03-31 16:59:22.183 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [99024e0b-989b-4c28-8046-612746ff9c33 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:59:22.213 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d42bde00-595c-4129-9f7e-42337f326bd1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.214 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d42bde00-595c-4129-9f7e-42337f326bd1 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.214 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [cd4213b6-c4ef-43b1-9ce8-79328d773289 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:59:22.214 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:22.215 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d42bde00-595c-4129-9f7e-42337f326bd1 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:22.215 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:22.216 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:59:22.217 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:59:22.217 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.217 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.217 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d42bde00-595c-4129-9f7e-42337f326bd1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:22.218 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7fb2bbc9-94e0-45db-8d69-f395199866b6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.218 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d42bde00-595c-4129-9f7e-42337f326bd1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:22.218 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d42bde00-595c-4129-9f7e-42337f326bd1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:22.218 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7fb2bbc9-94e0-45db-8d69-f395199866b6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.219 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:59:22.205Z +25-03-31 16:59:22.220 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:59:22.204Z +25-03-31 16:59:22.239 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:59:22.240 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:59:22.204Z] +25-03-31 16:59:22.240 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:59:22.240 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:59:22.221066300Z] +25-03-31 16:59:22.240 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.240 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6fdaec27-fb5c-4404-9aec-1db52ea3861b | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:59:22.240 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:59:22.205Z] +25-03-31 16:59:22.241 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:59:22.221066300Z] +25-03-31 16:59:22.241 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.241 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b6ec3521-f6d4-4fc2-a5c1-1fbc84da6060 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:59:22.247 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e33cbf3a-3433-4489-8248-4c3cc823c421 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.247 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [f57c7813-09d9-4640-adbf-9a4b3ce0066c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.248 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e33cbf3a-3433-4489-8248-4c3cc823c421 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.248 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [f57c7813-09d9-4640-adbf-9a4b3ce0066c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.249 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e33cbf3a-3433-4489-8248-4c3cc823c421 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:22.251 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e33cbf3a-3433-4489-8248-4c3cc823c421 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:22.251 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e33cbf3a-3433-4489-8248-4c3cc823c421 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:22.251 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e33cbf3a-3433-4489-8248-4c3cc823c421 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:22.255 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [9a36cf6f-efa4-4d04-90d1-6c732b0ee967 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.255 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [9a36cf6f-efa4-4d04-90d1-6c732b0ee967 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.259 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1408b274-fe6a-4d4a-9f5a-1a561eecf19a | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:59:22.262 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0d8888ee-fafd-474e-810f-7abf76f55168 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.262 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0d8888ee-fafd-474e-810f-7abf76f55168 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.268 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ec4fc7ba-3310-447c-a982-7f79d5e06e96 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.269 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ec4fc7ba-3310-447c-a982-7f79d5e06e96 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.269 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [da661524-4d09-4ee3-85c6-cc106a99dc48 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.269 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [da661524-4d09-4ee3-85c6-cc106a99dc48 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:22.269 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [da661524-4d09-4ee3-85c6-cc106a99dc48 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:22.272 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [da661524-4d09-4ee3-85c6-cc106a99dc48 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:22.273 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [da661524-4d09-4ee3-85c6-cc106a99dc48 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:22.273 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [da661524-4d09-4ee3-85c6-cc106a99dc48 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:22.280 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d138e602-41df-4fff-9ff1-5e433d78be2d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:22.281 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d138e602-41df-4fff-9ff1-5e433d78be2d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:25.275 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f2bed8d0-434b-4eeb-9904-0ed52e5e482f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:25.277 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f2bed8d0-434b-4eeb-9904-0ed52e5e482f | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:25.279 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f2bed8d0-434b-4eeb-9904-0ed52e5e482f | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:25.282 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f2bed8d0-434b-4eeb-9904-0ed52e5e482f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:25.283 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f2bed8d0-434b-4eeb-9904-0ed52e5e482f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:25.284 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f2bed8d0-434b-4eeb-9904-0ed52e5e482f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:25.301 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3b76d8ec-d958-418c-9b1c-3e547df88fd9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:25.301 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3b76d8ec-d958-418c-9b1c-3e547df88fd9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:28.272 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [3284fe91-de92-42b7-85d3-48561f73296c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:28.272 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3284fe91-de92-42b7-85d3-48561f73296c | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:28.273 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3284fe91-de92-42b7-85d3-48561f73296c | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:28.274 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [3284fe91-de92-42b7-85d3-48561f73296c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:28.275 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3284fe91-de92-42b7-85d3-48561f73296c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:28.275 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3284fe91-de92-42b7-85d3-48561f73296c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:28.284 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [0c95ce35-7ad3-4895-9931-941dd396b9f2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:28.284 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [0c95ce35-7ad3-4895-9931-941dd396b9f2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:30.659 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - [회원 수정 요청] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:30.707 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-03-31 16:59:30.708 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:30.725 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email is null + fetch + first ? rows only +25-03-31 16:59:30.726 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (1:INTEGER) <- [1] +25-03-31 16:59:30.728 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username is null + fetch + first ? rows only +25-03-31 16:59:30.729 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (1:INTEGER) <- [1] +25-03-31 16:59:30.731 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - [프로필 이미지 업데이트] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-03-31 16:59:30.745 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - [회원 수정 완료] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, 새로운 이름: null, 새로운 이메일: null +25-03-31 16:59:30.751 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-03-31 16:59:30.752 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (1:VARCHAR) <- [image/png] +25-03-31 16:59:30.752 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:59:30.733854800Z] +25-03-31 16:59:30.752 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (3:VARCHAR) <- [rex.png] +25-03-31 16:59:30.752 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (4:BIGINT) <- [64605] +25-03-31 16:59:30.752 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (5:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:30.757 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - + /* update + for com.sprint.mission.discodeit.entity.User */update users + set + email=?, + password=?, + profile_id=?, + updated_at=?, + username=? + where + id=? +25-03-31 16:59:30.758 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 16:59:30.758 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (2:VARCHAR) <- [Rlawnsdn12!] +25-03-31 16:59:30.758 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (3:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:30.758 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-31T07:59:30.747602500Z] +25-03-31 16:59:30.758 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (5:VARCHAR) <- [rex] +25-03-31 16:59:30.758 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [64a2ecf4-0148-4643-96e0-05936313983d | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86] - binding parameter (6:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:31.280 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [79abba6c-f5ff-40a4-abfd-7b964cb22ae1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:31.280 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [79abba6c-f5ff-40a4-abfd-7b964cb22ae1 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:31.282 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [79abba6c-f5ff-40a4-abfd-7b964cb22ae1 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:31.284 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [79abba6c-f5ff-40a4-abfd-7b964cb22ae1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:31.284 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [79abba6c-f5ff-40a4-abfd-7b964cb22ae1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:31.284 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [79abba6c-f5ff-40a4-abfd-7b964cb22ae1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:31.296 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e78170fb-df89-49a9-8b5b-bb996047b209 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:31.297 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e78170fb-df89-49a9-8b5b-bb996047b209 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.324 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:32.324 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:32.325 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:59:32.327 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 16:59:32.327 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.327 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.328 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:59:32.320Z +25-03-31 16:59:32.328 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T07:59:32.318Z +25-03-31 16:59:32.331 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:59:32.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 16:59:32.331 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:59:32.320Z] +25-03-31 16:59:32.331 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T07:59:32.318Z] +25-03-31 16:59:32.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:59:32.330172100Z] +25-03-31 16:59:32.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T07:59:32.330172100Z] +25-03-31 16:59:32.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [bf434158-cbac-468e-b691-f30d9183a329 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:59:32.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.332 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ee0915ea-99ae-43a3-b81f-943e73017f41 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 16:59:32.341 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [220f77a5-d7b4-49e3-b2a7-32a64edb7e5e | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:59:32.367 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [216324a1-cb4a-4664-bfa2-4ebebbaf3bf4 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 16:59:32.369 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a378fa98-14ed-40ff-bcff-fbde1a856b5b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:32.369 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [efe920ab-fe83-49ac-aaa8-b401a4ed0d2e | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - [파일 조회] id: d997a192-3682-447e-8a3a-df4a8fcf68f0 +25-03-31 16:59:32.369 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a378fa98-14ed-40ff-bcff-fbde1a856b5b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.370 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [fda15b95-e551-460c-b0ab-0b7edbe58119 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:32.370 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [fda15b95-e551-460c-b0ab-0b7edbe58119 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.371 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [efe920ab-fe83-49ac-aaa8-b401a4ed0d2e | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 16:59:32.372 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fda15b95-e551-460c-b0ab-0b7edbe58119 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:32.372 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [efe920ab-fe83-49ac-aaa8-b401a4ed0d2e | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - binding parameter (1:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:32.375 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [fda15b95-e551-460c-b0ab-0b7edbe58119 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:32.376 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [fda15b95-e551-460c-b0ab-0b7edbe58119 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:32.376 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [fda15b95-e551-460c-b0ab-0b7edbe58119 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:32.386 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [cade567e-c02b-46ee-99e5-3d8d88c2ce81 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - [파일 조회] id: d997a192-3682-447e-8a3a-df4a8fcf68f0 +25-03-31 16:59:32.387 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cade567e-c02b-46ee-99e5-3d8d88c2ce81 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 16:59:32.387 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cade567e-c02b-46ee-99e5-3d8d88c2ce81 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - binding parameter (1:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:32.392 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [019b72d8-b321-4df2-8f1d-6d7e0f5f4da0 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0/download] - [파일 조회] id: d997a192-3682-447e-8a3a-df4a8fcf68f0 +25-03-31 16:59:32.393 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [34229285-0b97-4121-bf29-6c627b9b65fc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:32.393 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [34229285-0b97-4121-bf29-6c627b9b65fc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.393 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [019b72d8-b321-4df2-8f1d-6d7e0f5f4da0 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 16:59:32.394 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [019b72d8-b321-4df2-8f1d-6d7e0f5f4da0 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0/download] - binding parameter (1:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:32.397 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6ca25842-cdc9-4e25-a6f9-e85640b960c8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:32.397 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [70be8658-116f-4625-abc5-3a4606a86355 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - [파일 조회] id: d997a192-3682-447e-8a3a-df4a8fcf68f0 +25-03-31 16:59:32.398 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6ca25842-cdc9-4e25-a6f9-e85640b960c8 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.399 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [70be8658-116f-4625-abc5-3a4606a86355 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 16:59:32.399 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6ca25842-cdc9-4e25-a6f9-e85640b960c8 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:32.400 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [70be8658-116f-4625-abc5-3a4606a86355 | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - binding parameter (1:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:32.403 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6ca25842-cdc9-4e25-a6f9-e85640b960c8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:32.404 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6ca25842-cdc9-4e25-a6f9-e85640b960c8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:32.404 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6ca25842-cdc9-4e25-a6f9-e85640b960c8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:32.408 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [993b3c6c-bd8e-4dd6-b287-ca667163e5d2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:32.409 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [993b3c6c-bd8e-4dd6-b287-ca667163e5d2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.410 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [b0deac27-3686-450c-b1a3-c884ee6854af | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - [파일 조회] id: d997a192-3682-447e-8a3a-df4a8fcf68f0 +25-03-31 16:59:32.411 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b0deac27-3686-450c-b1a3-c884ee6854af | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 16:59:32.411 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b0deac27-3686-450c-b1a3-c884ee6854af | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - binding parameter (1:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:32.439 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [777921b4-382d-46b7-ad94-c1f7ee18f14f | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - [파일 조회] id: d997a192-3682-447e-8a3a-df4a8fcf68f0 +25-03-31 16:59:32.441 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [777921b4-382d-46b7-ad94-c1f7ee18f14f | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-03-31 16:59:32.441 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ba69734d-9843-4ee5-9bbe-6e089ed27d22 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:32.441 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ba69734d-9843-4ee5-9bbe-6e089ed27d22 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:32.441 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [777921b4-382d-46b7-ad94-c1f7ee18f14f | GET | /api/binaryContents/d997a192-3682-447e-8a3a-df4a8fcf68f0] - binding parameter (1:UUID) <- [d997a192-3682-447e-8a3a-df4a8fcf68f0] +25-03-31 16:59:35.399 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [29ce2cc4-52a6-4fe3-943d-2ea011bbfa30 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:35.400 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [29ce2cc4-52a6-4fe3-943d-2ea011bbfa30 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:35.401 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [29ce2cc4-52a6-4fe3-943d-2ea011bbfa30 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:35.403 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [29ce2cc4-52a6-4fe3-943d-2ea011bbfa30 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:35.404 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [29ce2cc4-52a6-4fe3-943d-2ea011bbfa30 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:35.404 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [29ce2cc4-52a6-4fe3-943d-2ea011bbfa30 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:35.419 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [61bcc9f3-963f-484c-9dec-18e2e16c0715 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:35.420 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [61bcc9f3-963f-484c-9dec-18e2e16c0715 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:39.067 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c30107fe-b890-4c0f-b565-eb2503344ec5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:39.068 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c30107fe-b890-4c0f-b565-eb2503344ec5 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:39.071 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c30107fe-b890-4c0f-b565-eb2503344ec5 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:39.074 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c30107fe-b890-4c0f-b565-eb2503344ec5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:39.074 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c30107fe-b890-4c0f-b565-eb2503344ec5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:39.074 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c30107fe-b890-4c0f-b565-eb2503344ec5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:39.083 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7a40142f-abaa-4a05-9f22-1525be4b1fc3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:39.083 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7a40142f-abaa-4a05-9f22-1525be4b1fc3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:42.128 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [567a86ce-f9dc-4d14-9690-de8ba3edb41f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:42.129 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [567a86ce-f9dc-4d14-9690-de8ba3edb41f | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:42.129 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [567a86ce-f9dc-4d14-9690-de8ba3edb41f | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:42.131 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [567a86ce-f9dc-4d14-9690-de8ba3edb41f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:42.131 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [567a86ce-f9dc-4d14-9690-de8ba3edb41f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:42.131 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [567a86ce-f9dc-4d14-9690-de8ba3edb41f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:42.141 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c35ca4fc-5b70-4dd2-b546-5d54c7d92d53 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:42.142 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c35ca4fc-5b70-4dd2-b546-5d54c7d92d53 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:44.395 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3ff8d0d7-26fb-4802-8b45-2db18dca5329 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:44.395 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3ff8d0d7-26fb-4802-8b45-2db18dca5329 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:44.397 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3ff8d0d7-26fb-4802-8b45-2db18dca5329 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:44.400 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3ff8d0d7-26fb-4802-8b45-2db18dca5329 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:44.400 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3ff8d0d7-26fb-4802-8b45-2db18dca5329 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:44.400 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3ff8d0d7-26fb-4802-8b45-2db18dca5329 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:44.410 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [c1bf2418-6ccf-413f-a12b-779e1788e49c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:44.411 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [c1bf2418-6ccf-413f-a12b-779e1788e49c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:47.392 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [f765f054-3dcc-43d9-92aa-a63f427b5f86 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:47.393 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [f765f054-3dcc-43d9-92aa-a63f427b5f86 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:47.393 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f765f054-3dcc-43d9-92aa-a63f427b5f86 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:47.395 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [f765f054-3dcc-43d9-92aa-a63f427b5f86 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:47.397 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [f765f054-3dcc-43d9-92aa-a63f427b5f86 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:47.397 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [f765f054-3dcc-43d9-92aa-a63f427b5f86 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:47.426 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [914b6c81-a354-47cf-b92d-9f3c76436f68 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:47.426 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [914b6c81-a354-47cf-b92d-9f3c76436f68 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:50.391 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a5143f3f-954b-403c-b270-7d1350300c51 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:50.391 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a5143f3f-954b-403c-b270-7d1350300c51 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:50.392 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a5143f3f-954b-403c-b270-7d1350300c51 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:50.398 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a5143f3f-954b-403c-b270-7d1350300c51 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:50.398 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a5143f3f-954b-403c-b270-7d1350300c51 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:50.398 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a5143f3f-954b-403c-b270-7d1350300c51 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:50.407 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8dfdf6f6-f1cd-413b-9da7-f605002fd0a3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:50.407 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8dfdf6f6-f1cd-413b-9da7-f605002fd0a3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:54.059 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [28c93b7e-b3b6-4c21-b9be-9f378b96d981 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:54.060 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [28c93b7e-b3b6-4c21-b9be-9f378b96d981 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:54.061 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [28c93b7e-b3b6-4c21-b9be-9f378b96d981 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:54.062 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [28c93b7e-b3b6-4c21-b9be-9f378b96d981 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:54.062 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [28c93b7e-b3b6-4c21-b9be-9f378b96d981 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:54.063 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [28c93b7e-b3b6-4c21-b9be-9f378b96d981 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:54.073 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [157328d7-ee77-4a50-8944-1b2905fadb18 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:54.073 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [157328d7-ee77-4a50-8944-1b2905fadb18 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:57.047 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [8d1afd84-4429-49b8-b80b-b8a7a663d8aa | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:57.047 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [8d1afd84-4429-49b8-b80b-b8a7a663d8aa | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 16:59:57.047 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8d1afd84-4429-49b8-b80b-b8a7a663d8aa | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 16:59:57.049 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [8d1afd84-4429-49b8-b80b-b8a7a663d8aa | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 16:59:57.049 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [8d1afd84-4429-49b8-b80b-b8a7a663d8aa | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 16:59:57.049 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [8d1afd84-4429-49b8-b80b-b8a7a663d8aa | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 16:59:57.060 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2978e31d-4af2-462f-987f-571a1ea1efc7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 16:59:57.061 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2978e31d-4af2-462f-987f-571a1ea1efc7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:00.061 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [4c7b6cbe-e80f-4e88-8aae-958b7e512264 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:00.061 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [4c7b6cbe-e80f-4e88-8aae-958b7e512264 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:00.062 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4c7b6cbe-e80f-4e88-8aae-958b7e512264 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:00.063 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [4c7b6cbe-e80f-4e88-8aae-958b7e512264 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:00.064 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [4c7b6cbe-e80f-4e88-8aae-958b7e512264 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:00.064 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [4c7b6cbe-e80f-4e88-8aae-958b7e512264 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:00.073 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [47480c96-9176-462a-808e-9ca458fbfc26 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:00.073 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [47480c96-9176-462a-808e-9ca458fbfc26 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:03.050 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:03.052 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a37fc96-ea12-46f9-ba9e-a709eb46745f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:03.053 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a37fc96-ea12-46f9-ba9e-a709eb46745f | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:03.053 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 17:00:03.053 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:03.054 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2a37fc96-ea12-46f9-ba9e-a709eb46745f | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:03.055 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T08:00:03.042Z +25-03-31 17:00:03.060 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 17:00:03.060 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a37fc96-ea12-46f9-ba9e-a709eb46745f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:03.062 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T08:00:03.042Z] +25-03-31 17:00:03.062 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a37fc96-ea12-46f9-ba9e-a709eb46745f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:03.063 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T08:00:03.056036800Z] +25-03-31 17:00:03.063 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a37fc96-ea12-46f9-ba9e-a709eb46745f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:03.064 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:03.064 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9230abdc-83c7-4db4-a064-9cd7eab594b7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 17:00:03.082 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [68ebd617-ef28-4ccd-befc-490934b2a606 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:03.082 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [68ebd617-ef28-4ccd-befc-490934b2a606 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:06.060 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e5fd738c-b3e7-4f0f-ae14-34e96e1c2cc9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:06.060 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e5fd738c-b3e7-4f0f-ae14-34e96e1c2cc9 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:06.061 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e5fd738c-b3e7-4f0f-ae14-34e96e1c2cc9 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:06.063 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e5fd738c-b3e7-4f0f-ae14-34e96e1c2cc9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:06.063 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e5fd738c-b3e7-4f0f-ae14-34e96e1c2cc9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:06.063 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e5fd738c-b3e7-4f0f-ae14-34e96e1c2cc9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:06.076 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [492db6b2-02bd-462f-bf55-45c4262a076a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:06.077 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [492db6b2-02bd-462f-bf55-45c4262a076a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:09.059 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [14a28097-c63d-4a96-a42f-dfdd41a007e5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:09.059 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [14a28097-c63d-4a96-a42f-dfdd41a007e5 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:09.060 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [14a28097-c63d-4a96-a42f-dfdd41a007e5 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:09.061 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [14a28097-c63d-4a96-a42f-dfdd41a007e5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:09.061 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [14a28097-c63d-4a96-a42f-dfdd41a007e5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:09.061 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [14a28097-c63d-4a96-a42f-dfdd41a007e5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:09.071 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [94fbca4d-0c0e-49ae-92be-dfcf34497f89 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:09.071 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [94fbca4d-0c0e-49ae-92be-dfcf34497f89 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:12.056 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4b5ccc4d-3ab8-4530-9eb7-2dbeb454e76f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:12.057 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4b5ccc4d-3ab8-4530-9eb7-2dbeb454e76f | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:12.059 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4b5ccc4d-3ab8-4530-9eb7-2dbeb454e76f | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:12.062 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4b5ccc4d-3ab8-4530-9eb7-2dbeb454e76f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:12.063 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4b5ccc4d-3ab8-4530-9eb7-2dbeb454e76f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:12.064 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4b5ccc4d-3ab8-4530-9eb7-2dbeb454e76f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:12.083 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [090908bb-9230-4376-ba60-62f9e0aae35b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:12.084 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [090908bb-9230-4376-ba60-62f9e0aae35b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:15.052 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [99afe4b0-5e59-4cff-be23-53cadeb21cd7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:15.053 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [99afe4b0-5e59-4cff-be23-53cadeb21cd7 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:15.053 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [99afe4b0-5e59-4cff-be23-53cadeb21cd7 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:15.055 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [99afe4b0-5e59-4cff-be23-53cadeb21cd7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:15.055 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [99afe4b0-5e59-4cff-be23-53cadeb21cd7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:15.055 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [99afe4b0-5e59-4cff-be23-53cadeb21cd7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:15.075 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ecf1f01c-2707-4df1-bd53-cc1ddc5f0e71 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:15.075 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ecf1f01c-2707-4df1-bd53-cc1ddc5f0e71 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:18.057 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [06ab3103-cadf-4142-a371-425976134b7e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:18.057 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [06ab3103-cadf-4142-a371-425976134b7e | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:18.058 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [06ab3103-cadf-4142-a371-425976134b7e | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:18.063 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [06ab3103-cadf-4142-a371-425976134b7e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:18.064 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [06ab3103-cadf-4142-a371-425976134b7e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:18.064 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [06ab3103-cadf-4142-a371-425976134b7e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:18.079 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [7bb5d847-a663-4cd8-8332-3bc7e250368b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:18.080 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [7bb5d847-a663-4cd8-8332-3bc7e250368b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:21.064 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [13a6b428-e2f5-4b95-aa50-2f57e5ada1e4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:21.065 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [13a6b428-e2f5-4b95-aa50-2f57e5ada1e4 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:21.067 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [13a6b428-e2f5-4b95-aa50-2f57e5ada1e4 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:21.071 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [13a6b428-e2f5-4b95-aa50-2f57e5ada1e4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:21.071 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [13a6b428-e2f5-4b95-aa50-2f57e5ada1e4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:21.071 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [13a6b428-e2f5-4b95-aa50-2f57e5ada1e4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:21.082 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ad203311-ea9e-4af4-901a-22a4511ecdb5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:21.082 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ad203311-ea9e-4af4-901a-22a4511ecdb5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:24.070 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d2a497b9-54b0-47e0-a71a-1bb4bd10024b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:24.071 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d2a497b9-54b0-47e0-a71a-1bb4bd10024b | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:24.072 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d2a497b9-54b0-47e0-a71a-1bb4bd10024b | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:24.075 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d2a497b9-54b0-47e0-a71a-1bb4bd10024b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:24.075 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d2a497b9-54b0-47e0-a71a-1bb4bd10024b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:24.076 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d2a497b9-54b0-47e0-a71a-1bb4bd10024b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:24.086 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b50bda9a-b9ec-4648-b704-2e3c88351052 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:24.086 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [b50bda9a-b9ec-4648-b704-2e3c88351052 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:27.055 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1b503b83-d774-4dbb-bb6f-c860e810a633 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:27.056 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1b503b83-d774-4dbb-bb6f-c860e810a633 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:27.058 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1b503b83-d774-4dbb-bb6f-c860e810a633 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:27.061 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1b503b83-d774-4dbb-bb6f-c860e810a633 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:27.062 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1b503b83-d774-4dbb-bb6f-c860e810a633 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:27.062 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1b503b83-d774-4dbb-bb6f-c860e810a633 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:27.082 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [ffac2469-ef10-485d-9c18-55dc70cdc9a7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:27.082 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [ffac2469-ef10-485d-9c18-55dc70cdc9a7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:30.056 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [af6d7796-b1bf-42b5-979c-ad3c697e80e3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:30.056 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [af6d7796-b1bf-42b5-979c-ad3c697e80e3 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:30.057 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [af6d7796-b1bf-42b5-979c-ad3c697e80e3 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:30.058 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [af6d7796-b1bf-42b5-979c-ad3c697e80e3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:30.058 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [af6d7796-b1bf-42b5-979c-ad3c697e80e3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:30.058 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [af6d7796-b1bf-42b5-979c-ad3c697e80e3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:30.068 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [74cd9093-e1b8-4b18-b612-2e3ba44f3afb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:30.069 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [74cd9093-e1b8-4b18-b612-2e3ba44f3afb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.054 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [563c9885-921e-4576-a99a-f2ae3aec26c0 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 17:00:33.055 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:33.056 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3afb7072-bc57-41fe-8d20-96389e4ac432 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:33.056 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3afb7072-bc57-41fe-8d20-96389e4ac432 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.056 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 17:00:33.057 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.057 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3afb7072-bc57-41fe-8d20-96389e4ac432 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:33.057 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T08:00:33.046Z +25-03-31 17:00:33.058 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 17:00:33.059 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3afb7072-bc57-41fe-8d20-96389e4ac432 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:33.059 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T08:00:33.046Z] +25-03-31 17:00:33.059 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3afb7072-bc57-41fe-8d20-96389e4ac432 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:33.059 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3afb7072-bc57-41fe-8d20-96389e4ac432 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:33.059 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T08:00:33.058040500Z] +25-03-31 17:00:33.059 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.060 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3f3a938a-fe4a-4391-bbbf-7b23e3dceff7 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 17:00:33.072 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [9517539c-c4ff-4214-8e74-e5c7449e2e55 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:33.072 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [db5aa137-7e67-4e72-af47-3e4ba9e3990c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:33.072 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [9517539c-c4ff-4214-8e74-e5c7449e2e55 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.072 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [db5aa137-7e67-4e72-af47-3e4ba9e3990c | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.073 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [db5aa137-7e67-4e72-af47-3e4ba9e3990c | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:33.074 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [db5aa137-7e67-4e72-af47-3e4ba9e3990c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:33.075 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [db5aa137-7e67-4e72-af47-3e4ba9e3990c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:33.075 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [db5aa137-7e67-4e72-af47-3e4ba9e3990c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:33.082 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c30fa802-3edb-4ddf-b804-5c88c806b925 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:33.083 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c30fa802-3edb-4ddf-b804-5c88c806b925 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:33.094 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e23fb6db-e87f-446d-9343-b5c70b6bfb73 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:33.094 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e23fb6db-e87f-446d-9343-b5c70b6bfb73 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:37.056 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bdf12c45-8ce6-4e9e-aaa5-9961c79e7e55 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:37.056 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bdf12c45-8ce6-4e9e-aaa5-9961c79e7e55 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:37.057 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bdf12c45-8ce6-4e9e-aaa5-9961c79e7e55 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:37.058 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [bdf12c45-8ce6-4e9e-aaa5-9961c79e7e55 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:37.058 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bdf12c45-8ce6-4e9e-aaa5-9961c79e7e55 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:37.058 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [bdf12c45-8ce6-4e9e-aaa5-9961c79e7e55 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:37.074 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [69da813d-d2c7-4d79-b068-a20ba8ad634e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:37.075 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [69da813d-d2c7-4d79-b068-a20ba8ad634e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:40.064 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f4bde47d-c6df-400a-ae2b-f69b2d237ea5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:40.066 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bde47d-c6df-400a-ae2b-f69b2d237ea5 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:40.066 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f4bde47d-c6df-400a-ae2b-f69b2d237ea5 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:40.068 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f4bde47d-c6df-400a-ae2b-f69b2d237ea5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:40.068 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bde47d-c6df-400a-ae2b-f69b2d237ea5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:40.068 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bde47d-c6df-400a-ae2b-f69b2d237ea5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:40.085 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7aa3e64e-1c35-4fbb-95ec-f15df8a864d9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:40.085 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7aa3e64e-1c35-4fbb-95ec-f15df8a864d9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:43.066 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d78d9cac-3b1e-4755-9570-a254980a8470 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:43.067 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d78d9cac-3b1e-4755-9570-a254980a8470 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:43.067 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d78d9cac-3b1e-4755-9570-a254980a8470 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:43.069 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d78d9cac-3b1e-4755-9570-a254980a8470 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:43.069 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d78d9cac-3b1e-4755-9570-a254980a8470 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:43.069 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d78d9cac-3b1e-4755-9570-a254980a8470 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:43.083 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [6a5d52da-f6c8-4b45-90c7-811d71ddd8b0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:43.083 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [6a5d52da-f6c8-4b45-90c7-811d71ddd8b0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:46.063 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f44e2354-89a0-43dc-9188-39aa1c3d3f5b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:46.063 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f44e2354-89a0-43dc-9188-39aa1c3d3f5b | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:46.064 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f44e2354-89a0-43dc-9188-39aa1c3d3f5b | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:46.066 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f44e2354-89a0-43dc-9188-39aa1c3d3f5b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:46.066 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f44e2354-89a0-43dc-9188-39aa1c3d3f5b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:46.066 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f44e2354-89a0-43dc-9188-39aa1c3d3f5b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:46.084 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [304be725-7e14-4a8b-ad1f-699a1400709e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:46.084 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [304be725-7e14-4a8b-ad1f-699a1400709e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:49.057 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [436836ab-8168-40dc-9cb2-8c00a60b6b7c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:49.057 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [436836ab-8168-40dc-9cb2-8c00a60b6b7c | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:00:49.058 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [436836ab-8168-40dc-9cb2-8c00a60b6b7c | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:00:49.060 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [436836ab-8168-40dc-9cb2-8c00a60b6b7c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:00:49.060 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [436836ab-8168-40dc-9cb2-8c00a60b6b7c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:00:49.060 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [436836ab-8168-40dc-9cb2-8c00a60b6b7c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:00:49.070 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [82ebade1-6264-4076-a49a-4696f240b5ed | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:00:49.070 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [82ebade1-6264-4076-a49a-4696f240b5ed | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:00.053 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7fefcd99-9877-4640-96a1-c41970b3c446 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:00.053 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7fefcd99-9877-4640-96a1-c41970b3c446 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:00.055 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7fefcd99-9877-4640-96a1-c41970b3c446 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:00.058 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7fefcd99-9877-4640-96a1-c41970b3c446 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:00.059 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7fefcd99-9877-4640-96a1-c41970b3c446 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:00.059 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7fefcd99-9877-4640-96a1-c41970b3c446 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:00.072 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [4e909f63-b52c-477f-b027-04e57fbc8d03 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:00.073 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4e909f63-b52c-477f-b027-04e57fbc8d03 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:03.064 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:03.067 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 17:01:03.067 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:03.068 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T08:01:03.055Z +25-03-31 17:01:03.069 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 17:01:03.069 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T08:01:03.055Z] +25-03-31 17:01:03.069 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T08:01:03.069085100Z] +25-03-31 17:01:03.069 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:03.069 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8dea10e2-1eb1-4c4b-9c0e-86f86893d23e | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 17:01:04.054 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c68e17e8-ac27-441c-bdbf-91f3673b1384 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:04.055 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c68e17e8-ac27-441c-bdbf-91f3673b1384 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:04.056 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c68e17e8-ac27-441c-bdbf-91f3673b1384 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:04.058 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c68e17e8-ac27-441c-bdbf-91f3673b1384 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:04.058 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c68e17e8-ac27-441c-bdbf-91f3673b1384 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:04.058 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c68e17e8-ac27-441c-bdbf-91f3673b1384 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:04.070 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [317a787e-810e-4572-b03c-501094ee6998 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:04.070 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [317a787e-810e-4572-b03c-501094ee6998 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:07.061 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [06d6498e-23ff-4009-86d4-b3b3f93329cb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:07.061 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [06d6498e-23ff-4009-86d4-b3b3f93329cb | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:07.062 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [06d6498e-23ff-4009-86d4-b3b3f93329cb | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:07.064 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [06d6498e-23ff-4009-86d4-b3b3f93329cb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:07.064 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [06d6498e-23ff-4009-86d4-b3b3f93329cb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:07.064 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [06d6498e-23ff-4009-86d4-b3b3f93329cb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:07.079 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [04977252-8ed1-4faf-aca0-71f925826a59 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:07.079 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [04977252-8ed1-4faf-aca0-71f925826a59 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:10.056 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [670f177f-a3b3-4079-8c87-0a7f24e50c66 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:10.056 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [670f177f-a3b3-4079-8c87-0a7f24e50c66 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:10.057 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [670f177f-a3b3-4079-8c87-0a7f24e50c66 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:10.059 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [670f177f-a3b3-4079-8c87-0a7f24e50c66 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:10.059 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [670f177f-a3b3-4079-8c87-0a7f24e50c66 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:10.059 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [670f177f-a3b3-4079-8c87-0a7f24e50c66 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:10.079 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8494755f-3fc1-4f16-aa73-5c1890fd708d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:10.080 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8494755f-3fc1-4f16-aa73-5c1890fd708d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:13.052 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4115f36f-803c-4dd6-80da-5d880ef00c23 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:13.053 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4115f36f-803c-4dd6-80da-5d880ef00c23 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:13.054 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4115f36f-803c-4dd6-80da-5d880ef00c23 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:13.055 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4115f36f-803c-4dd6-80da-5d880ef00c23 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:13.055 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4115f36f-803c-4dd6-80da-5d880ef00c23 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:13.056 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4115f36f-803c-4dd6-80da-5d880ef00c23 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:13.063 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f1241d7d-ed2f-4847-911b-37ac0466de0d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:13.064 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f1241d7d-ed2f-4847-911b-37ac0466de0d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:16.057 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9a4c6369-732f-4ca0-a276-abb0ce17bf4d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:16.057 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9a4c6369-732f-4ca0-a276-abb0ce17bf4d | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:16.058 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9a4c6369-732f-4ca0-a276-abb0ce17bf4d | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:16.061 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9a4c6369-732f-4ca0-a276-abb0ce17bf4d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:16.062 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9a4c6369-732f-4ca0-a276-abb0ce17bf4d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:16.062 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9a4c6369-732f-4ca0-a276-abb0ce17bf4d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:16.079 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cff1c8ef-953c-49b3-af2c-b1db19ba106e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:16.079 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cff1c8ef-953c-49b3-af2c-b1db19ba106e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:19.052 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [385cbd7d-1cc4-402a-813d-fdbebad043d1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:19.052 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [385cbd7d-1cc4-402a-813d-fdbebad043d1 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:19.054 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [385cbd7d-1cc4-402a-813d-fdbebad043d1 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:19.055 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [385cbd7d-1cc4-402a-813d-fdbebad043d1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:19.056 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [385cbd7d-1cc4-402a-813d-fdbebad043d1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:19.056 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [385cbd7d-1cc4-402a-813d-fdbebad043d1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:19.077 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [01e56ce0-38ef-4681-9fa3-a7f0a98133f7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:19.077 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [01e56ce0-38ef-4681-9fa3-a7f0a98133f7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:22.059 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b8a01f6a-5513-40d7-a3c0-0a464b757230 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:22.059 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b8a01f6a-5513-40d7-a3c0-0a464b757230 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:22.060 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b8a01f6a-5513-40d7-a3c0-0a464b757230 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:22.061 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b8a01f6a-5513-40d7-a3c0-0a464b757230 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:22.061 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b8a01f6a-5513-40d7-a3c0-0a464b757230 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:22.061 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b8a01f6a-5513-40d7-a3c0-0a464b757230 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:22.071 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [b15c0eb0-aa86-4a5d-a34c-692ac7fe22d3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:22.072 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [b15c0eb0-aa86-4a5d-a34c-692ac7fe22d3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:25.056 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [95a79fb5-10af-44f7-b622-1c5c536429f4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:25.057 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [95a79fb5-10af-44f7-b622-1c5c536429f4 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:25.057 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [95a79fb5-10af-44f7-b622-1c5c536429f4 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:25.059 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [95a79fb5-10af-44f7-b622-1c5c536429f4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:25.060 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [95a79fb5-10af-44f7-b622-1c5c536429f4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:25.060 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [95a79fb5-10af-44f7-b622-1c5c536429f4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:25.074 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [21e380f8-cf1f-4695-9181-75ab9e2c8b93 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:25.075 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [21e380f8-cf1f-4695-9181-75ab9e2c8b93 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:28.052 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [11fbb491-edf4-401c-95d1-d597f42084bb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:28.052 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [11fbb491-edf4-401c-95d1-d597f42084bb | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:28.054 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [11fbb491-edf4-401c-95d1-d597f42084bb | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:28.060 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [11fbb491-edf4-401c-95d1-d597f42084bb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:28.061 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [11fbb491-edf4-401c-95d1-d597f42084bb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:28.061 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [11fbb491-edf4-401c-95d1-d597f42084bb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:28.075 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [791cc502-f15b-4f63-87f2-b6308a36d11b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:28.076 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [791cc502-f15b-4f63-87f2-b6308a36d11b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:31.065 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [e983b3a9-f4e8-49b1-8263-6fe794ae7718 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:31.066 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e983b3a9-f4e8-49b1-8263-6fe794ae7718 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:31.066 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e983b3a9-f4e8-49b1-8263-6fe794ae7718 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:31.068 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [e983b3a9-f4e8-49b1-8263-6fe794ae7718 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:31.068 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e983b3a9-f4e8-49b1-8263-6fe794ae7718 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:31.068 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [e983b3a9-f4e8-49b1-8263-6fe794ae7718 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:31.078 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b46f8a35-8fd3-425e-ad4e-28ab8b0c176a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:31.078 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b46f8a35-8fd3-425e-ad4e-28ab8b0c176a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:33.050 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:33.050 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4a90d5ca-0c01-45b7-99b4-301146fb057f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 17:01:33.054 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 17:01:33.055 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:33.057 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T08:01:33.042Z +25-03-31 17:01:33.061 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 17:01:33.062 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T08:01:33.042Z] +25-03-31 17:01:33.062 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T08:01:33.058566500Z] +25-03-31 17:01:33.062 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:33.062 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [a864fa8e-eb15-44a4-8d56-5ebc880ebe83 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 17:01:33.078 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d4990fa4-c481-40d2-8858-00e03fed0a67 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:33.078 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e0ef8f53-7736-426e-98de-5e30968e6b89 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:33.078 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d4990fa4-c481-40d2-8858-00e03fed0a67 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:33.079 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e0ef8f53-7736-426e-98de-5e30968e6b89 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:33.079 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d4990fa4-c481-40d2-8858-00e03fed0a67 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:33.082 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d4990fa4-c481-40d2-8858-00e03fed0a67 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:33.082 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d4990fa4-c481-40d2-8858-00e03fed0a67 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:33.082 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d4990fa4-c481-40d2-8858-00e03fed0a67 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:33.107 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6854799f-30f4-4194-99bc-293208bc949e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:33.108 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6854799f-30f4-4194-99bc-293208bc949e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:37.050 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7e8ab194-2271-4f4c-bcfc-98455e9dba0f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:37.050 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7e8ab194-2271-4f4c-bcfc-98455e9dba0f | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:37.051 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7e8ab194-2271-4f4c-bcfc-98455e9dba0f | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:37.052 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7e8ab194-2271-4f4c-bcfc-98455e9dba0f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:37.052 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7e8ab194-2271-4f4c-bcfc-98455e9dba0f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:37.052 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7e8ab194-2271-4f4c-bcfc-98455e9dba0f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:37.062 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [e0d80cd7-2782-4a07-9600-f1459b1bcf57 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:37.062 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [e0d80cd7-2782-4a07-9600-f1459b1bcf57 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:40.059 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d269d7de-4ed7-4abe-ab62-83faa21354e2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:40.060 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d269d7de-4ed7-4abe-ab62-83faa21354e2 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:40.061 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d269d7de-4ed7-4abe-ab62-83faa21354e2 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:40.063 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d269d7de-4ed7-4abe-ab62-83faa21354e2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:40.064 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d269d7de-4ed7-4abe-ab62-83faa21354e2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:40.064 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d269d7de-4ed7-4abe-ab62-83faa21354e2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:40.072 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f5b6b710-cc7e-4482-84bc-d7c8b74bb355 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:40.072 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f5b6b710-cc7e-4482-84bc-d7c8b74bb355 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:43.059 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8769ca32-5b41-4747-bfd0-1785d88214b5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:43.059 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8769ca32-5b41-4747-bfd0-1785d88214b5 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:43.059 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8769ca32-5b41-4747-bfd0-1785d88214b5 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:43.062 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [8769ca32-5b41-4747-bfd0-1785d88214b5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:43.062 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8769ca32-5b41-4747-bfd0-1785d88214b5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:43.062 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [8769ca32-5b41-4747-bfd0-1785d88214b5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:43.072 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b97b165d-cb55-4c68-ab35-239c4cdf003d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:43.073 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b97b165d-cb55-4c68-ab35-239c4cdf003d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:46.060 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [bed65289-4ebb-479c-8845-04204ff3bf95 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:46.060 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [bed65289-4ebb-479c-8845-04204ff3bf95 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:46.061 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bed65289-4ebb-479c-8845-04204ff3bf95 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:46.062 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [bed65289-4ebb-479c-8845-04204ff3bf95 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:46.062 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [bed65289-4ebb-479c-8845-04204ff3bf95 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:46.062 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [bed65289-4ebb-479c-8845-04204ff3bf95 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:46.074 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [c42c3900-2020-4e7e-a524-72bd80bee0d7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:46.075 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [c42c3900-2020-4e7e-a524-72bd80bee0d7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:49.057 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f1d1339f-21d3-4465-93be-4aa689cc3055 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:49.057 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f1d1339f-21d3-4465-93be-4aa689cc3055 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:49.058 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f1d1339f-21d3-4465-93be-4aa689cc3055 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:49.061 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [f1d1339f-21d3-4465-93be-4aa689cc3055 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:49.062 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f1d1339f-21d3-4465-93be-4aa689cc3055 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:49.062 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [f1d1339f-21d3-4465-93be-4aa689cc3055 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:49.074 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c3ba4397-00bc-4219-8902-b52cb1da3783 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:49.074 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c3ba4397-00bc-4219-8902-b52cb1da3783 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:52.065 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6f1a986f-c5e0-4b98-a095-78f897b246a0 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:52.065 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6f1a986f-c5e0-4b98-a095-78f897b246a0 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:52.066 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6f1a986f-c5e0-4b98-a095-78f897b246a0 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:52.067 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6f1a986f-c5e0-4b98-a095-78f897b246a0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:52.067 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6f1a986f-c5e0-4b98-a095-78f897b246a0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:52.067 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6f1a986f-c5e0-4b98-a095-78f897b246a0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:52.075 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5b8217b9-8174-4af0-87f0-b51dc1ed792d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:52.076 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5b8217b9-8174-4af0-87f0-b51dc1ed792d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:55.057 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d081c208-fba0-46e5-a0f4-8a0f6f2ba0eb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:55.057 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d081c208-fba0-46e5-a0f4-8a0f6f2ba0eb | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:55.058 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d081c208-fba0-46e5-a0f4-8a0f6f2ba0eb | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:55.059 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d081c208-fba0-46e5-a0f4-8a0f6f2ba0eb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:55.059 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d081c208-fba0-46e5-a0f4-8a0f6f2ba0eb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:55.059 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d081c208-fba0-46e5-a0f4-8a0f6f2ba0eb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:55.067 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f2e3aea4-4dca-4e72-85af-a71b8be50fa6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:55.068 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f2e3aea4-4dca-4e72-85af-a71b8be50fa6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:58.054 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [417104f3-12bf-4e01-af2f-d68fac3e1548 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:58.054 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [417104f3-12bf-4e01-af2f-d68fac3e1548 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:01:58.057 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [417104f3-12bf-4e01-af2f-d68fac3e1548 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:01:58.059 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [417104f3-12bf-4e01-af2f-d68fac3e1548 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:01:58.060 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [417104f3-12bf-4e01-af2f-d68fac3e1548 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:01:58.060 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [417104f3-12bf-4e01-af2f-d68fac3e1548 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:01:58.072 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [382aca06-2bb1-48a1-8afa-21f5dc424795 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:01:58.072 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [382aca06-2bb1-48a1-8afa-21f5dc424795 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:02:05.053 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:02:05.056 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e3d0a621-e9b2-4d4d-9396-7976c51454fc | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:02:05.056 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e3d0a621-e9b2-4d4d-9396-7976c51454fc | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:02:05.057 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e3d0a621-e9b2-4d4d-9396-7976c51454fc | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:02:05.058 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 17:02:05.058 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:02:05.060 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e3d0a621-e9b2-4d4d-9396-7976c51454fc | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:02:05.060 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 69ddae42-5b7b-4a6b-9762-a18b761e0a86, newLastActiveAt: 2025-03-31T08:02:05.045Z +25-03-31 17:02:05.061 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e3d0a621-e9b2-4d4d-9396-7976c51454fc | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:02:05.061 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e3d0a621-e9b2-4d4d-9396-7976c51454fc | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:02:05.063 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 17:02:05.064 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T08:02:05.045Z] +25-03-31 17:02:05.064 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T08:02:05.062195Z] +25-03-31 17:02:05.064 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (3:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:02:05.064 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bedf2fac-93de-42eb-85a5-888344ba2067 | PATCH | /api/users/69ddae42-5b7b-4a6b-9762-a18b761e0a86/userStatus] - binding parameter (4:UUID) <- [79b39bb2-368c-4999-86f6-f7fec6365dc6] +25-03-31 17:02:05.086 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1df216b9-4c45-44ba-aa11-3ff2ea685975 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:02:05.088 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1df216b9-4c45-44ba-aa11-3ff2ea685975 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:02:10.341 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [019c4dda-d6aa-4b15-a3e8-e55a3a8d8049 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:02:10.341 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [019c4dda-d6aa-4b15-a3e8-e55a3a8d8049 | GET | /api/channels] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:02:10.343 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [019c4dda-d6aa-4b15-a3e8-e55a3a8d8049 | GET | /api/channels] - [채널 조회 성공] id: 69ddae42-5b7b-4a6b-9762-a18b761e0a86 +25-03-31 17:02:10.346 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [019c4dda-d6aa-4b15-a3e8-e55a3a8d8049 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 17:02:10.346 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [019c4dda-d6aa-4b15-a3e8-e55a3a8d8049 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 17:02:10.346 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [019c4dda-d6aa-4b15-a3e8-e55a3a8d8049 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 17:02:10.357 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4c9b5907-0b0b-4ae3-8e97-894601638290 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 17:02:10.358 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4c9b5907-0b0b-4ae3-8e97-894601638290 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [69ddae42-5b7b-4a6b-9762-a18b761e0a86] +25-03-31 17:03:46.860 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 17:03:47.101 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-03-31 17:03:47.115 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-03-31 17:03:47.121 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-03-31 17:03:47.126 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-03-31 18:13:12.734 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-03-31 18:13:12.823 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 5704 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-03-31 18:13:12.824 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-03-31 18:13:14.536 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-03-31 18:13:14.652 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 103 ms. Found 6 JPA repository interfaces. +25-03-31 18:13:15.750 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-03-31 18:13:15.768 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-03-31 18:13:15.770 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-03-31 18:13:15.770 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-03-31 18:13:15.857 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-03-31 18:13:15.857 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 2975 ms +25-03-31 18:13:16.020 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-03-31 18:13:16.323 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-03-31 18:13:16.328 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-03-31 18:13:16.340 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-03-31 18:13:16.692 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-03-31 18:13:16.784 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-03-31 18:13:16.837 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-03-31 18:13:17.271 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-03-31 18:13:17.403 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-03-31 18:13:18.877 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-03-31 18:13:18.901 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-03-31 18:13:18.904 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-03-31 18:13:18.906 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-03-31 18:13:18.907 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-03-31 18:13:18.908 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-03-31 18:13:18.910 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-03-31 18:13:18.911 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-03-31 18:13:18.920 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-03-31 18:13:18.922 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-03-31 18:13:18.925 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-03-31 18:13:18.927 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-03-31 18:13:18.929 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-03-31 18:13:18.930 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-03-31 18:13:18.931 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-03-31 18:13:18.932 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-03-31 18:13:18.933 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-03-31 18:13:18.934 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-03-31 18:13:18.935 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-03-31 18:13:18.936 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-03-31 18:13:18.937 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-03-31 18:13:18.940 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-03-31 18:13:18.942 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-03-31 18:13:18.948 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-03-31 18:13:19.367 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-03-31 18:13:20.419 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-03-31 18:13:21.812 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-03-31 18:13:21.903 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-03-31 18:13:21.916 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-03-31 18:13:21.936 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 9.956 seconds (process running for 11.935) +25-03-31 18:13:22.157 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.22.11:8081/actuator, healthUrl=http://10.3.22.11:8081/actuator/health, serviceUrl=http://10.3.22.11:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:305) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run$$$capture(CompletableFuture.java:1773) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 10 common frames omitted +25-03-31 18:13:22.203 [RMI TCP Connection(2)-10.3.22.11] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-03-31 18:13:22.204 [RMI TCP Connection(2)-10.3.22.11] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-03-31 18:13:22.207 [RMI TCP Connection(2)-10.3.22.11] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 3 ms +25-03-31 18:14:02.872 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-03-31 18:14:03.100 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 18:14:03.112 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-03-31 18:14:03.112 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 18:14:03.209 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 18:14:03.209 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-03-31 18:14:03.210 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 18:14:03.392 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - [회원 생성 완료] username: rex, id: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:03.428 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 18:14:03.432 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.297417700Z] +25-03-31 18:14:03.445 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-03-31 18:14:03.446 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 18:14:03.446 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (4:UUID) <- [null] +25-03-31 18:14:03.447 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.297417700Z] +25-03-31 18:14:03.447 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-03-31 18:14:03.447 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (7:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.456 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 18:14:03.457 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.386956300Z] +25-03-31 18:14:03.459 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.212065700Z] +25-03-31 18:14:03.459 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.386956300Z] +25-03-31 18:14:03.459 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (4:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.459 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [575084a2-db30-4afb-95fe-8bceb44efe2e | POST | /api/users] - binding parameter (5:UUID) <- [b3a1d4d2-7ee2-41e8-ac06-48629e8b0aec] +25-03-31 18:14:03.543 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:03.544 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:03.556 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:03.556 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:03.558 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.559 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.601 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: df9fcd85-2560-4a83-a6f2-feae33ae9353, newLastActiveAt: 2025-03-31T09:14:03.518Z +25-03-31 18:14:03.601 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: df9fcd85-2560-4a83-a6f2-feae33ae9353, newLastActiveAt: 2025-03-31T09:14:03.519Z +25-03-31 18:14:03.620 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 18:14:03.620 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 18:14:03.626 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.519Z] +25-03-31 18:14:03.626 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.518Z] +25-03-31 18:14:03.627 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.602307600Z] +25-03-31 18:14:03.627 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:03.602307600Z] +25-03-31 18:14:03.627 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (3:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.627 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (3:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.628 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [25588b3a-364d-4a1a-aff4-e6050e4c4071 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (4:UUID) <- [b3a1d4d2-7ee2-41e8-ac06-48629e8b0aec] +25-03-31 18:14:03.628 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [cda58b15-d41b-405c-b7d1-01dfb8f261c2 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (4:UUID) <- [b3a1d4d2-7ee2-41e8-ac06-48629e8b0aec] +25-03-31 18:14:03.702 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5db0c30c-0683-42c6-b5c8-e7b28dfb7870 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 18:14:03.738 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [354847fc-0462-42ae-ba1b-c30c130b666f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 18:14:03.738 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7bd33429-ec52-4be7-bd0f-95cf3f4fd628 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:03.738 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [9bdd6df8-483f-4176-a78c-12cfee23baa1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:03.739 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7bd33429-ec52-4be7-bd0f-95cf3f4fd628 | GET | /api/channels] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.740 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [9bdd6df8-483f-4176-a78c-12cfee23baa1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.744 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7bd33429-ec52-4be7-bd0f-95cf3f4fd628 | GET | /api/channels] - [채널 조회 성공] id: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:03.760 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7bd33429-ec52-4be7-bd0f-95cf3f4fd628 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:03.762 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7bd33429-ec52-4be7-bd0f-95cf3f4fd628 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:03.762 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7bd33429-ec52-4be7-bd0f-95cf3f4fd628 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:03.780 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c0ea881c-ffcb-441c-b2ee-17c39dbfcc69 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:03.781 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [af73f3c5-1d57-4573-81c3-184cd91e3ca5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:03.781 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [af73f3c5-1d57-4573-81c3-184cd91e3ca5 | GET | /api/channels] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.781 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c0ea881c-ffcb-441c-b2ee-17c39dbfcc69 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.782 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [af73f3c5-1d57-4573-81c3-184cd91e3ca5 | GET | /api/channels] - [채널 조회 성공] id: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:03.785 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [af73f3c5-1d57-4573-81c3-184cd91e3ca5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:03.786 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [af73f3c5-1d57-4573-81c3-184cd91e3ca5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:03.786 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [af73f3c5-1d57-4573-81c3-184cd91e3ca5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:03.791 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8213c652-d625-4141-9c3c-f1eb5121df56 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:03.792 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8213c652-d625-4141-9c3c-f1eb5121df56 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:03.801 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9521648c-7d24-44cc-99ba-556152a8fc29 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:03.802 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9521648c-7d24-44cc-99ba-556152a8fc29 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:06.798 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8f985918-8f2d-49ff-9c7d-0cd4c78fe617 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:06.799 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8f985918-8f2d-49ff-9c7d-0cd4c78fe617 | GET | /api/channels] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:06.801 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8f985918-8f2d-49ff-9c7d-0cd4c78fe617 | GET | /api/channels] - [채널 조회 성공] id: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:06.809 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8f985918-8f2d-49ff-9c7d-0cd4c78fe617 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:06.809 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8f985918-8f2d-49ff-9c7d-0cd4c78fe617 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:06.810 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8f985918-8f2d-49ff-9c7d-0cd4c78fe617 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:06.844 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [28395b72-6b8a-4141-8f6a-96da579c5c7f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:06.846 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [28395b72-6b8a-4141-8f6a-96da579c5c7f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:09.788 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a80c1491-7650-4231-8b22-e8c7c76bdf0e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:09.789 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a80c1491-7650-4231-8b22-e8c7c76bdf0e | GET | /api/channels] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:09.792 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a80c1491-7650-4231-8b22-e8c7c76bdf0e | GET | /api/channels] - [채널 조회 성공] id: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:09.798 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a80c1491-7650-4231-8b22-e8c7c76bdf0e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:09.799 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a80c1491-7650-4231-8b22-e8c7c76bdf0e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:09.800 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a80c1491-7650-4231-8b22-e8c7c76bdf0e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:09.817 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3836b8e0-95b6-4910-a215-9e4d6ba207f1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:09.819 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3836b8e0-95b6-4910-a215-9e4d6ba207f1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:12.794 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e0f40921-d88a-40bf-8762-2f8398be7c3e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:12.795 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e0f40921-d88a-40bf-8762-2f8398be7c3e | GET | /api/channels] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:12.797 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e0f40921-d88a-40bf-8762-2f8398be7c3e | GET | /api/channels] - [채널 조회 성공] id: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:12.801 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e0f40921-d88a-40bf-8762-2f8398be7c3e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:12.803 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e0f40921-d88a-40bf-8762-2f8398be7c3e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:12.803 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e0f40921-d88a-40bf-8762-2f8398be7c3e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:12.819 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f56842a0-0129-4e05-a715-976c867d9427 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:12.820 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f56842a0-0129-4e05-a715-976c867d9427 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:15.038 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: df9fcd85-2560-4a83-a6f2-feae33ae9353 +25-03-31 18:14:15.041 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:15.041 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:15.043 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: df9fcd85-2560-4a83-a6f2-feae33ae9353, newLastActiveAt: 2025-03-31T09:14:15.033Z +25-03-31 18:14:15.044 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 18:14:15.044 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:15.033Z] +25-03-31 18:14:15.044 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:15.043670100Z] +25-03-31 18:14:15.045 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (3:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:15.045 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [235ecc58-8900-4da9-86f1-8599d5843fd1 | PATCH | /api/users/df9fcd85-2560-4a83-a6f2-feae33ae9353/userStatus] - binding parameter (4:UUID) <- [b3a1d4d2-7ee2-41e8-ac06-48629e8b0aec] +25-03-31 18:14:31.633 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - [회원 생성 요청] username: toby, email: toby@naver.com +25-03-31 18:14:31.636 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-03-31 18:14:31.637 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (1:VARCHAR) <- [toby@naver.com] +25-03-31 18:14:31.637 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 18:14:31.640 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-03-31 18:14:31.644 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (1:VARCHAR) <- [toby] +25-03-31 18:14:31.645 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-03-31 18:14:31.652 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - [회원 생성 완료] username: toby, id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:31.655 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-03-31 18:14:31.656 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.650562Z] +25-03-31 18:14:31.656 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (2:VARCHAR) <- [toby@naver.com] +25-03-31 18:14:31.657 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-03-31 18:14:31.657 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (4:UUID) <- [null] +25-03-31 18:14:31.657 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.650562Z] +25-03-31 18:14:31.657 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (6:VARCHAR) <- [toby] +25-03-31 18:14:31.657 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (7:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.659 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-03-31 18:14:31.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.651562800Z] +25-03-31 18:14:31.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.648563Z] +25-03-31 18:14:31.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.651562800Z] +25-03-31 18:14:31.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (4:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.661 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0962cd89-d052-44d7-bac5-76deb066ed47 | POST | /api/users] - binding parameter (5:UUID) <- [c9f04a05-d379-43ad-b6fd-428a4aac4ef5] +25-03-31 18:14:31.672 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:31.672 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:31.674 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:31.674 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:31.674 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.674 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.676 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db74239d-e584-4c8e-a81a-a08dc4f250fe, newLastActiveAt: 2025-03-31T09:14:31.667Z +25-03-31 18:14:31.676 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db74239d-e584-4c8e-a81a-a08dc4f250fe, newLastActiveAt: 2025-03-31T09:14:31.668Z +25-03-31 18:14:31.677 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 18:14:31.677 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-03-31 18:14:31.678 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.667Z] +25-03-31 18:14:31.678 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.677127500Z] +25-03-31 18:14:31.678 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.668Z] +25-03-31 18:14:31.678 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (3:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.678 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8ab9dedb-7614-4f14-b31c-3f5dedb72c4d | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (4:UUID) <- [c9f04a05-d379-43ad-b6fd-428a4aac4ef5] +25-03-31 18:14:31.678 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:31.677127500Z] +25-03-31 18:14:31.678 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (3:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.678 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [254f6a97-905a-4c26-9237-a2192b9f6be2 | PATCH | /api/users/db74239d-e584-4c8e-a81a-a08dc4f250fe/userStatus] - binding parameter (4:UUID) <- [c9f04a05-d379-43ad-b6fd-428a4aac4ef5] +25-03-31 18:14:31.686 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [66b80dcf-5c90-4ee5-9dd1-e4a470553a5d | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 18:14:31.699 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [a0c5b0da-02a7-42fc-a8ee-28a2de01b810 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-03-31 18:14:31.700 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2f67f9a7-0870-4b09-a257-4057705a2ce3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:31.700 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8ee50492-fd5a-4df3-8b6a-1b3107686385 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:31.701 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2f67f9a7-0870-4b09-a257-4057705a2ce3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.701 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8ee50492-fd5a-4df3-8b6a-1b3107686385 | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.701 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8ee50492-fd5a-4df3-8b6a-1b3107686385 | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:31.707 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8ee50492-fd5a-4df3-8b6a-1b3107686385 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:31.708 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8ee50492-fd5a-4df3-8b6a-1b3107686385 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:31.708 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8ee50492-fd5a-4df3-8b6a-1b3107686385 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:31.712 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [95f1cdbc-3deb-4f45-b2ed-3740455c7a35 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:31.712 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [95f1cdbc-3deb-4f45-b2ed-3740455c7a35 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.716 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d938fa62-315b-4412-8f2b-f6313c94ac45 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:31.716 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d938fa62-315b-4412-8f2b-f6313c94ac45 | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.717 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d938fa62-315b-4412-8f2b-f6313c94ac45 | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:31.719 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d938fa62-315b-4412-8f2b-f6313c94ac45 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:31.720 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [366c68b5-c8fa-4690-80b2-26bb9fa70731 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:31.720 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [366c68b5-c8fa-4690-80b2-26bb9fa70731 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:31.720 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d938fa62-315b-4412-8f2b-f6313c94ac45 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:31.720 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d938fa62-315b-4412-8f2b-f6313c94ac45 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:31.729 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [81ba032f-8033-45f0-9850-db520ee2cf17 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:31.730 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [81ba032f-8033-45f0-9850-db520ee2cf17 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:34.721 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [85d78090-402a-4da2-a946-123f0b6a81de | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:34.721 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [85d78090-402a-4da2-a946-123f0b6a81de | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:34.723 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [85d78090-402a-4da2-a946-123f0b6a81de | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:34.733 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [85d78090-402a-4da2-a946-123f0b6a81de | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:34.733 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [85d78090-402a-4da2-a946-123f0b6a81de | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:34.734 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [85d78090-402a-4da2-a946-123f0b6a81de | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:34.752 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [daf9f9fc-4efd-4cf7-a7c8-d807ee972b32 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:34.753 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [daf9f9fc-4efd-4cf7-a7c8-d807ee972b32 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:36.334 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - [개인 채널 생성 완료] id: 604ef048-ba17-45a2-9d00-d76c10d47bf0 +25-03-31 18:14:36.345 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.id in (?, ?) +25-03-31 18:14:36.345 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:36.345 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (2:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:36.363 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:36.364 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:36.366 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-03-31 18:14:36.366 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:54.606 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d6dcb268-c7fa-4e21-852f-c61428238c2b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.606 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d6dcb268-c7fa-4e21-852f-c61428238c2b | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.607 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d6dcb268-c7fa-4e21-852f-c61428238c2b | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.611 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d6dcb268-c7fa-4e21-852f-c61428238c2b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.612 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d6dcb268-c7fa-4e21-852f-c61428238c2b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.612 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d6dcb268-c7fa-4e21-852f-c61428238c2b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:54.625 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - [읽기 정보 생성 완료] count: 2 +25-03-31 18:14:54.629 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c0b4a2fe-b708-4c5c-99d3-a1725f9b7b17 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.632 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c0b4a2fe-b708-4c5c-99d3-a1725f9b7b17 | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.634 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c0b4a2fe-b708-4c5c-99d3-a1725f9b7b17 | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.635 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [9a618b92-713c-4fbb-b2e4-af8c049a7834 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.635 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [9a618b92-713c-4fbb-b2e4-af8c049a7834 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.637 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c0b4a2fe-b708-4c5c-99d3-a1725f9b7b17 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.637 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c0b4a2fe-b708-4c5c-99d3-a1725f9b7b17 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.637 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c0b4a2fe-b708-4c5c-99d3-a1725f9b7b17 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:54.638 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-03-31 18:14:54.638 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:TIMESTAMP_UTC) <- [2025-03-31T09:14:36.328831200Z] +25-03-31 18:14:54.638 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (2:VARCHAR) <- [null] +25-03-31 18:14:54.638 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (3:VARCHAR) <- [null] +25-03-31 18:14:54.638 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (4:ENUM) <- [PRIVATE] +25-03-31 18:14:54.638 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (5:TIMESTAMP_UTC) <- [2025-03-31T09:14:36.328831200Z] +25-03-31 18:14:54.638 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (6:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.639 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + /* insert for + com.sprint.mission.discodeit.entity.ReadStatus */insert + into + read_statuses (channel_id, created_at, last_read_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?, ?) +25-03-31 18:14:54.640 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.640 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:54.615193500Z] +25-03-31 18:14:54.640 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T09:14:36.328831200Z] +25-03-31 18:14:54.640 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-31T09:14:54.615193500Z] +25-03-31 18:14:54.640 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (5:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.640 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (6:UUID) <- [1e8df989-32d2-43cb-97e4-7e4e69c12c2c] +25-03-31 18:14:54.644 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + /* insert for + com.sprint.mission.discodeit.entity.ReadStatus */insert + into + read_statuses (channel_id, created_at, last_read_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?, ?) +25-03-31 18:14:54.644 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.645 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (2:TIMESTAMP_UTC) <- [2025-03-31T09:14:54.624195Z] +25-03-31 18:14:54.645 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (3:TIMESTAMP_UTC) <- [2025-03-31T09:14:36.328831200Z] +25-03-31 18:14:54.645 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (4:TIMESTAMP_UTC) <- [2025-03-31T09:14:54.624195Z] +25-03-31 18:14:54.645 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (5:UUID) <- [df9fcd85-2560-4a83-a6f2-feae33ae9353] +25-03-31 18:14:54.645 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (6:UUID) <- [0be96f18-bb8c-4e61-aaad-ad9b167aa95a] +25-03-31 18:14:54.646 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + /* SELECT + r + FROM + ReadStatus r + JOIN + + FETCH + r.user u + JOIN + + FETCH + u.status + LEFT JOIN + + FETCH + u.profile + WHERE + r.channel.id = :channelId */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id, + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + read_statuses rs1_0 + join + users u1_0 + on u1_0.id=rs1_0.user_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + where + rs1_0.channel_id=? +25-03-31 18:14:54.647 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ced53318-75a4-4ca0-af42-61b1b35d7013 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.647 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ced53318-75a4-4ca0-af42-61b1b35d7013 | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.648 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ced53318-75a4-4ca0-af42-61b1b35d7013 | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.648 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e2bb61b5-d721-4131-b6dd-825d85729eaf | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.648 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e2bb61b5-d721-4131-b6dd-825d85729eaf | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.649 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.650 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ced53318-75a4-4ca0-af42-61b1b35d7013 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.650 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ced53318-75a4-4ca0-af42-61b1b35d7013 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.650 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ced53318-75a4-4ca0-af42-61b1b35d7013 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:54.658 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a3ff0e38-1ea0-4169-9323-428111eeb15e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.658 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a3ff0e38-1ea0-4169-9323-428111eeb15e | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.659 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a3ff0e38-1ea0-4169-9323-428111eeb15e | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.660 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-31 18:14:54.660 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1d001715-b077-4d7d-8cf2-a404b52df68a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.660 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a3ff0e38-1ea0-4169-9323-428111eeb15e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.660 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [972114f0-6fdb-4625-9daf-ab485f748d27 | POST | /api/channels/private] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.660 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1d001715-b077-4d7d-8cf2-a404b52df68a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.660 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a3ff0e38-1ea0-4169-9323-428111eeb15e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.660 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a3ff0e38-1ea0-4169-9323-428111eeb15e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-03-31 18:14:54.669 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.670 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.678 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.680 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [865d22c1-e145-4043-8502-d62ccc81d3f4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.680 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.680 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.680 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [865d22c1-e145-4043-8502-d62ccc81d3f4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.680 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - binding parameter (2:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.685 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - + /* SELECT + r + FROM + ReadStatus r + JOIN + + FETCH + r.user u + JOIN + + FETCH + u.status + LEFT JOIN + + FETCH + u.profile + WHERE + r.channel.id = :channelId */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id, + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + read_statuses rs1_0 + join + users u1_0 + on u1_0.id=rs1_0.user_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + where + rs1_0.channel_id=? +25-03-31 18:14:54.686 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.690 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-31 18:14:54.690 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [0099884d-eacf-4ea9-b6dc-d53fb20c01d9 | GET | /api/channels] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.700 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.700 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.702 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.703 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [92023d3a-dadb-44d7-b833-e1cdc3cf5a99 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.703 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [92023d3a-dadb-44d7-b833-e1cdc3cf5a99 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.722 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.723 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.723 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - binding parameter (2:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.726 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - + /* SELECT + r + FROM + ReadStatus r + JOIN + + FETCH + r.user u + JOIN + + FETCH + u.status + LEFT JOIN + + FETCH + u.profile + WHERE + r.channel.id = :channelId */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id, + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + read_statuses rs1_0 + join + users u1_0 + on u1_0.id=rs1_0.user_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + where + rs1_0.channel_id=? +25-03-31 18:14:54.726 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.731 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-31 18:14:54.732 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [6050ed44-7885-4738-8d3f-0a5d760287bc | GET | /api/channels] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.746 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [850d0245-cfbf-455e-9733-e36c708e7d8f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.746 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.747 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [850d0245-cfbf-455e-9733-e36c708e7d8f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.747 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.748 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - [채널 조회 성공] id: db74239d-e584-4c8e-a81a-a08dc4f250fe +25-03-31 18:14:54.751 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-03-31 18:14:54.751 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-03-31 18:14:54.751 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - binding parameter (2:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.753 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - + /* SELECT + r + FROM + ReadStatus r + JOIN + + FETCH + r.user u + JOIN + + FETCH + u.status + LEFT JOIN + + FETCH + u.profile + WHERE + r.channel.id = :channelId */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id, + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + read_statuses rs1_0 + join + users u1_0 + on u1_0.id=rs1_0.user_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + where + rs1_0.channel_id=? +25-03-31 18:14:54.754 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.756 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-03-31 18:14:54.757 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [aafc0b4a-c22b-409a-95d9-ba316ac4e227 | GET | /api/channels] - binding parameter (1:UUID) <- [604ef048-ba17-45a2-9d00-d76c10d47bf0] +25-03-31 18:14:54.768 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [7593435c-7301-4078-9392-0b434c0b0b52 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-03-31 18:14:54.768 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7593435c-7301-4078-9392-0b434c0b0b52 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db74239d-e584-4c8e-a81a-a08dc4f250fe] +25-03-31 18:14:54.807 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-03-31 18:14:54.809 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b8e1b1f2-14cf-41d5-802f-f1aefde2c11e | GET | /api/messages] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-01 15:14:17.311 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-04-01 15:14:17.312 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-04-01 15:14:17.426 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-01 15:14:17.427 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-04-01 15:14:17.428 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-04-01 15:14:17.430 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-04-01 15:14:17.545 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - [회원 생성 완료] username: rex, id: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:17.595 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-01 15:14:17.603 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-04-01 15:14:17.603 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.476764800Z] +25-04-01 15:14:17.618 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-04-01 15:14:17.618 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-04-01 15:14:17.619 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (5:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.628 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-01 15:14:17.630 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.532620400Z] +25-04-01 15:14:17.631 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-04-01 15:14:17.632 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-04-01 15:14:17.632 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (4:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.633 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.532620400Z] +25-04-01 15:14:17.634 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-04-01 15:14:17.634 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (7:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.636 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-01 15:14:17.637 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.540651300Z] +25-04-01 15:14:17.638 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.530620800Z] +25-04-01 15:14:17.638 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.540651300Z] +25-04-01 15:14:17.638 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (4:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.639 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [e294bc6d-d437-440f-a9b8-13c5f7a0a813 | POST | /api/users] - binding parameter (5:UUID) <- [d93b23b5-59b1-4dc8-8840-499080606e08] +25-04-01 15:14:17.701 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:17.703 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:17.714 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:14:17.714 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:14:17.715 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.715 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.789 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 555b90c3-3f26-4052-9ea0-e023a26db623, newLastActiveAt: 2025-04-01T06:14:17.688Z +25-04-01 15:14:17.789 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 555b90c3-3f26-4052-9ea0-e023a26db623, newLastActiveAt: 2025-04-01T06:14:17.689Z +25-04-01 15:14:17.807 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:14:17.807 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:14:17.815 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.688Z] +25-04-01 15:14:17.815 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.689Z] +25-04-01 15:14:17.816 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.790647500Z] +25-04-01 15:14:17.816 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:17.791649100Z] +25-04-01 15:14:17.817 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (3:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.817 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (3:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.818 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7369820b-f4f9-4d2c-bec3-6869152a2b49 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (4:UUID) <- [d93b23b5-59b1-4dc8-8840-499080606e08] +25-04-01 15:14:17.818 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [81cec75f-1b2f-4be5-8725-8a365371db2f | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (4:UUID) <- [d93b23b5-59b1-4dc8-8840-499080606e08] +25-04-01 15:14:17.897 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7636b825-3fe3-41df-9ad3-2e5ea662d1c1 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:14:17.924 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [d7c95c18-67a5-4d69-873d-523476b4f10e | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:14:17.928 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d4c6674e-5806-415e-9216-6e2ce4fd93aa | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:14:17.928 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e11746ad-5aee-4042-ba4c-f0cacc8ad946 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:17.928 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [71145cad-6b73-4a23-90c9-c7291fa3e936 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:17.929 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [71145cad-6b73-4a23-90c9-c7291fa3e936 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.929 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e11746ad-5aee-4042-ba4c-f0cacc8ad946 | GET | /api/channels] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.932 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e11746ad-5aee-4042-ba4c-f0cacc8ad946 | GET | /api/channels] - [채널 조회 성공] id: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:17.945 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e11746ad-5aee-4042-ba4c-f0cacc8ad946 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:17.947 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e11746ad-5aee-4042-ba4c-f0cacc8ad946 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:17.947 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e11746ad-5aee-4042-ba4c-f0cacc8ad946 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:17.949 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d7c95c18-67a5-4d69-873d-523476b4f10e | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:14:17.950 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d7c95c18-67a5-4d69-873d-523476b4f10e | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.959 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a3e7213d-9717-42dc-a55c-8d6c4d2e1c3a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:17.959 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0fa37901-0801-4690-8e69-53e30476095f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:17.959 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a3e7213d-9717-42dc-a55c-8d6c4d2e1c3a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.960 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0fa37901-0801-4690-8e69-53e30476095f | GET | /api/channels] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.960 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0fa37901-0801-4690-8e69-53e30476095f | GET | /api/channels] - [채널 조회 성공] id: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:17.961 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [45aa3c6d-0507-4d8b-a5e8-377c0a39108b | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:14:17.962 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [45aa3c6d-0507-4d8b-a5e8-377c0a39108b | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:14:17.963 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0fa37901-0801-4690-8e69-53e30476095f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:17.963 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [45aa3c6d-0507-4d8b-a5e8-377c0a39108b | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.963 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0fa37901-0801-4690-8e69-53e30476095f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:17.963 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0fa37901-0801-4690-8e69-53e30476095f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:17.966 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [485771ed-913a-432c-841a-662781141c74 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:17.967 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [485771ed-913a-432c-841a-662781141c74 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.970 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a5ce7a8a-05cd-45af-b133-8004f05a623f | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:14:17.971 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [48b05f74-b73c-4380-9992-06464300258a | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:14:17.972 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [48b05f74-b73c-4380-9992-06464300258a | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:14:17.972 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [a5ce7a8a-05cd-45af-b133-8004f05a623f | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:14:17.974 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [a5ce7a8a-05cd-45af-b133-8004f05a623f | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.974 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [48b05f74-b73c-4380-9992-06464300258a | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.978 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [297daa28-9b2a-4ac4-b622-0eeb5384f8e8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:17.978 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [297daa28-9b2a-4ac4-b622-0eeb5384f8e8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:17.980 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [d23ddfa6-f5e5-4f93-958b-28afb058915e | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:14:17.982 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d23ddfa6-f5e5-4f93-958b-28afb058915e | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:14:17.983 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [d23ddfa6-f5e5-4f93-958b-28afb058915e | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:17.991 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [8d7ffbf6-5988-4597-868b-2546bd6dbf0c | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:14:17.992 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [8d7ffbf6-5988-4597-868b-2546bd6dbf0c | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:14:17.992 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8d7ffbf6-5988-4597-868b-2546bd6dbf0c | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:14:20.964 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c5597209-ed7d-4dc1-9326-1c3c2afcb47c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:20.965 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c5597209-ed7d-4dc1-9326-1c3c2afcb47c | GET | /api/channels] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:20.967 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c5597209-ed7d-4dc1-9326-1c3c2afcb47c | GET | /api/channels] - [채널 조회 성공] id: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:20.972 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c5597209-ed7d-4dc1-9326-1c3c2afcb47c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:20.973 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c5597209-ed7d-4dc1-9326-1c3c2afcb47c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:20.974 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c5597209-ed7d-4dc1-9326-1c3c2afcb47c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:20.996 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b8983c10-662f-4195-b293-5af0412cc4d6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:20.997 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b8983c10-662f-4195-b293-5af0412cc4d6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:23.971 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [1f9bc09b-9fcb-4727-9062-da5a6e8021a8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:23.972 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1f9bc09b-9fcb-4727-9062-da5a6e8021a8 | GET | /api/channels] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:23.975 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1f9bc09b-9fcb-4727-9062-da5a6e8021a8 | GET | /api/channels] - [채널 조회 성공] id: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:23.980 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [1f9bc09b-9fcb-4727-9062-da5a6e8021a8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:23.981 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1f9bc09b-9fcb-4727-9062-da5a6e8021a8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:23.981 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1f9bc09b-9fcb-4727-9062-da5a6e8021a8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:24.001 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5f2d181d-28b3-4e24-a047-5b4e7e88a0f2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:24.002 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5f2d181d-28b3-4e24-a047-5b4e7e88a0f2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:26.965 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b6c3fdb1-6805-4df9-ba70-1f132b2c6e45 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:26.965 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b6c3fdb1-6805-4df9-ba70-1f132b2c6e45 | GET | /api/channels] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:26.966 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b6c3fdb1-6805-4df9-ba70-1f132b2c6e45 | GET | /api/channels] - [채널 조회 성공] id: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:26.969 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b6c3fdb1-6805-4df9-ba70-1f132b2c6e45 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:26.970 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b6c3fdb1-6805-4df9-ba70-1f132b2c6e45 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:26.970 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b6c3fdb1-6805-4df9-ba70-1f132b2c6e45 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:26.985 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [7b421d1f-3bd7-475f-921c-9cd0968141c4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:26.985 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [7b421d1f-3bd7-475f-921c-9cd0968141c4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:29.118 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 555b90c3-3f26-4052-9ea0-e023a26db623 +25-04-01 15:14:29.121 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:14:29.121 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (1:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:29.124 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 555b90c3-3f26-4052-9ea0-e023a26db623, newLastActiveAt: 2025-04-01T06:14:29.113Z +25-04-01 15:14:29.125 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:14:29.126 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:29.113Z] +25-04-01 15:14:29.126 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:29.125864100Z] +25-04-01 15:14:29.126 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (3:UUID) <- [555b90c3-3f26-4052-9ea0-e023a26db623] +25-04-01 15:14:29.126 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [a4608f0a-88d3-4ae0-8dd2-29f3f9549350 | PATCH | /api/users/555b90c3-3f26-4052-9ea0-e023a26db623/userStatus] - binding parameter (4:UUID) <- [d93b23b5-59b1-4dc8-8840-499080606e08] +25-04-01 15:14:42.923 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - [회원 생성 요청] username: jessi, email: jessi@naver.com +25-04-01 15:14:42.924 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-01 15:14:42.925 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (1:VARCHAR) <- [jessi@naver.com] +25-04-01 15:14:42.925 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-04-01 15:14:42.926 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-01 15:14:42.927 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (1:VARCHAR) <- [jessi] +25-04-01 15:14:42.927 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-04-01 15:14:42.929 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - [회원 생성 완료] username: jessi, id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:42.930 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.928574Z] +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (2:VARCHAR) <- [jessi@naver.com] +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (4:UUID) <- [null] +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.928574Z] +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (6:VARCHAR) <- [jessi] +25-04-01 15:14:42.930 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (7:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.932 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-01 15:14:42.932 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.928574Z] +25-04-01 15:14:42.932 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.927570300Z] +25-04-01 15:14:42.932 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.928574Z] +25-04-01 15:14:42.932 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (4:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.932 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [03a42fda-1804-45e7-b28f-4f53c7c266b6 | POST | /api/users] - binding parameter (5:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:14:42.943 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:42.943 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:42.946 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:14:42.946 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:14:42.946 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.946 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.947 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:14:42.939Z +25-04-01 15:14:42.947 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:14:42.939Z +25-04-01 15:14:42.950 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:14:42.950 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:14:42.950 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.939Z] +25-04-01 15:14:42.952 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.949953500Z] +25-04-01 15:14:42.952 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.939Z] +25-04-01 15:14:42.952 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.952 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [229f676c-a4ee-479e-8bdd-812c387f8e78 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:14:42.952 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:42.949953500Z] +25-04-01 15:14:42.952 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.952 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0e3b4d9-5389-4a4c-8469-f4fa78f8d42a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:14:42.960 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9722b70a-f9cf-4ae4-b029-4ef509e17950 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:14:42.971 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4f6f7ec9-3163-4cb9-8f22-238cc93c9a03 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:14:42.973 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [05767489-65e0-4d45-8006-67e560dc9d52 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:42.973 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ea7d9df-f969-4805-8d3b-89185774eeba | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:42.973 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [05767489-65e0-4d45-8006-67e560dc9d52 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.973 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ea7d9df-f969-4805-8d3b-89185774eeba | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.974 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3ea7d9df-f969-4805-8d3b-89185774eeba | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:42.976 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ea7d9df-f969-4805-8d3b-89185774eeba | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:42.977 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ea7d9df-f969-4805-8d3b-89185774eeba | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:42.977 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ea7d9df-f969-4805-8d3b-89185774eeba | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:42.983 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [748255ab-a3c5-4f03-8b74-5e848e83fde3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:42.983 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [748255ab-a3c5-4f03-8b74-5e848e83fde3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.984 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e52cce71-7e80-4294-9ccc-e4e7cc7e1b78 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:42.984 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e52cce71-7e80-4294-9ccc-e4e7cc7e1b78 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.985 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e52cce71-7e80-4294-9ccc-e4e7cc7e1b78 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:42.987 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [e52cce71-7e80-4294-9ccc-e4e7cc7e1b78 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:42.987 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e52cce71-7e80-4294-9ccc-e4e7cc7e1b78 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:42.987 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [e52cce71-7e80-4294-9ccc-e4e7cc7e1b78 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:42.991 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [da55d6b7-73e4-4925-8b6e-6b3f88fc24d1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:42.991 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [da55d6b7-73e4-4925-8b6e-6b3f88fc24d1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:42.999 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [19ea5439-e9d1-45c7-9d4c-329eed1d3417 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:42.999 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [19ea5439-e9d1-45c7-9d4c-329eed1d3417 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:45.995 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e5411d39-8b30-4213-81b8-618ca7cd674a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:45.996 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e5411d39-8b30-4213-81b8-618ca7cd674a | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:45.997 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e5411d39-8b30-4213-81b8-618ca7cd674a | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:46.002 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [e5411d39-8b30-4213-81b8-618ca7cd674a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:46.003 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e5411d39-8b30-4213-81b8-618ca7cd674a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:46.003 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [e5411d39-8b30-4213-81b8-618ca7cd674a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:46.015 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [4776149f-93af-4e0c-9970-52cfeb0eb70c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:46.015 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [4776149f-93af-4e0c-9970-52cfeb0eb70c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:48.988 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a4571c4-4760-4467-a0df-c16442523cdb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:48.988 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a4571c4-4760-4467-a0df-c16442523cdb | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:48.989 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2a4571c4-4760-4467-a0df-c16442523cdb | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:48.992 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [2a4571c4-4760-4467-a0df-c16442523cdb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:48.993 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a4571c4-4760-4467-a0df-c16442523cdb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:48.993 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [2a4571c4-4760-4467-a0df-c16442523cdb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:49.010 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2e7591ca-b54e-4a16-b7e1-0399f8278b85 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:49.010 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2e7591ca-b54e-4a16-b7e1-0399f8278b85 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:50.560 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - [회원 수정 요청] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:50.561 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-01 15:14:50.562 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:50.571 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email is null + fetch + first ? rows only +25-04-01 15:14:50.572 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (1:INTEGER) <- [1] +25-04-01 15:14:50.575 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username is null + fetch + first ? rows only +25-04-01 15:14:50.576 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (1:INTEGER) <- [1] +25-04-01 15:14:50.577 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - [프로필 이미지 업데이트] 파일명: jessie.jpeg, 타입: image/jpeg, 크기: 34815 bytes +25-04-01 15:14:50.580 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - [회원 수정 완료] id: db28c977-40a7-4fce-b054-aceef730a2ee, 새로운 이름: null, 새로운 이메일: null +25-04-01 15:14:50.581 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-01 15:14:50.582 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (1:VARCHAR) <- [image/jpeg] +25-04-01 15:14:50.582 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:14:50.578053400Z] +25-04-01 15:14:50.582 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (3:VARCHAR) <- [jessie.jpeg] +25-04-01 15:14:50.582 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (4:BIGINT) <- [34815] +25-04-01 15:14:50.582 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (5:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:14:50.583 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - + /* update + for com.sprint.mission.discodeit.entity.User */update users + set + email=?, + password=?, + profile_id=?, + updated_at=?, + username=? + where + id=? +25-04-01 15:14:50.583 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (1:VARCHAR) <- [jessi@naver.com] +25-04-01 15:14:50.583 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (2:VARCHAR) <- [Rlawnsdn12!] +25-04-01 15:14:50.583 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (3:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:14:50.583 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (4:TIMESTAMP_UTC) <- [2025-04-01T06:14:50.581072200Z] +25-04-01 15:14:50.583 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (5:VARCHAR) <- [jessi] +25-04-01 15:14:50.583 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [0b75ceb9-c249-48bc-abfa-27a4314cceeb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee] - binding parameter (6:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:51.984 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f134ffb0-47ea-48fd-8ae9-f63657306bbb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:51.985 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f134ffb0-47ea-48fd-8ae9-f63657306bbb | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:51.986 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f134ffb0-47ea-48fd-8ae9-f63657306bbb | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:51.988 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f134ffb0-47ea-48fd-8ae9-f63657306bbb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:51.988 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f134ffb0-47ea-48fd-8ae9-f63657306bbb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:51.988 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f134ffb0-47ea-48fd-8ae9-f63657306bbb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:51.996 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [074328b1-ddf2-428c-a919-bd1727302e6f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:51.996 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [074328b1-ddf2-428c-a919-bd1727302e6f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:54.990 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b39b06cb-d370-48d0-9be7-5b15f084f9eb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:54.990 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b39b06cb-d370-48d0-9be7-5b15f084f9eb | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:54.991 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b39b06cb-d370-48d0-9be7-5b15f084f9eb | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:54.994 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b39b06cb-d370-48d0-9be7-5b15f084f9eb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:54.994 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b39b06cb-d370-48d0-9be7-5b15f084f9eb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:54.994 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b39b06cb-d370-48d0-9be7-5b15f084f9eb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:55.013 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [1bcd0516-45a0-4c21-a6db-8bf48ed28184 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:55.014 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [1bcd0516-45a0-4c21-a6db-8bf48ed28184 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:57.988 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b5fbe16e-22d5-449c-b575-19cd66b98598 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:57.988 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b5fbe16e-22d5-449c-b575-19cd66b98598 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:14:57.989 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b5fbe16e-22d5-449c-b575-19cd66b98598 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:14:57.992 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b5fbe16e-22d5-449c-b575-19cd66b98598 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:14:57.992 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b5fbe16e-22d5-449c-b575-19cd66b98598 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:14:57.993 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b5fbe16e-22d5-449c-b575-19cd66b98598 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:14:58.002 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [590151e3-081f-4ca0-9201-ca4c02ce052b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:14:58.003 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [590151e3-081f-4ca0-9201-ca4c02ce052b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:00.983 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [959fc09c-bcab-498d-8b36-6e7894706bfb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:00.984 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [959fc09c-bcab-498d-8b36-6e7894706bfb | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:00.985 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [959fc09c-bcab-498d-8b36-6e7894706bfb | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:00.987 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [959fc09c-bcab-498d-8b36-6e7894706bfb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:00.987 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [959fc09c-bcab-498d-8b36-6e7894706bfb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:00.987 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [959fc09c-bcab-498d-8b36-6e7894706bfb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:01.010 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [06da2598-2118-4270-8c19-9c5ffb6e868d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:01.011 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [06da2598-2118-4270-8c19-9c5ffb6e868d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:03.984 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [aab79d6b-83f8-4769-9c8b-1403c24c9d9e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:03.984 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [aab79d6b-83f8-4769-9c8b-1403c24c9d9e | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:03.985 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [aab79d6b-83f8-4769-9c8b-1403c24c9d9e | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:03.987 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [aab79d6b-83f8-4769-9c8b-1403c24c9d9e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:03.987 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [aab79d6b-83f8-4769-9c8b-1403c24c9d9e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:03.987 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [aab79d6b-83f8-4769-9c8b-1403c24c9d9e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:04.019 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [b56699fc-d05a-4f06-95d1-a7939d135484 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:04.019 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [b56699fc-d05a-4f06-95d1-a7939d135484 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:06.996 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1395ac0a-c434-4688-9338-0df401774af3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:06.996 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1395ac0a-c434-4688-9338-0df401774af3 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:06.998 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1395ac0a-c434-4688-9338-0df401774af3 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:07.003 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1395ac0a-c434-4688-9338-0df401774af3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:07.005 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1395ac0a-c434-4688-9338-0df401774af3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:07.005 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1395ac0a-c434-4688-9338-0df401774af3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:07.027 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d531b850-45f6-40b4-abb4-4c2ed62db16f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:07.027 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d531b850-45f6-40b4-abb4-4c2ed62db16f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:09.989 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6b89af0f-d6fe-4fe0-987c-ad6598475c54 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:09.989 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6b89af0f-d6fe-4fe0-987c-ad6598475c54 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:09.990 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6b89af0f-d6fe-4fe0-987c-ad6598475c54 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:09.993 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6b89af0f-d6fe-4fe0-987c-ad6598475c54 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:09.994 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6b89af0f-d6fe-4fe0-987c-ad6598475c54 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:09.994 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6b89af0f-d6fe-4fe0-987c-ad6598475c54 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:10.003 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [acaca1cb-4b2d-4679-bb36-edc1c8d7d349 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:10.003 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [acaca1cb-4b2d-4679-bb36-edc1c8d7d349 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:12.950 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:12.953 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:15:12.953 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:12.954 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:15:12.942Z +25-04-01 15:15:12.956 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:15:12.956 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:15:12.942Z] +25-04-01 15:15:12.957 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:15:12.955283200Z] +25-04-01 15:15:12.957 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:12.957 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [972b4cca-2f20-41e7-a13f-e3cfd4f48699 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:15:12.990 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [87f5992c-d7d1-4433-b7c7-d20c11d066f1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:12.991 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [87f5992c-d7d1-4433-b7c7-d20c11d066f1 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:12.992 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [87f5992c-d7d1-4433-b7c7-d20c11d066f1 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:12.993 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [87f5992c-d7d1-4433-b7c7-d20c11d066f1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:12.993 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [87f5992c-d7d1-4433-b7c7-d20c11d066f1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:12.993 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [87f5992c-d7d1-4433-b7c7-d20c11d066f1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:13.002 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [aeee8152-a142-40a9-ba44-5b209f18cc0e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:13.002 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [aeee8152-a142-40a9-ba44-5b209f18cc0e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:15.988 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [eb6504ed-4536-49f1-98a6-036f298fe307 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:15.988 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [eb6504ed-4536-49f1-98a6-036f298fe307 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:15.988 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [eb6504ed-4536-49f1-98a6-036f298fe307 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:15.990 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [eb6504ed-4536-49f1-98a6-036f298fe307 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:15.990 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [eb6504ed-4536-49f1-98a6-036f298fe307 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:15.990 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [eb6504ed-4536-49f1-98a6-036f298fe307 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:15.998 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e82b3719-1e0d-45ec-bdab-501018283259 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:15.999 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e82b3719-1e0d-45ec-bdab-501018283259 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:18.988 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [57aff89d-7590-4c5c-a38b-6f6f4326ffd7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:18.989 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [57aff89d-7590-4c5c-a38b-6f6f4326ffd7 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:18.989 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [57aff89d-7590-4c5c-a38b-6f6f4326ffd7 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:18.991 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [57aff89d-7590-4c5c-a38b-6f6f4326ffd7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:18.991 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [57aff89d-7590-4c5c-a38b-6f6f4326ffd7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:18.991 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [57aff89d-7590-4c5c-a38b-6f6f4326ffd7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:19.001 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b216ae0f-fc90-499c-ade4-d545c7355451 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:19.002 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b216ae0f-fc90-499c-ade4-d545c7355451 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:21.992 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d5c4ef64-a2a3-4b6c-a48d-c0988d22dd84 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:21.992 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d5c4ef64-a2a3-4b6c-a48d-c0988d22dd84 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:21.992 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d5c4ef64-a2a3-4b6c-a48d-c0988d22dd84 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:21.993 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d5c4ef64-a2a3-4b6c-a48d-c0988d22dd84 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:21.993 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d5c4ef64-a2a3-4b6c-a48d-c0988d22dd84 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:21.993 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d5c4ef64-a2a3-4b6c-a48d-c0988d22dd84 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:22.006 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [eb4c87c8-915f-4c05-859d-4c9ca7ecf580 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:22.006 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [eb4c87c8-915f-4c05-859d-4c9ca7ecf580 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:24.989 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d289b963-164b-46fd-ac2c-f515d2fc62da | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:24.990 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d289b963-164b-46fd-ac2c-f515d2fc62da | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:24.991 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d289b963-164b-46fd-ac2c-f515d2fc62da | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:24.993 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [d289b963-164b-46fd-ac2c-f515d2fc62da | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:24.994 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d289b963-164b-46fd-ac2c-f515d2fc62da | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:24.994 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [d289b963-164b-46fd-ac2c-f515d2fc62da | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:25.009 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c8e045f3-1e7e-4d83-8698-7fde873b981c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:25.010 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c8e045f3-1e7e-4d83-8698-7fde873b981c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:27.986 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ebd7159d-d1b0-46a4-a900-3e09a4d50ece | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:27.986 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ebd7159d-d1b0-46a4-a900-3e09a4d50ece | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:27.987 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ebd7159d-d1b0-46a4-a900-3e09a4d50ece | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:27.988 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ebd7159d-d1b0-46a4-a900-3e09a4d50ece | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:27.988 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ebd7159d-d1b0-46a4-a900-3e09a4d50ece | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:27.988 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ebd7159d-d1b0-46a4-a900-3e09a4d50ece | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:28.011 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [654e6284-a3e5-496f-b59a-3749e6f95244 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:28.011 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [654e6284-a3e5-496f-b59a-3749e6f95244 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:30.984 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [61548d4e-2a2b-49de-a3b0-0ba16482099c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:30.985 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [61548d4e-2a2b-49de-a3b0-0ba16482099c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:30.986 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [61548d4e-2a2b-49de-a3b0-0ba16482099c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:30.988 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [61548d4e-2a2b-49de-a3b0-0ba16482099c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:30.988 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [61548d4e-2a2b-49de-a3b0-0ba16482099c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:30.988 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [61548d4e-2a2b-49de-a3b0-0ba16482099c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:30.997 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [5f463c5c-0783-4353-8da9-cc9390d71fac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:30.997 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [5f463c5c-0783-4353-8da9-cc9390d71fac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:33.988 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d5cb223a-3d14-4130-8c4a-706d291e1de6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:33.988 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d5cb223a-3d14-4130-8c4a-706d291e1de6 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:33.988 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d5cb223a-3d14-4130-8c4a-706d291e1de6 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:33.989 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d5cb223a-3d14-4130-8c4a-706d291e1de6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:33.989 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d5cb223a-3d14-4130-8c4a-706d291e1de6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:33.989 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d5cb223a-3d14-4130-8c4a-706d291e1de6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:34.006 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [da44a9e2-3787-44e7-b44b-5a1e980fac3b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:34.007 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [da44a9e2-3787-44e7-b44b-5a1e980fac3b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:36.987 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d9d6b89c-a8dc-49f7-95ec-3e5968ad1aed | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:36.987 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d9d6b89c-a8dc-49f7-95ec-3e5968ad1aed | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:36.987 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d9d6b89c-a8dc-49f7-95ec-3e5968ad1aed | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:36.989 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d9d6b89c-a8dc-49f7-95ec-3e5968ad1aed | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:36.989 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d9d6b89c-a8dc-49f7-95ec-3e5968ad1aed | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:36.989 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d9d6b89c-a8dc-49f7-95ec-3e5968ad1aed | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:37.001 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0c7ebbcd-fa3b-49a0-bd4d-6eb03f5deb1b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:37.001 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0c7ebbcd-fa3b-49a0-bd4d-6eb03f5deb1b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:39.983 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [aeb34ed4-9d3d-4958-8b74-0f474b6d69c8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:39.983 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [aeb34ed4-9d3d-4958-8b74-0f474b6d69c8 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:39.983 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [aeb34ed4-9d3d-4958-8b74-0f474b6d69c8 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:39.984 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [aeb34ed4-9d3d-4958-8b74-0f474b6d69c8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:39.985 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [aeb34ed4-9d3d-4958-8b74-0f474b6d69c8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:39.985 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [aeb34ed4-9d3d-4958-8b74-0f474b6d69c8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:39.992 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f51f8c58-c45c-47d8-ba06-97c78f431740 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:39.992 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [f51f8c58-c45c-47d8-ba06-97c78f431740 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:42.951 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d778f956-2d24-4f75-92ec-d380245da96a | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:15:42.951 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:42.955 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:15:42.955 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:42.956 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:15:42.942Z +25-04-01 15:15:42.958 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:15:42.958 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:15:42.942Z] +25-04-01 15:15:42.958 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:15:42.957023300Z] +25-04-01 15:15:42.958 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:42.958 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2b42d0a6-c51f-47c4-affc-ef1fbdbb6ea2 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:15:42.970 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [6b5563c8-6378-4761-85b4-fdd65e92f60b | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:15:42.973 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6b5563c8-6378-4761-85b4-fdd65e92f60b | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:15:42.975 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6b5563c8-6378-4761-85b4-fdd65e92f60b | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:15:42.979 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3c10c17a-5f9e-4306-bcbc-9effde0f6370 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:42.979 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3c10c17a-5f9e-4306-bcbc-9effde0f6370 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:42.979 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [854dc806-d388-4051-9654-d558a2f8f8aa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:42.980 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [854dc806-d388-4051-9654-d558a2f8f8aa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:42.980 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3c10c17a-5f9e-4306-bcbc-9effde0f6370 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:42.986 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3c10c17a-5f9e-4306-bcbc-9effde0f6370 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:42.986 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3c10c17a-5f9e-4306-bcbc-9effde0f6370 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:42.986 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3c10c17a-5f9e-4306-bcbc-9effde0f6370 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:42.988 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [eb813e56-000b-491b-be0f-cc4c079091e1 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:15:42.990 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [eb813e56-000b-491b-be0f-cc4c079091e1 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:15:42.991 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [eb813e56-000b-491b-be0f-cc4c079091e1 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:15:42.995 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [2194db14-65a4-4054-bcbc-06f8a23c2f15 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:15:42.997 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2194db14-65a4-4054-bcbc-06f8a23c2f15 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:15:42.998 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2194db14-65a4-4054-bcbc-06f8a23c2f15 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:15:43.006 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [41ed8b21-0334-4bfd-91dd-4dfa3ae980e7 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:15:43.009 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [41ed8b21-0334-4bfd-91dd-4dfa3ae980e7 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:15:43.010 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [41ed8b21-0334-4bfd-91dd-4dfa3ae980e7 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:15:43.011 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [93f2ec28-bb39-4d98-8d11-6e8d3266cc38 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:43.011 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [93f2ec28-bb39-4d98-8d11-6e8d3266cc38 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:45.977 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [38e17584-f4e4-4540-acd7-0a954a8dde77 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:45.977 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [38e17584-f4e4-4540-acd7-0a954a8dde77 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:45.978 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [38e17584-f4e4-4540-acd7-0a954a8dde77 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:45.983 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [38e17584-f4e4-4540-acd7-0a954a8dde77 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:45.984 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [38e17584-f4e4-4540-acd7-0a954a8dde77 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:45.985 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [38e17584-f4e4-4540-acd7-0a954a8dde77 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:46.007 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [1d755382-d682-42db-8561-a070e07f4b47 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:46.009 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [1d755382-d682-42db-8561-a070e07f4b47 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:48.978 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0f26edc2-548c-4bc0-80e6-f8030a8085c1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:48.978 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0f26edc2-548c-4bc0-80e6-f8030a8085c1 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:48.978 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0f26edc2-548c-4bc0-80e6-f8030a8085c1 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:48.989 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0f26edc2-548c-4bc0-80e6-f8030a8085c1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:48.990 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0f26edc2-548c-4bc0-80e6-f8030a8085c1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:48.990 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0f26edc2-548c-4bc0-80e6-f8030a8085c1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:49.004 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [52e6a9d7-5543-43de-b247-1cfdf5a6b28a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:49.005 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [52e6a9d7-5543-43de-b247-1cfdf5a6b28a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:51.985 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [85cf5e57-ce99-4911-9489-e39edd4b635b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:51.986 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [85cf5e57-ce99-4911-9489-e39edd4b635b | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:51.987 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [85cf5e57-ce99-4911-9489-e39edd4b635b | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:51.988 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [85cf5e57-ce99-4911-9489-e39edd4b635b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:51.988 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [85cf5e57-ce99-4911-9489-e39edd4b635b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:51.989 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [85cf5e57-ce99-4911-9489-e39edd4b635b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:52.001 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [512bb8a5-407e-40f1-9863-48402938d689 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:52.001 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [512bb8a5-407e-40f1-9863-48402938d689 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:54.983 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [37a22ed4-d022-4424-945e-949df36e7905 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:54.983 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [37a22ed4-d022-4424-945e-949df36e7905 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:54.984 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [37a22ed4-d022-4424-945e-949df36e7905 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:54.985 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [37a22ed4-d022-4424-945e-949df36e7905 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:54.985 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [37a22ed4-d022-4424-945e-949df36e7905 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:54.985 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [37a22ed4-d022-4424-945e-949df36e7905 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:54.994 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0edef2ea-5c32-42ca-bb3c-f7fb20bd5de3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:54.994 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0edef2ea-5c32-42ca-bb3c-f7fb20bd5de3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:57.995 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [bffd71d0-5d8a-406d-a138-a84ec2d8fa0e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:57.995 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [bffd71d0-5d8a-406d-a138-a84ec2d8fa0e | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:15:57.996 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [bffd71d0-5d8a-406d-a138-a84ec2d8fa0e | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:15:58.000 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [bffd71d0-5d8a-406d-a138-a84ec2d8fa0e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:15:58.000 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [bffd71d0-5d8a-406d-a138-a84ec2d8fa0e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:15:58.000 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [bffd71d0-5d8a-406d-a138-a84ec2d8fa0e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:15:58.027 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2195c182-00cb-43ec-9355-186636b69582 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:15:58.028 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2195c182-00cb-43ec-9355-186636b69582 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:01.821 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [984ca307-0bb5-41d2-9b3e-da14942d743f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:01.821 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [984ca307-0bb5-41d2-9b3e-da14942d743f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:01.822 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [984ca307-0bb5-41d2-9b3e-da14942d743f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:01.823 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [984ca307-0bb5-41d2-9b3e-da14942d743f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:01.823 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [984ca307-0bb5-41d2-9b3e-da14942d743f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:01.823 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [984ca307-0bb5-41d2-9b3e-da14942d743f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:01.836 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [74f09cc0-c5fb-486c-ae9f-a3a170c5a795 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:01.836 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [74f09cc0-c5fb-486c-ae9f-a3a170c5a795 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:04.822 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6d9fb4a8-c512-4335-b8d5-f57859b78e30 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:04.822 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6d9fb4a8-c512-4335-b8d5-f57859b78e30 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:04.823 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6d9fb4a8-c512-4335-b8d5-f57859b78e30 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:04.825 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6d9fb4a8-c512-4335-b8d5-f57859b78e30 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:04.825 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6d9fb4a8-c512-4335-b8d5-f57859b78e30 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:04.826 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6d9fb4a8-c512-4335-b8d5-f57859b78e30 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:04.839 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c3ca0dda-8677-4486-9854-78ebad69eb5f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:04.839 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c3ca0dda-8677-4486-9854-78ebad69eb5f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:07.824 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f1c4f694-51b4-484c-8503-bd2d6ec187ea | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:07.824 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f1c4f694-51b4-484c-8503-bd2d6ec187ea | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:07.825 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f1c4f694-51b4-484c-8503-bd2d6ec187ea | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:07.826 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f1c4f694-51b4-484c-8503-bd2d6ec187ea | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:07.826 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f1c4f694-51b4-484c-8503-bd2d6ec187ea | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:07.826 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f1c4f694-51b4-484c-8503-bd2d6ec187ea | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:07.841 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [833a649b-b9a0-4b89-8b6f-70fc14fd06f1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:07.841 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [833a649b-b9a0-4b89-8b6f-70fc14fd06f1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:10.817 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a906535f-987b-4d63-90d0-c5134230bf53 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:10.817 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a906535f-987b-4d63-90d0-c5134230bf53 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:10.817 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a906535f-987b-4d63-90d0-c5134230bf53 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:10.819 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a906535f-987b-4d63-90d0-c5134230bf53 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:10.819 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a906535f-987b-4d63-90d0-c5134230bf53 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:10.819 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a906535f-987b-4d63-90d0-c5134230bf53 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:10.829 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d92836c8-a8fe-48fc-acd5-5577593e55fb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:10.830 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d92836c8-a8fe-48fc-acd5-5577593e55fb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:13.815 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:13.817 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:16:13.817 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:13.818 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d6d697b3-4a2e-4400-84b5-38b26e842ccd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:13.818 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d6d697b3-4a2e-4400-84b5-38b26e842ccd | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:13.818 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:16:13.808Z +25-04-01 15:16:13.819 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d6d697b3-4a2e-4400-84b5-38b26e842ccd | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:13.820 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:16:13.821 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:16:13.808Z] +25-04-01 15:16:13.821 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:16:13.819790400Z] +25-04-01 15:16:13.821 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:13.821 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [052b64f8-856f-4158-9aa7-8464661f3e8b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:16:13.822 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d6d697b3-4a2e-4400-84b5-38b26e842ccd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:13.822 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d6d697b3-4a2e-4400-84b5-38b26e842ccd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:13.822 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d6d697b3-4a2e-4400-84b5-38b26e842ccd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:13.833 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3ee1f18d-5002-46c7-b3f3-112e7a58864e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:13.833 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3ee1f18d-5002-46c7-b3f3-112e7a58864e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:16.825 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c2294c1c-5226-467b-b3cc-0b014f68ca9a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:16.825 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c2294c1c-5226-467b-b3cc-0b014f68ca9a | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:16.826 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c2294c1c-5226-467b-b3cc-0b014f68ca9a | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:16.828 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c2294c1c-5226-467b-b3cc-0b014f68ca9a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:16.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c2294c1c-5226-467b-b3cc-0b014f68ca9a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:16.829 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c2294c1c-5226-467b-b3cc-0b014f68ca9a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:16.844 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [01659cec-6e28-4386-995e-d3f5ed4adbad | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:16.844 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01659cec-6e28-4386-995e-d3f5ed4adbad | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:19.815 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0901392d-a052-4fa1-b590-5f31972a66bd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:19.815 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0901392d-a052-4fa1-b590-5f31972a66bd | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:19.816 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0901392d-a052-4fa1-b590-5f31972a66bd | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:19.817 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0901392d-a052-4fa1-b590-5f31972a66bd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:19.817 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0901392d-a052-4fa1-b590-5f31972a66bd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:19.817 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [0901392d-a052-4fa1-b590-5f31972a66bd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:19.827 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [365572fc-7fe3-47a7-82db-d97a506ba3ff | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:19.828 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [365572fc-7fe3-47a7-82db-d97a506ba3ff | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:22.829 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [59fa2970-7f8b-4372-abe9-78e4e7a82763 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:22.830 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [59fa2970-7f8b-4372-abe9-78e4e7a82763 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:22.831 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [59fa2970-7f8b-4372-abe9-78e4e7a82763 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:22.833 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [59fa2970-7f8b-4372-abe9-78e4e7a82763 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:22.834 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [59fa2970-7f8b-4372-abe9-78e4e7a82763 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:22.834 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [59fa2970-7f8b-4372-abe9-78e4e7a82763 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:22.852 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [fe9db0dc-767b-4f26-80b0-045890944cae | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:22.853 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [fe9db0dc-767b-4f26-80b0-045890944cae | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:25.823 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [35a1afe1-d407-4646-9095-48ca532320f5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:25.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [35a1afe1-d407-4646-9095-48ca532320f5 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:25.824 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [35a1afe1-d407-4646-9095-48ca532320f5 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:25.826 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [35a1afe1-d407-4646-9095-48ca532320f5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:25.826 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [35a1afe1-d407-4646-9095-48ca532320f5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:25.826 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [35a1afe1-d407-4646-9095-48ca532320f5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:25.837 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ef979d80-8603-48f6-881a-ad4753564467 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:25.837 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ef979d80-8603-48f6-881a-ad4753564467 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:28.820 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e939b578-804d-476f-b542-6c573b6d46ad | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:28.820 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e939b578-804d-476f-b542-6c573b6d46ad | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:28.820 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e939b578-804d-476f-b542-6c573b6d46ad | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:28.821 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e939b578-804d-476f-b542-6c573b6d46ad | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:28.821 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e939b578-804d-476f-b542-6c573b6d46ad | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:28.821 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e939b578-804d-476f-b542-6c573b6d46ad | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:28.831 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [592d1590-d6f0-4859-a03a-6ec7d17f9038 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:28.832 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [592d1590-d6f0-4859-a03a-6ec7d17f9038 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:31.829 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [25f3e999-0192-4d7b-91d8-728d96822c48 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:31.830 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25f3e999-0192-4d7b-91d8-728d96822c48 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:31.831 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [25f3e999-0192-4d7b-91d8-728d96822c48 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:31.837 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [25f3e999-0192-4d7b-91d8-728d96822c48 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:31.837 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25f3e999-0192-4d7b-91d8-728d96822c48 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:31.837 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [25f3e999-0192-4d7b-91d8-728d96822c48 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:31.852 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [26259b03-a2f8-46f5-b63b-d2f8f2882ade | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:31.852 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [26259b03-a2f8-46f5-b63b-d2f8f2882ade | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:34.826 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [28f17cda-20a9-40ca-9af0-1b119fb4f4ee | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:34.826 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [28f17cda-20a9-40ca-9af0-1b119fb4f4ee | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:34.828 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [28f17cda-20a9-40ca-9af0-1b119fb4f4ee | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:34.832 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [28f17cda-20a9-40ca-9af0-1b119fb4f4ee | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:34.832 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [28f17cda-20a9-40ca-9af0-1b119fb4f4ee | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:34.833 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [28f17cda-20a9-40ca-9af0-1b119fb4f4ee | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:34.848 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [fbcaa3cf-ae58-4f35-82f0-c8cdf32719db | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:34.849 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [fbcaa3cf-ae58-4f35-82f0-c8cdf32719db | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:37.828 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c0f9e9cc-54b6-4402-88f3-1b1d3481a43f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:37.829 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c0f9e9cc-54b6-4402-88f3-1b1d3481a43f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:37.830 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c0f9e9cc-54b6-4402-88f3-1b1d3481a43f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:37.835 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c0f9e9cc-54b6-4402-88f3-1b1d3481a43f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:37.835 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c0f9e9cc-54b6-4402-88f3-1b1d3481a43f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:37.836 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c0f9e9cc-54b6-4402-88f3-1b1d3481a43f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:37.852 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [5cd89519-9d85-46e0-b4e2-843423e74aae | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:37.852 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [5cd89519-9d85-46e0-b4e2-843423e74aae | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:40.820 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [076d9494-4edb-4f7e-a5c3-21a84bfdc2f6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:40.821 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [076d9494-4edb-4f7e-a5c3-21a84bfdc2f6 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:40.823 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [076d9494-4edb-4f7e-a5c3-21a84bfdc2f6 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:40.828 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [076d9494-4edb-4f7e-a5c3-21a84bfdc2f6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:40.828 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [076d9494-4edb-4f7e-a5c3-21a84bfdc2f6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:40.829 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [076d9494-4edb-4f7e-a5c3-21a84bfdc2f6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:40.852 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [17132f86-7bde-482c-8f9c-9322aa3878fb | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:40.853 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [17132f86-7bde-482c-8f9c-9322aa3878fb | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.814 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:43.816 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:16:43.816 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.817 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:16:43.809Z +25-04-01 15:16:43.818 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [52306202-333d-4d0c-973d-7bbb8e818a59 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:16:43.819 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:16:43.819 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:16:43.809Z] +25-04-01 15:16:43.819 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:16:43.818520900Z] +25-04-01 15:16:43.819 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.819 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b3a816ba-0a06-4043-afc1-36330d8bfa48 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:16:43.820 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8d5a511e-59a5-4edb-8d1a-984f62421738 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:43.820 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8d5a511e-59a5-4edb-8d1a-984f62421738 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.821 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8d5a511e-59a5-4edb-8d1a-984f62421738 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:43.824 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8d5a511e-59a5-4edb-8d1a-984f62421738 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:43.825 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8d5a511e-59a5-4edb-8d1a-984f62421738 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:43.825 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8d5a511e-59a5-4edb-8d1a-984f62421738 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:43.841 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [cbd0f3bb-78da-4574-82a5-6e19149d9175 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:43.841 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cbd0f3bb-78da-4574-82a5-6e19149d9175 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.842 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [90651f8e-c98b-4855-a8cd-22baf21459cc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:43.842 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cbd0f3bb-78da-4574-82a5-6e19149d9175 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:43.842 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [90651f8e-c98b-4855-a8cd-22baf21459cc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.844 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [cbd0f3bb-78da-4574-82a5-6e19149d9175 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:43.845 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cbd0f3bb-78da-4574-82a5-6e19149d9175 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:43.845 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cbd0f3bb-78da-4574-82a5-6e19149d9175 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:43.851 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a7f3ab1a-4988-4353-9df0-a29071595f93 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:43.851 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a7f3ab1a-4988-4353-9df0-a29071595f93 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:43.858 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [90ce420c-7677-4de4-b0e7-7d8a3eb10982 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:43.858 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [90ce420c-7677-4de4-b0e7-7d8a3eb10982 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:47.818 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b6ed069e-bb4d-40d1-a430-6039b41b3e0d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:47.819 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b6ed069e-bb4d-40d1-a430-6039b41b3e0d | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:47.819 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b6ed069e-bb4d-40d1-a430-6039b41b3e0d | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:47.821 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [b6ed069e-bb4d-40d1-a430-6039b41b3e0d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:47.821 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b6ed069e-bb4d-40d1-a430-6039b41b3e0d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:47.821 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [b6ed069e-bb4d-40d1-a430-6039b41b3e0d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:47.833 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [c174f7c7-5577-4570-b27b-c6800d43385f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:47.833 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [c174f7c7-5577-4570-b27b-c6800d43385f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:50.825 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [67f7abf3-c88c-42c8-992f-5e9424057b99 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:50.826 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [67f7abf3-c88c-42c8-992f-5e9424057b99 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:50.827 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [67f7abf3-c88c-42c8-992f-5e9424057b99 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:50.828 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [67f7abf3-c88c-42c8-992f-5e9424057b99 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:50.829 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [67f7abf3-c88c-42c8-992f-5e9424057b99 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:50.829 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [67f7abf3-c88c-42c8-992f-5e9424057b99 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:50.847 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [62800b3d-d342-49b4-a8b1-1ce525df3e0a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:50.847 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [62800b3d-d342-49b4-a8b1-1ce525df3e0a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:53.820 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [6cf8afbe-a40f-46d5-a2be-4460ff0a33be | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:53.821 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6cf8afbe-a40f-46d5-a2be-4460ff0a33be | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:53.822 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6cf8afbe-a40f-46d5-a2be-4460ff0a33be | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:53.826 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [6cf8afbe-a40f-46d5-a2be-4460ff0a33be | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:53.826 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6cf8afbe-a40f-46d5-a2be-4460ff0a33be | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:53.826 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6cf8afbe-a40f-46d5-a2be-4460ff0a33be | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:53.843 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6ff2fb9b-2dac-442d-b9f9-a17b0d2b434c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:53.844 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6ff2fb9b-2dac-442d-b9f9-a17b0d2b434c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:56.827 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6f9c7482-f94a-474d-b492-b3103f2eb22e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:56.827 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6f9c7482-f94a-474d-b492-b3103f2eb22e | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:16:56.829 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6f9c7482-f94a-474d-b492-b3103f2eb22e | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:16:56.833 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6f9c7482-f94a-474d-b492-b3103f2eb22e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:16:56.833 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6f9c7482-f94a-474d-b492-b3103f2eb22e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:16:56.833 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6f9c7482-f94a-474d-b492-b3103f2eb22e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:16:56.848 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c710f89d-bf89-4d1e-a91b-83476997f550 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:16:56.848 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c710f89d-bf89-4d1e-a91b-83476997f550 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:03.820 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4e3d3563-b547-4c40-8133-27c03af4bbbf | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:03.821 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4e3d3563-b547-4c40-8133-27c03af4bbbf | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:03.822 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4e3d3563-b547-4c40-8133-27c03af4bbbf | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:17:03.825 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4e3d3563-b547-4c40-8133-27c03af4bbbf | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:17:03.825 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4e3d3563-b547-4c40-8133-27c03af4bbbf | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:17:03.825 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4e3d3563-b547-4c40-8133-27c03af4bbbf | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:17:03.838 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [82605136-c795-4c0e-b8d3-d50f99cc93e7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:03.838 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [82605136-c795-4c0e-b8d3-d50f99cc93e7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:43.823 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [af21407c-824c-468e-a939-0a5bf62dedcd | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:17:43.844 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [7f54a34b-640a-411c-a792-c3d33d378603 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:43.844 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [7f54a34b-640a-411c-a792-c3d33d378603 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:43.845 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [855c1f52-97ea-477d-8ab8-aa4674128b66 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:43.845 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [855c1f52-97ea-477d-8ab8-aa4674128b66 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:43.846 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [855c1f52-97ea-477d-8ab8-aa4674128b66 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:17:43.849 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [855c1f52-97ea-477d-8ab8-aa4674128b66 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:17:43.849 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [855c1f52-97ea-477d-8ab8-aa4674128b66 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:17:43.849 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [855c1f52-97ea-477d-8ab8-aa4674128b66 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:17:43.866 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [4720441d-2b5b-4b6c-afac-c4d7058ee68b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:43.866 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [4720441d-2b5b-4b6c-afac-c4d7058ee68b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:47.818 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6d0fe0ac-0864-4a9d-acfc-5f5bd6c5fa60 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:47.818 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6d0fe0ac-0864-4a9d-acfc-5f5bd6c5fa60 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:47.819 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [6d0fe0ac-0864-4a9d-acfc-5f5bd6c5fa60 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:17:47.821 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [6d0fe0ac-0864-4a9d-acfc-5f5bd6c5fa60 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:17:47.822 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6d0fe0ac-0864-4a9d-acfc-5f5bd6c5fa60 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:17:47.822 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [6d0fe0ac-0864-4a9d-acfc-5f5bd6c5fa60 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:17:47.833 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2008f468-34ca-4b39-b373-64af6f54560e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:47.833 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2008f468-34ca-4b39-b373-64af6f54560e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:50.827 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e852084d-0f79-46b4-addb-c60352f2d152 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:50.828 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e852084d-0f79-46b4-addb-c60352f2d152 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:50.829 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e852084d-0f79-46b4-addb-c60352f2d152 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:17:50.834 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e852084d-0f79-46b4-addb-c60352f2d152 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:17:50.835 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e852084d-0f79-46b4-addb-c60352f2d152 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:17:50.835 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e852084d-0f79-46b4-addb-c60352f2d152 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:17:50.862 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [79b017e3-c5de-4819-b7d9-74803d84977a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:50.862 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [79b017e3-c5de-4819-b7d9-74803d84977a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:53.816 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [70733110-2ea3-444e-b8fc-6a7e3d213bfc | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:53.817 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [70733110-2ea3-444e-b8fc-6a7e3d213bfc | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:53.818 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [70733110-2ea3-444e-b8fc-6a7e3d213bfc | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:17:53.821 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [70733110-2ea3-444e-b8fc-6a7e3d213bfc | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:17:53.822 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [70733110-2ea3-444e-b8fc-6a7e3d213bfc | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:17:53.822 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [70733110-2ea3-444e-b8fc-6a7e3d213bfc | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:17:53.837 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [8dcc005e-e9a5-467f-b20b-8e06129eeeb2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:53.837 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [8dcc005e-e9a5-467f-b20b-8e06129eeeb2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:56.816 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [44c7f9b5-aa38-40a5-8464-58052ca76590 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:56.816 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [44c7f9b5-aa38-40a5-8464-58052ca76590 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:17:56.817 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [44c7f9b5-aa38-40a5-8464-58052ca76590 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:17:56.820 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [44c7f9b5-aa38-40a5-8464-58052ca76590 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:17:56.820 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [44c7f9b5-aa38-40a5-8464-58052ca76590 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:17:56.820 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [44c7f9b5-aa38-40a5-8464-58052ca76590 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:17:56.847 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ed62f9c8-137f-4540-bb91-884188052459 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:17:56.847 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ed62f9c8-137f-4540-bb91-884188052459 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:03.818 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:03.821 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:18:03.822 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:03.824 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3a2d519b-d4db-4a9c-acb6-1e8d3816f6a5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:03.824 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3a2d519b-d4db-4a9c-acb6-1e8d3816f6a5 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:03.825 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:18:03.808Z +25-04-01 15:18:03.825 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3a2d519b-d4db-4a9c-acb6-1e8d3816f6a5 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:03.828 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:18:03.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:18:03.808Z] +25-04-01 15:18:03.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:18:03.826897700Z] +25-04-01 15:18:03.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:03.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [b39b7044-af32-4613-82dc-8c5b45ac9108 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:18:03.829 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [3a2d519b-d4db-4a9c-acb6-1e8d3816f6a5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:03.829 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3a2d519b-d4db-4a9c-acb6-1e8d3816f6a5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:03.830 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [3a2d519b-d4db-4a9c-acb6-1e8d3816f6a5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:03.847 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ba053d22-58ae-4494-a4cd-26bde31b12da | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:03.848 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ba053d22-58ae-4494-a4cd-26bde31b12da | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:36.110 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:36.114 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:18:36.114 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:36.117 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [966613ec-9c3a-463e-9853-d2f06d75d485 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:36.117 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [966613ec-9c3a-463e-9853-d2f06d75d485 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:36.117 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:18:36.077Z +25-04-01 15:18:36.118 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [966613ec-9c3a-463e-9853-d2f06d75d485 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:36.120 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:18:36.120 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:18:36.077Z] +25-04-01 15:18:36.120 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:18:36.118375100Z] +25-04-01 15:18:36.120 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:36.120 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8af9b6ec-4d7d-4d8a-9c4b-02e67b3ce05a | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:18:36.121 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [966613ec-9c3a-463e-9853-d2f06d75d485 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:36.122 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [966613ec-9c3a-463e-9853-d2f06d75d485 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:36.122 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [966613ec-9c3a-463e-9853-d2f06d75d485 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:36.138 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [954d552a-522f-4167-8ed5-ccff00f2c248 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:36.139 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [954d552a-522f-4167-8ed5-ccff00f2c248 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:37.847 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [cae3043e-8dc7-425b-af86-782af38e1df4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:37.847 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [cae3043e-8dc7-425b-af86-782af38e1df4 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:37.848 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cae3043e-8dc7-425b-af86-782af38e1df4 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:37.850 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [cae3043e-8dc7-425b-af86-782af38e1df4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:37.850 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [cae3043e-8dc7-425b-af86-782af38e1df4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:37.851 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [cae3043e-8dc7-425b-af86-782af38e1df4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:37.868 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ed01d353-b911-4e47-8bbf-4708e3d10869 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:37.869 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ed01d353-b911-4e47-8bbf-4708e3d10869 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.240 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:39.241 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:39.242 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:18:39.243 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.243 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:18:39.243 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.244 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:18:39.226Z +25-04-01 15:18:39.244 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:18:39.231Z +25-04-01 15:18:39.245 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:18:39.245 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:18:39.231Z] +25-04-01 15:18:39.245 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:18:39.245 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:18:39.244327700Z] +25-04-01 15:18:39.245 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.245 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:18:39.226Z] +25-04-01 15:18:39.246 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [62ad1aa6-c203-4f91-b1df-67a553fcc9f1 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:18:39.246 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:18:39.244327700Z] +25-04-01 15:18:39.246 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.246 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9de17bc1-91b3-47cd-8900-5772d6aae1fb | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:18:39.254 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [96b56958-6906-4d42-9408-25f9eb65ab6e | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:18:39.271 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [f2ca4123-6635-494c-ab33-53ffb1f06e12 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:39.272 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f2ca4123-6635-494c-ab33-53ffb1f06e12 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.272 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f2ca4123-6635-494c-ab33-53ffb1f06e12 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:39.273 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2f6884c2-878a-4c3a-9f79-6922fc93340e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:39.273 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6884c2-878a-4c3a-9f79-6922fc93340e | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.273 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2f6884c2-878a-4c3a-9f79-6922fc93340e | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:39.274 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [ce555eeb-8c3c-476b-a124-fa6087b445ce | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:39.274 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [ce555eeb-8c3c-476b-a124-fa6087b445ce | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.275 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [f8a5250d-ca3c-4dde-9a4c-6297da066409 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:18:39.275 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2f6884c2-878a-4c3a-9f79-6922fc93340e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:39.275 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6884c2-878a-4c3a-9f79-6922fc93340e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:39.275 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2f6884c2-878a-4c3a-9f79-6922fc93340e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:39.275 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [1e4c5490-289a-45e8-90de-9c8588d89d4f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:18:39.276 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f8a5250d-ca3c-4dde-9a4c-6297da066409 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.276 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f8a5250d-ca3c-4dde-9a4c-6297da066409 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:18:39.277 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [25609bb0-bdbb-4648-81a2-9dc23e856dcc | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:39.277 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [25609bb0-bdbb-4648-81a2-9dc23e856dcc | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.278 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [25609bb0-bdbb-4648-81a2-9dc23e856dcc | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:39.281 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [14186de0-2550-40b3-b541-7a58e073eac3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:39.281 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [0eaffcb9-a29a-4104-aab3-c5e99ffff29c | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:18:39.282 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0eaffcb9-a29a-4104-aab3-c5e99ffff29c | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.282 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0eaffcb9-a29a-4104-aab3-c5e99ffff29c | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:18:39.283 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a731bc9c-11f8-482a-ae76-17d9dc3bf819 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:39.283 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [14186de0-2550-40b3-b541-7a58e073eac3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.284 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [14186de0-2550-40b3-b541-7a58e073eac3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:39.284 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a731bc9c-11f8-482a-ae76-17d9dc3bf819 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.284 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [eeb401bd-574a-4de3-ab6b-914b15e4a5a6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:39.284 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a731bc9c-11f8-482a-ae76-17d9dc3bf819 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:39.284 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [eeb401bd-574a-4de3-ab6b-914b15e4a5a6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.287 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [46a00424-d522-4c1b-b781-721ab2c4f5a6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:39.287 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [46a00424-d522-4c1b-b781-721ab2c4f5a6 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.287 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [46a00424-d522-4c1b-b781-721ab2c4f5a6 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:39.288 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [f040d963-5dfe-4ca2-9563-bad051d53876 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:18:39.289 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [46a00424-d522-4c1b-b781-721ab2c4f5a6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:39.289 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [46a00424-d522-4c1b-b781-721ab2c4f5a6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:39.289 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [46a00424-d522-4c1b-b781-721ab2c4f5a6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:39.289 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f040d963-5dfe-4ca2-9563-bad051d53876 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:39.289 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f040d963-5dfe-4ca2-9563-bad051d53876 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:18:39.290 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [68e728f3-7682-4e92-a22e-ddd4d0408b3a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:39.290 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [68e728f3-7682-4e92-a22e-ddd4d0408b3a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:39.299 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d2d781a3-297b-47e3-a708-6b472a4fa74d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:39.299 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d2d781a3-297b-47e3-a708-6b472a4fa74d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.248 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:42.248 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:42.249 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:18:42.249 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:18:42.250 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.250 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.250 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:18:42.243Z +25-04-01 15:18:42.250 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:18:42.244Z +25-04-01 15:18:42.251 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:18:42.251 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:18:42.252 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:18:42.243Z] +25-04-01 15:18:42.252 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:18:42.244Z] +25-04-01 15:18:42.252 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:18:42.251480800Z] +25-04-01 15:18:42.252 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:18:42.251480800Z] +25-04-01 15:18:42.252 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.252 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.252 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [718eec43-6fd0-41d0-a32a-b1c2b6bcb51e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:18:42.252 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [35cc6bcf-94fc-4278-bc93-49a907a99e92 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:18:42.262 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3bc3778a-8c81-4d51-8d53-58205a785641 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:18:42.289 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [93b1135c-9fc6-4f13-8343-3c302048db87 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:42.289 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [93b1135c-9fc6-4f13-8343-3c302048db87 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.290 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [93b1135c-9fc6-4f13-8343-3c302048db87 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:42.291 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0846dcd1-25aa-4068-acd6-4af8dc9cd4c6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:42.291 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d5561c37-e09e-4f1a-8f41-cb941f5de6d3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:42.291 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0846dcd1-25aa-4068-acd6-4af8dc9cd4c6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.291 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d5561c37-e09e-4f1a-8f41-cb941f5de6d3 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.291 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d5561c37-e09e-4f1a-8f41-cb941f5de6d3 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:42.292 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [453058c4-2cd7-420f-b7d0-81b81b5ea009 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:18:42.292 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8b9074c7-1a54-447b-a2b3-26e3c75031b4 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:18:42.292 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [453058c4-2cd7-420f-b7d0-81b81b5ea009 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.293 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [453058c4-2cd7-420f-b7d0-81b81b5ea009 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:18:42.294 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d5561c37-e09e-4f1a-8f41-cb941f5de6d3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:42.294 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d5561c37-e09e-4f1a-8f41-cb941f5de6d3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:42.294 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d5561c37-e09e-4f1a-8f41-cb941f5de6d3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:42.297 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [133fbd58-5eb6-4812-916d-a52f46d878ef | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:42.298 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [133fbd58-5eb6-4812-916d-a52f46d878ef | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.298 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [133fbd58-5eb6-4812-916d-a52f46d878ef | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:42.300 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [bbb1b63e-479b-46e5-a6df-036ddb1743f2 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:42.300 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [710e5b68-82e0-4188-afaf-8fd8f19e05b6 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:18:42.301 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [bbb1b63e-479b-46e5-a6df-036ddb1743f2 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.301 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [710e5b68-82e0-4188-afaf-8fd8f19e05b6 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.301 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [bbb1b63e-479b-46e5-a6df-036ddb1743f2 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:42.301 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [710e5b68-82e0-4188-afaf-8fd8f19e05b6 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:18:42.303 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [f485ada7-1648-4a4f-8ac0-e31971f8bb08 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:18:42.303 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a074fbc4-c720-4846-9485-5a6ab503460d | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:18:42.303 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a074fbc4-c720-4846-9485-5a6ab503460d | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.304 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [f485ada7-1648-4a4f-8ac0-e31971f8bb08 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:18:42.304 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [f485ada7-1648-4a4f-8ac0-e31971f8bb08 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:18:42.304 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a074fbc4-c720-4846-9485-5a6ab503460d | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:18:42.306 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [ddb39d3f-39ba-4819-915b-e9bf2c520a94 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:42.306 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [ddb39d3f-39ba-4819-915b-e9bf2c520a94 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.313 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2c33ca15-73cf-4769-b3b2-419bb8747b18 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:42.313 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2c33ca15-73cf-4769-b3b2-419bb8747b18 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.313 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2c33ca15-73cf-4769-b3b2-419bb8747b18 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:42.315 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [1590d7e4-2643-4899-b717-236010dbe74d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:42.315 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2c33ca15-73cf-4769-b3b2-419bb8747b18 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:42.315 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2c33ca15-73cf-4769-b3b2-419bb8747b18 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:42.315 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2c33ca15-73cf-4769-b3b2-419bb8747b18 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:42.315 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [1590d7e4-2643-4899-b717-236010dbe74d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:42.324 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [2c941420-c438-40f1-a289-deb028dba452 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:42.324 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [2c941420-c438-40f1-a289-deb028dba452 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:45.329 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1415f80e-19a3-453b-b388-9d8087099cf2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:45.330 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1415f80e-19a3-453b-b388-9d8087099cf2 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:45.331 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1415f80e-19a3-453b-b388-9d8087099cf2 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:45.335 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1415f80e-19a3-453b-b388-9d8087099cf2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:45.335 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1415f80e-19a3-453b-b388-9d8087099cf2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:45.336 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1415f80e-19a3-453b-b388-9d8087099cf2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:45.354 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c39ac9c2-8407-4819-a974-9ff08a33662f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:45.355 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c39ac9c2-8407-4819-a974-9ff08a33662f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:48.834 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e1eb6de8-7c45-4729-8a86-7a5ca073bcf3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:48.834 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e1eb6de8-7c45-4729-8a86-7a5ca073bcf3 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:48.835 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [e1eb6de8-7c45-4729-8a86-7a5ca073bcf3 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:48.839 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e1eb6de8-7c45-4729-8a86-7a5ca073bcf3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:48.839 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e1eb6de8-7c45-4729-8a86-7a5ca073bcf3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:48.839 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e1eb6de8-7c45-4729-8a86-7a5ca073bcf3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:48.864 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d55a5f4c-cb0b-4293-831c-9d98d2e65d26 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:48.865 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d55a5f4c-cb0b-4293-831c-9d98d2e65d26 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:51.816 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [df6cc7e8-fa35-4ae6-9ae1-40567535f4a7 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:51.817 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [df6cc7e8-fa35-4ae6-9ae1-40567535f4a7 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:51.818 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [df6cc7e8-fa35-4ae6-9ae1-40567535f4a7 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:51.821 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [df6cc7e8-fa35-4ae6-9ae1-40567535f4a7 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:51.821 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [df6cc7e8-fa35-4ae6-9ae1-40567535f4a7 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:51.822 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [df6cc7e8-fa35-4ae6-9ae1-40567535f4a7 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:51.838 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0db3731a-1e3e-4d6e-9b31-475bd976afc6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:51.839 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0db3731a-1e3e-4d6e-9b31-475bd976afc6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:54.825 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [210de34e-cb24-4c5b-8a2b-2d38b2cfc2fc | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:54.825 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [210de34e-cb24-4c5b-8a2b-2d38b2cfc2fc | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:54.825 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [210de34e-cb24-4c5b-8a2b-2d38b2cfc2fc | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:54.828 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [210de34e-cb24-4c5b-8a2b-2d38b2cfc2fc | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:54.828 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [210de34e-cb24-4c5b-8a2b-2d38b2cfc2fc | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:54.828 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [210de34e-cb24-4c5b-8a2b-2d38b2cfc2fc | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:54.843 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6c428343-7387-4964-97f7-b6c31fb67220 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:54.843 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6c428343-7387-4964-97f7-b6c31fb67220 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:57.820 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [031da7d4-afb3-457a-adeb-e67cdc902eda | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:57.821 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [031da7d4-afb3-457a-adeb-e67cdc902eda | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:18:57.823 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [031da7d4-afb3-457a-adeb-e67cdc902eda | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:18:57.827 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [031da7d4-afb3-457a-adeb-e67cdc902eda | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:18:57.827 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [031da7d4-afb3-457a-adeb-e67cdc902eda | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:18:57.828 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [031da7d4-afb3-457a-adeb-e67cdc902eda | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:18:57.843 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8b6fa94a-0968-4373-a325-7fd954dd6ae7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:18:57.843 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8b6fa94a-0968-4373-a325-7fd954dd6ae7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:00.833 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [dda266f1-f811-4a4f-b8a7-41a379407641 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:00.833 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [dda266f1-f811-4a4f-b8a7-41a379407641 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:00.835 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [dda266f1-f811-4a4f-b8a7-41a379407641 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:00.839 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [dda266f1-f811-4a4f-b8a7-41a379407641 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:00.840 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [dda266f1-f811-4a4f-b8a7-41a379407641 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:00.840 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [dda266f1-f811-4a4f-b8a7-41a379407641 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:00.860 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [e25bb2df-ad92-4d1d-9ef3-726a8a524f83 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:00.860 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [e25bb2df-ad92-4d1d-9ef3-726a8a524f83 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:03.814 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ef531d3e-97c3-4133-a26c-eff8108a9355 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:03.814 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ef531d3e-97c3-4133-a26c-eff8108a9355 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:03.815 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ef531d3e-97c3-4133-a26c-eff8108a9355 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:03.816 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [ef531d3e-97c3-4133-a26c-eff8108a9355 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:03.816 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ef531d3e-97c3-4133-a26c-eff8108a9355 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:03.816 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [ef531d3e-97c3-4133-a26c-eff8108a9355 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:03.824 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [13ab9286-4f6c-42e6-aa25-07407a35ea85 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:03.825 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [13ab9286-4f6c-42e6-aa25-07407a35ea85 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:06.811 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fd351c7f-c64e-4e26-b526-447b635cac5c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:06.811 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fd351c7f-c64e-4e26-b526-447b635cac5c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:06.812 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fd351c7f-c64e-4e26-b526-447b635cac5c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:06.812 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fd351c7f-c64e-4e26-b526-447b635cac5c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:06.813 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fd351c7f-c64e-4e26-b526-447b635cac5c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:06.813 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fd351c7f-c64e-4e26-b526-447b635cac5c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:06.823 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [99578ac6-e552-451a-8228-13f7c5d37339 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:06.825 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [99578ac6-e552-451a-8228-13f7c5d37339 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:09.831 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5395ee27-d76c-44f4-ab4f-568aa3ec61a8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:09.831 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5395ee27-d76c-44f4-ab4f-568aa3ec61a8 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:09.832 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5395ee27-d76c-44f4-ab4f-568aa3ec61a8 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:09.834 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5395ee27-d76c-44f4-ab4f-568aa3ec61a8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:09.836 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5395ee27-d76c-44f4-ab4f-568aa3ec61a8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:09.836 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5395ee27-d76c-44f4-ab4f-568aa3ec61a8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:09.856 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b9cec800-98bb-40fb-a0bc-6e3d50e1894a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:09.857 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b9cec800-98bb-40fb-a0bc-6e3d50e1894a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:12.823 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:12.825 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9888fd66-2338-4cac-9115-933ad7678a1f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:12.825 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:19:12.826 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9888fd66-2338-4cac-9115-933ad7678a1f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:12.826 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:12.827 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9888fd66-2338-4cac-9115-933ad7678a1f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:12.829 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:19:12.807Z +25-04-01 15:19:12.830 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [9888fd66-2338-4cac-9115-933ad7678a1f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:12.831 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9888fd66-2338-4cac-9115-933ad7678a1f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:12.831 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [9888fd66-2338-4cac-9115-933ad7678a1f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:12.835 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:19:12.835 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:19:12.807Z] +25-04-01 15:19:12.837 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:19:12.831189Z] +25-04-01 15:19:12.837 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:12.838 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [3553c035-3b55-4c84-ab8b-f8e8776b353e | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:19:12.854 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3516fec1-6f8c-4031-b76e-431f12a215fc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:12.855 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3516fec1-6f8c-4031-b76e-431f12a215fc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:15.816 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2263aff4-386c-44bd-8473-b5f1ab6e2e93 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:15.816 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2263aff4-386c-44bd-8473-b5f1ab6e2e93 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:15.817 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2263aff4-386c-44bd-8473-b5f1ab6e2e93 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:15.819 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [2263aff4-386c-44bd-8473-b5f1ab6e2e93 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:15.819 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2263aff4-386c-44bd-8473-b5f1ab6e2e93 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:15.819 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [2263aff4-386c-44bd-8473-b5f1ab6e2e93 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:15.835 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [30c6dea9-08c7-4ba0-9e80-9d1f795cd33f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:15.836 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [30c6dea9-08c7-4ba0-9e80-9d1f795cd33f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:18.830 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [c00ef8bb-aac8-488a-b7d6-0b98eb66e7cc | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:18.830 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [c00ef8bb-aac8-488a-b7d6-0b98eb66e7cc | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:18.831 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c00ef8bb-aac8-488a-b7d6-0b98eb66e7cc | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:18.835 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [c00ef8bb-aac8-488a-b7d6-0b98eb66e7cc | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:18.835 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [c00ef8bb-aac8-488a-b7d6-0b98eb66e7cc | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:18.835 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [c00ef8bb-aac8-488a-b7d6-0b98eb66e7cc | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:18.849 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [864a17c9-a6c6-48bc-b0f2-7a9c1370977e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:18.850 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [864a17c9-a6c6-48bc-b0f2-7a9c1370977e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:21.818 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [757d51d8-9317-49ee-ace6-58b02df54453 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:21.819 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [757d51d8-9317-49ee-ace6-58b02df54453 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:21.820 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [757d51d8-9317-49ee-ace6-58b02df54453 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:21.823 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [757d51d8-9317-49ee-ace6-58b02df54453 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:21.823 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [757d51d8-9317-49ee-ace6-58b02df54453 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:21.823 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [757d51d8-9317-49ee-ace6-58b02df54453 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:21.842 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [36783c7f-d122-47e8-9e95-cf27938d2142 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:21.843 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [36783c7f-d122-47e8-9e95-cf27938d2142 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:24.830 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [d8931e93-c269-4cb2-a9ad-e202dfde1353 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:24.831 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [d8931e93-c269-4cb2-a9ad-e202dfde1353 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:24.831 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d8931e93-c269-4cb2-a9ad-e202dfde1353 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:24.834 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [d8931e93-c269-4cb2-a9ad-e202dfde1353 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:24.835 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [d8931e93-c269-4cb2-a9ad-e202dfde1353 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:24.835 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [d8931e93-c269-4cb2-a9ad-e202dfde1353 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:24.851 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [0e90739e-0778-45ec-adff-0c2fee910745 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:24.851 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [0e90739e-0778-45ec-adff-0c2fee910745 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:27.812 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [537dc5f4-2800-493c-832e-e735a5b51a1d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:27.814 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [537dc5f4-2800-493c-832e-e735a5b51a1d | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:27.814 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [537dc5f4-2800-493c-832e-e735a5b51a1d | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:27.817 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [537dc5f4-2800-493c-832e-e735a5b51a1d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:27.817 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [537dc5f4-2800-493c-832e-e735a5b51a1d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:27.817 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [537dc5f4-2800-493c-832e-e735a5b51a1d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:27.827 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f12a686f-a942-456e-a4db-3185355c150e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:27.828 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f12a686f-a942-456e-a4db-3185355c150e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:30.819 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [79e660d5-f7e0-40a7-80db-5e8fe4db59a6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:30.819 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [79e660d5-f7e0-40a7-80db-5e8fe4db59a6 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:30.820 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [79e660d5-f7e0-40a7-80db-5e8fe4db59a6 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:30.824 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [79e660d5-f7e0-40a7-80db-5e8fe4db59a6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:30.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [79e660d5-f7e0-40a7-80db-5e8fe4db59a6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:30.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [79e660d5-f7e0-40a7-80db-5e8fe4db59a6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:30.850 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [34d6ca29-c146-41b6-b121-762d3bd8dee5 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:30.851 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [34d6ca29-c146-41b6-b121-762d3bd8dee5 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:33.824 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [62ae4870-7150-49cf-887c-14237eedc45d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:33.825 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [62ae4870-7150-49cf-887c-14237eedc45d | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:33.826 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [62ae4870-7150-49cf-887c-14237eedc45d | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:33.827 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [62ae4870-7150-49cf-887c-14237eedc45d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:33.828 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [62ae4870-7150-49cf-887c-14237eedc45d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:33.828 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [62ae4870-7150-49cf-887c-14237eedc45d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:33.846 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [901ebde0-e43f-4c00-b29e-de46dcdcb898 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:33.847 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [901ebde0-e43f-4c00-b29e-de46dcdcb898 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:36.821 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [adeae8e0-4d42-45dc-8463-4f7b941fa358 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:36.821 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [adeae8e0-4d42-45dc-8463-4f7b941fa358 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:36.821 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [adeae8e0-4d42-45dc-8463-4f7b941fa358 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:36.823 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [adeae8e0-4d42-45dc-8463-4f7b941fa358 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:36.823 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [adeae8e0-4d42-45dc-8463-4f7b941fa358 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:36.823 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [adeae8e0-4d42-45dc-8463-4f7b941fa358 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:36.832 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [0d20dbfe-772a-4822-b6bd-c993e244b9bf | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:36.832 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [0d20dbfe-772a-4822-b6bd-c993e244b9bf | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:39.818 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [578b15a9-2fb4-4851-862d-3ef5f111976f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:39.819 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [578b15a9-2fb4-4851-862d-3ef5f111976f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:39.820 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [578b15a9-2fb4-4851-862d-3ef5f111976f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:39.823 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [578b15a9-2fb4-4851-862d-3ef5f111976f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:39.823 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [578b15a9-2fb4-4851-862d-3ef5f111976f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:39.823 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [578b15a9-2fb4-4851-862d-3ef5f111976f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:39.838 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [3edc8c37-2a49-4429-8caa-02c32110b514 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:39.838 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [3edc8c37-2a49-4429-8caa-02c32110b514 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.813 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:42.814 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [30897c37-6249-4055-82d9-dc3280eb822d | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:19:42.816 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:19:42.816 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.818 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:19:42.805Z +25-04-01 15:19:42.821 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [1f7e3d7f-63aa-4ca2-9c9e-c3232779ca8f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:42.821 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1f7e3d7f-63aa-4ca2-9c9e-c3232779ca8f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.822 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1f7e3d7f-63aa-4ca2-9c9e-c3232779ca8f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:42.823 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:19:42.823 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:19:42.805Z] +25-04-01 15:19:42.824 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:19:42.819972600Z] +25-04-01 15:19:42.824 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.824 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [fabc59bb-e2b7-4449-80e7-7d49fffa6f74 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:19:42.825 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [1f7e3d7f-63aa-4ca2-9c9e-c3232779ca8f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:42.825 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1f7e3d7f-63aa-4ca2-9c9e-c3232779ca8f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:42.825 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1f7e3d7f-63aa-4ca2-9c9e-c3232779ca8f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:42.837 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0041687a-a615-4412-844e-809d0a2d0cf8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:42.837 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [44dccbf6-bb33-4314-922a-f72792e5f50e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:42.838 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0041687a-a615-4412-844e-809d0a2d0cf8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.838 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [44dccbf6-bb33-4314-922a-f72792e5f50e | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.838 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [44dccbf6-bb33-4314-922a-f72792e5f50e | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:42.841 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [44dccbf6-bb33-4314-922a-f72792e5f50e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:42.841 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [44dccbf6-bb33-4314-922a-f72792e5f50e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:42.841 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [44dccbf6-bb33-4314-922a-f72792e5f50e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:42.846 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b5084ef2-3972-4127-a1ce-f43b29ca557c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:42.847 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b5084ef2-3972-4127-a1ce-f43b29ca557c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:42.853 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [6b409536-4d85-4753-9127-afabd6253a0a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:42.854 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [6b409536-4d85-4753-9127-afabd6253a0a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:46.826 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cdb6887f-eb73-4edd-94dd-e12340e8a2ae | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:46.827 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cdb6887f-eb73-4edd-94dd-e12340e8a2ae | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:46.828 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [cdb6887f-eb73-4edd-94dd-e12340e8a2ae | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:46.832 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cdb6887f-eb73-4edd-94dd-e12340e8a2ae | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:46.833 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cdb6887f-eb73-4edd-94dd-e12340e8a2ae | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:46.833 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cdb6887f-eb73-4edd-94dd-e12340e8a2ae | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:46.851 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [8f8c7f10-e6b8-4081-a64e-315b00723f08 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:46.852 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [8f8c7f10-e6b8-4081-a64e-315b00723f08 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:49.824 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [00f01a8d-4f20-4681-903d-c58d6d979842 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:49.825 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [00f01a8d-4f20-4681-903d-c58d6d979842 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:49.826 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [00f01a8d-4f20-4681-903d-c58d6d979842 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:49.828 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [00f01a8d-4f20-4681-903d-c58d6d979842 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:49.828 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [00f01a8d-4f20-4681-903d-c58d6d979842 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:49.828 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [00f01a8d-4f20-4681-903d-c58d6d979842 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:49.846 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [46cdf4d7-1534-490b-a564-62a599d2a1ec | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:49.847 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [46cdf4d7-1534-490b-a564-62a599d2a1ec | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:52.814 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [1ebb95d8-d84b-4801-96fc-4d41f7f4d7d0 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:52.815 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [1ebb95d8-d84b-4801-96fc-4d41f7f4d7d0 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:52.815 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1ebb95d8-d84b-4801-96fc-4d41f7f4d7d0 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:52.816 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [1ebb95d8-d84b-4801-96fc-4d41f7f4d7d0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:52.816 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [1ebb95d8-d84b-4801-96fc-4d41f7f4d7d0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:52.816 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [1ebb95d8-d84b-4801-96fc-4d41f7f4d7d0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:52.828 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [29b367a1-a5c6-4dd3-8e2d-dd0d372953f3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:52.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [29b367a1-a5c6-4dd3-8e2d-dd0d372953f3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:55.827 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [281c18da-3dab-47aa-8fba-cfb118f08b02 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:55.827 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [281c18da-3dab-47aa-8fba-cfb118f08b02 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:19:55.828 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [281c18da-3dab-47aa-8fba-cfb118f08b02 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:19:55.832 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [281c18da-3dab-47aa-8fba-cfb118f08b02 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:19:55.833 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [281c18da-3dab-47aa-8fba-cfb118f08b02 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:19:55.833 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [281c18da-3dab-47aa-8fba-cfb118f08b02 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:19:55.862 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bcd3ae8d-17bb-4d01-acf1-bbb5677a2b97 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:19:55.862 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [bcd3ae8d-17bb-4d01-acf1-bbb5677a2b97 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:03.828 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [850894d5-8294-4d07-8d46-53785029b99c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:03.828 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [850894d5-8294-4d07-8d46-53785029b99c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:03.829 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [850894d5-8294-4d07-8d46-53785029b99c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:03.831 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [850894d5-8294-4d07-8d46-53785029b99c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:20:03.831 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [850894d5-8294-4d07-8d46-53785029b99c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:20:03.831 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [850894d5-8294-4d07-8d46-53785029b99c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:20:03.850 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [0b69111a-194a-4810-b4c9-c654d27d700f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:03.850 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [0b69111a-194a-4810-b4c9-c654d27d700f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:12.818 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:12.819 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:20:12.820 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:12.821 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:20:12.813Z +25-04-01 15:20:12.822 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:20:12.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:20:12.813Z] +25-04-01 15:20:12.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:20:12.822347700Z] +25-04-01 15:20:12.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:12.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f4bbe668-2c0a-4958-96d9-138939c76b4b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:20:42.835 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0ebc5e3e-5ee5-4b6c-8b7c-51343c2cc14e | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:20:42.835 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:42.838 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:20:42.840 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:42.843 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:20:42.819Z +25-04-01 15:20:42.846 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:20:42.846 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:20:42.819Z] +25-04-01 15:20:42.847 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:20:42.844431100Z] +25-04-01 15:20:42.850 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:42.851 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6bd2a73c-8dbf-4b29-bc94-00fdd7c5d777 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:20:42.871 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [377f57ec-8aa3-4067-aad5-cff75f5143cf | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:42.872 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [377f57ec-8aa3-4067-aad5-cff75f5143cf | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:42.872 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4c7df6de-73e8-429a-9b15-1a0a5e112d29 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:42.872 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4c7df6de-73e8-429a-9b15-1a0a5e112d29 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:42.873 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4c7df6de-73e8-429a-9b15-1a0a5e112d29 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:42.876 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [4c7df6de-73e8-429a-9b15-1a0a5e112d29 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:20:42.877 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4c7df6de-73e8-429a-9b15-1a0a5e112d29 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:20:42.877 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [4c7df6de-73e8-429a-9b15-1a0a5e112d29 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:20:42.897 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2a7b3840-029a-4ec7-a49b-26d3455c2701 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:42.897 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2a7b3840-029a-4ec7-a49b-26d3455c2701 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:46.827 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5caa686c-ac93-4828-9ed3-01d0b438abce | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:46.828 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5caa686c-ac93-4828-9ed3-01d0b438abce | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:46.829 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5caa686c-ac93-4828-9ed3-01d0b438abce | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:46.832 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5caa686c-ac93-4828-9ed3-01d0b438abce | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:20:46.833 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5caa686c-ac93-4828-9ed3-01d0b438abce | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:20:46.833 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5caa686c-ac93-4828-9ed3-01d0b438abce | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:20:46.844 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [fae4c4fd-4188-4cdb-827c-8a8c60c35b95 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:46.844 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [fae4c4fd-4188-4cdb-827c-8a8c60c35b95 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:49.826 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7a60f400-0c0d-4e4c-aacf-44a4c8c31b53 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:49.827 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7a60f400-0c0d-4e4c-aacf-44a4c8c31b53 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:49.828 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7a60f400-0c0d-4e4c-aacf-44a4c8c31b53 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:49.832 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [7a60f400-0c0d-4e4c-aacf-44a4c8c31b53 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:20:49.833 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7a60f400-0c0d-4e4c-aacf-44a4c8c31b53 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:20:49.833 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [7a60f400-0c0d-4e4c-aacf-44a4c8c31b53 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:20:49.855 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ca8278cd-b655-42f8-b003-c01547c1c6a8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:49.856 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ca8278cd-b655-42f8-b003-c01547c1c6a8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:52.819 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8f42a272-1232-47db-8aa1-0a6ca348f24d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:52.819 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8f42a272-1232-47db-8aa1-0a6ca348f24d | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:52.821 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8f42a272-1232-47db-8aa1-0a6ca348f24d | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:52.824 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8f42a272-1232-47db-8aa1-0a6ca348f24d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:20:52.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8f42a272-1232-47db-8aa1-0a6ca348f24d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:20:52.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8f42a272-1232-47db-8aa1-0a6ca348f24d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:20:52.834 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4c4f58c0-4cf7-4ecf-b536-cf91421e5f25 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:52.834 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4c4f58c0-4cf7-4ecf-b536-cf91421e5f25 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:55.824 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [03fde540-7a3c-43a7-92fe-46a084c8e6e8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:55.825 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [03fde540-7a3c-43a7-92fe-46a084c8e6e8 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:20:55.825 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [03fde540-7a3c-43a7-92fe-46a084c8e6e8 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:20:55.826 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [03fde540-7a3c-43a7-92fe-46a084c8e6e8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:20:55.827 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [03fde540-7a3c-43a7-92fe-46a084c8e6e8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:20:55.827 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [03fde540-7a3c-43a7-92fe-46a084c8e6e8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:20:55.836 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [210f6260-2325-4230-a52c-0c34e243a4c1 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:20:55.837 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [210f6260-2325-4230-a52c-0c34e243a4c1 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:03.815 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [27aa5bff-976f-4890-af19-8a37168c70c9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:03.815 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [27aa5bff-976f-4890-af19-8a37168c70c9 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:03.816 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [27aa5bff-976f-4890-af19-8a37168c70c9 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:21:03.817 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [27aa5bff-976f-4890-af19-8a37168c70c9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:21:03.817 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [27aa5bff-976f-4890-af19-8a37168c70c9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:21:03.817 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [27aa5bff-976f-4890-af19-8a37168c70c9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:21:03.825 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7b44b226-9e86-47d7-9308-6b41d08a77a0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:03.825 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7b44b226-9e86-47d7-9308-6b41d08a77a0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:42.821 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [d68715b0-14ae-4d37-bac7-cce47cb87c2d | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:21:42.850 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0550fa9a-27f3-44dd-bd34-2d047ccc2b5f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:42.851 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0550fa9a-27f3-44dd-bd34-2d047ccc2b5f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:42.852 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ea8d12af-fa53-4259-af7f-11ac78a23792 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:42.852 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0550fa9a-27f3-44dd-bd34-2d047ccc2b5f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:21:42.852 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ea8d12af-fa53-4259-af7f-11ac78a23792 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:42.855 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0550fa9a-27f3-44dd-bd34-2d047ccc2b5f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:21:42.856 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0550fa9a-27f3-44dd-bd34-2d047ccc2b5f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:21:42.856 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0550fa9a-27f3-44dd-bd34-2d047ccc2b5f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:21:42.876 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ff739dac-044a-4649-96b4-563557cf2e3f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:42.877 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ff739dac-044a-4649-96b4-563557cf2e3f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:46.820 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a1e054c5-72ac-4083-9a69-e56032c6307a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:46.820 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1e054c5-72ac-4083-9a69-e56032c6307a | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:46.821 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a1e054c5-72ac-4083-9a69-e56032c6307a | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:21:46.824 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a1e054c5-72ac-4083-9a69-e56032c6307a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:21:46.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1e054c5-72ac-4083-9a69-e56032c6307a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:21:46.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a1e054c5-72ac-4083-9a69-e56032c6307a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:21:46.845 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [d1b05433-6684-4d6f-bb37-bea138a5f900 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:46.846 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [d1b05433-6684-4d6f-bb37-bea138a5f900 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:49.829 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [73d5925e-458f-4b06-b9d4-da20c818227c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:49.829 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [73d5925e-458f-4b06-b9d4-da20c818227c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:49.830 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [73d5925e-458f-4b06-b9d4-da20c818227c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:21:49.833 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [73d5925e-458f-4b06-b9d4-da20c818227c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:21:49.833 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [73d5925e-458f-4b06-b9d4-da20c818227c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:21:49.833 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [73d5925e-458f-4b06-b9d4-da20c818227c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:21:49.850 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [f89a9067-c1a6-42f3-a709-707590b95618 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:49.850 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [f89a9067-c1a6-42f3-a709-707590b95618 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:52.823 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d876b2cb-3ec6-4498-9885-c7efbcb1a4ad | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:52.824 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d876b2cb-3ec6-4498-9885-c7efbcb1a4ad | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:52.825 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d876b2cb-3ec6-4498-9885-c7efbcb1a4ad | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:21:52.828 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d876b2cb-3ec6-4498-9885-c7efbcb1a4ad | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:21:52.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d876b2cb-3ec6-4498-9885-c7efbcb1a4ad | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:21:52.829 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d876b2cb-3ec6-4498-9885-c7efbcb1a4ad | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:21:52.853 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [47e99d11-4fc9-412f-88e2-d0527a24a016 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:52.854 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [47e99d11-4fc9-412f-88e2-d0527a24a016 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:55.814 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9f6b4a13-e214-4b94-90d3-28506dd135e5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:55.814 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9f6b4a13-e214-4b94-90d3-28506dd135e5 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:21:55.815 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9f6b4a13-e214-4b94-90d3-28506dd135e5 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:21:55.817 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [9f6b4a13-e214-4b94-90d3-28506dd135e5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:21:55.818 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9f6b4a13-e214-4b94-90d3-28506dd135e5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:21:55.818 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [9f6b4a13-e214-4b94-90d3-28506dd135e5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:21:55.832 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [aabd771d-f393-4e08-9c28-60e45489160d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:21:55.833 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [aabd771d-f393-4e08-9c28-60e45489160d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:03.818 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:03.822 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:22:03.822 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:03.822 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f41cae78-607e-43b7-ab10-96c087ff9d7b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:03.822 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f41cae78-607e-43b7-ab10-96c087ff9d7b | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:03.824 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f41cae78-607e-43b7-ab10-96c087ff9d7b | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:03.825 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:22:03.807Z +25-04-01 15:22:03.828 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:22:03.828 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:22:03.807Z] +25-04-01 15:22:03.828 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:22:03.826978Z] +25-04-01 15:22:03.829 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:03.829 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [042016de-bdf5-4290-a3d9-6a79ae6b95fd | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:22:03.829 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f41cae78-607e-43b7-ab10-96c087ff9d7b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:22:03.831 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f41cae78-607e-43b7-ab10-96c087ff9d7b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:22:03.831 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f41cae78-607e-43b7-ab10-96c087ff9d7b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:22:03.862 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [73917d88-dc30-4bf1-9313-aeebdca541e9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:03.863 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [73917d88-dc30-4bf1-9313-aeebdca541e9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:42.814 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [48f6ba8a-fe05-4a66-9d6a-338491508d04 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:22:42.838 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7128f8ec-dbe2-4036-bdac-d7d7549a7874 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:42.838 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [967cccc5-2eb1-47fe-aa85-6ee13e88a88a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:42.839 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7128f8ec-dbe2-4036-bdac-d7d7549a7874 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:42.839 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [967cccc5-2eb1-47fe-aa85-6ee13e88a88a | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:42.841 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [967cccc5-2eb1-47fe-aa85-6ee13e88a88a | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:42.846 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [967cccc5-2eb1-47fe-aa85-6ee13e88a88a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:22:42.846 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [967cccc5-2eb1-47fe-aa85-6ee13e88a88a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:22:42.847 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [967cccc5-2eb1-47fe-aa85-6ee13e88a88a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:22:42.860 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [88a3c335-7bc4-44d5-8d87-72044c88de25 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:42.860 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [88a3c335-7bc4-44d5-8d87-72044c88de25 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:46.819 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [90341d69-f181-4279-8888-46ee8e6300eb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:46.819 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [90341d69-f181-4279-8888-46ee8e6300eb | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:46.820 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [90341d69-f181-4279-8888-46ee8e6300eb | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:46.822 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [90341d69-f181-4279-8888-46ee8e6300eb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:22:46.823 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [90341d69-f181-4279-8888-46ee8e6300eb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:22:46.823 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [90341d69-f181-4279-8888-46ee8e6300eb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:22:46.834 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [dbc36d8d-e21e-43d3-95b8-7c37f65aa993 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:46.834 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [dbc36d8d-e21e-43d3-95b8-7c37f65aa993 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:49.830 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1a284296-7f6c-4414-b30b-433982b13d62 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:49.830 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1a284296-7f6c-4414-b30b-433982b13d62 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:49.831 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1a284296-7f6c-4414-b30b-433982b13d62 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:49.833 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [1a284296-7f6c-4414-b30b-433982b13d62 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:22:49.833 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1a284296-7f6c-4414-b30b-433982b13d62 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:22:49.833 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [1a284296-7f6c-4414-b30b-433982b13d62 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:22:49.847 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6df1ecb0-c1e3-42a4-a921-182eb6168cf6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:49.847 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6df1ecb0-c1e3-42a4-a921-182eb6168cf6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:52.815 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0c2da5b0-b592-4d1b-bb4b-f0840484acd6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:52.815 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0c2da5b0-b592-4d1b-bb4b-f0840484acd6 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:52.815 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0c2da5b0-b592-4d1b-bb4b-f0840484acd6 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:52.816 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [0c2da5b0-b592-4d1b-bb4b-f0840484acd6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:22:52.816 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0c2da5b0-b592-4d1b-bb4b-f0840484acd6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:22:52.816 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [0c2da5b0-b592-4d1b-bb4b-f0840484acd6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:22:52.826 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [4ef2c0be-1637-453a-9474-dd3c11c16132 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:52.826 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [4ef2c0be-1637-453a-9474-dd3c11c16132 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:55.822 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b22fab02-8e81-43c4-a3a3-21038e099f5c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:55.822 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b22fab02-8e81-43c4-a3a3-21038e099f5c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:22:55.822 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b22fab02-8e81-43c4-a3a3-21038e099f5c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:22:55.824 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b22fab02-8e81-43c4-a3a3-21038e099f5c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:22:55.824 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b22fab02-8e81-43c4-a3a3-21038e099f5c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:22:55.824 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b22fab02-8e81-43c4-a3a3-21038e099f5c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:22:55.842 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [35204f34-7272-4463-8e0c-dadca0d05c9c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:22:55.842 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [35204f34-7272-4463-8e0c-dadca0d05c9c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:23:03.824 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:23:03.827 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c38a86ac-90f0-41a1-b30f-df5049a913de | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:23:03.828 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c38a86ac-90f0-41a1-b30f-df5049a913de | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:23:03.827 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:23:03.829 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:23:03.829 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c38a86ac-90f0-41a1-b30f-df5049a913de | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:23:03.832 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:23:03.808Z +25-04-01 15:23:03.833 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c38a86ac-90f0-41a1-b30f-df5049a913de | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:23:03.833 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c38a86ac-90f0-41a1-b30f-df5049a913de | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:23:03.833 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c38a86ac-90f0-41a1-b30f-df5049a913de | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:23:03.835 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:23:03.836 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:23:03.808Z] +25-04-01 15:23:03.838 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:23:03.833737100Z] +25-04-01 15:23:03.839 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:23:03.841 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [066f5469-720a-40fa-a77b-eaf22d22f232 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:23:03.855 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [580fe4de-b4dc-4e57-a83c-d94c9f23bc0f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:23:03.856 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [580fe4de-b4dc-4e57-a83c-d94c9f23bc0f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.816 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:03.818 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [89f1a38e-66be-4b2d-acce-32776c365dfe | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:03.818 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [89f1a38e-66be-4b2d-acce-32776c365dfe | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.819 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [89f1a38e-66be-4b2d-acce-32776c365dfe | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:03.819 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:24:03.820 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.820 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [89f1a38e-66be-4b2d-acce-32776c365dfe | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:24:03.821 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [89f1a38e-66be-4b2d-acce-32776c365dfe | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:24:03.821 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [89f1a38e-66be-4b2d-acce-32776c365dfe | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:24:03.821 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d5448a78-0db2-4e9a-9ace-875f696e1557 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:24:03.822 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:24:03.809Z +25-04-01 15:24:03.825 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:24:03.825 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:24:03.809Z] +25-04-01 15:24:03.826 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:24:03.823336300Z] +25-04-01 15:24:03.826 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.826 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [a751299f-3cc9-40e9-b709-3728fc3d42b9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:24:03.841 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [15d1d544-776c-4fc4-8bd5-b937b81aa906 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:03.841 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [15d1d544-776c-4fc4-8bd5-b937b81aa906 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.853 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b9b85a70-cca9-4c57-aa9d-21c84c99d307 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:03.853 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8286ca3f-4478-4f9b-93d2-027b3f0fdcca | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:03.853 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b9b85a70-cca9-4c57-aa9d-21c84c99d307 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.853 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8286ca3f-4478-4f9b-93d2-027b3f0fdcca | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:03.854 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8286ca3f-4478-4f9b-93d2-027b3f0fdcca | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:03.857 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8286ca3f-4478-4f9b-93d2-027b3f0fdcca | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:24:03.857 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8286ca3f-4478-4f9b-93d2-027b3f0fdcca | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:24:03.858 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8286ca3f-4478-4f9b-93d2-027b3f0fdcca | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:24:03.870 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d3738a31-e439-46bc-b906-7468c7177b99 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:03.870 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d3738a31-e439-46bc-b906-7468c7177b99 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:07.827 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0e41c156-f892-4f5b-b982-fc971d5ddd48 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:07.827 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0e41c156-f892-4f5b-b982-fc971d5ddd48 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:07.828 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [0e41c156-f892-4f5b-b982-fc971d5ddd48 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:07.834 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [0e41c156-f892-4f5b-b982-fc971d5ddd48 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:24:07.834 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0e41c156-f892-4f5b-b982-fc971d5ddd48 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:24:07.835 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [0e41c156-f892-4f5b-b982-fc971d5ddd48 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:24:07.847 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [43cb0201-3347-40f4-a724-b9ec5788398e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:07.847 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [43cb0201-3347-40f4-a724-b9ec5788398e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:10.808 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a1cc1647-c17d-44b1-a1de-ce3145f9d131 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:10.808 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a1cc1647-c17d-44b1-a1de-ce3145f9d131 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:10.809 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a1cc1647-c17d-44b1-a1de-ce3145f9d131 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:10.810 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a1cc1647-c17d-44b1-a1de-ce3145f9d131 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:24:10.810 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a1cc1647-c17d-44b1-a1de-ce3145f9d131 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:24:10.810 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a1cc1647-c17d-44b1-a1de-ce3145f9d131 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:24:10.818 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [cb3db7fb-58c7-4237-9b46-8a678d7fb21c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:10.818 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cb3db7fb-58c7-4237-9b46-8a678d7fb21c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:13.822 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [20e3c6bc-e45e-4f90-915f-c0cb919c7ca8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:13.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20e3c6bc-e45e-4f90-915f-c0cb919c7ca8 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:13.823 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [20e3c6bc-e45e-4f90-915f-c0cb919c7ca8 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:13.826 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [20e3c6bc-e45e-4f90-915f-c0cb919c7ca8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:24:13.827 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20e3c6bc-e45e-4f90-915f-c0cb919c7ca8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:24:13.827 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [20e3c6bc-e45e-4f90-915f-c0cb919c7ca8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:24:13.840 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [6b779de3-114c-4128-a81a-0c47d302aaea | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:13.840 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [6b779de3-114c-4128-a81a-0c47d302aaea | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:16.815 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9c3c64b2-5aa3-414a-a7e1-4aac2849690f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:16.815 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9c3c64b2-5aa3-414a-a7e1-4aac2849690f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:24:16.816 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [9c3c64b2-5aa3-414a-a7e1-4aac2849690f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:24:16.817 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [9c3c64b2-5aa3-414a-a7e1-4aac2849690f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:24:16.817 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9c3c64b2-5aa3-414a-a7e1-4aac2849690f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:24:16.817 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [9c3c64b2-5aa3-414a-a7e1-4aac2849690f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:24:16.832 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e17d619b-9cb6-4bdf-991a-78b52b937cac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:24:16.833 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e17d619b-9cb6-4bdf-991a-78b52b937cac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.817 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:03.818 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [042ef289-a988-414e-afbc-955b0ff9c09f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:25:03.819 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:25:03.820 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.820 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [500fc896-3319-4e73-ac54-9265ac36c5a5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:03.821 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [500fc896-3319-4e73-ac54-9265ac36c5a5 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.820 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:25:03.806Z +25-04-01 15:25:03.821 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [500fc896-3319-4e73-ac54-9265ac36c5a5 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:03.823 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [500fc896-3319-4e73-ac54-9265ac36c5a5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:25:03.823 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:25:03.823 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [500fc896-3319-4e73-ac54-9265ac36c5a5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:25:03.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:25:03.806Z] +25-04-01 15:25:03.824 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [500fc896-3319-4e73-ac54-9265ac36c5a5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:25:03.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:25:03.822931400Z] +25-04-01 15:25:03.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.824 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [46f4449c-2234-4ea9-b74b-c0b57d4fe504 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:25:03.837 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2bc84680-2f12-4f59-9c59-2569e801dfa1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:03.837 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2bc84680-2f12-4f59-9c59-2569e801dfa1 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.837 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ca870057-4dfb-4caf-9f52-aa6f1ead692b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:03.838 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2bc84680-2f12-4f59-9c59-2569e801dfa1 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:03.838 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ca870057-4dfb-4caf-9f52-aa6f1ead692b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.838 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2bc84680-2f12-4f59-9c59-2569e801dfa1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:25:03.838 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2bc84680-2f12-4f59-9c59-2569e801dfa1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:25:03.838 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2bc84680-2f12-4f59-9c59-2569e801dfa1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:25:03.846 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [823e295a-f6df-4732-9bfe-a539ed0e69ce | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:03.846 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [823e295a-f6df-4732-9bfe-a539ed0e69ce | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:03.858 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [1de1d99b-ae8a-4756-8c70-db86518de498 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:03.858 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [1de1d99b-ae8a-4756-8c70-db86518de498 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:07.817 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c3fd0874-cd72-41ad-9f48-b8b07f19d0a2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:07.817 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c3fd0874-cd72-41ad-9f48-b8b07f19d0a2 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:07.817 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c3fd0874-cd72-41ad-9f48-b8b07f19d0a2 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:07.819 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c3fd0874-cd72-41ad-9f48-b8b07f19d0a2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:25:07.819 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c3fd0874-cd72-41ad-9f48-b8b07f19d0a2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:25:07.819 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c3fd0874-cd72-41ad-9f48-b8b07f19d0a2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:25:07.826 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a15c3d04-a1b7-4169-94b8-edd0926ef3cd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:07.826 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a15c3d04-a1b7-4169-94b8-edd0926ef3cd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:10.828 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [ec136d3b-ff78-4ef5-8bef-26f0f9f0abac | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:10.828 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [ec136d3b-ff78-4ef5-8bef-26f0f9f0abac | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:10.829 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ec136d3b-ff78-4ef5-8bef-26f0f9f0abac | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:10.830 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [ec136d3b-ff78-4ef5-8bef-26f0f9f0abac | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:25:10.830 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [ec136d3b-ff78-4ef5-8bef-26f0f9f0abac | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:25:10.830 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [ec136d3b-ff78-4ef5-8bef-26f0f9f0abac | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:25:10.842 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bf20047b-a046-467f-ba08-6e5d448edba4 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:10.842 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bf20047b-a046-467f-ba08-6e5d448edba4 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:13.823 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [582ec8af-caa3-497e-8a48-d887b57f1e76 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:13.823 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [582ec8af-caa3-497e-8a48-d887b57f1e76 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:13.824 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [582ec8af-caa3-497e-8a48-d887b57f1e76 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:13.825 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [582ec8af-caa3-497e-8a48-d887b57f1e76 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:25:13.826 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [582ec8af-caa3-497e-8a48-d887b57f1e76 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:25:13.826 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [582ec8af-caa3-497e-8a48-d887b57f1e76 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:25:13.846 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [3946cabf-fa78-4adc-a58d-0470e4f41419 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:13.847 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [3946cabf-fa78-4adc-a58d-0470e4f41419 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:16.816 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fd448004-5cb8-4351-a847-ca6899e20efb | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:16.816 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fd448004-5cb8-4351-a847-ca6899e20efb | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:25:16.816 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fd448004-5cb8-4351-a847-ca6899e20efb | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:25:16.818 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [fd448004-5cb8-4351-a847-ca6899e20efb | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:25:16.818 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fd448004-5cb8-4351-a847-ca6899e20efb | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:25:16.818 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [fd448004-5cb8-4351-a847-ca6899e20efb | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:25:16.828 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [c35cd56c-b6ea-4726-a73e-5a761107ed08 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:25:16.828 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [c35cd56c-b6ea-4726-a73e-5a761107ed08 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.817 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:03.817 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [28530176-28ec-4399-999b-0e149ca05bbf | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:26:03.818 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:26:03.818 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [340a46aa-15d1-4d98-b76f-76870abb2479 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:03.818 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.819 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [340a46aa-15d1-4d98-b76f-76870abb2479 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.819 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [340a46aa-15d1-4d98-b76f-76870abb2479 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:03.819 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:26:03.810Z +25-04-01 15:26:03.821 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [340a46aa-15d1-4d98-b76f-76870abb2479 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:26:03.821 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [340a46aa-15d1-4d98-b76f-76870abb2479 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:26:03.821 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [340a46aa-15d1-4d98-b76f-76870abb2479 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:26:03.821 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:26:03.822 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:26:03.810Z] +25-04-01 15:26:03.822 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:26:03.820208800Z] +25-04-01 15:26:03.822 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.822 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f09d4823-06df-4fa4-8d5c-1604f3e48723 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:26:03.840 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b48dd31c-7d9d-41fb-8f95-da46fd662761 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:03.841 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b48dd31c-7d9d-41fb-8f95-da46fd662761 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.841 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5f72171e-937b-41fa-b96d-cb1e3d2990c3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:03.841 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5f72171e-937b-41fa-b96d-cb1e3d2990c3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.842 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b48dd31c-7d9d-41fb-8f95-da46fd662761 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:03.844 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [b48dd31c-7d9d-41fb-8f95-da46fd662761 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:26:03.845 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b48dd31c-7d9d-41fb-8f95-da46fd662761 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:26:03.845 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [b48dd31c-7d9d-41fb-8f95-da46fd662761 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:26:03.851 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [bbf97a0b-68d3-45c0-87ee-5bdd54871c46 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:03.852 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [bbf97a0b-68d3-45c0-87ee-5bdd54871c46 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:03.859 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [eee12c51-88dd-4882-b8a3-7cfb1b0e1153 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:03.859 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [eee12c51-88dd-4882-b8a3-7cfb1b0e1153 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:07.825 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c4a4a471-ce01-4827-8cfe-68caeb98be56 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:07.825 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c4a4a471-ce01-4827-8cfe-68caeb98be56 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:07.826 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c4a4a471-ce01-4827-8cfe-68caeb98be56 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:07.828 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [c4a4a471-ce01-4827-8cfe-68caeb98be56 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:26:07.828 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c4a4a471-ce01-4827-8cfe-68caeb98be56 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:26:07.828 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [c4a4a471-ce01-4827-8cfe-68caeb98be56 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:26:07.839 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [44aaa619-d24e-47ea-8554-10b9ae13a6dd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:07.841 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [44aaa619-d24e-47ea-8554-10b9ae13a6dd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:10.817 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2f8e8eb9-636e-4c96-b291-7ac473d7f9a3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:10.818 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2f8e8eb9-636e-4c96-b291-7ac473d7f9a3 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:10.818 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2f8e8eb9-636e-4c96-b291-7ac473d7f9a3 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:10.819 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2f8e8eb9-636e-4c96-b291-7ac473d7f9a3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:26:10.821 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2f8e8eb9-636e-4c96-b291-7ac473d7f9a3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:26:10.821 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2f8e8eb9-636e-4c96-b291-7ac473d7f9a3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:26:10.835 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [17099d29-88a3-4d5a-8749-51e14c710fe0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:10.836 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [17099d29-88a3-4d5a-8749-51e14c710fe0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:13.821 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d6df5b57-4af8-490a-a284-44f1b3713245 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:13.821 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d6df5b57-4af8-490a-a284-44f1b3713245 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:13.822 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d6df5b57-4af8-490a-a284-44f1b3713245 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:13.823 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d6df5b57-4af8-490a-a284-44f1b3713245 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:26:13.823 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d6df5b57-4af8-490a-a284-44f1b3713245 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:26:13.824 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d6df5b57-4af8-490a-a284-44f1b3713245 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:26:13.836 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [f8d029de-d33c-4e9c-8543-ad9c185fc28a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:13.837 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [f8d029de-d33c-4e9c-8543-ad9c185fc28a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:16.823 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a3e5e374-9ee8-4909-b1f6-f955a94e60de | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:16.824 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a3e5e374-9ee8-4909-b1f6-f955a94e60de | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:26:16.824 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a3e5e374-9ee8-4909-b1f6-f955a94e60de | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:26:16.825 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [a3e5e374-9ee8-4909-b1f6-f955a94e60de | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:26:16.826 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a3e5e374-9ee8-4909-b1f6-f955a94e60de | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:26:16.826 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [a3e5e374-9ee8-4909-b1f6-f955a94e60de | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:26:16.837 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [6115097f-2cce-4806-adc2-829b08ddc5c2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:26:16.838 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [6115097f-2cce-4806-adc2-829b08ddc5c2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.822 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:03.824 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:27:03.824 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.825 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [baff585f-6535-4542-a217-c02603aa7a0b | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:27:03.825 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a9e52add-013c-4a60-ad09-daaf468a59b0 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:03.825 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a9e52add-013c-4a60-ad09-daaf468a59b0 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.825 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:27:03.813Z +25-04-01 15:27:03.826 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a9e52add-013c-4a60-ad09-daaf468a59b0 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:03.827 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a9e52add-013c-4a60-ad09-daaf468a59b0 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:27:03.827 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a9e52add-013c-4a60-ad09-daaf468a59b0 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:27:03.827 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a9e52add-013c-4a60-ad09-daaf468a59b0 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:27:03.827 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:27:03.827 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:27:03.813Z] +25-04-01 15:27:03.827 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:27:03.826924Z] +25-04-01 15:27:03.828 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.828 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [a044b175-249d-4702-8391-e6f4a82791b0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:27:03.841 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [6e0c0a90-99dd-4ddd-b4ca-2119fa8331f7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:03.841 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [6e0c0a90-99dd-4ddd-b4ca-2119fa8331f7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.845 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b3d16031-dbf2-4c83-9a31-4051c46f4685 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:03.845 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b3d16031-dbf2-4c83-9a31-4051c46f4685 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.846 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [5d658d7c-b134-49c1-b10d-e537b519fba6 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:03.846 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b3d16031-dbf2-4c83-9a31-4051c46f4685 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:03.846 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [5d658d7c-b134-49c1-b10d-e537b519fba6 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:03.848 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [b3d16031-dbf2-4c83-9a31-4051c46f4685 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:27:03.848 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b3d16031-dbf2-4c83-9a31-4051c46f4685 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:27:03.848 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [b3d16031-dbf2-4c83-9a31-4051c46f4685 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:27:03.864 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [190b87f8-bae3-4e5b-afcb-19c44b01984c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:03.864 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [190b87f8-bae3-4e5b-afcb-19c44b01984c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:07.817 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d913345b-511c-4d6a-a999-150bad2f6cf1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:07.818 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d913345b-511c-4d6a-a999-150bad2f6cf1 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:07.818 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d913345b-511c-4d6a-a999-150bad2f6cf1 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:07.818 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d913345b-511c-4d6a-a999-150bad2f6cf1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:27:07.818 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d913345b-511c-4d6a-a999-150bad2f6cf1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:27:07.819 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d913345b-511c-4d6a-a999-150bad2f6cf1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:27:07.826 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [893ecf2e-ba7e-4871-acba-47b8609f1870 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:07.826 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [893ecf2e-ba7e-4871-acba-47b8609f1870 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:10.824 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [86dee9d6-eb39-47dd-8224-af9736aaed5b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:10.825 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [86dee9d6-eb39-47dd-8224-af9736aaed5b | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:10.825 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [86dee9d6-eb39-47dd-8224-af9736aaed5b | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:10.826 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [86dee9d6-eb39-47dd-8224-af9736aaed5b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:27:10.826 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [86dee9d6-eb39-47dd-8224-af9736aaed5b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:27:10.826 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [86dee9d6-eb39-47dd-8224-af9736aaed5b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:27:10.835 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [db8f3e58-4f02-44fb-8960-58383ad24b4c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:10.836 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [db8f3e58-4f02-44fb-8960-58383ad24b4c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:13.826 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [70c4f38b-ae6e-4c77-9267-20e48f3ae400 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:13.826 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c4f38b-ae6e-4c77-9267-20e48f3ae400 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:13.827 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [70c4f38b-ae6e-4c77-9267-20e48f3ae400 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:13.828 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [70c4f38b-ae6e-4c77-9267-20e48f3ae400 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:27:13.829 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c4f38b-ae6e-4c77-9267-20e48f3ae400 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:27:13.829 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c4f38b-ae6e-4c77-9267-20e48f3ae400 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:27:13.842 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [c453c297-25cc-4d53-a815-80a61e0dbf3d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:13.843 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [c453c297-25cc-4d53-a815-80a61e0dbf3d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:16.821 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fe65d590-8d70-4005-bd2f-ec3a5a5003d2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:16.821 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fe65d590-8d70-4005-bd2f-ec3a5a5003d2 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:27:16.822 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fe65d590-8d70-4005-bd2f-ec3a5a5003d2 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:27:16.824 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [fe65d590-8d70-4005-bd2f-ec3a5a5003d2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:27:16.824 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fe65d590-8d70-4005-bd2f-ec3a5a5003d2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:27:16.824 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [fe65d590-8d70-4005-bd2f-ec3a5a5003d2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:27:16.833 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [cc689cd6-dbc4-4312-a9c2-477a86edc2dd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:27:16.833 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [cc689cd6-dbc4-4312-a9c2-477a86edc2dd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.821 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:03.823 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:03.823 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.825 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [11fedac9-d4be-4d8f-95c8-72c1a298c87a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:03.825 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [11fedac9-d4be-4d8f-95c8-72c1a298c87a | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.825 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [11fedac9-d4be-4d8f-95c8-72c1a298c87a | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:03.825 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:03.812Z +25-04-01 15:28:03.826 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [11fedac9-d4be-4d8f-95c8-72c1a298c87a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:03.826 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [11fedac9-d4be-4d8f-95c8-72c1a298c87a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:03.826 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [11fedac9-d4be-4d8f-95c8-72c1a298c87a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:03.827 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:03.827 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:03.812Z] +25-04-01 15:28:03.827 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:03.826142700Z] +25-04-01 15:28:03.827 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.827 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3e6e21be-5f07-459e-be55-0730924246c7 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:03.830 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [64a29fc4-62d1-4e66-9931-f2264308cd2e | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:03.838 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [b792597f-ca80-4702-94c2-44907049e512 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:03.838 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [b792597f-ca80-4702-94c2-44907049e512 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.850 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [5c32d1ab-d57a-43a0-86e7-c672f09b28b0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:03.850 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [edaa0aec-c925-48e0-91c8-1ff50cbd3e4f | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:03.850 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [5c32d1ab-d57a-43a0-86e7-c672f09b28b0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.850 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [edaa0aec-c925-48e0-91c8-1ff50cbd3e4f | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:03.851 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [edaa0aec-c925-48e0-91c8-1ff50cbd3e4f | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:03.852 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [edaa0aec-c925-48e0-91c8-1ff50cbd3e4f | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:03.852 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [edaa0aec-c925-48e0-91c8-1ff50cbd3e4f | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:03.854 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [edaa0aec-c925-48e0-91c8-1ff50cbd3e4f | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:03.866 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [a2d66c26-e979-4ad4-89d9-82b5cdc8085e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:03.866 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [a2d66c26-e979-4ad4-89d9-82b5cdc8085e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:07.811 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d2417c36-f4c0-43c5-9383-676d54fec357 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:07.812 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d2417c36-f4c0-43c5-9383-676d54fec357 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:07.813 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d2417c36-f4c0-43c5-9383-676d54fec357 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:07.814 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [d2417c36-f4c0-43c5-9383-676d54fec357 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:07.816 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d2417c36-f4c0-43c5-9383-676d54fec357 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:07.816 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [d2417c36-f4c0-43c5-9383-676d54fec357 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:07.830 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [5d8c8c20-79b4-4f66-a235-8a5a717d4a6e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:07.830 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [5d8c8c20-79b4-4f66-a235-8a5a717d4a6e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:10.823 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2fbd6c40-6c8d-4b42-a11b-c681b07bee3c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:10.823 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2fbd6c40-6c8d-4b42-a11b-c681b07bee3c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:10.824 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2fbd6c40-6c8d-4b42-a11b-c681b07bee3c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:10.825 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [2fbd6c40-6c8d-4b42-a11b-c681b07bee3c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:10.825 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2fbd6c40-6c8d-4b42-a11b-c681b07bee3c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:10.825 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [2fbd6c40-6c8d-4b42-a11b-c681b07bee3c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:10.837 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [afabde51-a1d7-43ca-8fd5-3cf4d37beb89 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:10.837 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [afabde51-a1d7-43ca-8fd5-3cf4d37beb89 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:13.443 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:13.443 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7b10eae5-8d3e-4001-8ae4-f17eb0583fea | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:13.444 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7b10eae5-8d3e-4001-8ae4-f17eb0583fea | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:13.444 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7b10eae5-8d3e-4001-8ae4-f17eb0583fea | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:13.444 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:13.444 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:13.445 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [7b10eae5-8d3e-4001-8ae4-f17eb0583fea | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:13.446 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7b10eae5-8d3e-4001-8ae4-f17eb0583fea | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:13.446 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [7b10eae5-8d3e-4001-8ae4-f17eb0583fea | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:13.447 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:13.429Z +25-04-01 15:28:13.448 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:13.448 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:13.429Z] +25-04-01 15:28:13.449 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:13.447066900Z] +25-04-01 15:28:13.449 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:13.449 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3bd7844c-fc7a-4d96-8458-11867131d940 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:13.456 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [97461cfa-e67a-44ad-b4d1-c4040f416049 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:13.456 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [97461cfa-e67a-44ad-b4d1-c4040f416049 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.250 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:15.251 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:15.252 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.253 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:15.253 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:15.240Z +25-04-01 15:28:15.254 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:15.254 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.255 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:15.255 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:15.240Z] +25-04-01 15:28:15.255 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:15.254590400Z] +25-04-01 15:28:15.255 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.255 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [257ca629-a5c4-4e5f-8a0c-5e8b60e548f9 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:15.255 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:15.245Z +25-04-01 15:28:15.257 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:15.257 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:15.245Z] +25-04-01 15:28:15.257 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:15.256608300Z] +25-04-01 15:28:15.257 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.257 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [70c91c76-66d9-4f5e-b28e-2364c586f33b | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:15.264 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8869a7a6-bb34-4f97-a722-9bfb3b37c642 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:15.298 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [cf639d7a-e7f4-4e78-96a8-d61429d19f01 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:15.299 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [cf639d7a-e7f4-4e78-96a8-d61429d19f01 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.299 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [cf639d7a-e7f4-4e78-96a8-d61429d19f01 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:15.304 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ce00ff51-9b6c-48c2-a396-0b442c0fea63 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:15.304 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [60377022-94c3-4d95-9de9-20564b66a8f8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:15.305 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ce00ff51-9b6c-48c2-a396-0b442c0fea63 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.305 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [60377022-94c3-4d95-9de9-20564b66a8f8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.305 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ce00ff51-9b6c-48c2-a396-0b442c0fea63 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:15.306 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [bedccce7-e5c1-4375-98be-33bfa756f7c0 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:15.307 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [bedccce7-e5c1-4375-98be-33bfa756f7c0 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.307 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [ce00ff51-9b6c-48c2-a396-0b442c0fea63 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:15.308 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [bedccce7-e5c1-4375-98be-33bfa756f7c0 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:15.308 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1b74a30d-1b15-4beb-a86c-73538363f859 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:15.308 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ce00ff51-9b6c-48c2-a396-0b442c0fea63 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:15.308 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [ce00ff51-9b6c-48c2-a396-0b442c0fea63 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:15.311 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [14f5134f-8f8f-483f-b15f-8b0e7160d657 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:15.312 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [14f5134f-8f8f-483f-b15f-8b0e7160d657 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.312 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [14f5134f-8f8f-483f-b15f-8b0e7160d657 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:15.325 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [b6226335-a38f-455b-9a50-584ccc7f42b3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:15.325 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [9dec7aaf-a213-48b6-90b0-9fb2f6901992 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:15.325 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [72a2230f-ec9b-435d-8267-acf85fe4e95f | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:15.326 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b6226335-a38f-455b-9a50-584ccc7f42b3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.326 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b6226335-a38f-455b-9a50-584ccc7f42b3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:15.326 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [9dec7aaf-a213-48b6-90b0-9fb2f6901992 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.326 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [9dec7aaf-a213-48b6-90b0-9fb2f6901992 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:15.326 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [72a2230f-ec9b-435d-8267-acf85fe4e95f | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.326 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [72a2230f-ec9b-435d-8267-acf85fe4e95f | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:15.330 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [7381e807-673f-4df9-b180-5b1122b93867 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:15.330 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [7381e807-673f-4df9-b180-5b1122b93867 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.332 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3339c241-2ba1-4236-a11f-7360f5de3e5f | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:15.334 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [3339c241-2ba1-4236-a11f-7360f5de3e5f | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.334 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [3339c241-2ba1-4236-a11f-7360f5de3e5f | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:15.334 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8c721879-5d37-46f3-bef3-37d3b4234921 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:15.334 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8c721879-5d37-46f3-bef3-37d3b4234921 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.335 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [8c721879-5d37-46f3-bef3-37d3b4234921 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:15.335 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [8c721879-5d37-46f3-bef3-37d3b4234921 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:15.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8c721879-5d37-46f3-bef3-37d3b4234921 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:15.336 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [8c721879-5d37-46f3-bef3-37d3b4234921 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:15.337 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [c8d7b809-0fd8-4a80-b125-0d462b986cea | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:15.337 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [c8d7b809-0fd8-4a80-b125-0d462b986cea | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:15.337 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [c8d7b809-0fd8-4a80-b125-0d462b986cea | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:15.339 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [4e505aed-d645-485e-a3d7-c573c0caed03 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:15.340 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [4e505aed-d645-485e-a3d7-c573c0caed03 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:15.348 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a977c3de-6b9d-43b6-b567-94019c9d0a79 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:15.348 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a977c3de-6b9d-43b6-b567-94019c9d0a79 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:18.343 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [55a9c21c-b999-4fb4-a3aa-5af825d05259 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:18.343 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [55a9c21c-b999-4fb4-a3aa-5af825d05259 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:18.345 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [55a9c21c-b999-4fb4-a3aa-5af825d05259 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:18.347 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [55a9c21c-b999-4fb4-a3aa-5af825d05259 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:18.347 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [55a9c21c-b999-4fb4-a3aa-5af825d05259 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:18.347 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [55a9c21c-b999-4fb4-a3aa-5af825d05259 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:18.367 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b0dd07d9-671f-4622-906f-8015048d3bc9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:18.368 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b0dd07d9-671f-4622-906f-8015048d3bc9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:21.334 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2d1b505d-71f4-4c49-84b4-1db142a9bb76 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:21.336 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2d1b505d-71f4-4c49-84b4-1db142a9bb76 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:21.336 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2d1b505d-71f4-4c49-84b4-1db142a9bb76 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:21.337 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [2d1b505d-71f4-4c49-84b4-1db142a9bb76 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:21.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2d1b505d-71f4-4c49-84b4-1db142a9bb76 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:21.338 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [2d1b505d-71f4-4c49-84b4-1db142a9bb76 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:21.346 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [e2d6dd9c-735c-4558-9d14-87669c6c9412 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:21.346 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [e2d6dd9c-735c-4558-9d14-87669c6c9412 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:24.335 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [738b4301-7539-4312-9ea1-51e863ac80d4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:24.336 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [738b4301-7539-4312-9ea1-51e863ac80d4 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:24.336 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [738b4301-7539-4312-9ea1-51e863ac80d4 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:24.338 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [738b4301-7539-4312-9ea1-51e863ac80d4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:24.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [738b4301-7539-4312-9ea1-51e863ac80d4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:24.338 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [738b4301-7539-4312-9ea1-51e863ac80d4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:24.349 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [7bcf9017-c5d1-4bac-94bb-969dc7001734 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:24.350 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [7bcf9017-c5d1-4bac-94bb-969dc7001734 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.589 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:26.591 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:26.591 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.592 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:26.577Z +25-04-01 15:28:26.594 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:26.595 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:26.577Z] +25-04-01 15:28:26.595 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:26.593792400Z] +25-04-01 15:28:26.595 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.595 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3d1bbc72-ca7d-4723-974f-028b76c92808 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:26.597 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:26.598 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:26.598 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.600 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:26.583Z +25-04-01 15:28:26.601 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:26.601 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:26.583Z] +25-04-01 15:28:26.601 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:26.600011700Z] +25-04-01 15:28:26.601 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.601 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3ab2fdd3-c055-4adc-af6f-e05aeccee9f0 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:26.606 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [0ef2adfc-a7f5-41a9-adf8-62248d13fb64 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:26.627 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [20e7c05c-2d3a-4cb8-a3ea-fe3722780b32 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.628 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [7f4d64e9-07d8-42e1-9eee-493810793709 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:26.628 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [20e7c05c-2d3a-4cb8-a3ea-fe3722780b32 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.628 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [7f4d64e9-07d8-42e1-9eee-493810793709 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.628 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3fd6712c-d8e3-4e06-9dac-3f2062b0536c | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:26.628 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b087a769-fd51-420f-b0dd-418bac9e335d | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:26.628 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [7f4d64e9-07d8-42e1-9eee-493810793709 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:26.628 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [4a69c6fb-5a3e-4eab-89dc-f769b4bfd8aa | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:26.628 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b087a769-fd51-420f-b0dd-418bac9e335d | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.628 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [20e7c05c-2d3a-4cb8-a3ea-fe3722780b32 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.629 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [b087a769-fd51-420f-b0dd-418bac9e335d | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:26.630 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [b087a769-fd51-420f-b0dd-418bac9e335d | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:26.630 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [4a69c6fb-5a3e-4eab-89dc-f769b4bfd8aa | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.630 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b087a769-fd51-420f-b0dd-418bac9e335d | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:26.630 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [b087a769-fd51-420f-b0dd-418bac9e335d | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:26.634 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [4cf6d938-8634-439b-8452-66532fe8516b | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.634 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [4cf6d938-8634-439b-8452-66532fe8516b | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.635 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [4cf6d938-8634-439b-8452-66532fe8516b | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.640 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ab5e670a-3c1e-4992-b6ca-2f783deaec43 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:26.640 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [fd251a40-5e5f-4390-b991-33886fc40a3b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:26.640 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ab5e670a-3c1e-4992-b6ca-2f783deaec43 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.640 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [fd251a40-5e5f-4390-b991-33886fc40a3b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.640 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [b46e926c-4357-44e8-b353-893a4dd5b954 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.640 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ab5e670a-3c1e-4992-b6ca-2f783deaec43 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:26.640 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [b46e926c-4357-44e8-b353-893a4dd5b954 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.640 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [b46e926c-4357-44e8-b353-893a4dd5b954 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.642 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ab5e670a-3c1e-4992-b6ca-2f783deaec43 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:26.642 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [ad2e0c69-0c8c-4b4a-abf7-18377cc92b90 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:26.642 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ab5e670a-3c1e-4992-b6ca-2f783deaec43 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:26.642 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ab5e670a-3c1e-4992-b6ca-2f783deaec43 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:26.643 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ad2e0c69-0c8c-4b4a-abf7-18377cc92b90 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.643 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ad2e0c69-0c8c-4b4a-abf7-18377cc92b90 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:26.645 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [dafa6dde-e629-4116-949e-bacd36080b9d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:26.645 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [dafa6dde-e629-4116-949e-bacd36080b9d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.646 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [0a20589e-4176-44ea-aa5b-26de4f834ac1 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.646 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [38b8b84d-c9f9-4bdc-bb72-ddac8761bc21 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.647 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [0a20589e-4176-44ea-aa5b-26de4f834ac1 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.647 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [0a20589e-4176-44ea-aa5b-26de4f834ac1 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.647 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [38b8b84d-c9f9-4bdc-bb72-ddac8761bc21 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.647 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [38b8b84d-c9f9-4bdc-bb72-ddac8761bc21 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.653 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [3f07b2b9-2ff1-41f2-924d-8b581b4ab531 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.655 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [3f07b2b9-2ff1-41f2-924d-8b581b4ab531 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.655 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [add0bf2d-81dd-4bc1-90c0-63636f3371e0 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:26.655 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [add0bf2d-81dd-4bc1-90c0-63636f3371e0 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:26.656 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [3f07b2b9-2ff1-41f2-924d-8b581b4ab531 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.660 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [080105b1-5758-4d4b-ac2b-9e359d13974c | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.661 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [080105b1-5758-4d4b-ac2b-9e359d13974c | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.661 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [080105b1-5758-4d4b-ac2b-9e359d13974c | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.664 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [01b5a508-e944-4ba8-9a09-e33109c4e8c4 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.664 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [01b5a508-e944-4ba8-9a09-e33109c4e8c4 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.664 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [01b5a508-e944-4ba8-9a09-e33109c4e8c4 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:26.668 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [650626e1-d27b-40ba-9db6-ab31de15900a | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:26.669 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [650626e1-d27b-40ba-9db6-ab31de15900a | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:26.669 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [650626e1-d27b-40ba-9db6-ab31de15900a | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:28.863 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:28.864 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:28.864 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:28.865 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.866 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:28.853Z +25-04-01 15:28:28.866 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:28.866 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.867 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:28.867 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:28.853Z] +25-04-01 15:28:28.867 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:28.866852Z] +25-04-01 15:28:28.867 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.867 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [53e4bfd7-b269-4929-8ec9-96b99fc7a797 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:28.868 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:28.858Z +25-04-01 15:28:28.870 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:28.871 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:28.858Z] +25-04-01 15:28:28.871 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:28.868923300Z] +25-04-01 15:28:28.871 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.872 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b23886a6-871a-4701-a822-7a3b309f64c6 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:28.885 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ce565b53-79ad-46bd-97df-22b13e8483a7 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:28.917 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [a5cd5c85-ca4a-4eab-9432-8c8dcd8f94b3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:28.918 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a5cd5c85-ca4a-4eab-9432-8c8dcd8f94b3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.918 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a5cd5c85-ca4a-4eab-9432-8c8dcd8f94b3 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:28.923 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4ba03991-d0e6-4d03-9d77-fac7a5e124e2 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:28.923 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [70feb3da-a910-49c7-9f57-93ef3f797fa2 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:28.923 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4ba03991-d0e6-4d03-9d77-fac7a5e124e2 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.924 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [4ba03991-d0e6-4d03-9d77-fac7a5e124e2 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:28.924 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [70feb3da-a910-49c7-9f57-93ef3f797fa2 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.924 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [70feb3da-a910-49c7-9f57-93ef3f797fa2 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:28.925 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [755c2cef-5c14-4b37-aaec-dc5d10d07cc7 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:28.925 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [755c2cef-5c14-4b37-aaec-dc5d10d07cc7 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.925 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [4ba03991-d0e6-4d03-9d77-fac7a5e124e2 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:28.925 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4ba03991-d0e6-4d03-9d77-fac7a5e124e2 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:28.925 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [4ba03991-d0e6-4d03-9d77-fac7a5e124e2 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:28.925 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [816e002d-4835-4b1e-8f5f-a62be2980508 | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-01 15:28:28.927 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [6f174b8f-708f-40ba-b289-fbc66817399f | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:28.930 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [6f174b8f-708f-40ba-b289-fbc66817399f | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.930 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [6f174b8f-708f-40ba-b289-fbc66817399f | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:28.939 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [d9be951f-03b5-47b6-9b9a-f172a1ce46d9 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:28.940 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d9be951f-03b5-47b6-9b9a-f172a1ce46d9 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.940 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d9be951f-03b5-47b6-9b9a-f172a1ce46d9 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:28.943 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [8dc6cff1-4157-4122-9bc3-c21de04e17a2 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:28.943 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [d631c462-d153-4b87-9412-0d52a90f1c41 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - [파일 조회] id: 10509da6-14b2-4dc5-afbe-9a8be9bd5654 +25-04-01 15:28:28.943 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [8dc6cff1-4157-4122-9bc3-c21de04e17a2 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.944 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [8dc6cff1-4157-4122-9bc3-c21de04e17a2 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:28.944 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d631c462-d153-4b87-9412-0d52a90f1c41 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.944 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [d631c462-d153-4b87-9412-0d52a90f1c41 | GET | /api/binaryContents/10509da6-14b2-4dc5-afbe-9a8be9bd5654/download] - binding parameter (1:UUID) <- [10509da6-14b2-4dc5-afbe-9a8be9bd5654] +25-04-01 15:28:28.945 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [54c159f0-8d5c-4e9c-8969-c4c73c9ee704 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:28.945 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [54c159f0-8d5c-4e9c-8969-c4c73c9ee704 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.955 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [8bdc97fd-c016-4f00-b152-97cbdc8ef8b9 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - [파일 조회] id: 8fc3f6f8-0aa7-4386-adba-61b333b060c9 +25-04-01 15:28:28.956 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [8bdc97fd-c016-4f00-b152-97cbdc8ef8b9 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-01 15:28:28.956 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [8bdc97fd-c016-4f00-b152-97cbdc8ef8b9 | GET | /api/binaryContents/8fc3f6f8-0aa7-4386-adba-61b333b060c9/download] - binding parameter (1:UUID) <- [8fc3f6f8-0aa7-4386-adba-61b333b060c9] +25-04-01 15:28:28.959 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [31b0b8e7-cea9-496d-9c2e-ffb3b46e47bd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:28.959 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [31b0b8e7-cea9-496d-9c2e-ffb3b46e47bd | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.959 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [31b0b8e7-cea9-496d-9c2e-ffb3b46e47bd | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:28.960 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [31b0b8e7-cea9-496d-9c2e-ffb3b46e47bd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:28.960 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [e9accd4d-9436-4110-9db8-16b4420319c9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:28.960 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [31b0b8e7-cea9-496d-9c2e-ffb3b46e47bd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:28.960 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [e9accd4d-9436-4110-9db8-16b4420319c9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:28.960 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [31b0b8e7-cea9-496d-9c2e-ffb3b46e47bd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:28.971 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [df1f64c5-1c0c-4dc8-8134-559387defcb9 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:28.971 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [df1f64c5-1c0c-4dc8-8134-559387defcb9 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:31.965 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3595261b-fc9b-43ce-8fb0-72adc02936d8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:31.966 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3595261b-fc9b-43ce-8fb0-72adc02936d8 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:31.966 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3595261b-fc9b-43ce-8fb0-72adc02936d8 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:31.967 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3595261b-fc9b-43ce-8fb0-72adc02936d8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:31.967 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3595261b-fc9b-43ce-8fb0-72adc02936d8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:31.967 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3595261b-fc9b-43ce-8fb0-72adc02936d8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:31.980 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f6b27bf9-cfec-42d6-a9f5-939801ced5ce | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:31.981 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f6b27bf9-cfec-42d6-a9f5-939801ced5ce | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:34.968 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [07a72f74-5569-49b6-9d2e-617376844706 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:34.969 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [07a72f74-5569-49b6-9d2e-617376844706 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:34.969 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [07a72f74-5569-49b6-9d2e-617376844706 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:34.971 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [07a72f74-5569-49b6-9d2e-617376844706 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:34.972 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [07a72f74-5569-49b6-9d2e-617376844706 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:34.972 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [07a72f74-5569-49b6-9d2e-617376844706 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:34.990 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [f69bed88-99c1-450a-9dae-b656745270cd | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:34.991 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [f69bed88-99c1-450a-9dae-b656745270cd | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:37.960 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ef2bf7d2-57de-4e6e-afef-69096f8c002c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:37.960 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ef2bf7d2-57de-4e6e-afef-69096f8c002c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:37.961 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ef2bf7d2-57de-4e6e-afef-69096f8c002c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:37.962 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [ef2bf7d2-57de-4e6e-afef-69096f8c002c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:37.963 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ef2bf7d2-57de-4e6e-afef-69096f8c002c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:37.963 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [ef2bf7d2-57de-4e6e-afef-69096f8c002c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:37.973 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [155c14a2-fee3-438a-b46e-4542bf49961f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:37.974 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [155c14a2-fee3-438a-b46e-4542bf49961f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:40.958 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a91a1761-c65f-4b8c-aed2-e6fd7cf39188 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:40.959 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a91a1761-c65f-4b8c-aed2-e6fd7cf39188 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:40.959 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a91a1761-c65f-4b8c-aed2-e6fd7cf39188 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:40.959 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a91a1761-c65f-4b8c-aed2-e6fd7cf39188 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:40.959 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a91a1761-c65f-4b8c-aed2-e6fd7cf39188 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:40.959 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a91a1761-c65f-4b8c-aed2-e6fd7cf39188 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:40.966 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [dfd0cae4-4432-4c1a-9e7f-940180c38f45 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:40.966 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [dfd0cae4-4432-4c1a-9e7f-940180c38f45 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:43.961 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7b36a894-b4fe-42eb-be94-cee479afd3dd | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:43.961 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7b36a894-b4fe-42eb-be94-cee479afd3dd | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:43.962 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7b36a894-b4fe-42eb-be94-cee479afd3dd | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:43.964 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [7b36a894-b4fe-42eb-be94-cee479afd3dd | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:43.965 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7b36a894-b4fe-42eb-be94-cee479afd3dd | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:43.965 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [7b36a894-b4fe-42eb-be94-cee479afd3dd | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:43.977 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [fe697cfe-2134-4a88-8c5f-4372f9dc8dee | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:43.977 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [fe697cfe-2134-4a88-8c5f-4372f9dc8dee | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:46.962 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [56a2f743-86b5-4cc4-9a65-e7a6fb513933 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:46.962 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [56a2f743-86b5-4cc4-9a65-e7a6fb513933 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:46.963 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [56a2f743-86b5-4cc4-9a65-e7a6fb513933 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:46.965 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [56a2f743-86b5-4cc4-9a65-e7a6fb513933 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:46.965 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [56a2f743-86b5-4cc4-9a65-e7a6fb513933 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:46.965 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [56a2f743-86b5-4cc4-9a65-e7a6fb513933 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:46.975 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e511858c-875c-4808-a694-844c9a7280ef | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:46.975 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e511858c-875c-4808-a694-844c9a7280ef | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:49.961 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d28334d7-bd7a-4127-8232-f79fba2b217c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:49.961 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d28334d7-bd7a-4127-8232-f79fba2b217c | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:49.962 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d28334d7-bd7a-4127-8232-f79fba2b217c | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:49.964 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [d28334d7-bd7a-4127-8232-f79fba2b217c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:49.964 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d28334d7-bd7a-4127-8232-f79fba2b217c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:49.964 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [d28334d7-bd7a-4127-8232-f79fba2b217c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:49.979 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [b35f0b6a-00df-4b5c-b80e-06ca726f9a33 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:49.979 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [b35f0b6a-00df-4b5c-b80e-06ca726f9a33 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:52.965 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [a6f7b364-3493-4d31-b7ea-891289245798 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:52.965 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a6f7b364-3493-4d31-b7ea-891289245798 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:52.966 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [a6f7b364-3493-4d31-b7ea-891289245798 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:52.966 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [a6f7b364-3493-4d31-b7ea-891289245798 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:52.967 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a6f7b364-3493-4d31-b7ea-891289245798 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:52.967 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [a6f7b364-3493-4d31-b7ea-891289245798 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:52.979 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [3c6b0c39-7fe2-4590-995b-4ff38efb78ec | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:52.980 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [3c6b0c39-7fe2-4590-995b-4ff38efb78ec | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:55.961 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f1da8f41-a91e-46bc-9a8b-21872256de69 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:55.961 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f1da8f41-a91e-46bc-9a8b-21872256de69 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:55.962 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f1da8f41-a91e-46bc-9a8b-21872256de69 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:55.963 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [f1da8f41-a91e-46bc-9a8b-21872256de69 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:55.963 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f1da8f41-a91e-46bc-9a8b-21872256de69 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:55.964 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [f1da8f41-a91e-46bc-9a8b-21872256de69 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:55.973 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1eb6fe82-6791-45a4-beba-6d0a49c62e0c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:55.973 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1eb6fe82-6791-45a4-beba-6d0a49c62e0c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:58.868 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:58.869 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-01 15:28:58.869 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:58.869 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: db28c977-40a7-4fce-b054-aceef730a2ee, newLastActiveAt: 2025-04-01T06:28:58.865Z +25-04-01 15:28:58.872 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-01 15:28:58.872 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-01T06:28:58.865Z] +25-04-01 15:28:58.872 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-01T06:28:58.871481600Z] +25-04-01 15:28:58.872 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (3:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:58.872 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [d0473a87-ba1b-4101-a59a-b474573db822 | PATCH | /api/users/db28c977-40a7-4fce-b054-aceef730a2ee/userStatus] - binding parameter (4:UUID) <- [dbd3b5b9-b349-43bb-9fd0-730cd1efc2b1] +25-04-01 15:28:58.961 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [277eb676-01ae-454e-ba35-cbc14d9170a5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:58.961 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [277eb676-01ae-454e-ba35-cbc14d9170a5 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:28:58.962 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [277eb676-01ae-454e-ba35-cbc14d9170a5 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:28:58.963 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [277eb676-01ae-454e-ba35-cbc14d9170a5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:28:58.965 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [277eb676-01ae-454e-ba35-cbc14d9170a5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:28:58.965 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [277eb676-01ae-454e-ba35-cbc14d9170a5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:28:58.974 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [5f81b3cc-dea9-45d5-b4dd-4082744f8f9e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:28:58.974 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [5f81b3cc-dea9-45d5-b4dd-4082744f8f9e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:01.957 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f721cb93-e95f-4673-8adb-4409eef183e9 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:01.957 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f721cb93-e95f-4673-8adb-4409eef183e9 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:01.958 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f721cb93-e95f-4673-8adb-4409eef183e9 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:01.958 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [f721cb93-e95f-4673-8adb-4409eef183e9 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:01.958 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f721cb93-e95f-4673-8adb-4409eef183e9 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:01.958 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [f721cb93-e95f-4673-8adb-4409eef183e9 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:01.964 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [f114102b-22da-4d7f-9c42-a3d791f53670 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:01.965 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [f114102b-22da-4d7f-9c42-a3d791f53670 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:04.958 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [620fc17c-cfe5-417a-bd57-a108305202f5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:04.959 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [620fc17c-cfe5-417a-bd57-a108305202f5 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:04.959 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [620fc17c-cfe5-417a-bd57-a108305202f5 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:04.959 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [620fc17c-cfe5-417a-bd57-a108305202f5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:04.959 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [620fc17c-cfe5-417a-bd57-a108305202f5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:04.959 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [620fc17c-cfe5-417a-bd57-a108305202f5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:04.965 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [cf1b9c32-f1f2-4efb-a731-69e4ac927274 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:04.965 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [cf1b9c32-f1f2-4efb-a731-69e4ac927274 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:07.961 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [02a4604d-a1d9-47d6-bd5e-ab504c4f9556 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:07.961 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [02a4604d-a1d9-47d6-bd5e-ab504c4f9556 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:07.962 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [02a4604d-a1d9-47d6-bd5e-ab504c4f9556 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:07.963 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [02a4604d-a1d9-47d6-bd5e-ab504c4f9556 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:07.963 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [02a4604d-a1d9-47d6-bd5e-ab504c4f9556 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:07.963 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [02a4604d-a1d9-47d6-bd5e-ab504c4f9556 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:07.975 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [cf38af29-2fbf-466f-af5d-827044196f99 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:07.975 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [cf38af29-2fbf-466f-af5d-827044196f99 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:10.964 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2308d165-d707-472a-ad1c-93896106006a | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:10.964 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2308d165-d707-472a-ad1c-93896106006a | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:10.965 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [2308d165-d707-472a-ad1c-93896106006a | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:10.966 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [2308d165-d707-472a-ad1c-93896106006a | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:10.967 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2308d165-d707-472a-ad1c-93896106006a | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:10.967 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [2308d165-d707-472a-ad1c-93896106006a | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:10.978 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [50da0f06-8a39-4dff-93c9-7191bec0124e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:10.979 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [50da0f06-8a39-4dff-93c9-7191bec0124e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:13.960 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [89c6c0f1-5410-45d5-9f8f-c2d4333749f1 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:13.960 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [89c6c0f1-5410-45d5-9f8f-c2d4333749f1 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:13.961 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [89c6c0f1-5410-45d5-9f8f-c2d4333749f1 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:13.962 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [89c6c0f1-5410-45d5-9f8f-c2d4333749f1 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:13.962 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [89c6c0f1-5410-45d5-9f8f-c2d4333749f1 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:13.962 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [89c6c0f1-5410-45d5-9f8f-c2d4333749f1 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:13.971 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [3773f1cb-fc48-4683-8a39-8c0cb30d6c8f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:13.971 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [3773f1cb-fc48-4683-8a39-8c0cb30d6c8f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:16.960 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3909c96a-f05e-4a1a-9a15-3857156958cf | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:16.960 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3909c96a-f05e-4a1a-9a15-3857156958cf | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:16.960 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3909c96a-f05e-4a1a-9a15-3857156958cf | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:16.960 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [3909c96a-f05e-4a1a-9a15-3857156958cf | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:16.960 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3909c96a-f05e-4a1a-9a15-3857156958cf | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:16.960 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [3909c96a-f05e-4a1a-9a15-3857156958cf | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:16.973 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [b6440f9d-5462-4d34-a787-80c3491ee706 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:16.974 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [b6440f9d-5462-4d34-a787-80c3491ee706 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:19.961 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3490c5ef-a669-4d56-81ac-6a265828bafe | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:19.961 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3490c5ef-a669-4d56-81ac-6a265828bafe | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:19.961 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [3490c5ef-a669-4d56-81ac-6a265828bafe | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:19.962 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [3490c5ef-a669-4d56-81ac-6a265828bafe | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:19.962 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3490c5ef-a669-4d56-81ac-6a265828bafe | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:19.962 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [3490c5ef-a669-4d56-81ac-6a265828bafe | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:19.978 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [c5908b14-e860-463e-85b9-664135dedc4a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:19.978 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [c5908b14-e860-463e-85b9-664135dedc4a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:22.958 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d42d47e5-bef2-4775-aef3-e8dd210dcce4 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:22.959 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d42d47e5-bef2-4775-aef3-e8dd210dcce4 | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:22.959 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [d42d47e5-bef2-4775-aef3-e8dd210dcce4 | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:22.959 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [d42d47e5-bef2-4775-aef3-e8dd210dcce4 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:22.959 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d42d47e5-bef2-4775-aef3-e8dd210dcce4 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:22.959 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [d42d47e5-bef2-4775-aef3-e8dd210dcce4 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:22.965 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [1eab1f4c-a1d2-4b55-8c36-121d4baccfd8 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:22.965 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [1eab1f4c-a1d2-4b55-8c36-121d4baccfd8 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:25.960 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [85089d7e-301b-4f53-a6a2-0bb9b9f1e80b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:25.960 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [85089d7e-301b-4f53-a6a2-0bb9b9f1e80b | GET | /api/channels] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:25.961 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [85089d7e-301b-4f53-a6a2-0bb9b9f1e80b | GET | /api/channels] - [채널 조회 성공] id: db28c977-40a7-4fce-b054-aceef730a2ee +25-04-01 15:29:25.961 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [85089d7e-301b-4f53-a6a2-0bb9b9f1e80b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-01 15:29:25.961 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [85089d7e-301b-4f53-a6a2-0bb9b9f1e80b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-01 15:29:25.961 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [85089d7e-301b-4f53-a6a2-0bb9b9f1e80b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-01 15:29:25.968 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c9f0438f-2d6d-47c9-b04a-430fd37f2db3 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-01 15:29:25.969 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [c9f0438f-2d6d-47c9-b04a-430fd37f2db3 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [db28c977-40a7-4fce-b054-aceef730a2ee] +25-04-01 15:29:29.819 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-04-01 15:29:30.121 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-04-01 15:29:30.131 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-01 15:29:30.136 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-04-01 15:29:30.141 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. diff --git a/.logs/logfile-2025-04-02.log b/.logs/logfile-2025-04-02.log new file mode 100644 index 000000000..45b6c5168 --- /dev/null +++ b/.logs/logfile-2025-04-02.log @@ -0,0 +1,3481 @@ +25-04-02 09:17:14.408 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 09:17:14.500 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 11568 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 09:17:14.501 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-04-02 09:17:16.666 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 09:17:16.791 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 109 ms. Found 6 JPA repository interfaces. +25-04-02 09:17:17.939 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-04-02 09:17:17.957 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-04-02 09:17:17.961 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-04-02 09:17:17.962 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-04-02 09:17:18.057 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-04-02 09:17:18.057 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 3489 ms +25-04-02 09:17:18.217 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-04-02 09:17:18.554 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-04-02 09:17:18.558 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-04-02 09:17:18.570 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-04-02 09:17:18.957 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 09:17:19.077 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 09:17:19.150 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 09:17:19.606 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 09:17:19.721 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 09:17:21.356 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 09:17:21.382 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 09:17:21.386 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 09:17:21.387 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 09:17:21.388 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 09:17:21.389 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 09:17:21.391 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 09:17:21.395 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 09:17:21.405 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 09:17:21.407 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 09:17:21.411 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 09:17:21.414 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 09:17:21.416 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 09:17:21.418 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 09:17:21.419 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 09:17:21.422 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 09:17:21.423 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 09:17:21.425 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 09:17:21.427 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 09:17:21.428 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 09:17:21.431 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 09:17:21.434 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 09:17:21.435 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 09:17:21.444 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 09:17:22.161 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 09:17:23.984 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-02 09:17:26.773 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-04-02 09:17:27.011 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-04-02 09:17:27.043 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-04-02 09:17:27.088 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 13.564 seconds (process running for 14.631) +25-04-02 09:17:27.476 [registrationTask1] WARN de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Failed to register application as Application(name=discodeit, managementUrl=http://10.3.23.18:8081/actuator, healthUrl=http://10.3.23.18:8081/actuator/health, serviceUrl=http://10.3.23.18:8081/) at spring-boot-admin ([http://localhost:9090/instances]): I/O error on POST request for "http://localhost:9090/instances": null. Further attempts are logged on DEBUG level +org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:9090/instances": null + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.createResourceAccessException(DefaultRestClient.java:689) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:574) + at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:532) + at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:677) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:806) + at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:750) + at de.codecentric.boot.admin.client.registration.RestClientRegistrationClient.register(RestClientRegistrationClient.java:45) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:80) + at de.codecentric.boot.admin.client.registration.DefaultApplicationRegistrator.register(DefaultApplicationRegistrator.java:61) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.net.ConnectException: null + at java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1083) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206) + at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934) + at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911) + at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) + at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773) + ... 3 common frames omitted +Caused by: java.nio.channels.ClosedChannelException: null + at java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195) + at java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760) + at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183) + at java.base/java.security.AccessController.doPrivileged(AccessController.java:569) + at java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185) + ... 9 common frames omitted +25-04-02 09:17:27.608 [RMI TCP Connection(2)-10.3.23.18] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-04-02 09:17:27.609 [RMI TCP Connection(2)-10.3.23.18] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-04-02 09:17:27.613 [RMI TCP Connection(2)-10.3.23.18] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 3 ms +25-04-02 09:17:44.810 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - [회원 생성 요청] username: rex, email: rex@naver.com +25-04-02 09:17:44.964 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-02 09:17:44.972 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex@naver.com] +25-04-02 09:17:44.972 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-04-02 09:17:45.033 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-02 09:17:45.034 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (1:VARCHAR) <- [rex] +25-04-02 09:17:45.034 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (2:INTEGER) <- [1] +25-04-02 09:17:45.035 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - [프로필 이미지 업로드] 파일명: rex.png, 타입: image/png, 크기: 64605 bytes +25-04-02 09:17:45.144 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - [회원 생성 완료] username: rex, id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:45.173 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-02 09:17:45.177 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (1:VARCHAR) <- [image/png] +25-04-02 09:17:45.178 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.085969500Z] +25-04-02 09:17:45.187 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (3:VARCHAR) <- [rex.png] +25-04-02 09:17:45.188 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (4:BIGINT) <- [64605] +25-04-02 09:17:45.190 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (5:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.204 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-02 09:17:45.205 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.131548800Z] +25-04-02 09:17:45.205 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-04-02 09:17:45.205 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-04-02 09:17:45.205 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (4:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.206 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.131548800Z] +25-04-02 09:17:45.206 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (6:VARCHAR) <- [rex] +25-04-02 09:17:45.206 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (7:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.207 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-02 09:17:45.208 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.139549700Z] +25-04-02 09:17:45.208 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.128553700Z] +25-04-02 09:17:45.208 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.139549700Z] +25-04-02 09:17:45.208 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (4:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.208 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [2338adeb-c25a-4bd9-947e-c9b5fff5b1d3 | POST | /api/users] - binding parameter (5:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:17:45.273 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:45.274 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:45.288 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:17:45.288 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:17:45.289 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.289 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.336 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158, newLastActiveAt: 2025-04-02T00:17:45.255Z +25-04-02 09:17:45.336 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158, newLastActiveAt: 2025-04-02T00:17:45.258Z +25-04-02 09:17:45.346 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-02 09:17:45.346 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-02 09:17:45.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.258Z] +25-04-02 09:17:45.351 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.255Z] +25-04-02 09:17:45.351 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.336610100Z] +25-04-02 09:17:45.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:17:45.336610100Z] +25-04-02 09:17:45.351 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (3:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.351 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (3:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.352 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [98d65b2b-154e-4436-9a60-e05f90f118aa | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (4:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:17:45.352 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e73f6332-be1c-4654-9cf8-f4e1efce1cde | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (4:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:17:45.411 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [700ae228-16a6-4944-8a1f-782aca0d1c0f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-02 09:17:45.435 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [c8412ba5-6c53-47ad-983b-bfac80aaed40 | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - [파일 조회] id: 9db53282-b714-4976-8671-edcd5cfcd616 +25-04-02 09:17:45.438 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [7a9e24eb-7555-43eb-b54d-c40103a40805 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:45.438 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [a3522ae7-c6c8-4512-9121-90d72a6f891f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:45.439 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [a3522ae7-c6c8-4512-9121-90d72a6f891f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.439 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [7a9e24eb-7555-43eb-b54d-c40103a40805 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.440 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [d6d8af8c-262f-4d34-91d9-80a5237e34bb | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-02 09:17:45.441 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [7a9e24eb-7555-43eb-b54d-c40103a40805 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:45.452 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [7a9e24eb-7555-43eb-b54d-c40103a40805 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:17:45.454 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [7a9e24eb-7555-43eb-b54d-c40103a40805 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:17:45.454 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [7a9e24eb-7555-43eb-b54d-c40103a40805 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:17:45.456 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c8412ba5-6c53-47ad-983b-bfac80aaed40 | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:17:45.456 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c8412ba5-6c53-47ad-983b-bfac80aaed40 | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.473 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [fd302312-fa17-4a03-a65a-7a03a827343c | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:45.473 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [9fe8fb83-03c8-49bf-aedd-a4e1e87fe159 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:45.473 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [273c7e46-42ea-4e7c-98fd-e641ef75975d | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - [파일 조회] id: 9db53282-b714-4976-8671-edcd5cfcd616 +25-04-02 09:17:45.474 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [9fe8fb83-03c8-49bf-aedd-a4e1e87fe159 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.474 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [fd302312-fa17-4a03-a65a-7a03a827343c | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.474 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [273c7e46-42ea-4e7c-98fd-e641ef75975d | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:17:45.475 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [fd302312-fa17-4a03-a65a-7a03a827343c | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:45.475 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [273c7e46-42ea-4e7c-98fd-e641ef75975d | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.477 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [fd302312-fa17-4a03-a65a-7a03a827343c | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:17:45.478 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [fd302312-fa17-4a03-a65a-7a03a827343c | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:17:45.479 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [fd302312-fa17-4a03-a65a-7a03a827343c | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:17:45.482 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [1687f868-a386-48d6-bb06-967d2bb6a48b | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - [파일 조회] id: 9db53282-b714-4976-8671-edcd5cfcd616 +25-04-02 09:17:45.483 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [80f22571-eadd-40c5-a5ef-37a374590797 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:45.484 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [80f22571-eadd-40c5-a5ef-37a374590797 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.484 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1687f868-a386-48d6-bb06-967d2bb6a48b | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:17:45.484 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1687f868-a386-48d6-bb06-967d2bb6a48b | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.485 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [dcbaf464-d970-44c6-81cf-03bd43c6e1d1 | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616/download] - [파일 조회] id: 9db53282-b714-4976-8671-edcd5cfcd616 +25-04-02 09:17:45.486 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [dcbaf464-d970-44c6-81cf-03bd43c6e1d1 | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616/download] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:17:45.487 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [dcbaf464-d970-44c6-81cf-03bd43c6e1d1 | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616/download] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.491 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [8977d730-bf6b-4ee8-8c2c-41a4677034ef | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - [파일 조회] id: 9db53282-b714-4976-8671-edcd5cfcd616 +25-04-02 09:17:45.493 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [8977d730-bf6b-4ee8-8c2c-41a4677034ef | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:17:45.493 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [8977d730-bf6b-4ee8-8c2c-41a4677034ef | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:45.494 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [714e0f36-4f92-415f-b563-980b0f2427bc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:45.495 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [714e0f36-4f92-415f-b563-980b0f2427bc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:45.503 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicBinaryContentService [2f84a19a-5fa9-4939-a839-6d416ef1fc9f | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - [파일 조회] id: 9db53282-b714-4976-8671-edcd5cfcd616 +25-04-02 09:17:45.504 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [2f84a19a-5fa9-4939-a839-6d416ef1fc9f | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:17:45.505 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [2f84a19a-5fa9-4939-a839-6d416ef1fc9f | GET | /api/binaryContents/9db53282-b714-4976-8671-edcd5cfcd616] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:17:48.477 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f68f4330-9b2c-403c-98d6-24e8e5d07066 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:48.478 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [f68f4330-9b2c-403c-98d6-24e8e5d07066 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:48.478 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [f68f4330-9b2c-403c-98d6-24e8e5d07066 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:48.481 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [f68f4330-9b2c-403c-98d6-24e8e5d07066 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:17:48.482 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [f68f4330-9b2c-403c-98d6-24e8e5d07066 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:17:48.482 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [f68f4330-9b2c-403c-98d6-24e8e5d07066 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:17:48.491 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [64c37622-6adb-4f20-8bf7-6511f5c7971a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:48.491 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [64c37622-6adb-4f20-8bf7-6511f5c7971a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:51.476 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ac2b1a84-dafd-454d-a343-9319a5ebcaef | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:51.477 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ac2b1a84-dafd-454d-a343-9319a5ebcaef | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:51.478 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ac2b1a84-dafd-454d-a343-9319a5ebcaef | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:51.480 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [ac2b1a84-dafd-454d-a343-9319a5ebcaef | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:17:51.481 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ac2b1a84-dafd-454d-a343-9319a5ebcaef | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:17:51.481 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [ac2b1a84-dafd-454d-a343-9319a5ebcaef | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:17:51.496 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [8f7dfadb-d0fb-4e52-a7bc-bd946b2a121c | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:51.496 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [8f7dfadb-d0fb-4e52-a7bc-bd946b2a121c | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:54.492 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1e5475a6-a646-4d85-8e01-186b5acec0d6 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:54.492 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1e5475a6-a646-4d85-8e01-186b5acec0d6 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:54.493 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [1e5475a6-a646-4d85-8e01-186b5acec0d6 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:54.494 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [1e5475a6-a646-4d85-8e01-186b5acec0d6 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:17:54.495 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1e5475a6-a646-4d85-8e01-186b5acec0d6 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:17:54.495 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [1e5475a6-a646-4d85-8e01-186b5acec0d6 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:17:54.508 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [178b44ed-9a10-4a6f-87c6-85a13ef31cac | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:54.508 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [178b44ed-9a10-4a6f-87c6-85a13ef31cac | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:57.483 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [73517356-9deb-4787-a0e4-720e5b8ceaee | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:57.485 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [73517356-9deb-4787-a0e4-720e5b8ceaee | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:17:57.487 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [73517356-9deb-4787-a0e4-720e5b8ceaee | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:17:57.490 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [73517356-9deb-4787-a0e4-720e5b8ceaee | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:17:57.491 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [73517356-9deb-4787-a0e4-720e5b8ceaee | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:17:57.491 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [73517356-9deb-4787-a0e4-720e5b8ceaee | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:17:57.499 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [df9e8352-b2b7-4f85-9990-ed99c59751fc | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:17:57.500 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [df9e8352-b2b7-4f85-9990-ed99c59751fc | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:00.183 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - [회원 수정 요청] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:00.185 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-02 09:18:00.185 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:00.190 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-02 09:18:00.191 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (1:VARCHAR) <- [rex@google.com] +25-04-02 09:18:00.191 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (2:INTEGER) <- [1] +25-04-02 09:18:00.193 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-02 09:18:00.194 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (1:VARCHAR) <- [newRex] +25-04-02 09:18:00.194 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (2:INTEGER) <- [1] +25-04-02 09:18:00.196 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserService [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - [회원 수정 완료] id: 89d6810c-5aa4-459d-a864-b825e0842158, 새로운 이름: newRex, 새로운 이메일: rex@google.com +25-04-02 09:18:00.197 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:18:00.198 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:18:00.202 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - + /* update + for com.sprint.mission.discodeit.entity.User */update users + set + email=?, + password=?, + profile_id=?, + updated_at=?, + username=? + where + id=? +25-04-02 09:18:00.203 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (1:VARCHAR) <- [rex@google.com] +25-04-02 09:18:00.203 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (2:VARCHAR) <- [Rlawnsdn12!] +25-04-02 09:18:00.203 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (3:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:18:00.203 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (4:TIMESTAMP_UTC) <- [2025-04-02T00:18:00.201015200Z] +25-04-02 09:18:00.203 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (5:VARCHAR) <- [newRex] +25-04-02 09:18:00.204 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [ef63f8b3-69cd-4200-b1ba-076ea47223a5 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158] - binding parameter (6:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:00.482 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [14b2c7ad-a86f-4ab1-be40-6b0ff33eb9f3 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:00.483 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [14b2c7ad-a86f-4ab1-be40-6b0ff33eb9f3 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:00.484 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [14b2c7ad-a86f-4ab1-be40-6b0ff33eb9f3 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:00.488 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [14b2c7ad-a86f-4ab1-be40-6b0ff33eb9f3 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:00.489 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [14b2c7ad-a86f-4ab1-be40-6b0ff33eb9f3 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:00.489 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [14b2c7ad-a86f-4ab1-be40-6b0ff33eb9f3 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:00.502 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [1c4b5df2-5290-48a2-be28-19c95fddfd2e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:00.503 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [1c4b5df2-5290-48a2-be28-19c95fddfd2e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:03.475 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5d2ef606-7353-4a4a-b842-568e6768251b | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:03.476 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5d2ef606-7353-4a4a-b842-568e6768251b | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:03.476 [http-nio-8081-exec-5] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [5d2ef606-7353-4a4a-b842-568e6768251b | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:03.477 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5d2ef606-7353-4a4a-b842-568e6768251b | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:03.477 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5d2ef606-7353-4a4a-b842-568e6768251b | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:03.477 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5d2ef606-7353-4a4a-b842-568e6768251b | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:03.491 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [11ad1c5a-773a-4a56-bb55-cdfd88dd4e8b | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:03.491 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [11ad1c5a-773a-4a56-bb55-cdfd88dd4e8b | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:06.477 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [94ebc45a-aeff-4b55-90d0-2823472565f8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:06.477 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [94ebc45a-aeff-4b55-90d0-2823472565f8 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:06.478 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [94ebc45a-aeff-4b55-90d0-2823472565f8 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:06.481 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [94ebc45a-aeff-4b55-90d0-2823472565f8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:06.481 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [94ebc45a-aeff-4b55-90d0-2823472565f8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:06.481 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [94ebc45a-aeff-4b55-90d0-2823472565f8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:06.492 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [e15c162e-3196-4293-9eec-2814a77dc20e | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:06.492 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [e15c162e-3196-4293-9eec-2814a77dc20e | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:09.482 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [22bac0e2-a89a-469b-b602-7daaf50a6f87 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:09.482 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22bac0e2-a89a-469b-b602-7daaf50a6f87 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:09.484 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [22bac0e2-a89a-469b-b602-7daaf50a6f87 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:09.490 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [22bac0e2-a89a-469b-b602-7daaf50a6f87 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:09.490 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22bac0e2-a89a-469b-b602-7daaf50a6f87 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:09.490 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [22bac0e2-a89a-469b-b602-7daaf50a6f87 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:09.500 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [e347fa38-7038-4b80-bb99-63f925867c9d | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:09.501 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [e347fa38-7038-4b80-bb99-63f925867c9d | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:12.495 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [07e687cd-5f52-4b09-8627-be89d5936c64 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:12.497 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [07e687cd-5f52-4b09-8627-be89d5936c64 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:12.500 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [07e687cd-5f52-4b09-8627-be89d5936c64 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:12.503 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [07e687cd-5f52-4b09-8627-be89d5936c64 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:12.504 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [07e687cd-5f52-4b09-8627-be89d5936c64 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:12.504 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [07e687cd-5f52-4b09-8627-be89d5936c64 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:12.523 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [381add84-8949-470e-a0ca-84f75fd00f1f | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:12.523 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [381add84-8949-470e-a0ca-84f75fd00f1f | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:15.274 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:15.277 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:18:15.278 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:15.282 [http-nio-8081-exec-1] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158, newLastActiveAt: 2025-04-02T00:18:15.260Z +25-04-02 09:18:15.285 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-02 09:18:15.286 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:18:15.260Z] +25-04-02 09:18:15.286 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:18:15.284795200Z] +25-04-02 09:18:15.287 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (3:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:15.287 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [a5407c6c-1d26-4f69-ac5d-91264854d452 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (4:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:18:15.480 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c5aac1c9-a3fd-4808-a366-a3534cc16192 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:15.481 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c5aac1c9-a3fd-4808-a366-a3534cc16192 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:15.484 [http-nio-8081-exec-10] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [c5aac1c9-a3fd-4808-a366-a3534cc16192 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:15.489 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [c5aac1c9-a3fd-4808-a366-a3534cc16192 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:15.490 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c5aac1c9-a3fd-4808-a366-a3534cc16192 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:15.490 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [c5aac1c9-a3fd-4808-a366-a3534cc16192 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:15.512 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [ee4b1067-3393-4a52-a8cf-23d01f244c81 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:15.512 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [ee4b1067-3393-4a52-a8cf-23d01f244c81 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:18.480 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [725073af-15fa-4e09-9107-7919277f30b5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:18.481 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [725073af-15fa-4e09-9107-7919277f30b5 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:18.482 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:18.482 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [725073af-15fa-4e09-9107-7919277f30b5 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:18.485 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:18:18.485 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:18.485 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [725073af-15fa-4e09-9107-7919277f30b5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:18.485 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [725073af-15fa-4e09-9107-7919277f30b5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:18.485 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [725073af-15fa-4e09-9107-7919277f30b5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:18.486 [http-nio-8081-exec-2] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158, newLastActiveAt: 2025-04-02T00:18:18.472Z +25-04-02 09:18:18.487 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-02 09:18:18.488 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:18:18.472Z] +25-04-02 09:18:18.488 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:18:18.487290900Z] +25-04-02 09:18:18.488 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (3:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:18.489 [http-nio-8081-exec-2] TRACE org.hibernate.orm.jdbc.bind [906a557a-01a0-4c52-92db-765b099feb04 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (4:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:18:26.263 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - [로그인 시도] username: newRex +25-04-02 09:18:26.265 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-04-02 09:18:26.266 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - binding parameter (1:VARCHAR) <- [newRex] +25-04-02 09:18:26.286 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:18:26.286 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.289 [http-nio-8081-exec-4] INFO com.sprint.mission.discodeit.service.basic.BasicAuthService [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - [로그인 성공] username: newRex +25-04-02 09:18:26.289 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-02 09:18:26.290 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [2673917b-0f33-4257-84c1-e410075b24cf | POST | /api/auth/login] - binding parameter (1:UUID) <- [9db53282-b714-4976-8671-edcd5cfcd616] +25-04-02 09:18:26.300 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [112b3e9f-f313-47d5-b87d-64579893644b | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-02 09:18:26.327 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:26.327 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 요청 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:26.327 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [bcaed9f1-0a3d-4cae-af21-010ee234960c | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-02 09:18:26.329 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [ed4132b8-e61b-44c1-b43a-46aa3fbd1d58 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.330 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [afd74017-ac54-4e2a-ba82-5912a26933a8 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.330 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [ed4132b8-e61b-44c1-b43a-46aa3fbd1d58 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.330 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [afd74017-ac54-4e2a-ba82-5912a26933a8 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.330 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:18:26.331 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.331 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.user_id=? +25-04-02 09:18:26.332 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.331 [http-nio-8081-exec-7] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [afd74017-ac54-4e2a-ba82-5912a26933a8 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:26.334 [http-nio-8081-exec-9] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158, newLastActiveAt: 2025-04-02T00:18:26.315Z +25-04-02 09:18:26.334 [http-nio-8081-exec-3] INFO com.sprint.mission.discodeit.service.basic.BasicUserStatusService [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - [유저 상태 수정 완료 - userId 기준] userId: 89d6810c-5aa4-459d-a864-b825e0842158, newLastActiveAt: 2025-04-02T00:18:26.316Z +25-04-02 09:18:26.338 [http-nio-8081-exec-3] DEBUG org.hibernate.SQL [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-02 09:18:26.338 [http-nio-8081-exec-9] DEBUG org.hibernate.SQL [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - + /* update + for com.sprint.mission.discodeit.entity.UserStatus */update user_statuses + set + last_active_at=?, + updated_at=?, + user_id=? + where + id=? +25-04-02 09:18:26.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:18:26.315Z] +25-04-02 09:18:26.340 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [afd74017-ac54-4e2a-ba82-5912a26933a8 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:26.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:18:26.316Z] +25-04-02 09:18:26.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:18:26.336887800Z] +25-04-02 09:18:26.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [afd74017-ac54-4e2a-ba82-5912a26933a8 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:26.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-02T00:18:26.336887800Z] +25-04-02 09:18:26.340 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [afd74017-ac54-4e2a-ba82-5912a26933a8 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:26.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (3:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (3:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.340 [http-nio-8081-exec-3] TRACE org.hibernate.orm.jdbc.bind [6ea8a8e6-8510-4ff4-93f8-af652226ecd1 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (4:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:18:26.340 [http-nio-8081-exec-9] TRACE org.hibernate.orm.jdbc.bind [8a54c921-56e4-4db1-b308-5d196eb625e3 | PATCH | /api/users/89d6810c-5aa4-459d-a864-b825e0842158/userStatus] - binding parameter (4:UUID) <- [dd9a11d6-65ac-46ec-99ae-2d1631c2721b] +25-04-02 09:18:26.347 [http-nio-8081-exec-5] DEBUG org.hibernate.SQL [5fd85ce0-101a-4311-9c1e-02c768bccea2 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.347 [http-nio-8081-exec-5] TRACE org.hibernate.orm.jdbc.bind [5fd85ce0-101a-4311-9c1e-02c768bccea2 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.355 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [550db953-d28b-4c0d-aee1-24f4fd4f50a5 | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.355 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [550db953-d28b-4c0d-aee1-24f4fd4f50a5 | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.356 [http-nio-8081-exec-2] DEBUG org.hibernate.SQL [c033f3d2-d21a-40b2-bfb2-0bfe081e388f | GET | /api/users] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-02 09:18:26.356 [http-nio-8081-exec-6] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [550db953-d28b-4c0d-aee1-24f4fd4f50a5 | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:26.359 [http-nio-8081-exec-4] DEBUG org.hibernate.SQL [7995db87-0cf1-48ec-8225-8616e9e36b76 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.359 [http-nio-8081-exec-6] DEBUG org.hibernate.SQL [550db953-d28b-4c0d-aee1-24f4fd4f50a5 | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:26.359 [http-nio-8081-exec-4] TRACE org.hibernate.orm.jdbc.bind [7995db87-0cf1-48ec-8225-8616e9e36b76 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.359 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [550db953-d28b-4c0d-aee1-24f4fd4f50a5 | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:26.359 [http-nio-8081-exec-6] TRACE org.hibernate.orm.jdbc.bind [550db953-d28b-4c0d-aee1-24f4fd4f50a5 | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:26.369 [http-nio-8081-exec-10] DEBUG org.hibernate.SQL [cba194c7-dada-4b0d-b73f-2c3b7a8fde4a | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.369 [http-nio-8081-exec-10] TRACE org.hibernate.orm.jdbc.bind [cba194c7-dada-4b0d-b73f-2c3b7a8fde4a | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.369 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ff17c353-5db7-4461-9fe5-49240ecbd83e | GET | /api/channels] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.369 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ff17c353-5db7-4461-9fe5-49240ecbd83e | GET | /api/channels] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.370 [http-nio-8081-exec-8] INFO com.sprint.mission.discodeit.service.basic.BasicChannelService [ff17c353-5db7-4461-9fe5-49240ecbd83e | GET | /api/channels] - [채널 조회 성공] id: 89d6810c-5aa4-459d-a864-b825e0842158 +25-04-02 09:18:26.372 [http-nio-8081-exec-8] DEBUG org.hibernate.SQL [ff17c353-5db7-4461-9fe5-49240ecbd83e | GET | /api/channels] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 09:18:26.372 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ff17c353-5db7-4461-9fe5-49240ecbd83e | GET | /api/channels] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 09:18:26.372 [http-nio-8081-exec-8] TRACE org.hibernate.orm.jdbc.bind [ff17c353-5db7-4461-9fe5-49240ecbd83e | GET | /api/channels] - binding parameter (2:UUID) <- [null] +25-04-02 09:18:26.376 [http-nio-8081-exec-1] DEBUG org.hibernate.SQL [39eaed22-c0f0-459a-8112-845d0c448d36 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.378 [http-nio-8081-exec-1] TRACE org.hibernate.orm.jdbc.bind [39eaed22-c0f0-459a-8112-845d0c448d36 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:26.385 [http-nio-8081-exec-7] DEBUG org.hibernate.SQL [70a43ab8-82ed-4bc7-94f6-e6399e081691 | GET | /api/readStatuses] - + /* */ select + rs1_0.id, + rs1_0.channel_id, + rs1_0.created_at, + rs1_0.last_read_at, + rs1_0.updated_at, + rs1_0.user_id + from + read_statuses rs1_0 + where + rs1_0.user_id=? +25-04-02 09:18:26.386 [http-nio-8081-exec-7] TRACE org.hibernate.orm.jdbc.bind [70a43ab8-82ed-4bc7-94f6-e6399e081691 | GET | /api/readStatuses] - binding parameter (1:UUID) <- [89d6810c-5aa4-459d-a864-b825e0842158] +25-04-02 09:18:30.750 [SpringApplicationShutdownHook] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Commencing graceful shutdown. Waiting for active requests to complete +25-04-02 09:18:31.143 [tomcat-shutdown] INFO org.springframework.boot.web.embedded.tomcat.GracefulShutdown [ | | ] - Graceful shutdown complete +25-04-02 09:18:31.154 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 09:18:31.157 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown initiated... +25-04-02 09:18:31.163 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Shutdown completed. +25-04-02 09:59:37.511 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 09:59:37.676 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 19344 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 09:59:37.678 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 09:59:38.826 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 09:59:39.085 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 226 ms. Found 6 JPA repository interfaces. +25-04-02 09:59:39.237 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 09:59:39.674 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:4e671baf-4c8b-4ce2-b13c-c20af0808092;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 09:59:40.773 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 09:59:41.014 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 09:59:41.158 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 09:59:42.253 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 09:59:42.633 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@606ab048'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 09:59:46.622 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 09:59:46.700 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 09:59:46.706 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 09:59:46.708 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 09:59:46.712 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 09:59:46.714 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 09:59:46.716 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 09:59:46.719 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 09:59:46.735 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 09:59:46.746 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 09:59:46.753 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 09:59:46.755 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 09:59:46.760 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 09:59:46.766 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 09:59:46.771 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 09:59:46.781 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 09:59:46.783 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 09:59:46.787 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 09:59:46.792 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 09:59:46.795 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 09:59:46.799 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 09:59:46.804 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 09:59:46.808 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 09:59:46.822 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 09:59:48.095 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 09:59:49.775 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 13.77 seconds (process running for 17.372) +25-04-02 09:59:51.252 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-02 09:59:51.268 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T00:59:50.948267500Z] +25-04-02 09:59:51.283 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-02 09:59:51.283 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-02 09:59:51.283 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-02 09:59:51.284 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T00:59:50.948267500Z] +25-04-02 09:59:51.284 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-02 09:59:51.285 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [f315dece-8492-4553-9fa0-4186efb6183d] +25-04-02 09:59:51.367 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-02 09:59:51.370 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo@email.com] +25-04-02 09:59:51.372 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-04-02 09:59:51.436 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-02 09:59:51.437 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo] +25-04-02 09:59:51.438 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-04-02 09:59:51.700 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:11:45.864 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 10:11:46.013 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 18340 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 10:11:46.015 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 10:11:47.104 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 10:11:47.352 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 213 ms. Found 6 JPA repository interfaces. +25-04-02 10:11:47.496 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 10:11:47.966 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:78e911db-6d4b-4967-99e0-e6aa460a5422;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 10:11:48.921 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 10:11:49.105 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 10:11:49.203 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 10:11:49.950 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 10:11:50.144 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@605ba15f'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 10:11:52.532 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 10:11:52.559 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 10:11:52.565 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 10:11:52.567 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 10:11:52.569 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 10:11:52.571 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 10:11:52.575 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 10:11:52.578 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 10:11:52.595 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 10:11:52.599 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 10:11:52.604 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 10:11:52.607 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 10:11:52.612 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 10:11:52.616 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 10:11:52.621 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 10:11:52.625 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 10:11:52.629 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 10:11:52.633 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 10:11:52.636 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 10:11:52.640 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 10:11:52.645 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 10:11:52.651 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 10:11:52.655 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 10:11:52.669 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:11:53.440 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 10:11:54.618 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 10.188 seconds (process running for 13.369) +25-04-02 10:11:55.834 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-02 10:11:55.847 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T01:11:55.609442200Z] +25-04-02 10:11:55.863 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-02 10:11:55.864 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-02 10:11:55.864 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-02 10:11:55.865 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T01:11:55.609442200Z] +25-04-02 10:11:55.865 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-02 10:11:55.865 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [361ebe51-30f4-471e-b486-5bffcfdd0dd7] +25-04-02 10:11:55.912 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-02 10:11:56.159 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:14:49.595 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 10:14:49.769 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 9592 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 10:14:49.770 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 10:14:50.884 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 10:14:51.130 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 214 ms. Found 6 JPA repository interfaces. +25-04-02 10:14:51.273 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 10:14:51.729 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:e3e1b17b-1ac8-48c4-9b85-2ad02492f5cf;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 10:14:52.615 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 10:14:52.760 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 10:14:52.826 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 10:14:53.549 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 10:14:53.737 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@5c430208'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 10:14:55.826 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 10:14:55.861 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 10:14:55.867 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 10:14:55.869 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 10:14:55.872 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 10:14:55.875 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 10:14:55.877 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 10:14:55.880 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 10:14:55.895 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 10:14:55.899 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 10:14:55.903 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 10:14:55.906 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 10:14:55.910 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 10:14:55.915 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 10:14:55.920 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 10:14:55.924 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 10:14:55.928 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 10:14:55.931 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 10:14:55.936 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 10:14:55.940 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 10:14:55.944 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 10:14:55.949 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 10:14:55.953 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 10:14:55.964 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:14:56.751 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 10:14:57.788 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 9.624 seconds (process running for 12.957) +25-04-02 10:14:58.728 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:15:30.359 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 10:15:30.525 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 11740 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 10:15:30.528 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 10:15:31.553 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 10:15:31.781 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 199 ms. Found 6 JPA repository interfaces. +25-04-02 10:15:31.910 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 10:15:32.377 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:1363f669-a550-4d57-b466-f01a11eedbb5;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 10:15:33.308 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 10:15:33.495 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 10:15:33.580 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 10:15:34.146 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 10:15:34.337 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@7144cd51'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 10:15:36.820 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 10:15:36.868 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 10:15:36.876 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 10:15:36.880 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 10:15:36.883 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 10:15:36.888 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 10:15:36.890 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 10:15:36.894 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 10:15:36.911 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 10:15:36.920 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 10:15:36.925 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 10:15:36.928 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 10:15:36.932 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 10:15:36.937 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 10:15:36.942 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 10:15:36.949 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 10:15:36.952 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 10:15:36.956 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 10:15:36.959 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 10:15:36.965 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 10:15:36.969 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 10:15:36.972 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 10:15:36.975 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 10:15:36.986 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:15:37.810 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 10:15:39.382 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 10.334 seconds (process running for 13.42) +25-04-02 10:15:40.352 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:17:34.763 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 10:17:34.898 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 11640 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 10:17:34.900 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 10:17:35.980 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 10:17:36.197 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 188 ms. Found 6 JPA repository interfaces. +25-04-02 10:17:36.321 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 10:17:36.761 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:12d5ad83-5aaa-430a-87b8-0c1cee79e8d3;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 10:17:37.635 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 10:17:37.783 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 10:17:37.859 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 10:17:38.594 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 10:17:38.778 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@606ab048'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 10:17:40.977 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 10:17:41.019 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 10:17:41.025 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 10:17:41.028 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 10:17:41.030 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 10:17:41.034 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 10:17:41.037 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 10:17:41.040 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 10:17:41.053 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 10:17:41.058 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 10:17:41.063 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 10:17:41.065 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 10:17:41.070 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 10:17:41.072 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 10:17:41.075 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 10:17:41.084 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 10:17:41.086 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 10:17:41.090 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 10:17:41.093 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 10:17:41.096 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 10:17:41.101 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 10:17:41.106 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 10:17:41.109 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 10:17:41.120 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 10:17:41.863 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 10:17:42.891 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 9.513 seconds (process running for 12.684) +25-04-02 10:17:43.874 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 18:36:21.049 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:36:21.301 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - Starting ChannelRepositoryTest using Java 17.0.14 with PID 21404 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:36:21.305 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:36:23.084 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 18:36:23.466 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 343 ms. Found 6 JPA repository interfaces. +25-04-02 18:36:23.696 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 18:36:24.465 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:19087475-b092-4ae9-8422-5c4cbf89864a;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 18:36:26.218 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 18:36:26.542 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 18:36:26.707 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 18:36:28.248 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 18:36:28.862 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@199efc58'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 18:36:35.039 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 18:36:35.130 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 18:36:35.141 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 18:36:35.145 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 18:36:35.148 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 18:36:35.152 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 18:36:35.159 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 18:36:35.166 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 18:36:35.193 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 18:36:35.200 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 18:36:35.208 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 18:36:35.211 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 18:36:35.216 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 18:36:35.222 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 18:36:35.230 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 18:36:35.239 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 18:36:35.243 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 18:36:35.247 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 18:36:35.253 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 18:36:35.260 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 18:36:35.265 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 18:36:35.269 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 18:36:35.275 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 18:36:35.290 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 18:36:37.028 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 18:36:39.470 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - Started ChannelRepositoryTest in 21.117 seconds (process running for 25.232) +25-04-02 18:36:41.601 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-04-02 18:36:41.630 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T09:36:41.129714700Z] +25-04-02 18:36:41.663 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [전체 공지] +25-04-02 18:36:41.665 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [공지사항] +25-04-02 18:36:41.667 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-04-02 18:36:41.668 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T09:36:41.129714700Z] +25-04-02 18:36:41.669 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [a35bd44a-5c70-4398-bf71-dce51f5ece0c] +25-04-02 18:36:41.734 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-04-02 18:36:41.737 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T09:36:41.228554300Z] +25-04-02 18:36:41.739 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [잡담방] +25-04-02 18:36:41.741 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [자유채팅] +25-04-02 18:36:41.743 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-04-02 18:36:41.744 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T09:36:41.228554300Z] +25-04-02 18:36:41.747 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [b1289e28-57fb-461d-894b-b6805c94ad7e] +25-04-02 18:36:41.752 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-04-02 18:36:41.755 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T09:36:41.229552900Z] +25-04-02 18:36:41.757 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [null] +25-04-02 18:36:41.759 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [null] +25-04-02 18:36:41.761 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PRIVATE] +25-04-02 18:36:41.763 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T09:36:41.229552900Z] +25-04-02 18:36:41.767 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [a3c03c83-1db0-4f51-ba8c-d0c4c133ae92] +25-04-02 18:36:41.828 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-02 18:36:41.833 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-02 18:36:41.833 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [a3c03c83-1db0-4f51-ba8c-d0c4c133ae92] +25-04-02 18:36:42.391 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 18:40:37.040 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:40:37.117 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Starting DiscodeitApplication using Java 17.0.14 with PID 18308 (C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:40:37.118 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:40:39.145 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 18:40:39.523 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 337 ms. Found 6 JPA repository interfaces. +25-04-02 18:40:42.882 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat initialized with port 8081 (http) +25-04-02 18:40:42.938 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Initializing ProtocolHandler ["http-nio-8081"] +25-04-02 18:40:42.955 [main] INFO org.apache.catalina.core.StandardService [ | | ] - Starting service [Tomcat] +25-04-02 18:40:42.957 [main] INFO org.apache.catalina.core.StandardEngine [ | | ] - Starting Servlet engine: [Apache Tomcat/10.1.33] +25-04-02 18:40:43.269 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring embedded WebApplicationContext +25-04-02 18:40:43.270 [main] INFO org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext [ | | ] - Root WebApplicationContext: initialization completed in 6093 ms +25-04-02 18:40:43.750 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Starting... +25-04-02 18:40:44.367 [main] INFO com.zaxxer.hikari.pool.HikariPool [ | | ] - HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:testdb user=SA +25-04-02 18:40:44.371 [main] INFO com.zaxxer.hikari.HikariDataSource [ | | ] - HikariPool-1 - Start completed. +25-04-02 18:40:44.401 [main] INFO org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration [ | | ] - H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +25-04-02 18:40:45.216 [main] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 18:40:45.397 [main] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 18:40:45.562 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 18:40:46.740 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 18:40:47.012 [main] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 18:40:50.771 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 18:40:50.824 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 18:40:50.829 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 18:40:50.831 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 18:40:50.832 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 18:40:50.834 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 18:40:50.837 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 18:40:50.839 [main] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 18:40:50.852 [main] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 18:40:50.855 [main] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 18:40:50.860 [main] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 18:40:50.864 [main] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 18:40:50.869 [main] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 18:40:50.878 [main] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 18:40:50.881 [main] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 18:40:50.884 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 18:40:50.887 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 18:40:50.890 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 18:40:50.894 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 18:40:50.896 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 18:40:50.898 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 18:40:50.901 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 18:40:50.904 [main] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 18:40:50.916 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 18:40:51.930 [main] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 18:40:54.143 [main] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-02 18:40:57.429 [main] INFO org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver [ | | ] - Exposing 4 endpoints beneath base path '/actuator' +25-04-02 18:40:57.605 [main] INFO org.apache.coyote.http11.Http11NioProtocol [ | | ] - Starting ProtocolHandler ["http-nio-8081"] +25-04-02 18:40:57.631 [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer [ | | ] - Tomcat started on port 8081 (http) with context path '/' +25-04-02 18:40:57.667 [main] INFO com.sprint.mission.discodeit.DiscodeitApplication [ | | ] - Started DiscodeitApplication in 21.269 seconds (process running for 22.035) +25-04-02 18:40:58.052 [RMI TCP Connection(2)-10.3.23.18] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] [ | | ] - Initializing Spring DispatcherServlet 'dispatcherServlet' +25-04-02 18:40:58.052 [RMI TCP Connection(2)-10.3.23.18] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Initializing Servlet 'dispatcherServlet' +25-04-02 18:40:58.056 [RMI TCP Connection(2)-10.3.23.18] INFO org.springframework.web.servlet.DispatcherServlet [ | | ] - Completed initialization in 4 ms +25-04-02 18:40:59.010 [registrationTask1] INFO de.codecentric.boot.admin.client.registration.ApplicationRegistrator [ | | ] - Application registered itself as 742551e7777b +25-04-02 18:44:24.155 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:44:24.409 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 10400 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:44:24.413 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:44:26.056 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-02 18:44:26.443 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 351 ms. Found 6 JPA repository interfaces. +25-04-02 18:44:26.657 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-02 18:44:27.372 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:f5f80957-5985-410f-9eff-0b51d940ed85;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-02 18:44:29.699 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-02 18:44:30.123 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-02 18:44:30.421 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-02 18:44:32.313 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-02 18:44:32.917 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@5d16f27b'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-02 18:44:39.323 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-02 18:44:39.409 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-02 18:44:39.424 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-02 18:44:39.430 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-02 18:44:39.433 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-02 18:44:39.437 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-02 18:44:39.440 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-02 18:44:39.444 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-02 18:44:39.469 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-02 18:44:39.480 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-02 18:44:39.489 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-02 18:44:39.495 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-02 18:44:39.500 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-02 18:44:39.507 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-02 18:44:39.514 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-02 18:44:39.521 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-02 18:44:39.526 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-02 18:44:39.535 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-02 18:44:39.544 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-02 18:44:39.554 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-02 18:44:39.562 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-02 18:44:39.567 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-02 18:44:39.574 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-02 18:44:39.590 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-02 18:44:41.005 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-02 18:44:43.747 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 21.886 seconds (process running for 25.455) +25-04-02 18:44:45.621 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-02 18:44:45.670 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T09:44:45.226778600Z] +25-04-02 18:44:45.696 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-02 18:44:45.697 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-02 18:44:45.699 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-02 18:44:45.701 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T09:44:45.226778600Z] +25-04-02 18:44:45.702 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-02 18:44:45.703 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [0940577c-6f6d-4259-9838-53434d426150] +25-04-02 18:44:45.811 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-02 18:44:45.814 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo@email.com] +25-04-02 18:44:45.815 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-04-02 18:44:45.917 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-02 18:44:45.924 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo] +25-04-02 18:44:45.925 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-04-02 18:44:46.419 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-02 18:44:46.424 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-02T09:44:46.388145700Z] +25-04-02 18:44:46.426 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [rex@naver.com] +25-04-02 18:44:46.427 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [Rlawnsdn12!] +25-04-02 18:44:46.429 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-02 18:44:46.430 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-02T09:44:46.388145700Z] +25-04-02 18:44:46.432 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [rex] +25-04-02 18:44:46.433 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [b6bd1f56-1594-48ec-a990-1e1429b75e21] +25-04-02 18:44:46.442 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + where + u1_0.username=? +25-04-02 18:44:46.444 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [rex] +25-04-02 18:44:46.579 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-02 18:45:59.023 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:45:59.298 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - Starting UserControllerTest using Java 17.0.14 with PID 21424 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:45:59.301 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:46:07.146 [Test worker] WARN org.springframework.web.context.support.GenericWebApplicationContext [ | | ] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main\com\sprint\mission\discodeit\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserStatusService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} +25-04-02 18:46:07.234 [Test worker] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger [ | | ] - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-04-02 18:46:07.426 [Test worker] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter [ | | ] - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Parameter 1 of constructor in com.sprint.mission.discodeit.controller.UserController required a bean of type 'com.sprint.mission.discodeit.service.UserStatusService' that could not be found. + + +Action: + +Consider defining a bean of type 'com.sprint.mission.discodeit.service.UserStatusService' in your configuration. + +25-04-02 18:46:07.445 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@711cd6f9] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@26c9225a testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6ada9c0c, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@7b4a0aef, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@72a2e851, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@73d60e76, [ImportsContextCustomizer@10ba757f key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@43fda8d9, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6a87026, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@370c1968, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@61ef8b0d, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@babd8fcf], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main\com\sprint\mission\discodeit\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserStatusService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1371) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1208) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserStatusService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:2139) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1589) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1514) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 115 common frames omitted +25-04-02 18:46:07.544 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@7b5f886d] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@26c9225a testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6ada9c0c, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@7b4a0aef, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@72a2e851, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@73d60e76, [ImportsContextCustomizer@10ba757f key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@43fda8d9, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6a87026, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@370c1968, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@61ef8b0d, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@babd8fcf], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-04-02 18:46:07.554 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@9504a58] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@26c9225a testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6ada9c0c, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@7b4a0aef, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@72a2e851, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@73d60e76, [ImportsContextCustomizer@10ba757f key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@43fda8d9, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6a87026, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@370c1968, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@61ef8b0d, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@babd8fcf], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-04-02 18:46:07.564 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@badf24b] +java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@26c9225a testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@6ada9c0c, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@7b4a0aef, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@72a2e851, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@73d60e76, [ImportsContextCustomizer@10ba757f key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@43fda8d9, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6a87026, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@370c1968, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@61ef8b0d, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@babd8fcf], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:145) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +25-04-02 18:46:35.186 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:46:35.408 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - Starting UserControllerTest using Java 17.0.14 with PID 17668 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:46:35.410 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:46:41.606 [Test worker] WARN org.springframework.web.context.support.GenericWebApplicationContext [ | | ] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main\com\sprint\mission\discodeit\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserStatusService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} +25-04-02 18:46:41.692 [Test worker] INFO org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLogger [ | | ] - + +Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. +25-04-02 18:46:41.865 [Test worker] ERROR org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter [ | | ] - + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Parameter 1 of constructor in com.sprint.mission.discodeit.controller.UserController required a bean of type 'com.sprint.mission.discodeit.service.UserStatusService' that could not be found. + + +Action: + +Consider defining a bean of type 'com.sprint.mission.discodeit.service.UserStatusService' in your configuration. + +25-04-02 18:46:41.888 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while allowing TestExecutionListener [org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener] to prepare test instance [com.sprint.mission.discodeit.controller.UserControllerTest@22bf2a0d] +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@7cc742d testClass = com.sprint.mission.discodeit.controller.UserControllerTest, locations = [], classes = [com.sprint.mission.discodeit.DiscodeitApplication], contextInitializerClasses = [], activeProfiles = ["dev"], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@340a8894, org.springframework.boot.test.autoconfigure.OverrideAutoConfigurationContextCustomizerFactory$DisableAutoConfigurationContextCustomizer@10c72a6f, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.filter.TypeExcludeFiltersContextCustomizer@61bddf31, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@2acab77, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@44ed0a8f, [ImportsContextCustomizer@734db023 key = [org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration, org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration, org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration, org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration, org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration, org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration, org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration, org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration, org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration, org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration, org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@79b2852b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@5cc9d3d0, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@43e065f2, org.springframework.test.context.bean.override.BeanOverrideContextCustomizer@c7f37626, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@7647c69e], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.injectFields(BeanOverrideTestExecutionListener.java:87) + at org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener.prepareTestInstance(BeanOverrideTestExecutionListener.java:58) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in file [C:\Users\junwo\IdeaProjects\1-sprint-mission\build\classes\java\main\com\sprint\mission\discodeit\controller\UserController.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserStatusService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1371) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1208) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:336) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:288) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1122) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1093) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1030) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 89 common frames omitted +Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sprint.mission.discodeit.service.UserStatusService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} + at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:2139) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1589) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1514) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 115 common frames omitted +25-04-02 18:47:51.313 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:47:51.524 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - Starting UserControllerTest using Java 17.0.14 with PID 16348 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:47:51.528 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:47:57.799 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-02 18:47:59.250 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext [ | | ] - Initializing Spring TestDispatcherServlet '' +25-04-02 18:47:59.252 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Initializing Servlet '' +25-04-02 18:47:59.256 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Completed initialization in 3 ms +25-04-02 18:47:59.372 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - Started UserControllerTest in 10.008 seconds (process running for 13.804) +25-04-02 18:48:13.193 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-02 18:48:13.428 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - Starting UserControllerTest using Java 17.0.14 with PID 17464 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-02 18:48:13.430 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - The following 1 profile is active: "dev" +25-04-02 18:48:19.968 [Test worker] INFO org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping [ | | ] - Adding welcome page: class path resource [static/index.html] +25-04-02 18:48:21.435 [Test worker] INFO org.springframework.boot.test.mock.web.SpringBootMockServletContext [ | | ] - Initializing Spring TestDispatcherServlet '' +25-04-02 18:48:21.436 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Initializing Servlet '' +25-04-02 18:48:21.441 [Test worker] INFO org.springframework.test.web.servlet.TestDispatcherServlet [ | | ] - Completed initialization in 3 ms +25-04-02 18:48:21.562 [Test worker] INFO com.sprint.mission.discodeit.controller.UserControllerTest [ | | ] - Started UserControllerTest in 10.77 seconds (process running for 14.804) diff --git a/.logs/logfile-2025-04-05.log b/.logs/logfile-2025-04-05.log new file mode 100644 index 000000000..f88cde47d --- /dev/null +++ b/.logs/logfile-2025-04-05.log @@ -0,0 +1,4644 @@ +25-04-05 15:23:45.526 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:23:46.010 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 30472 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:23:46.017 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:23:49.125 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:23:49.916 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 714 ms. Found 6 JPA repository interfaces. +25-04-05 15:23:50.373 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:23:51.718 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:becba3fe-8aa1-47fb-8841-01cba05ffb1a;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:23:54.981 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:23:55.680 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:23:56.047 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:23:58.933 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:23:59.833 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@14bc9fe3'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:24:08.734 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:24:08.851 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:24:08.864 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:24:08.868 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:24:08.872 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:24:08.874 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:24:08.880 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:24:08.883 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:24:08.932 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:24:08.945 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:24:08.951 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:24:08.957 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:24:08.962 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:24:08.967 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:24:08.972 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:24:08.978 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:24:08.981 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:24:08.986 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:24:08.991 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:24:08.995 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:24:09.001 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:24:09.005 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:24:09.009 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:24:09.027 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:24:11.558 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:24:15.235 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 33.921 seconds (process running for 38.343) +25-04-05 15:24:18.462 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:31:05.288 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:31:05.686 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 31264 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:31:05.688 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:31:08.015 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:31:08.755 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 678 ms. Found 6 JPA repository interfaces. +25-04-05 15:31:09.184 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:31:10.429 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:bb38095d-e036-4a92-8ee9-676fb2352822;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:31:13.668 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:31:14.257 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:31:14.617 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:31:17.301 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:31:18.084 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@b027acf'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:31:27.188 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:31:27.340 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:31:27.355 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:31:27.364 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:31:27.370 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:31:27.375 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:31:27.381 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:31:27.388 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:31:27.430 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:31:27.451 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:31:27.465 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:31:27.474 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:31:27.485 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:31:27.493 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:31:27.498 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:31:27.504 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:31:27.509 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:31:27.512 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:31:27.516 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:31:27.520 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:31:27.525 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:31:27.529 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:31:27.533 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:31:27.553 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:31:29.783 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:31:33.086 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 31.564 seconds (process running for 34.935) +25-04-05 15:31:35.708 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:31:35.748 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:31:35.367402600Z] +25-04-05 15:31:35.781 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-05 15:31:35.782 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-05 15:31:35.784 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:31:35.785 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:31:35.367402600Z] +25-04-05 15:31:35.786 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-05 15:31:35.788 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [dbc08575-ff3e-4f5b-ba51-2e81379cba0c] +25-04-05 15:31:35.855 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:31:35.856 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:31:35.542204600Z] +25-04-05 15:31:35.857 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:31:35.146947600Z] +25-04-05 15:31:35.858 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:31:35.542204600Z] +25-04-05 15:31:35.859 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [dbc08575-ff3e-4f5b-ba51-2e81379cba0c] +25-04-05 15:31:35.859 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [75b25cc8-ba5e-4122-a5e6-412587f51965] +25-04-05 15:31:36.442 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:34:04.088 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:34:04.542 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 4824 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:34:04.547 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:34:07.101 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:34:07.833 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 667 ms. Found 6 JPA repository interfaces. +25-04-05 15:34:08.262 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:34:09.488 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:89148a36-2d61-4cd7-8c23-bef7930d2524;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:34:12.700 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:34:13.273 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:34:13.627 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:34:16.466 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:34:17.331 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@401516ad'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:34:26.475 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:34:26.638 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:34:26.647 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:34:26.653 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:34:26.657 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:34:26.662 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:34:26.668 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:34:26.672 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:34:26.705 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:34:26.718 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:34:26.730 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:34:26.736 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:34:26.746 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:34:26.756 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:34:26.763 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:34:26.770 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:34:26.776 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:34:26.780 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:34:26.786 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:34:26.793 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:34:26.797 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:34:26.805 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:34:26.809 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:34:26.834 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:34:28.566 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:34:30.842 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 30.792 seconds (process running for 34.601) +25-04-05 15:34:32.939 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:34:32.972 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:34:32.660982700Z] +25-04-05 15:34:33.010 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-05 15:34:33.012 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-05 15:34:33.013 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:34:33.013 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:34:32.660982700Z] +25-04-05 15:34:33.014 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-05 15:34:33.014 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [ab4aff70-d18d-4922-a687-3917a065ce64] +25-04-05 15:34:33.113 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:34:33.122 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:34:32.828045400Z] +25-04-05 15:34:33.124 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:34:32.815244300Z] +25-04-05 15:34:33.127 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:34:32.828045400Z] +25-04-05 15:34:33.128 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [ab4aff70-d18d-4922-a687-3917a065ce64] +25-04-05 15:34:33.132 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [1b726906-4656-4d79-aff8-a170321c93ed] +25-04-05 15:34:33.374 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-05 15:34:33.391 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [ab4aff70-d18d-4922-a687-3917a065ce64] +25-04-05 15:34:34.028 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:35:50.689 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:35:51.118 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 22184 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:35:51.122 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:35:53.615 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:35:54.308 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 621 ms. Found 6 JPA repository interfaces. +25-04-05 15:35:54.652 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:35:55.842 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:11f22d62-7b21-492e-944a-30383990fd46;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:35:58.577 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:35:59.092 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:35:59.424 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:36:01.576 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:36:02.194 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@34902fe6'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:36:10.983 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:36:11.148 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:36:11.166 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:36:11.173 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:36:11.179 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:36:11.186 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:36:11.193 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:36:11.198 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:36:11.240 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:36:11.256 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:36:11.267 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:36:11.273 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:36:11.282 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:36:11.293 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:36:11.303 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:36:11.319 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:36:11.326 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:36:11.335 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:36:11.341 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:36:11.348 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:36:11.357 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:36:11.363 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:36:11.372 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:36:11.399 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:36:13.816 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:36:17.323 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 30.278 seconds (process running for 33.99) +25-04-05 15:36:19.990 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:36:20.033 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:36:19.667066100Z] +25-04-05 15:36:20.069 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-05 15:36:20.071 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-05 15:36:20.072 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:36:20.073 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:36:19.667066100Z] +25-04-05 15:36:20.074 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-05 15:36:20.075 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [d4d18fcd-2d4d-41b6-8e3f-3a0bd0bde625] +25-04-05 15:36:20.169 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:36:20.173 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:36:19.855411900Z] +25-04-05 15:36:20.175 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:36:19.839064400Z] +25-04-05 15:36:20.175 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:36:19.855411900Z] +25-04-05 15:36:20.175 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [d4d18fcd-2d4d-41b6-8e3f-3a0bd0bde625] +25-04-05 15:36:20.175 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [bf4deb4e-ecd3-49a1-8209-b61d1f6fb454] +25-04-05 15:36:20.361 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 + where + us1_0.id=? +25-04-05 15:36:20.372 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [bf4deb4e-ecd3-49a1-8209-b61d1f6fb454] +25-04-05 15:36:21.147 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:40:12.335 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:40:12.852 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 11160 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:40:12.858 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:40:15.384 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:40:16.172 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 707 ms. Found 6 JPA repository interfaces. +25-04-05 15:40:16.582 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:40:17.824 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:9adc69ef-4119-459c-be32-82bdc5b12860;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:40:20.973 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:40:21.614 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:40:21.971 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:40:24.989 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:40:25.821 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@41a98737'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:40:35.269 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:40:35.443 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:40:35.463 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:40:35.472 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:40:35.479 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:40:35.486 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:40:35.496 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:40:35.506 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:40:35.549 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:40:35.561 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:40:35.573 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:40:35.579 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:40:35.589 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:40:35.596 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:40:35.604 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:40:35.616 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:40:35.622 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:40:35.632 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:40:35.641 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:40:35.650 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:40:35.658 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:40:35.667 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:40:35.674 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:40:35.695 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:40:38.048 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:40:41.610 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 31.957 seconds (process running for 36.324) +25-04-05 15:40:44.178 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:40:44.215 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [.jpeg] +25-04-05 15:40:44.217 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:40:43.972985400Z] +25-04-05 15:40:44.247 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [userProfile] +25-04-05 15:40:44.247 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:BIGINT) <- [10] +25-04-05 15:40:44.248 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [74622d7b-898f-4c00-9882-8bf3145ec8e4] +25-04-05 15:40:44.328 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:40:44.331 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:40:43.848913800Z] +25-04-05 15:40:44.332 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:40:44.333 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:40:44.335 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [74622d7b-898f-4c00-9882-8bf3145ec8e4] +25-04-05 15:40:44.336 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:40:43.848913800Z] +25-04-05 15:40:44.336 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:40:44.337 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [23a72432-2cbb-4f08-9ea4-96613a3fd7f5] +25-04-05 15:40:44.539 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + bc1_0.id, + bc1_0.content_type, + bc1_0.created_at, + bc1_0.file_name, + bc1_0.size + from + binary_contents bc1_0 + where + bc1_0.id=? +25-04-05 15:40:44.547 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [74622d7b-898f-4c00-9882-8bf3145ec8e4] +25-04-05 15:40:45.320 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:42:09.034 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:42:09.400 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 22172 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:42:09.405 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:42:11.696 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:42:12.357 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 614 ms. Found 6 JPA repository interfaces. +25-04-05 15:42:12.756 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:42:13.972 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:45837d32-5636-4be3-a3a7-3b7b1ed76dd7;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:42:17.080 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:42:17.597 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:42:17.905 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:42:20.662 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:42:21.546 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@73eed7b0'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:42:30.496 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:42:30.653 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:42:30.669 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:42:30.675 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:42:30.682 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:42:30.689 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:42:30.696 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:42:30.702 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:42:30.742 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:42:30.760 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:42:30.771 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:42:30.779 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:42:30.801 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:42:30.809 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:42:30.817 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:42:30.824 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:42:30.829 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:42:30.834 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:42:30.841 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:42:30.849 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:42:30.853 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:42:30.857 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:42:30.860 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:42:30.883 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:42:33.025 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:42:36.032 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 30.745 seconds (process running for 35.376) +25-04-05 15:42:39.193 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:48:38.045 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:48:38.501 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 20564 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:48:38.503 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:48:41.059 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:48:41.773 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 645 ms. Found 6 JPA repository interfaces. +25-04-05 15:48:42.197 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:48:43.440 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:b02c67ec-cbc0-4969-a443-b8508c68f30f;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:48:46.555 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:48:47.142 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:48:47.466 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:48:50.290 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:48:51.131 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@3026d4cd'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:49:00.425 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:49:00.579 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:49:00.598 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:49:00.606 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:49:00.608 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:49:00.614 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:49:00.621 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:49:00.627 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:49:00.672 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:49:00.689 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:49:00.701 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:49:00.708 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:49:00.717 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:49:00.727 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:49:00.736 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:49:00.748 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:49:00.755 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:49:00.763 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:49:00.771 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:49:00.780 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:49:00.787 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:49:00.796 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:49:00.803 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:49:00.829 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:49:03.129 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:49:06.598 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 32.174 seconds (process running for 35.741) +25-04-05 15:49:09.081 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:49:09.110 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [.jpeg] +25-04-05 15:49:09.111 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:49:08.867860400Z] +25-04-05 15:49:09.138 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [userProfile] +25-04-05 15:49:09.139 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:BIGINT) <- [10] +25-04-05 15:49:09.141 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [2e451293-2168-454f-865f-48518c160e01] +25-04-05 15:49:09.210 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:49:09.215 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:49:08.765076500Z] +25-04-05 15:49:09.216 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:49:09.218 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:49:09.219 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [2e451293-2168-454f-865f-48518c160e01] +25-04-05 15:49:09.221 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:49:08.765076500Z] +25-04-05 15:49:09.222 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:49:09.223 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [57d5fc42-6e53-4a42-a50c-558513db7d5d] +25-04-05 15:49:09.229 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:49:09.232 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:49:08.954476200Z] +25-04-05 15:49:09.234 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:49:08.939366800Z] +25-04-05 15:49:09.237 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:49:08.954476200Z] +25-04-05 15:49:09.238 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [57d5fc42-6e53-4a42-a50c-558513db7d5d] +25-04-05 15:49:09.239 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [06492695-d5a8-4a95-9a2f-d92f7b3530ac] +25-04-05 15:49:09.637 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-05 15:49:10.399 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:49:53.367 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:49:53.798 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 22868 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:49:53.804 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:49:56.076 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:49:56.721 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 602 ms. Found 6 JPA repository interfaces. +25-04-05 15:49:57.127 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:49:58.295 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:2fbf0935-1fca-4a7c-bd50-3ada70d6e359;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:50:01.267 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:50:01.847 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:50:02.218 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:50:05.052 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:50:05.837 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@23b05e58'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:50:14.868 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:50:15.039 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:50:15.061 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:50:15.069 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:50:15.075 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:50:15.079 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:50:15.085 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:50:15.090 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:50:15.127 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:50:15.147 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:50:15.158 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:50:15.166 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:50:15.174 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:50:15.188 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:50:15.199 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:50:15.212 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:50:15.219 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:50:15.226 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:50:15.234 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:50:15.243 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:50:15.256 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:50:15.266 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:50:15.275 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:50:15.301 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:50:17.916 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:50:21.182 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 31.517 seconds (process running for 34.865) +25-04-05 15:50:23.869 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:50:23.904 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [.jpeg] +25-04-05 15:50:23.907 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:50:23.652303800Z] +25-04-05 15:50:23.942 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [userProfile] +25-04-05 15:50:23.944 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:BIGINT) <- [10] +25-04-05 15:50:23.945 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [74c700f0-dab9-444c-9041-2cb19a456ecd] +25-04-05 15:50:24.010 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:50:24.013 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:50:23.539164200Z] +25-04-05 15:50:24.015 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:50:24.016 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:50:24.017 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [74c700f0-dab9-444c-9041-2cb19a456ecd] +25-04-05 15:50:24.020 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:50:23.539164200Z] +25-04-05 15:50:24.022 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:50:24.024 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [2b76fc36-bf23-4a78-8e35-11ee5878b0f0] +25-04-05 15:50:24.028 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:50:24.031 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:50:23.740442500Z] +25-04-05 15:50:24.032 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:50:23.724994700Z] +25-04-05 15:50:24.034 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:50:23.740442500Z] +25-04-05 15:50:24.035 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [2b76fc36-bf23-4a78-8e35-11ee5878b0f0] +25-04-05 15:50:24.036 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [aaab693b-cacc-4cd4-8dfa-be6842082c52] +25-04-05 15:50:24.462 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-05 15:50:25.314 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:55:16.340 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:55:16.838 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 29852 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:55:16.843 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:55:19.642 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:55:20.438 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 720 ms. Found 6 JPA repository interfaces. +25-04-05 15:55:20.808 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:55:22.047 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:67176f88-d49a-42d8-bd68-1b59a84684a2;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:55:24.985 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:55:25.540 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:55:25.738 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:55:28.323 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:55:29.160 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@2e15ad9b'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:55:37.662 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:55:37.782 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:55:37.800 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:55:37.805 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:55:37.808 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:55:37.813 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:55:37.817 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:55:37.822 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:55:37.867 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:55:37.881 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:55:37.895 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:55:37.902 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:55:37.913 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:55:37.923 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:55:37.931 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:55:37.942 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:55:37.949 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:55:37.958 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:55:37.968 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:55:37.977 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:55:37.986 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:55:37.994 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:55:38.003 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:55:38.030 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:55:40.442 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:55:43.913 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 31.176 seconds (process running for 35.388) +25-04-05 15:55:46.435 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:55:46.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:55:46.103096Z] +25-04-05 15:55:46.510 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:55:46.511 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:55:46.513 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:55:46.513 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:55:46.103096Z] +25-04-05 15:55:46.513 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:55:46.514 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [ab3470a2-50a7-4b5b-bee5-d946d30c1386] +25-04-05 15:55:46.605 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:55:46.609 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:55:46.292052300Z] +25-04-05 15:55:46.610 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:55:46.273Z] +25-04-05 15:55:46.612 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:55:46.292052300Z] +25-04-05 15:55:46.613 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [ab3470a2-50a7-4b5b-bee5-d946d30c1386] +25-04-05 15:55:46.615 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [8da99eb6-de5a-4d18-b336-4d1ea17a3acd] +25-04-05 15:55:46.795 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-05 15:55:46.813 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [ab3470a2-50a7-4b5b-bee5-d946d30c1386] +25-04-05 15:55:47.386 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.UserStatus */delete + from + user_statuses + where + id=? +25-04-05 15:55:47.390 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [8da99eb6-de5a-4d18-b336-4d1ea17a3acd] +25-04-05 15:55:47.405 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.User */delete + from + users + where + id=? +25-04-05 15:55:47.408 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [ab3470a2-50a7-4b5b-bee5-d946d30c1386] +25-04-05 15:55:47.421 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 +25-04-05 15:55:48.167 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:56:57.989 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:56:58.366 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 31608 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:56:58.369 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:57:00.603 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:57:01.215 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 567 ms. Found 6 JPA repository interfaces. +25-04-05 15:57:01.586 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:57:02.736 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:89794f02-df52-46b4-9488-b8487a282849;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:57:05.851 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:57:06.334 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:57:06.638 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:57:09.197 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:57:09.995 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@26c8b723'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:57:18.523 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:57:18.686 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:57:18.704 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:57:18.711 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:57:18.717 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:57:18.722 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:57:18.730 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:57:18.737 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:57:18.781 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:57:18.801 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:57:18.813 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:57:18.822 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:57:18.835 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:57:18.845 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:57:18.856 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:57:18.865 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:57:18.871 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:57:18.876 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:57:18.881 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:57:18.886 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:57:18.889 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:57:18.895 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:57:18.898 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:57:18.916 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:57:20.567 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:57:24.056 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 29.488 seconds (process running for 32.77) +25-04-05 15:57:26.621 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:57:26.659 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:57:26.307067Z] +25-04-05 15:57:26.695 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:57:26.696 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:57:26.697 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:57:26.697 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:57:26.307067Z] +25-04-05 15:57:26.698 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:57:26.699 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [61cee58a-54a8-4f35-adbf-a9b185f7ae90] +25-04-05 15:57:26.796 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:57:26.800 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:57:26.483134400Z] +25-04-05 15:57:26.803 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:57:26.466011100Z] +25-04-05 15:57:26.804 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:57:26.483134400Z] +25-04-05 15:57:26.806 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [61cee58a-54a8-4f35-adbf-a9b185f7ae90] +25-04-05 15:57:26.808 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [8c996c6a-0fcb-497d-bc23-4d01b774e0b1] +25-04-05 15:57:27.024 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-05 15:57:27.036 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [61cee58a-54a8-4f35-adbf-a9b185f7ae90] +25-04-05 15:57:27.667 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.UserStatus */delete + from + user_statuses + where + id=? +25-04-05 15:57:27.670 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [8c996c6a-0fcb-497d-bc23-4d01b774e0b1] +25-04-05 15:57:27.680 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.User */delete + from + users + where + id=? +25-04-05 15:57:27.686 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [61cee58a-54a8-4f35-adbf-a9b185f7ae90] +25-04-05 15:57:27.691 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 +25-04-05 15:57:28.261 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:58:26.690 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:58:27.080 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 24676 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:58:27.082 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:58:29.603 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:58:30.309 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 640 ms. Found 6 JPA repository interfaces. +25-04-05 15:58:30.719 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:58:32.003 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:93252d8b-1c35-48bc-9e2a-8a533e91f844;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:58:34.805 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:58:35.344 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:58:35.716 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:58:38.353 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:58:39.198 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@21e67d8d'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:59:06.655 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 15:59:07.087 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Starting UserRepositoryTest using Java 17.0.14 with PID 18292 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 15:59:07.092 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 15:59:09.554 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 15:59:10.346 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 716 ms. Found 6 JPA repository interfaces. +25-04-05 15:59:10.697 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 15:59:11.862 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:04e95989-4d3a-4a1b-b9e7-4d030c766c52;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 15:59:14.935 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 15:59:15.539 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 15:59:15.883 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 15:59:18.582 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 15:59:19.473 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@688c1b2a'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 15:59:28.622 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 15:59:28.738 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 15:59:28.751 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 15:59:28.757 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 15:59:28.761 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 15:59:28.768 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 15:59:28.773 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 15:59:28.777 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 15:59:28.815 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 15:59:28.829 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 15:59:28.842 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 15:59:28.848 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 15:59:28.858 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 15:59:28.867 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 15:59:28.876 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 15:59:28.888 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 15:59:28.895 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 15:59:28.903 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 15:59:28.910 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 15:59:28.917 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 15:59:28.925 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 15:59:28.933 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 15:59:28.939 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 15:59:28.965 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 15:59:31.535 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 15:59:35.088 [Test worker] INFO com.sprint.mission.discodeit.repository.UserRepositoryTest [ | | ] - Started UserRepositoryTest in 32.181 seconds (process running for 35.311) +25-04-05 15:59:37.675 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.BinaryContent */insert + into + binary_contents (content_type, created_at, file_name, size, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:59:37.711 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [.jpeg] +25-04-05 15:59:37.712 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:59:37.438424700Z] +25-04-05 15:59:37.748 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [userProfile] +25-04-05 15:59:37.748 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:BIGINT) <- [10] +25-04-05 15:59:37.751 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [b694fc35-b828-4191-bbcc-dbea39b9d2a0] +25-04-05 15:59:37.838 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:59:37.843 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:37.315021600Z] +25-04-05 15:59:37.844 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:59:37.845 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:59:37.847 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [b694fc35-b828-4191-bbcc-dbea39b9d2a0] +25-04-05 15:59:37.850 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:59:37.315021600Z] +25-04-05 15:59:37.852 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:59:37.853 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [c4cdaca7-7306-45a5-aa2b-d9785a46f076] +25-04-05 15:59:37.857 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:59:37.860 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:37.536333800Z] +25-04-05 15:59:37.861 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:59:37.520979200Z] +25-04-05 15:59:37.862 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:59:37.536333800Z] +25-04-05 15:59:37.864 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [c4cdaca7-7306-45a5-aa2b-d9785a46f076] +25-04-05 15:59:37.866 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [e10e7c42-ac14-4ed1-a37d-18e81cf00404] +25-04-05 15:59:38.297 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + u + FROM + User u + LEFT JOIN + + FETCH + u.profile + JOIN + + FETCH + u.status */ select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + binary_contents p1_0 + on p1_0.id=u1_0.profile_id + join + user_statuses s1_0 + on u1_0.id=s1_0.user_id +25-04-05 15:59:39.120 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:59:39.124 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:38.999782600Z] +25-04-05 15:59:39.127 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-05 15:59:39.128 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-05 15:59:39.129 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:59:39.130 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:59:38.999782600Z] +25-04-05 15:59:39.130 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-05 15:59:39.131 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [de238411-fb5c-4fd9-a4dc-3b333b344fcd] +25-04-05 15:59:39.138 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.username=? + fetch + first ? rows only +25-04-05 15:59:39.142 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo] +25-04-05 15:59:39.142 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-04-05 15:59:39.182 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:59:39.186 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.175435200Z] +25-04-05 15:59:39.188 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [junwo@email.com] +25-04-05 15:59:39.189 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [password123!] +25-04-05 15:59:39.190 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:59:39.191 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.175435200Z] +25-04-05 15:59:39.192 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [junwo] +25-04-05 15:59:39.193 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [7b924aed-d3ba-47bc-a27f-5a2230811dbc] +25-04-05 15:59:39.198 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + u1_0.id + from + users u1_0 + where + u1_0.email=? + fetch + first ? rows only +25-04-05 15:59:39.201 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:VARCHAR) <- [junwo@email.com] +25-04-05 15:59:39.202 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:INTEGER) <- [1] +25-04-05 15:59:39.225 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:59:39.228 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.223194700Z] +25-04-05 15:59:39.228 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:59:39.229 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:59:39.229 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:59:39.229 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.223194700Z] +25-04-05 15:59:39.230 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:59:39.230 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [6c8e4ed4-6884-4a6b-a3b4-e42db33c40f2] +25-04-05 15:59:39.279 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-05 15:59:39.284 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [6c8e4ed4-6884-4a6b-a3b4-e42db33c40f2] +25-04-05 15:59:39.329 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.User */insert + into + users (created_at, email, password, profile_id, updated_at, username, id) + values + (?, ?, ?, ?, ?, ?, ?) +25-04-05 15:59:39.331 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.324707500Z] +25-04-05 15:59:39.332 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [test@naver.com] +25-04-05 15:59:39.333 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [testPassword12!] +25-04-05 15:59:39.336 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [null] +25-04-05 15:59:39.337 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.324707500Z] +25-04-05 15:59:39.338 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:VARCHAR) <- [test] +25-04-05 15:59:39.339 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [ad68c91f-e9c8-4b85-8c22-a7186f05022d] +25-04-05 15:59:39.346 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.UserStatus */insert + into + user_statuses (created_at, last_active_at, updated_at, user_id, id) + values + (?, ?, ?, ?, ?) +25-04-05 15:59:39.348 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.326270100Z] +25-04-05 15:59:39.349 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.325232600Z] +25-04-05 15:59:39.351 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:TIMESTAMP_UTC) <- [2025-04-05T06:59:39.326270100Z] +25-04-05 15:59:39.353 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [ad68c91f-e9c8-4b85-8c22-a7186f05022d] +25-04-05 15:59:39.354 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [048082e5-6763-427e-85b1-e8a2e2bd2d49] +25-04-05 15:59:39.360 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + u1_0.id, + u1_0.created_at, + u1_0.email, + u1_0.password, + u1_0.profile_id, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + u1_0.updated_at, + u1_0.username + from + users u1_0 + left join + user_statuses s1_0 + on u1_0.id=s1_0.user_id + where + u1_0.id=? +25-04-05 15:59:39.365 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [ad68c91f-e9c8-4b85-8c22-a7186f05022d] +25-04-05 15:59:39.421 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.UserStatus */delete + from + user_statuses + where + id=? +25-04-05 15:59:39.422 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [048082e5-6763-427e-85b1-e8a2e2bd2d49] +25-04-05 15:59:39.434 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.User */delete + from + users + where + id=? +25-04-05 15:59:39.436 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [ad68c91f-e9c8-4b85-8c22-a7186f05022d] +25-04-05 15:59:39.450 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + us1_0.id, + us1_0.created_at, + us1_0.last_active_at, + us1_0.updated_at, + us1_0.user_id + from + user_statuses us1_0 +25-04-05 15:59:39.508 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 16:04:25.201 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 16:04:25.477 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - Starting ChannelRepositoryTest using Java 17.0.14 with PID 4444 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 16:04:25.490 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 16:04:27.231 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 16:04:27.870 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 565 ms. Found 6 JPA repository interfaces. +25-04-05 16:04:28.269 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 16:04:29.259 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:09dbe4d8-a6c0-4aa2-8b88-9ac8c0abe62f;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 16:04:32.157 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 16:04:32.644 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 16:04:32.946 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 16:04:35.471 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 16:04:36.206 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@5d643896'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 16:04:44.767 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 16:04:44.927 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 16:04:44.943 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 16:04:44.950 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 16:04:44.956 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 16:04:44.961 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 16:04:44.965 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 16:04:44.970 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 16:04:45.009 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 16:04:45.022 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 16:04:45.033 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 16:04:45.040 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 16:04:45.048 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 16:04:45.058 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 16:04:45.068 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 16:04:45.082 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 16:04:45.087 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 16:04:45.092 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 16:04:45.097 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 16:04:45.104 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 16:04:45.110 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 16:04:45.114 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 16:04:45.117 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 16:04:45.137 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 16:04:47.442 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 16:04:50.409 [Test worker] INFO com.sprint.mission.discodeit.repository.ChannelRepositoryTest [ | | ] - Started ChannelRepositoryTest in 28.394 seconds (process running for 31.795) +25-04-05 16:04:53.317 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-04-05 16:04:53.353 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T07:04:52.660074900Z] +25-04-05 16:04:53.390 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [전체 공지] +25-04-05 16:04:53.391 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [공지사항] +25-04-05 16:04:53.392 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-04-05 16:04:53.393 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T07:04:52.660074900Z] +25-04-05 16:04:53.394 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [7bac67ee-1862-4977-b437-9261f488ed5f] +25-04-05 16:04:53.470 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-04-05 16:04:53.472 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T07:04:52.840818500Z] +25-04-05 16:04:53.474 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [잡담방] +25-04-05 16:04:53.475 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [자유채팅] +25-04-05 16:04:53.476 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PUBLIC] +25-04-05 16:04:53.478 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T07:04:52.840818500Z] +25-04-05 16:04:53.480 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [f3df224b-0379-4a7e-b24c-f593dd45a086] +25-04-05 16:04:53.482 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* insert for + com.sprint.mission.discodeit.entity.Channel */insert + into + channels (created_at, description, name, type, updated_at, id) + values + (?, ?, ?, ?, ?, ?) +25-04-05 16:04:53.485 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:TIMESTAMP_UTC) <- [2025-04-05T07:04:52.842825400Z] +25-04-05 16:04:53.486 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:VARCHAR) <- [null] +25-04-05 16:04:53.487 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:VARCHAR) <- [null] +25-04-05 16:04:53.488 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:ENUM) <- [PRIVATE] +25-04-05 16:04:53.489 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:TIMESTAMP_UTC) <- [2025-04-05T07:04:52.842825400Z] +25-04-05 16:04:53.490 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [e29cffb2-1264-4cbf-b5e0-37f8bbdb1b42] +25-04-05 16:04:53.553 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + c1_0.id, + c1_0.created_at, + c1_0.description, + c1_0.name, + c1_0.type, + c1_0.updated_at + from + channels c1_0 + where + c1_0.type=? + or c1_0.id in (?) +25-04-05 16:04:53.559 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:ENUM) <- [PUBLIC] +25-04-05 16:04:53.560 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [e29cffb2-1264-4cbf-b5e0-37f8bbdb1b42] +25-04-05 16:04:54.101 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 20:57:56.184 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 20:57:56.655 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 31452 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 20:57:56.659 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 20:57:59.382 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 20:58:00.085 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 629 ms. Found 6 JPA repository interfaces. +25-04-05 20:58:00.491 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 20:58:01.491 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:7bc6df23-18de-4586-bd01-88c30a8bfc05;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 20:58:04.165 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 20:58:04.763 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 20:58:05.098 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 20:58:07.764 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 20:58:08.474 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@79948bcf'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 20:58:17.980 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 20:58:18.136 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 20:58:18.163 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 20:58:18.166 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 20:58:18.170 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 20:58:18.171 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 20:58:18.173 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 20:58:18.177 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 20:58:18.215 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 20:58:18.259 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 20:58:18.273 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 20:58:18.284 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 20:58:18.290 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 20:58:18.297 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 20:58:18.301 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 20:58:18.315 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 20:58:18.419 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 20:58:18.426 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 20:58:18.431 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 20:58:18.436 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 20:58:18.442 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 20:58:18.447 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 20:58:18.452 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 20:58:18.468 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 20:58:20.506 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 20:58:24.499 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 32.239 seconds (process running for 37.164) +25-04-05 20:58:24.709 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while invoking 'beforeTestMethod' callback on TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] for test method [void com.sprint.mission.discodeit.repository.MessageRepositoryTest.findAllByChannelIdWithAuthor_success()] and test instance [com.sprint.mission.discodeit.repository.MessageRepositoryTest@225b9cf3] +org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [sql/message-data.sql]: INSERT INTO channels (id, name, description, type, created_at, updated_at) VALUES ('channel-uuid', 'Test Channel', '테스트 채널입니다.', 'PUBLIC', NOW(), NOW()) + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:282) + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:254) + at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:54) + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.execute(ResourceDatabasePopulator.java:269) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.lambda$executeSqlScripts$9(SqlScriptsTestExecutionListener.java:362) + at org.springframework.transaction.support.TransactionOperations.lambda$executeWithoutResult$0(TransactionOperations.java:68) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) + at org.springframework.transaction.support.TransactionOperations.executeWithoutResult(TransactionOperations.java:67) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:362) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.lambda$executeSqlScripts$4(SqlScriptsTestExecutionListener.java:274) + at java.base/java.lang.Iterable.forEach(Iterable.java:75) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:274) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:221) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.beforeTestMethod(SqlScriptsTestExecutionListener.java:164) + at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:320) + at org.springframework.test.context.junit.jupiter.SpringExtension.beforeEach(SpringExtension.java:237) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachCallbacks$3(TestMethodTestDescriptor.java:166) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$7(TestMethodTestDescriptor.java:202) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:202) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachCallbacks(TestMethodTestDescriptor.java:165) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:132) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "'channel-uuid' (CHANNELS: ""ID"" UUID NOT NULL)"; SQL statement: +INSERT INTO channels (id, name, description, type, created_at, updated_at) VALUES ('channel-uuid', 'Test Channel', '테스트 채널입니다.', 'PUBLIC', NOW(), NOW()) [22018-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:518) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.table.Column.getDataConversionError(Column.java:450) + at org.h2.table.Column.validateConvertUpdateSequence(Column.java:409) + at org.h2.table.Table.convertInsertRow(Table.java:963) + at org.h2.command.dml.Insert.insertRows(Insert.java:167) + at org.h2.command.dml.Insert.update(Insert.java:135) + at org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:74) + at org.h2.command.CommandContainer.update(CommandContainer.java:139) + at org.h2.command.Command.executeUpdate(Command.java:304) + at org.h2.command.Command.executeUpdate(Command.java:248) + at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:262) + at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:231) + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:261) + ... 84 common frames omitted +Caused by: org.h2.message.DbException: Data conversion error converting "channel-uuid" [22018-232] + at org.h2.message.DbException.get(DbException.java:223) + at org.h2.message.DbException.get(DbException.java:199) + at org.h2.value.ValueUuid.get(ValueUuid.java:134) + at org.h2.value.Value.convertToUuid(Value.java:2486) + at org.h2.value.Value.convertTo(Value.java:1206) + at org.h2.value.Value.convertForAssignTo(Value.java:1118) + at org.h2.table.Column.validateConvertUpdateSequence(Column.java:406) + ... 94 common frames omitted +Caused by: org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "channel-uuid" [22018-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:518) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + ... 101 common frames omitted +25-04-05 20:58:26.849 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:01:52.276 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:01:52.609 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 32388 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:01:52.612 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:01:55.101 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:01:55.858 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 691 ms. Found 6 JPA repository interfaces. +25-04-05 21:01:56.278 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 21:01:57.518 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:7d3b5c96-ae31-4dd6-a11f-099204d8a175;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 21:02:00.138 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 21:02:00.697 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 21:02:01.007 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 21:02:03.757 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 21:02:04.575 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@79948bcf'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 21:02:13.264 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 21:02:13.458 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 21:02:13.489 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 21:02:13.494 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 21:02:13.497 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 21:02:13.501 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 21:02:13.503 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 21:02:13.505 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 21:02:13.542 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 21:02:13.603 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 21:02:13.613 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 21:02:13.624 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 21:02:13.630 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 21:02:13.640 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 21:02:13.645 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 21:02:13.666 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 21:02:13.784 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 21:02:13.794 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 21:02:13.805 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 21:02:13.816 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 21:02:13.829 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 21:02:13.839 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 21:02:13.850 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 21:02:13.876 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:02:15.769 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 21:02:19.479 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 30.304 seconds (process running for 34.432) +25-04-05 21:02:19.681 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while invoking 'beforeTestMethod' callback on TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] for test method [void com.sprint.mission.discodeit.repository.MessageRepositoryTest.findAllByChannelIdWithAuthor_success()] and test instance [com.sprint.mission.discodeit.repository.MessageRepositoryTest@897ff3a] +org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of class path resource [sql/message-data.sql]: INSERT INTO messages (id, content, author_id, channel_id, created_at, updated_at) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001', 'Hello 1', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '20 minutes', NOW() - INTERVAL '20 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002', 'Hello 2', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '19 minutes', NOW() - INTERVAL '19 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003', 'Hello 3', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '18 minutes', NOW() - INTERVAL '18 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004', 'Hello 4', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '17 minutes', NOW() - INTERVAL '17 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005', 'Hello 5', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '16 minutes', NOW() - INTERVAL '16 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006', 'Hello 6', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '15 minutes', NOW() - INTERVAL '15 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007', 'Hello 7', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '14 minutes', NOW() - INTERVAL '14 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008', 'Hello 8', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '13 minutes', NOW() - INTERVAL '13 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009', 'Hello 9', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '12 minutes', NOW() - INTERVAL '12 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010', 'Hello 10', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '11 minutes', NOW() - INTERVAL '11 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011', 'Hello 11', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '10 minutes', NOW() - INTERVAL '10 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012', 'Hello 12', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '9 minutes', NOW() - INTERVAL '9 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013', 'Hello 13', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '8 minutes', NOW() - INTERVAL '8 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014', 'Hello 14', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '7 minutes', NOW() - INTERVAL '7 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015', 'Hello 15', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '6 minutes', NOW() - INTERVAL '6 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016', 'Hello 16', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '5 minutes', NOW() - INTERVAL '5 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017', 'Hello 17', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '4 minutes', NOW() - INTERVAL '4 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018', 'Hello 18', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '3 minutes', NOW() - INTERVAL '3 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019', 'Hello 19', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '2 minutes', NOW() - INTERVAL '2 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020', 'Hello 20', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '1 minutes', NOW() - INTERVAL '1 minutes') + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:282) + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:254) + at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:54) + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.execute(ResourceDatabasePopulator.java:269) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.lambda$executeSqlScripts$9(SqlScriptsTestExecutionListener.java:362) + at org.springframework.transaction.support.TransactionOperations.lambda$executeWithoutResult$0(TransactionOperations.java:68) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) + at org.springframework.transaction.support.TransactionOperations.executeWithoutResult(TransactionOperations.java:67) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:362) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.lambda$executeSqlScripts$4(SqlScriptsTestExecutionListener.java:274) + at java.base/java.lang.Iterable.forEach(Iterable.java:75) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:274) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:221) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.beforeTestMethod(SqlScriptsTestExecutionListener.java:164) + at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:320) + at org.springframework.test.context.junit.jupiter.SpringExtension.beforeEach(SpringExtension.java:237) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachCallbacks$3(TestMethodTestDescriptor.java:166) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$7(TestMethodTestDescriptor.java:202) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:202) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachCallbacks(TestMethodTestDescriptor.java:165) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:132) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "INTERVAL" constant "20 minutes"; SQL statement: +INSERT INTO messages (id, content, author_id, channel_id, created_at, updated_at) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001', 'Hello 1', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '20 minutes', NOW() - INTERVAL '20 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002', 'Hello 2', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '19 minutes', NOW() - INTERVAL '19 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003', 'Hello 3', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '18 minutes', NOW() - INTERVAL '18 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004', 'Hello 4', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '17 minutes', NOW() - INTERVAL '17 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005', 'Hello 5', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '16 minutes', NOW() - INTERVAL '16 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006', 'Hello 6', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '15 minutes', NOW() - INTERVAL '15 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007', 'Hello 7', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '14 minutes', NOW() - INTERVAL '14 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008', 'Hello 8', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '13 minutes', NOW() - INTERVAL '13 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009', 'Hello 9', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '12 minutes', NOW() - INTERVAL '12 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010', 'Hello 10', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '11 minutes', NOW() - INTERVAL '11 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011', 'Hello 11', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '10 minutes', NOW() - INTERVAL '10 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012', 'Hello 12', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '9 minutes', NOW() - INTERVAL '9 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013', 'Hello 13', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '8 minutes', NOW() - INTERVAL '8 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014', 'Hello 14', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '7 minutes', NOW() - INTERVAL '7 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015', 'Hello 15', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '6 minutes', NOW() - INTERVAL '6 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016', 'Hello 16', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '5 minutes', NOW() - INTERVAL '5 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017', 'Hello 17', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '4 minutes', NOW() - INTERVAL '4 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018', 'Hello 18', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '3 minutes', NOW() - INTERVAL '3 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019', 'Hello 19', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '2 minutes', NOW() - INTERVAL '2 minutes'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020', 'Hello 20', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '1 minutes', NOW() - INTERVAL '1 minutes') [22007-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:518) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.command.Parser.readInterval(Parser.java:5368) + at org.h2.command.Parser.readTermWithoutIdentifier(Parser.java:4964) + at org.h2.command.Parser.readTerm(Parser.java:4828) + at org.h2.command.Parser.readFactor(Parser.java:3323) + at org.h2.command.Parser.readSum(Parser.java:3315) + at org.h2.command.Parser.readConcat(Parser.java:3275) + at org.h2.command.Parser.readCondition(Parser.java:3065) + at org.h2.command.Parser.readExpression(Parser.java:2985) + at org.h2.command.Parser.readExpressionOrDefault(Parser.java:2971) + at org.h2.command.Parser.parseValuesForCommand(Parser.java:1685) + at org.h2.command.Parser.parseInsert(Parser.java:1550) + at org.h2.command.Parser.parsePrepared(Parser.java:698) + at org.h2.command.Parser.parse(Parser.java:581) + at org.h2.command.Parser.parse(Parser.java:556) + at org.h2.command.Parser.prepareCommand(Parser.java:484) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:645) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:561) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1164) + at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:245) + at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:231) + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:261) + ... 84 common frames omitted +Caused by: java.lang.NullPointerException: Cannot invoke "org.h2.value.TypeInfo.getValueType()" because "" is null + at org.h2.command.Parser.readInterval(Parser.java:5362) + ... 104 common frames omitted +25-04-05 21:02:21.699 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:05:06.393 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:05:06.825 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 12208 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:05:06.829 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:05:08.954 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:05:37.992 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:05:38.403 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 8428 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:05:38.407 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:05:40.877 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:05:41.544 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 599 ms. Found 6 JPA repository interfaces. +25-04-05 21:05:41.929 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 21:05:42.949 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:435b5b9f-e5c2-4bbb-bd5a-d3ceaa79ef57;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 21:05:45.340 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 21:05:45.898 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 21:05:46.193 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 21:05:48.432 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 21:05:49.101 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@79948bcf'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 21:05:57.240 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 21:05:57.378 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 21:05:57.401 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 21:05:57.404 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 21:05:57.408 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 21:05:57.413 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 21:05:57.417 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 21:05:57.421 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 21:05:57.453 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 21:05:57.496 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 21:05:57.507 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 21:05:57.514 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 21:05:57.522 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 21:05:57.530 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 21:05:57.540 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 21:05:57.554 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 21:05:57.629 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 21:05:57.635 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 21:05:57.643 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 21:05:57.649 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 21:05:57.655 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 21:05:57.660 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 21:05:57.664 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 21:05:57.681 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:05:59.539 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 21:06:02.687 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 27.639 seconds (process running for 31.503) +25-04-05 21:06:02.876 [Test worker] WARN org.springframework.test.context.TestContextManager [ | | ] - Caught exception while invoking 'beforeTestMethod' callback on TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] for test method [void com.sprint.mission.discodeit.repository.MessageRepositoryTest.findAllByChannelIdWithAuthor_success()] and test instance [com.sprint.mission.discodeit.repository.MessageRepositoryTest@3adcdbc0] +org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of class path resource [sql/message-data.sql]: INSERT INTO messages (id, content, author_id, channel_id, created_at, updated_at) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001', 'Hello 1', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '20 minute', NOW() - INTERVAL '20 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002', 'Hello 2', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '19 minute', NOW() - INTERVAL '19 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003', 'Hello 3', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '18 minute', NOW() - INTERVAL '18 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004', 'Hello 4', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '17 minute', NOW() - INTERVAL '17 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005', 'Hello 5', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '16 minute', NOW() - INTERVAL '16 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006', 'Hello 6', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '15 minute', NOW() - INTERVAL '15 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007', 'Hello 7', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '14 minute', NOW() - INTERVAL '14 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008', 'Hello 8', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '13 minute', NOW() - INTERVAL '13 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009', 'Hello 9', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '12 minute', NOW() - INTERVAL '12 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010', 'Hello 10', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '11 minute', NOW() - INTERVAL '11 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011', 'Hello 11', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '10 minute', NOW() - INTERVAL '10 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012', 'Hello 12', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '9 minute', NOW() - INTERVAL '9 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013', 'Hello 13', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '8 minute', NOW() - INTERVAL '8 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014', 'Hello 14', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '7 minute', NOW() - INTERVAL '7 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015', 'Hello 15', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '6 minute', NOW() - INTERVAL '6 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016', 'Hello 16', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '5 minute', NOW() - INTERVAL '5 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017', 'Hello 17', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '4 minute', NOW() - INTERVAL '4 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018', 'Hello 18', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '3 minute', NOW() - INTERVAL '3 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019', 'Hello 19', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '2 minute', NOW() - INTERVAL '2 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020', 'Hello 20', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '1 minute', NOW() - INTERVAL '1 minute') + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:282) + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:254) + at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:54) + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.execute(ResourceDatabasePopulator.java:269) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.lambda$executeSqlScripts$9(SqlScriptsTestExecutionListener.java:362) + at org.springframework.transaction.support.TransactionOperations.lambda$executeWithoutResult$0(TransactionOperations.java:68) + at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) + at org.springframework.transaction.support.TransactionOperations.executeWithoutResult(TransactionOperations.java:67) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:362) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.lambda$executeSqlScripts$4(SqlScriptsTestExecutionListener.java:274) + at java.base/java.lang.Iterable.forEach(Iterable.java:75) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:274) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.executeSqlScripts(SqlScriptsTestExecutionListener.java:221) + at org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener.beforeTestMethod(SqlScriptsTestExecutionListener.java:164) + at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:320) + at org.springframework.test.context.junit.jupiter.SpringExtension.beforeEach(SpringExtension.java:237) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachCallbacks$3(TestMethodTestDescriptor.java:166) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$7(TestMethodTestDescriptor.java:202) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:202) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachCallbacks(TestMethodTestDescriptor.java:165) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:132) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) + at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) + at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) + at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) + at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) + at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) + at jdk.proxy2/jdk.proxy2.$Proxy6.stop(Unknown Source) + at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) + at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) + at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) + at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) + at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) +Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "INTERVAL" constant "20 minute"; SQL statement: +INSERT INTO messages (id, content, author_id, channel_id, created_at, updated_at) VALUES ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001', 'Hello 1', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '20 minute', NOW() - INTERVAL '20 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002', 'Hello 2', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '19 minute', NOW() - INTERVAL '19 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003', 'Hello 3', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '18 minute', NOW() - INTERVAL '18 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004', 'Hello 4', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '17 minute', NOW() - INTERVAL '17 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005', 'Hello 5', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '16 minute', NOW() - INTERVAL '16 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006', 'Hello 6', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '15 minute', NOW() - INTERVAL '15 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007', 'Hello 7', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '14 minute', NOW() - INTERVAL '14 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008', 'Hello 8', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '13 minute', NOW() - INTERVAL '13 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009', 'Hello 9', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '12 minute', NOW() - INTERVAL '12 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010', 'Hello 10', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '11 minute', NOW() - INTERVAL '11 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011', 'Hello 11', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '10 minute', NOW() - INTERVAL '10 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012', 'Hello 12', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '9 minute', NOW() - INTERVAL '9 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013', 'Hello 13', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '8 minute', NOW() - INTERVAL '8 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014', 'Hello 14', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '7 minute', NOW() - INTERVAL '7 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015', 'Hello 15', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '6 minute', NOW() - INTERVAL '6 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016', 'Hello 16', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '5 minute', NOW() - INTERVAL '5 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017', 'Hello 17', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '4 minute', NOW() - INTERVAL '4 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018', 'Hello 18', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '3 minute', NOW() - INTERVAL '3 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019', 'Hello 19', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '2 minute', NOW() - INTERVAL '2 minute'), ('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020', 'Hello 20', '22222222-2222-2222-2222-222222222222', '11111111-1111-1111-1111-111111111111', NOW() - INTERVAL '1 minute', NOW() - INTERVAL '1 minute') [22007-232] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:518) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.command.Parser.readInterval(Parser.java:5368) + at org.h2.command.Parser.readTermWithoutIdentifier(Parser.java:4964) + at org.h2.command.Parser.readTerm(Parser.java:4828) + at org.h2.command.Parser.readFactor(Parser.java:3323) + at org.h2.command.Parser.readSum(Parser.java:3315) + at org.h2.command.Parser.readConcat(Parser.java:3275) + at org.h2.command.Parser.readCondition(Parser.java:3065) + at org.h2.command.Parser.readExpression(Parser.java:2985) + at org.h2.command.Parser.readExpressionOrDefault(Parser.java:2971) + at org.h2.command.Parser.parseValuesForCommand(Parser.java:1685) + at org.h2.command.Parser.parseInsert(Parser.java:1550) + at org.h2.command.Parser.parsePrepared(Parser.java:698) + at org.h2.command.Parser.parse(Parser.java:581) + at org.h2.command.Parser.parse(Parser.java:556) + at org.h2.command.Parser.prepareCommand(Parser.java:484) + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:645) + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:561) + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1164) + at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:245) + at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:231) + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:261) + ... 84 common frames omitted +Caused by: java.lang.NullPointerException: Cannot invoke "org.h2.value.TypeInfo.getValueType()" because "" is null + at org.h2.command.Parser.readInterval(Parser.java:5362) + ... 104 common frames omitted +25-04-05 21:06:04.748 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:08:32.080 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:08:32.539 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 28740 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:08:32.544 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:08:35.189 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:08:35.866 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 613 ms. Found 6 JPA repository interfaces. +25-04-05 21:08:36.239 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 21:08:37.437 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:70a3029f-f163-4791-9748-de28a0cf4fc5;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 21:08:40.089 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 21:08:40.659 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 21:08:40.988 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 21:08:43.720 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 21:08:44.525 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@4cd78959'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 21:08:53.503 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 21:08:53.665 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 21:08:53.696 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 21:08:53.699 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 21:08:53.703 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 21:08:53.705 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 21:08:53.708 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 21:08:53.711 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 21:08:53.755 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 21:08:53.806 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 21:08:53.818 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 21:08:53.828 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 21:08:53.836 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 21:08:53.846 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 21:08:53.857 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 21:08:53.879 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 21:08:53.984 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 21:08:53.993 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 21:08:53.999 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 21:08:54.007 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 21:08:54.013 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 21:08:54.020 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 21:08:54.026 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 21:08:54.056 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:08:56.473 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 21:08:59.708 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 31.384 seconds (process running for 35.423) +25-04-05 21:09:02.371 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + where + m1_0.channel_id=? +25-04-05 21:14:55.810 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [11111111-1111-1111-1111-111111111111] +25-04-05 21:14:56.384 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + a1_0.message_id, + a1_1.id, + a1_1.content_type, + a1_1.created_at, + a1_1.file_name, + a1_1.size + from + message_attachments a1_0 + join + binary_contents a1_1 + on a1_1.id=a1_0.attachment_id + where + a1_0.message_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +25-04-05 21:14:56.408 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001] +25-04-05 21:14:56.409 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (2:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002] +25-04-05 21:14:56.411 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (3:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003] +25-04-05 21:14:56.412 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (4:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004] +25-04-05 21:14:56.413 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (5:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005] +25-04-05 21:14:56.413 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (6:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006] +25-04-05 21:14:56.414 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (7:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007] +25-04-05 21:14:56.415 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (8:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008] +25-04-05 21:14:56.417 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (9:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009] +25-04-05 21:14:56.418 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (10:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010] +25-04-05 21:14:56.419 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (11:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011] +25-04-05 21:14:56.419 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (12:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012] +25-04-05 21:14:56.420 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (13:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013] +25-04-05 21:14:56.421 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (14:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014] +25-04-05 21:14:56.422 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (15:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015] +25-04-05 21:14:56.423 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (16:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016] +25-04-05 21:14:56.423 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (17:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017] +25-04-05 21:14:56.424 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (18:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018] +25-04-05 21:14:56.425 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (19:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019] +25-04-05 21:14:56.426 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (20:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020] +25-04-05 21:14:56.427 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (21:UUID) <- [null] +25-04-05 21:14:56.428 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (22:UUID) <- [null] +25-04-05 21:14:56.429 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (23:UUID) <- [null] +25-04-05 21:14:56.430 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (24:UUID) <- [null] +25-04-05 21:14:56.431 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (25:UUID) <- [null] +25-04-05 21:14:56.433 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (26:UUID) <- [null] +25-04-05 21:14:56.434 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (27:UUID) <- [null] +25-04-05 21:14:56.434 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (28:UUID) <- [null] +25-04-05 21:14:56.435 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (29:UUID) <- [null] +25-04-05 21:14:56.436 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (30:UUID) <- [null] +25-04-05 21:14:56.436 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (31:UUID) <- [null] +25-04-05 21:14:56.437 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (32:UUID) <- [null] +25-04-05 21:14:56.438 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (33:UUID) <- [null] +25-04-05 21:14:56.438 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (34:UUID) <- [null] +25-04-05 21:14:56.439 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (35:UUID) <- [null] +25-04-05 21:14:56.440 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (36:UUID) <- [null] +25-04-05 21:14:56.441 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (37:UUID) <- [null] +25-04-05 21:14:56.441 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (38:UUID) <- [null] +25-04-05 21:14:56.443 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (39:UUID) <- [null] +25-04-05 21:14:56.443 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (40:UUID) <- [null] +25-04-05 21:14:56.444 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (41:UUID) <- [null] +25-04-05 21:14:56.445 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (42:UUID) <- [null] +25-04-05 21:14:56.446 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (43:UUID) <- [null] +25-04-05 21:14:56.447 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (44:UUID) <- [null] +25-04-05 21:14:56.448 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (45:UUID) <- [null] +25-04-05 21:14:56.448 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (46:UUID) <- [null] +25-04-05 21:14:56.449 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (47:UUID) <- [null] +25-04-05 21:14:56.450 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (48:UUID) <- [null] +25-04-05 21:14:56.450 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (49:UUID) <- [null] +25-04-05 21:14:56.452 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (50:UUID) <- [null] +25-04-05 21:14:56.453 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (51:UUID) <- [null] +25-04-05 21:14:56.454 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (52:UUID) <- [null] +25-04-05 21:14:56.455 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (53:UUID) <- [null] +25-04-05 21:14:56.456 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (54:UUID) <- [null] +25-04-05 21:14:56.457 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (55:UUID) <- [null] +25-04-05 21:14:56.458 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (56:UUID) <- [null] +25-04-05 21:14:56.459 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (57:UUID) <- [null] +25-04-05 21:14:56.460 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (58:UUID) <- [null] +25-04-05 21:14:56.461 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (59:UUID) <- [null] +25-04-05 21:14:56.462 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (60:UUID) <- [null] +25-04-05 21:14:56.463 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (61:UUID) <- [null] +25-04-05 21:14:56.464 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (62:UUID) <- [null] +25-04-05 21:14:56.465 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (63:UUID) <- [null] +25-04-05 21:14:56.466 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (64:UUID) <- [null] +25-04-05 21:14:56.467 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (65:UUID) <- [null] +25-04-05 21:14:56.467 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (66:UUID) <- [null] +25-04-05 21:14:56.468 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (67:UUID) <- [null] +25-04-05 21:14:56.469 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (68:UUID) <- [null] +25-04-05 21:14:56.470 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (69:UUID) <- [null] +25-04-05 21:14:56.470 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (70:UUID) <- [null] +25-04-05 21:14:56.471 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (71:UUID) <- [null] +25-04-05 21:14:56.472 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (72:UUID) <- [null] +25-04-05 21:14:56.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (73:UUID) <- [null] +25-04-05 21:14:56.473 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (74:UUID) <- [null] +25-04-05 21:14:56.474 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (75:UUID) <- [null] +25-04-05 21:14:56.475 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (76:UUID) <- [null] +25-04-05 21:14:56.476 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (77:UUID) <- [null] +25-04-05 21:14:56.477 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (78:UUID) <- [null] +25-04-05 21:14:56.477 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (79:UUID) <- [null] +25-04-05 21:14:56.477 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (80:UUID) <- [null] +25-04-05 21:14:56.478 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (81:UUID) <- [null] +25-04-05 21:14:56.479 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (82:UUID) <- [null] +25-04-05 21:14:56.480 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (83:UUID) <- [null] +25-04-05 21:14:56.481 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (84:UUID) <- [null] +25-04-05 21:14:56.481 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (85:UUID) <- [null] +25-04-05 21:14:56.483 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (86:UUID) <- [null] +25-04-05 21:14:56.484 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (87:UUID) <- [null] +25-04-05 21:14:56.485 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (88:UUID) <- [null] +25-04-05 21:14:56.486 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (89:UUID) <- [null] +25-04-05 21:14:56.486 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (90:UUID) <- [null] +25-04-05 21:14:56.487 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (91:UUID) <- [null] +25-04-05 21:14:56.488 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (92:UUID) <- [null] +25-04-05 21:14:56.488 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (93:UUID) <- [null] +25-04-05 21:14:56.489 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (94:UUID) <- [null] +25-04-05 21:14:56.490 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (95:UUID) <- [null] +25-04-05 21:14:56.491 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (96:UUID) <- [null] +25-04-05 21:14:56.491 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (97:UUID) <- [null] +25-04-05 21:14:56.493 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (98:UUID) <- [null] +25-04-05 21:14:56.493 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (99:UUID) <- [null] +25-04-05 21:14:56.494 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (100:UUID) <- [null] +25-04-05 21:14:56.774 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.779 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0001] +25-04-05 21:14:56.798 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.800 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0002] +25-04-05 21:14:56.803 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.805 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0003] +25-04-05 21:14:56.808 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.811 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0004] +25-04-05 21:14:56.816 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.818 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0005] +25-04-05 21:14:56.821 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.823 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0006] +25-04-05 21:14:56.826 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.828 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0007] +25-04-05 21:14:56.833 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.833 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0008] +25-04-05 21:14:56.837 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.838 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0009] +25-04-05 21:14:56.842 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.843 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0010] +25-04-05 21:14:56.845 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.847 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0011] +25-04-05 21:14:56.850 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.851 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0012] +25-04-05 21:14:56.853 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.855 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0013] +25-04-05 21:14:56.858 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.859 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0014] +25-04-05 21:14:56.861 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.863 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0015] +25-04-05 21:14:56.866 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.867 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0016] +25-04-05 21:14:56.869 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.870 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0017] +25-04-05 21:14:56.871 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.871 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0018] +25-04-05 21:14:56.874 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.874 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0019] +25-04-05 21:14:56.875 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* delete for com.sprint.mission.discodeit.entity.Message */delete + from + messages + where + id=? +25-04-05 21:14:56.876 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020] +25-04-05 21:14:56.878 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* */ select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 +25-04-05 21:14:57.519 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:15:22.467 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:15:22.891 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 29392 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:15:22.895 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:15:25.243 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:15:25.983 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 673 ms. Found 6 JPA repository interfaces. +25-04-05 21:15:26.375 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 21:15:27.491 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:4fcf2720-395d-44e1-8e2b-ebf9b774451b;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 21:15:30.134 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 21:15:30.614 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 21:15:30.890 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 21:15:33.544 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 21:15:34.335 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@12e37ab2'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 21:15:43.310 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 21:15:43.474 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 21:15:43.503 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 21:15:43.505 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 21:15:43.509 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 21:15:43.511 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 21:15:43.513 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 21:15:43.516 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 21:15:43.556 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 21:15:43.615 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 21:15:43.629 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 21:15:43.639 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 21:15:43.649 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 21:15:43.662 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 21:15:43.671 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 21:15:43.691 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 21:15:43.805 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 21:15:43.814 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 21:15:43.823 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 21:15:43.829 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 21:15:43.840 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 21:15:43.845 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 21:15:43.853 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 21:15:43.885 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:15:46.181 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 21:15:49.398 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 30.611 seconds (process running for 33.872) +25-04-05 21:15:51.970 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-04-05 21:15:52.002 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [11111111-1111-1111-1111-111111111111] +25-04-05 21:15:52.875 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:18:15.061 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:18:15.448 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 17644 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:18:15.452 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:18:17.737 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:18:18.427 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 622 ms. Found 6 JPA repository interfaces. +25-04-05 21:18:18.795 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 21:18:19.920 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:06ec7306-84a2-4049-ac44-f7ef2ace14a7;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 21:18:22.447 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 21:18:23.007 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 21:18:23.345 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 21:18:25.951 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 21:18:26.801 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@72ecb71d'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 21:18:35.201 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 21:18:35.359 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 21:18:35.388 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 21:18:35.391 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 21:18:35.394 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 21:18:35.397 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 21:18:35.401 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 21:18:35.404 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 21:18:35.438 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 21:18:35.498 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 21:18:35.510 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 21:18:35.521 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 21:18:35.529 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 21:18:35.538 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 21:18:35.546 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 21:18:35.563 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 21:18:35.657 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 21:18:35.664 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 21:18:35.671 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 21:18:35.678 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 21:18:35.683 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 21:18:35.690 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 21:18:35.697 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 21:18:35.724 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:18:37.611 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 21:18:41.430 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 30.074 seconds (process running for 33.442) +25-04-05 21:18:43.869 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + select + m1_0.id, + m1_0.author_id, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + where + m1_0.id=? +25-04-05 21:18:43.897 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaa0020] +25-04-05 21:18:44.706 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + m.createdAt + FROM + Message m + WHERE + m.channel.id = :channelId + ORDER BY + m.createdAt DESC + LIMIT + 1 */ select + m1_0.created_at + from + messages m1_0 + where + m1_0.channel_id=? + order by + m1_0.created_at desc + fetch + first 1 rows only +25-04-05 21:18:44.713 [Test worker] TRACE org.hibernate.orm.jdbc.bind [ | | ] - binding parameter (1:UUID) <- [11111111-1111-1111-1111-111111111111] +25-04-05 21:18:45.356 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Closing JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:20:47.709 [background-preinit] INFO org.hibernate.validator.internal.util.Version [ | | ] - HV000001: Hibernate Validator 8.0.1.Final +25-04-05 21:20:48.070 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Starting MessageRepositoryTest using Java 17.0.14 with PID 32784 (started by junwo in C:\Users\junwo\IdeaProjects\1-sprint-mission) +25-04-05 21:20:48.073 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - The following 1 profile is active: "dev" +25-04-05 21:20:50.271 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +25-04-05 21:20:50.750 [Test worker] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate [ | | ] - Finished Spring Data repository scanning in 444 ms. Found 6 JPA repository interfaces. +25-04-05 21:20:50.979 [Test worker] INFO org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceBeanFactoryPostProcessor [ | | ] - Replacing 'dataSource' DataSource bean with embedded version +25-04-05 21:20:51.751 [Test worker] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory [ | | ] - Starting embedded database: url='jdbc:h2:mem:b8fa489b-499c-4383-97ed-50a9eab24ef1;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa' +25-04-05 21:20:54.151 [Test worker] INFO org.hibernate.jpa.internal.util.LogHelper [ | | ] - HHH000204: Processing PersistenceUnitInfo [name: default] +25-04-05 21:20:54.626 [Test worker] INFO org.hibernate.Version [ | | ] - HHH000412: Hibernate ORM core version 6.6.2.Final +25-04-05 21:20:54.863 [Test worker] INFO org.hibernate.cache.internal.RegionFactoryInitiator [ | | ] - HHH000026: Second-level cache disabled +25-04-05 21:20:57.528 [Test worker] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo [ | | ] - No LoadTimeWeaver setup: ignoring JPA class transformer +25-04-05 21:20:58.194 [Test worker] INFO org.hibernate.orm.connections.pooling [ | | ] - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory$EmbeddedDataSourceProxy@f5d20d8'] + Database driver: undefined/unknown + Database version: 2.3.232 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +25-04-05 21:21:06.266 [Test worker] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator [ | | ] - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +25-04-05 21:21:06.419 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists binary_contents cascade +25-04-05 21:21:06.448 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists channels cascade +25-04-05 21:21:06.452 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists message_attachments cascade +25-04-05 21:21:06.453 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists messages cascade +25-04-05 21:21:06.456 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists read_statuses cascade +25-04-05 21:21:06.459 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists user_statuses cascade +25-04-05 21:21:06.462 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + drop table if exists users cascade +25-04-05 21:21:06.499 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table binary_contents ( + created_at timestamp with time zone not null, + size bigint not null, + id uuid not null, + content_type varchar(100) not null, + file_name varchar(255) not null, + primary key (id) + ) +25-04-05 21:21:06.548 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table channels ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + name varchar(100), + description varchar(500), + type enum ('PRIVATE','PUBLIC') not null, + primary key (id) + ) +25-04-05 21:21:06.557 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table message_attachments ( + attachment_id uuid not null unique, + message_id uuid not null + ) +25-04-05 21:21:06.565 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table messages ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + author_id uuid, + channel_id uuid not null, + id uuid not null, + content text not null, + primary key (id) + ) +25-04-05 21:21:06.571 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table read_statuses ( + created_at timestamp with time zone not null, + last_read_at timestamp with time zone not null, + updated_at timestamp with time zone, + channel_id uuid not null, + id uuid not null, + user_id uuid not null, + primary key (id), + unique (user_id, channel_id) + ) +25-04-05 21:21:06.577 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table user_statuses ( + created_at timestamp with time zone not null, + last_active_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + user_id uuid not null unique, + primary key (id) + ) +25-04-05 21:21:06.583 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + create table users ( + created_at timestamp with time zone not null, + updated_at timestamp with time zone, + id uuid not null, + profile_id uuid unique, + username varchar(50) not null unique, + password varchar(60) not null, + email varchar(100) not null unique, + primary key (id) + ) +25-04-05 21:21:06.593 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKsd1m8rb8jcpbcnb7rpdue7ctc + foreign key (attachment_id) + references binary_contents +25-04-05 21:21:06.668 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists message_attachments + add constraint FKj7twd218e2gqw9cmlhwvo1rth + foreign key (message_id) + references messages +25-04-05 21:21:06.676 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FKowtlim26svclkatusptbgi7u1 + foreign key (author_id) + references users +25-04-05 21:21:06.683 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists messages + add constraint FK3u3ckbhwq9se1cmopk2pq05b2 + foreign key (channel_id) + references channels +25-04-05 21:21:06.691 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKa38ri44ml4gfdpklx4ahqr8gd + foreign key (channel_id) + references channels +25-04-05 21:21:06.697 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists read_statuses + add constraint FKml3k4wr9sj5yxrmj6d0aoib2e + foreign key (user_id) + references users +25-04-05 21:21:06.704 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists user_statuses + add constraint FK4lfl3ei2ubchgcxrrpo3pw4mm + foreign key (user_id) + references users +25-04-05 21:21:06.710 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + alter table if exists users + add constraint FKtbudycgrip49xdptogmhfqnso + foreign key (profile_id) + references binary_contents +25-04-05 21:21:06.732 [Test worker] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean [ | | ] - Initialized JPA EntityManagerFactory for persistence unit 'default' +25-04-05 21:21:08.937 [Test worker] INFO org.springframework.data.jpa.repository.query.QueryEnhancerFactory [ | | ] - Hibernate is in classpath; If applicable, HQL parser will be used. +25-04-05 21:21:11.790 [Test worker] INFO com.sprint.mission.discodeit.repository.MessageRepositoryTest [ | | ] - Started MessageRepositoryTest in 27.268 seconds (process running for 31.291) +25-04-05 21:21:14.233 [Test worker] DEBUG org.hibernate.SQL [ | | ] - + /* SELECT + m + FROM + Message m + LEFT JOIN + + FETCH + m.author a + JOIN + + FETCH + a.status + LEFT JOIN + + FETCH + a.profile + WHERE + m.channel.id = :channelId + AND m.createdAt < :createdAt + order by + m.createdAt desc */ select + m1_0.id, + a1_0.id, + a1_0.created_at, + a1_0.email, + a1_0.password, + p1_0.id, + p1_0.content_type, + p1_0.created_at, + p1_0.file_name, + p1_0.size, + s1_0.id, + s1_0.created_at, + s1_0.last_active_at, + s1_0.updated_at, + s1_0.user_id, + a1_0.updated_at, + a1_0.username, + m1_0.channel_id, + m1_0.content, + m1_0.created_at, + m1_0.updated_at + from + messages m1_0 + left join + users a1_0 + on a1_0.id=m1_0.author_id + join + user_statuses s1_0 + on a1_0.id=s1_0.user_id + left join + binary_contents p1_0 + on p1_0.id=a1_0.profile_id + where + m1_0.channel_id=? + and m1_0.created_at { - Optional findByUsername(String username); boolean existsByEmail(String email); From 1064cf513bf0cf8cb85b43f91b924a5fbe5be648 Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 14:38:42 +0900 Subject: [PATCH 114/115] ci test --- .github/workflows/pr-ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr-ci.yaml b/.github/workflows/pr-ci.yaml index b6359e02a..ab723f26c 100644 --- a/.github/workflows/pr-ci.yaml +++ b/.github/workflows/pr-ci.yaml @@ -14,6 +14,7 @@ jobs: permissions: checks: write pull-requests: write + contents: read steps: - name: 레포지토리 체크아웃 From b2523c32d4aedc21cefb6e8cec434127a4242f9f Mon Sep 17 00:00:00 2001 From: junwoo Date: Tue, 8 Apr 2025 14:45:40 +0900 Subject: [PATCH 115/115] Delete github workflows --- .github/workflows/pr-ci.yaml | 48 ------------------------------------ 1 file changed, 48 deletions(-) delete mode 100644 .github/workflows/pr-ci.yaml diff --git a/.github/workflows/pr-ci.yaml b/.github/workflows/pr-ci.yaml deleted file mode 100644 index ab723f26c..000000000 --- a/.github/workflows/pr-ci.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: PR 시 CI 테스트 자동화 - -on: - pull_request: - branches: - - main - - 'part3-김준우' - -jobs: - test: - name: Test - runs-on: ubuntu-latest - - permissions: - checks: write - pull-requests: write - contents: read - - steps: - - name: 레포지토리 체크아웃 - uses: actions/checkout@v4 - with: - token: ${{ secrets.GIT_TOKEN }} - - - name: JDK 17 설치 - uses: actions/setup-java@v3 - with: - distribution: 'oracle' - java-version: '17' - - - name: Gradle 명령 실행 권한 부여 - run: chmod +x ./gradlew - shell: bash - - - name: Gradle로 프로젝트 Build - run: ./gradlew build - - - name: 테스트 결과를 PR 코멘트로 출력 - uses: EnricoMi/publish-unit-test-result-action@v2 - if: always() - with: - files: '**/build/test-results/test/TEST-*.xml' - - - name: 테스트 실패 시, 오류가 발생한 코드 라인에 코멘트 추가 - uses: mikepenz/action-junit-report@v4 - if: always() - with: - report_paths: '**/build/test-results/test/TEST-*.xml' \ No newline at end of file